'required|integer', 'INFLUENCER_SEQ' => 'required|integer', 'STATUS' => 'required|in_list[PENDING,APPROVED,REJECTED,TERMINATED]', 'REQUEST_TYPE' => 'required|in_list[NEW,REAPPLY]', 'REQUESTED_BY' => 'required|integer', 'IS_ACTIVE' => 'required|in_list[Y,N]' ]; protected $validationMessages = [ 'VENDOR_SEQ' => [ 'required' => '벤더사 SEQ는 필수입니다.', 'integer' => '벤더사 SEQ는 정수여야 합니다.' ], 'INFLUENCER_SEQ' => [ 'required' => '인플루언서 SEQ는 필수입니다.', 'integer' => '인플루언서 SEQ는 정수여야 합니다.' ], 'STATUS' => [ 'required' => '상태는 필수입니다.', 'in_list' => '유효하지 않은 상태입니다.' ], 'REQUEST_TYPE' => [ 'required' => '요청 타입은 필수입니다.', 'in_list' => '유효하지 않은 요청 타입입니다.' ], 'REQUESTED_BY' => [ 'required' => '요청자 SEQ는 필수입니다.', 'integer' => '요청자 SEQ는 정수여야 합니다.' ], 'IS_ACTIVE' => [ 'required' => 'IS_ACTIVE는 필수입니다.', 'in_list' => 'IS_ACTIVE는 Y 또는 N이어야 합니다.' ] ]; protected $skipValidation = false; protected $cleanValidationRules = true; // Callbacks protected $allowCallbacks = true; protected $beforeInsert = ['beforeInsert']; protected $afterInsert = []; protected $beforeUpdate = ['beforeUpdate']; protected $afterUpdate = []; protected $beforeFind = []; protected $afterFind = []; protected $beforeDelete = []; protected $afterDelete = []; /** * 삽입 전 처리 */ protected function beforeInsert(array $data) { if (!isset($data['data']['CREATED_AT'])) { $data['data']['CREATED_AT'] = date('Y-m-d H:i:s'); } if (!isset($data['data']['UPDATED_AT'])) { $data['data']['UPDATED_AT'] = date('Y-m-d H:i:s'); } if (!isset($data['data']['REQUEST_DATE'])) { $data['data']['REQUEST_DATE'] = date('Y-m-d H:i:s'); } return $data; } /** * 업데이트 전 처리 */ protected function beforeUpdate(array $data) { $data['data']['UPDATED_AT'] = date('Y-m-d H:i:s'); return $data; } /** * 벤더사의 인플루언서 요청 목록 조회 */ public function getInfluencerRequestsForVendor($vendorSeq, $filters = []) { $builder = $this->select(' VENDOR_INFLUENCER_PARTNERSHIP.*, VENDOR_INFLUENCER_PARTNERSHIP.STATUS as CURRENT_STATUS, VENDOR_INFLUENCER_PARTNERSHIP.REQUEST_TYPE as ADD_INFO1, VENDOR_INFLUENCER_PARTNERSHIP.PARTNERSHIP_END_DATE as ADD_INFO3, USER_LIST.NAME as INFLUENCER_NAME, USER_LIST.NICK_NAME as INFLUENCER_NICKNAME, USER_LIST.EMAIL as INFLUENCER_EMAIL, USER_LIST.PHONE as INFLUENCER_PHONE, USER_LIST.SNS_TYPE as SNS_TYPE, USER_LIST.SNS_LINK_ID as SNS_LINK_ID ') ->join('USER_LIST', 'USER_LIST.SEQ = VENDOR_INFLUENCER_PARTNERSHIP.INFLUENCER_SEQ', 'left') ->where('VENDOR_INFLUENCER_PARTNERSHIP.VENDOR_SEQ', $vendorSeq) ->where('VENDOR_INFLUENCER_PARTNERSHIP.IS_ACTIVE', 'Y'); // 필터 적용 if (!empty($filters['status'])) { $builder->where('VENDOR_INFLUENCER_PARTNERSHIP.STATUS', $filters['status']); } if (!empty($filters['keyword'])) { $builder->groupStart() ->like('USER_LIST.NAME', $filters['keyword']) ->orLike('USER_LIST.NICK_NAME', $filters['keyword']) ->orLike('USER_LIST.EMAIL', $filters['keyword']) ->groupEnd(); } $results = $builder->orderBy('VENDOR_INFLUENCER_PARTNERSHIP.CREATED_AT', 'DESC') ->get() ->getResultArray(); // PHP에서 SNS 채널 정보를 JSON 형식으로 변환 foreach ($results as &$row) { // SNS 채널 정보를 JSON 배열로 변환 $snsChannels = []; if (!empty($row['SNS_TYPE']) && !empty($row['SNS_LINK_ID'])) { $snsChannels[] = [ 'platform' => strtolower($row['SNS_TYPE']), 'handle' => $row['SNS_LINK_ID'] ]; } $row['influencerSnsChannels'] = json_encode($snsChannels); } return $results; } /** * 인플루언서의 벤더사 검색 */ public function searchVendorsForInfluencer($influencerSeq, $filters = []) { $builder = $this->db->table('VENDOR_LIST') ->select(' VENDOR_LIST.*, VIP.STATUS as PARTNERSHIP_STATUS, VIP.REQUEST_TYPE as PARTNERSHIP_REQUEST_TYPE, VIP.COMMISSION_RATE as CURRENT_COMMISSION_RATE, VIP.SPECIAL_CONDITIONS as CURRENT_SPECIAL_CONDITIONS, VIP.CREATED_AT as PARTNERSHIP_DATE ') ->join('VENDOR_INFLUENCER_PARTNERSHIP VIP', "VIP.VENDOR_SEQ = VENDOR_LIST.SEQ AND VIP.INFLUENCER_SEQ = {$influencerSeq} AND VIP.IS_ACTIVE = 'Y'", 'left') ->where('VENDOR_LIST.IS_ACT', 'Y'); // 필터 적용 if (!empty($filters['keyword'])) { $builder->like('VENDOR_LIST.COMPANY_NAME', $filters['keyword']); } if (!empty($filters['category'])) { $builder->where('VENDOR_LIST.CATEGORY', $filters['category']); } return $builder->orderBy('VENDOR_LIST.COMPANY_NAME', 'ASC') ->get() ->getResultArray(); } /** * 파트너십 요청 생성 */ public function createPartnershipRequest($data) { // 기존 활성 파트너십 비활성화 $this->deactivateExistingPartnership($data['VENDOR_SEQ'], $data['INFLUENCER_SEQ']); // 새 요청 생성 return $this->insert($data); } /** * 파트너십 승인 처리 */ public function approvePartnership($partnershipSeq, $processedBy, $responseMessage = '') { $updateData = [ 'STATUS' => 'APPROVED', 'PROCESSED_BY' => $processedBy, 'RESPONSE_MESSAGE' => $responseMessage, 'RESPONSE_DATE' => date('Y-m-d H:i:s'), 'PARTNERSHIP_START_DATE' => date('Y-m-d H:i:s') ]; return $this->update($partnershipSeq, $updateData); } /** * 파트너십 거부 처리 */ public function rejectPartnership($partnershipSeq, $processedBy, $responseMessage = '') { $updateData = [ 'STATUS' => 'REJECTED', 'PROCESSED_BY' => $processedBy, 'RESPONSE_MESSAGE' => $responseMessage, 'RESPONSE_DATE' => date('Y-m-d H:i:s') ]; return $this->update($partnershipSeq, $updateData); } /** * 파트너십 해지 처리 */ public function terminatePartnership($partnershipSeq, $processedBy, $responseMessage = '') { $updateData = [ 'STATUS' => 'TERMINATED', 'PROCESSED_BY' => $processedBy, 'RESPONSE_MESSAGE' => $responseMessage, 'RESPONSE_DATE' => date('Y-m-d H:i:s'), 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s') ]; return $this->update($partnershipSeq, $updateData); } /** * 기존 파트너십 비활성화 (재신청 시 사용) */ protected function deactivateExistingPartnership($vendorSeq, $influencerSeq) { return $this->where('VENDOR_SEQ', $vendorSeq) ->where('INFLUENCER_SEQ', $influencerSeq) ->where('IS_ACTIVE', 'Y') ->set(['IS_ACTIVE' => 'N']) ->update(); } /** * 현재 활성 파트너십 조회 */ public function getActivePartnership($vendorSeq, $influencerSeq) { return $this->where('VENDOR_SEQ', $vendorSeq) ->where('INFLUENCER_SEQ', $influencerSeq) ->where('IS_ACTIVE', 'Y') ->first(); } /** * 벤더사 통계 조회 */ public function getVendorStats($vendorSeq) { $result = $this->select('STATUS, COUNT(*) as count') ->where('VENDOR_SEQ', $vendorSeq) ->where('IS_ACTIVE', 'Y') ->groupBy('STATUS') ->get() ->getResultArray(); $stats = [ 'pending' => 0, 'approved' => 0, 'rejected' => 0, 'terminated' => 0, 'total' => 0 ]; foreach ($result as $row) { $status = strtolower($row['STATUS']); $stats[$status] = (int)$row['count']; $stats['total'] += (int)$row['count']; } return $stats; } }