'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(); } }