| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- <?php
- namespace App\Models;
- use CodeIgniter\Model;
- class VendorModel extends Model
- {
- protected $table = 'VENDOR_LIST';
- protected $primaryKey = 'SEQ';
- protected $useAutoIncrement = true;
- protected $returnType = 'array';
- protected $useSoftDeletes = false;
-
- protected $allowedFields = [
- 'COMPANY_NAME',
- 'EMAIL',
- 'CATEGORY',
- 'REGION',
- 'DESCRIPTION',
- 'LOGO',
- 'TAGS',
- 'APPROVAL_STATUS',
- 'APPROVED_DATE',
- 'IS_ACT',
- 'REG_DATE',
- 'MOD_DATE',
- 'LAST_LOGIN_DATE',
- 'PASSWORD',
- 'PHONE',
- 'ADDRESS',
- 'BUSINESS_NUMBER',
- 'CEO_NAME',
- 'ESTABLISHMENT_DATE'
- ];
-
- protected $useTimestamps = true;
- protected $createdField = 'REG_DATE';
- protected $updatedField = 'MOD_DATE';
-
- protected $validationRules = [
- 'COMPANY_NAME' => 'required|max_length[255]',
- 'EMAIL' => 'required|valid_email|is_unique[VENDOR_LIST.EMAIL,SEQ,{SEQ}]',
- 'CATEGORY' => 'permit_empty|in_list[FASHION_BEAUTY,FOOD_HEALTH,LIFESTYLE,TECH_ELECTRONICS,SPORTS_LEISURE,CULTURE_ENTERTAINMENT]',
- 'REGION' => 'permit_empty|in_list[SEOUL,GYEONGGI,INCHEON,BUSAN,DAEGU,DAEJEON,GWANGJU,ULSAN,OTHER]',
- 'APPROVAL_STATUS' => 'permit_empty|in_list[PENDING,APPROVED,REJECTED]',
- 'IS_ACT' => 'required|in_list[Y,N]',
- 'PHONE' => 'permit_empty|max_length[20]',
- 'BUSINESS_NUMBER' => 'permit_empty|max_length[20]'
- ];
-
- protected $validationMessages = [
- 'COMPANY_NAME' => [
- 'required' => '회사명은 필수입니다.',
- 'max_length' => '회사명은 255자를 초과할 수 없습니다.'
- ],
- 'EMAIL' => [
- 'required' => '이메일은 필수입니다.',
- 'valid_email' => '유효한 이메일 형식이 아닙니다.',
- 'is_unique' => '이미 등록된 이메일입니다.'
- ],
- 'CATEGORY' => [
- 'in_list' => '유효하지 않은 카테고리입니다.'
- ],
- 'REGION' => [
- 'in_list' => '유효하지 않은 지역입니다.'
- ],
- 'APPROVAL_STATUS' => [
- 'in_list' => '유효하지 않은 승인 상태입니다.'
- ],
- 'IS_ACT' => [
- 'required' => '활성 상태는 필수입니다.',
- 'in_list' => '활성 상태는 Y 또는 N이어야 합니다.'
- ]
- ];
-
- protected $skipValidation = false;
- protected $cleanValidationRules = true;
-
- /**
- * 벤더사 검색
- */
- public function searchVendors($filters = [], $page = 1, $perPage = 12)
- {
- $builder = $this->builder();
- $builder->where('IS_ACT', 'Y');
-
- // 키워드 검색
- if (!empty($filters['keyword'])) {
- $builder->groupStart()
- ->like('COMPANY_NAME', $filters['keyword'])
- ->orLike('DESCRIPTION', $filters['keyword'])
- ->orLike('TAGS', $filters['keyword'])
- ->groupEnd();
- }
-
- // 카테고리 필터
- if (!empty($filters['category'])) {
- $builder->where('CATEGORY', $filters['category']);
- }
-
- // 지역 필터
- if (!empty($filters['region'])) {
- $builder->where('REGION', $filters['region']);
- }
-
- // 정렬
- switch ($filters['sortBy'] ?? 'latest') {
- case 'partnership':
- $builder->orderBy('PARTNERSHIP_COUNT', 'DESC')
- ->orderBy('REG_DATE', 'DESC');
- break;
- case 'name':
- $builder->orderBy('COMPANY_NAME', 'ASC');
- break;
- case 'latest':
- default:
- $builder->orderBy('REG_DATE', 'DESC');
- break;
- }
-
- // 페이징
- $offset = ($page - 1) * $perPage;
- return $builder->limit($perPage, $offset)->get()->getResultArray();
- }
-
- /**
- * 검색 결과 총 개수
- */
- public function countSearchResults($filters = [])
- {
- $builder = $this->builder();
- $builder->where('IS_ACT', 'Y');
-
- // 키워드 검색
- if (!empty($filters['keyword'])) {
- $builder->groupStart()
- ->like('COMPANY_NAME', $filters['keyword'])
- ->orLike('DESCRIPTION', $filters['keyword'])
- ->orLike('TAGS', $filters['keyword'])
- ->groupEnd();
- }
-
- // 카테고리 필터
- if (!empty($filters['category'])) {
- $builder->where('CATEGORY', $filters['category']);
- }
-
- // 지역 필터
- if (!empty($filters['region'])) {
- $builder->where('REGION', $filters['region']);
- }
-
- return $builder->countAllResults();
- }
-
- /**
- * 활성 벤더사 목록
- */
- public function getActiveVendors()
- {
- return $this->where('IS_ACT', 'Y')
- ->where('APPROVAL_STATUS', 'APPROVED')
- ->orderBy('REG_DATE', 'DESC')
- ->findAll();
- }
-
- /**
- * 카테고리별 벤더사 통계
- */
- public function getCategoryStats()
- {
- return $this->select('CATEGORY, COUNT(*) as count')
- ->where('IS_ACT', 'Y')
- ->groupBy('CATEGORY')
- ->findAll();
- }
-
- /**
- * 지역별 벤더사 통계
- */
- public function getRegionStats()
- {
- return $this->select('REGION, COUNT(*) as count')
- ->where('IS_ACT', 'Y')
- ->groupBy('REGION')
- ->findAll();
- }
- }
|