VendorModel.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. namespace App\Models;
  3. use CodeIgniter\Model;
  4. class VendorModel extends Model
  5. {
  6. protected $table = 'VENDOR_LIST';
  7. protected $primaryKey = 'SEQ';
  8. protected $useAutoIncrement = true;
  9. protected $returnType = 'array';
  10. protected $useSoftDeletes = false;
  11. protected $allowedFields = [
  12. 'COMPANY_NAME',
  13. 'EMAIL',
  14. 'CATEGORY',
  15. 'REGION',
  16. 'DESCRIPTION',
  17. 'LOGO',
  18. 'TAGS',
  19. 'APPROVAL_STATUS',
  20. 'APPROVED_DATE',
  21. 'IS_ACT',
  22. 'REG_DATE',
  23. 'MOD_DATE',
  24. 'LAST_LOGIN_DATE',
  25. 'PASSWORD',
  26. 'PHONE',
  27. 'ADDRESS',
  28. 'BUSINESS_NUMBER',
  29. 'CEO_NAME',
  30. 'ESTABLISHMENT_DATE'
  31. ];
  32. protected $useTimestamps = true;
  33. protected $createdField = 'REG_DATE';
  34. protected $updatedField = 'MOD_DATE';
  35. protected $validationRules = [
  36. 'COMPANY_NAME' => 'required|max_length[255]',
  37. 'EMAIL' => 'required|valid_email|is_unique[VENDOR_LIST.EMAIL,SEQ,{SEQ}]',
  38. 'CATEGORY' => 'permit_empty|in_list[FASHION_BEAUTY,FOOD_HEALTH,LIFESTYLE,TECH_ELECTRONICS,SPORTS_LEISURE,CULTURE_ENTERTAINMENT]',
  39. 'REGION' => 'permit_empty|in_list[SEOUL,GYEONGGI,INCHEON,BUSAN,DAEGU,DAEJEON,GWANGJU,ULSAN,OTHER]',
  40. 'APPROVAL_STATUS' => 'permit_empty|in_list[PENDING,APPROVED,REJECTED]',
  41. 'IS_ACT' => 'required|in_list[Y,N]',
  42. 'PHONE' => 'permit_empty|max_length[20]',
  43. 'BUSINESS_NUMBER' => 'permit_empty|max_length[20]'
  44. ];
  45. protected $validationMessages = [
  46. 'COMPANY_NAME' => [
  47. 'required' => '회사명은 필수입니다.',
  48. 'max_length' => '회사명은 255자를 초과할 수 없습니다.'
  49. ],
  50. 'EMAIL' => [
  51. 'required' => '이메일은 필수입니다.',
  52. 'valid_email' => '유효한 이메일 형식이 아닙니다.',
  53. 'is_unique' => '이미 등록된 이메일입니다.'
  54. ],
  55. 'CATEGORY' => [
  56. 'in_list' => '유효하지 않은 카테고리입니다.'
  57. ],
  58. 'REGION' => [
  59. 'in_list' => '유효하지 않은 지역입니다.'
  60. ],
  61. 'APPROVAL_STATUS' => [
  62. 'in_list' => '유효하지 않은 승인 상태입니다.'
  63. ],
  64. 'IS_ACT' => [
  65. 'required' => '활성 상태는 필수입니다.',
  66. 'in_list' => '활성 상태는 Y 또는 N이어야 합니다.'
  67. ]
  68. ];
  69. protected $skipValidation = false;
  70. protected $cleanValidationRules = true;
  71. /**
  72. * 벤더사 검색
  73. */
  74. public function searchVendors($filters = [], $page = 1, $perPage = 12)
  75. {
  76. $builder = $this->builder();
  77. $builder->where('IS_ACT', 'Y');
  78. // 키워드 검색
  79. if (!empty($filters['keyword'])) {
  80. $builder->groupStart()
  81. ->like('COMPANY_NAME', $filters['keyword'])
  82. ->orLike('DESCRIPTION', $filters['keyword'])
  83. ->orLike('TAGS', $filters['keyword'])
  84. ->groupEnd();
  85. }
  86. // 카테고리 필터
  87. if (!empty($filters['category'])) {
  88. $builder->where('CATEGORY', $filters['category']);
  89. }
  90. // 지역 필터
  91. if (!empty($filters['region'])) {
  92. $builder->where('REGION', $filters['region']);
  93. }
  94. // 정렬
  95. switch ($filters['sortBy'] ?? 'latest') {
  96. case 'partnership':
  97. $builder->orderBy('PARTNERSHIP_COUNT', 'DESC')
  98. ->orderBy('REG_DATE', 'DESC');
  99. break;
  100. case 'name':
  101. $builder->orderBy('COMPANY_NAME', 'ASC');
  102. break;
  103. case 'latest':
  104. default:
  105. $builder->orderBy('REG_DATE', 'DESC');
  106. break;
  107. }
  108. // 페이징
  109. $offset = ($page - 1) * $perPage;
  110. return $builder->limit($perPage, $offset)->get()->getResultArray();
  111. }
  112. /**
  113. * 검색 결과 총 개수
  114. */
  115. public function countSearchResults($filters = [])
  116. {
  117. $builder = $this->builder();
  118. $builder->where('IS_ACT', 'Y');
  119. // 키워드 검색
  120. if (!empty($filters['keyword'])) {
  121. $builder->groupStart()
  122. ->like('COMPANY_NAME', $filters['keyword'])
  123. ->orLike('DESCRIPTION', $filters['keyword'])
  124. ->orLike('TAGS', $filters['keyword'])
  125. ->groupEnd();
  126. }
  127. // 카테고리 필터
  128. if (!empty($filters['category'])) {
  129. $builder->where('CATEGORY', $filters['category']);
  130. }
  131. // 지역 필터
  132. if (!empty($filters['region'])) {
  133. $builder->where('REGION', $filters['region']);
  134. }
  135. return $builder->countAllResults();
  136. }
  137. /**
  138. * 활성 벤더사 목록
  139. */
  140. public function getActiveVendors()
  141. {
  142. return $this->where('IS_ACT', 'Y')
  143. ->where('APPROVAL_STATUS', 'APPROVED')
  144. ->orderBy('REG_DATE', 'DESC')
  145. ->findAll();
  146. }
  147. /**
  148. * 카테고리별 벤더사 통계
  149. */
  150. public function getCategoryStats()
  151. {
  152. return $this->select('CATEGORY, COUNT(*) as count')
  153. ->where('IS_ACT', 'Y')
  154. ->groupBy('CATEGORY')
  155. ->findAll();
  156. }
  157. /**
  158. * 지역별 벤더사 통계
  159. */
  160. public function getRegionStats()
  161. {
  162. return $this->select('REGION, COUNT(*) as count')
  163. ->where('IS_ACT', 'Y')
  164. ->groupBy('REGION')
  165. ->findAll();
  166. }
  167. }