VendorInfluencerMappingModel.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. namespace App\Models;
  3. use CodeIgniter\Model;
  4. class VendorInfluencerMappingModel extends Model
  5. {
  6. protected $table = 'VENDOR_INFLUENCER_MAPPING';
  7. protected $primaryKey = 'SEQ';
  8. protected $useAutoIncrement = true;
  9. protected $returnType = 'array';
  10. protected $useSoftDeletes = false;
  11. protected $allowedFields = [
  12. 'VENDOR_SEQ',
  13. 'INFLUENCER_SEQ',
  14. 'REQUEST_TYPE',
  15. 'STATUS',
  16. 'REQUEST_MESSAGE',
  17. 'RESPONSE_MESSAGE',
  18. 'REQUESTED_BY',
  19. 'APPROVED_BY',
  20. 'COMMISSION_RATE',
  21. 'SPECIAL_CONDITIONS',
  22. 'EXPIRED_DATE',
  23. 'REQUEST_DATE',
  24. 'RESPONSE_DATE',
  25. 'PARTNERSHIP_START_DATE',
  26. 'PARTNERSHIP_END_DATE',
  27. 'REG_DATE',
  28. 'MOD_DATE',
  29. 'IS_ACT',
  30. 'ADD_INFO1',
  31. 'ADD_INFO2',
  32. 'ADD_INFO3'
  33. ];
  34. protected $useTimestamps = true;
  35. protected $createdField = 'REG_DATE';
  36. protected $updatedField = 'MOD_DATE';
  37. protected $validationRules = [
  38. 'VENDOR_SEQ' => 'required|integer',
  39. 'INFLUENCER_SEQ' => 'required|integer',
  40. 'REQUEST_TYPE' => 'required|in_list[INFLUENCER_REQUEST,VENDOR_REQUEST]',
  41. 'STATUS' => 'required|in_list[PENDING,APPROVED,REJECTED,CANCELLED,EXPIRED,TERMINATED]',
  42. 'REQUESTED_BY' => 'required|integer',
  43. ];
  44. protected $validationMessages = [
  45. 'VENDOR_SEQ' => [
  46. 'required' => '벤더 SEQ는 필수입니다.',
  47. 'integer' => '벤더 SEQ는 숫자여야 합니다.'
  48. ],
  49. 'INFLUENCER_SEQ' => [
  50. 'required' => '인플루언서 SEQ는 필수입니다.',
  51. 'integer' => '인플루언서 SEQ는 숫자여야 합니다.'
  52. ],
  53. 'REQUEST_TYPE' => [
  54. 'required' => '요청 타입은 필수입니다.',
  55. 'in_list' => '유효하지 않은 요청 타입입니다.'
  56. ],
  57. 'STATUS' => [
  58. 'required' => '상태는 필수입니다.',
  59. 'in_list' => '유효하지 않은 상태입니다.'
  60. ],
  61. 'REQUESTED_BY' => [
  62. 'required' => '요청자는 필수입니다.',
  63. 'integer' => '요청자는 숫자여야 합니다.'
  64. ]
  65. ];
  66. protected $skipValidation = false;
  67. protected $cleanValidationRules = true;
  68. /**
  69. * 만료된 요청들을 처리
  70. */
  71. public function processExpiredRequests()
  72. {
  73. return $this->where('STATUS', 'PENDING')
  74. ->where('EXPIRED_DATE <', date('Y-m-d H:i:s'))
  75. ->where('IS_ACT', 'Y')
  76. ->set([
  77. 'STATUS' => 'EXPIRED',
  78. 'MOD_DATE' => date('Y-m-d H:i:s')
  79. ])
  80. ->update();
  81. }
  82. /**
  83. * 특정 벤더-인플루언서 조합의 활성 요청 확인
  84. */
  85. public function getActiveRequest($vendorSeq, $influencerSeq)
  86. {
  87. return $this->where('VENDOR_SEQ', $vendorSeq)
  88. ->where('INFLUENCER_SEQ', $influencerSeq)
  89. ->where('STATUS', 'PENDING')
  90. ->where('IS_ACT', 'Y')
  91. ->first();
  92. }
  93. /**
  94. * 사용자의 요청 목록 조회
  95. */
  96. public function getUserRequests($userSeq, $asInfluencer = true, $status = null)
  97. {
  98. $field = $asInfluencer ? 'INFLUENCER_SEQ' : 'VENDOR_SEQ';
  99. $builder = $this->where($field, $userSeq)
  100. ->where('IS_ACT', 'Y');
  101. if ($status) {
  102. $builder->where('STATUS', $status);
  103. }
  104. return $builder->findAll();
  105. }
  106. /**
  107. * 벤더사별 승인요청 통계
  108. */
  109. public function getVendorRequestStats($vendorSeq)
  110. {
  111. $builder = $this->where('VENDOR_SEQ', $vendorSeq)
  112. ->where('IS_ACT', 'Y');
  113. return [
  114. 'pending' => $builder->where('STATUS', 'PENDING')->countAllResults(false),
  115. 'approved' => $builder->where('STATUS', 'APPROVED')->countAllResults(false),
  116. 'rejected' => $builder->where('STATUS', 'REJECTED')->countAllResults(false),
  117. 'total' => $builder->countAllResults()
  118. ];
  119. }
  120. /**
  121. * 인플루언서별 요청 통계
  122. */
  123. public function getInfluencerRequestStats($influencerSeq)
  124. {
  125. $builder = $this->where('INFLUENCER_SEQ', $influencerSeq)
  126. ->where('IS_ACT', 'Y');
  127. return [
  128. 'pending' => $builder->where('STATUS', 'PENDING')->countAllResults(false),
  129. 'approved' => $builder->where('STATUS', 'APPROVED')->countAllResults(false),
  130. 'rejected' => $builder->where('STATUS', 'REJECTED')->countAllResults(false),
  131. 'total' => $builder->countAllResults()
  132. ];
  133. }
  134. }