| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- <?php
- namespace App\Models;
- use CodeIgniter\Model;
- class InfluencerModel extends Model
- {
- protected $table = 'USER_LIST';
- protected $primaryKey = 'SEQ';
- protected $useAutoIncrement = true;
- protected $returnType = 'array';
- protected $useSoftDeletes = false;
-
- protected $allowedFields = [
- 'ID',
- 'PASSWORD',
- 'NICK_NAME',
- 'NAME',
- 'EMAIL',
- 'PHONE',
- 'MEMBER_TYPE',
- 'STATUS',
- 'PROFILE_IMAGE',
- 'LAST_LOGIN_DATE',
- 'IS_ACT',
- 'REG_DATE',
- 'MOD_DATE',
- // 인플루언서 전용 필드들
- 'INFLUENCER_TYPE',
- 'PRIMARY_CATEGORY',
- 'SECONDARY_CATEGORY',
- 'FOLLOWER_COUNT',
- 'ENGAGEMENT_RATE',
- 'AVERAGE_VIEWS',
- 'SNS_CHANNELS',
- 'REGION',
- 'DESCRIPTION',
- 'PORTFOLIO_URL',
- 'BANK_NAME',
- 'ACCOUNT_NUMBER',
- 'ACCOUNT_HOLDER',
- 'TAX_INFO',
- 'RATING',
- 'VERIFICATION_STATUS',
- 'PREFERRED_CATEGORIES',
- 'MIN_COMMISSION_RATE',
- 'AVAILABLE_REGIONS'
- ];
-
- protected $useTimestamps = true;
- protected $createdField = 'REG_DATE';
- protected $updatedField = 'MOD_DATE';
- protected $dateFormat = 'datetime';
-
- protected $validationRules = [
- 'ID' => 'required|min_length[4]|max_length[50]|is_unique[USER_LIST.ID,SEQ,{SEQ}]',
- 'PASSWORD' => 'required|min_length[8]',
- 'NICK_NAME' => 'required|min_length[2]|max_length[50]',
- 'EMAIL' => 'required|valid_email|is_unique[USER_LIST.EMAIL,SEQ,{SEQ}]',
- 'PHONE' => 'permit_empty|min_length[10]|max_length[15]',
- 'MEMBER_TYPE' => 'required|in_list[INFLUENCER]',
- 'STATUS' => 'required|in_list[ACTIVE,INACTIVE,SUSPENDED,PENDING]',
- 'INFLUENCER_TYPE' => 'permit_empty|in_list[MICRO,MACRO,MEGA,NANO]',
- 'FOLLOWER_COUNT' => 'permit_empty|integer|greater_than_equal_to[0]',
- 'ENGAGEMENT_RATE' => 'permit_empty|decimal|greater_than_equal_to[0]|less_than_equal_to[100]',
- 'IS_ACT' => 'required|in_list[Y,N]'
- ];
-
- protected $validationMessages = [
- 'ID' => [
- 'required' => '아이디는 필수입니다.',
- 'min_length' => '아이디는 최소 4자 이상이어야 합니다.',
- 'is_unique' => '이미 사용 중인 아이디입니다.'
- ],
- 'EMAIL' => [
- 'required' => '이메일은 필수입니다.',
- 'valid_email' => '올바른 이메일 형식이 아닙니다.',
- 'is_unique' => '이미 사용 중인 이메일입니다.'
- ],
- 'NICK_NAME' => [
- 'required' => '닉네임은 필수입니다.',
- 'min_length' => '닉네임은 최소 2자 이상이어야 합니다.'
- ]
- ];
-
- protected $beforeInsert = ['hashPassword', 'setInfluencerDefaults'];
- protected $beforeUpdate = ['hashPassword'];
-
- /**
- * 패스워드 해시화
- */
- protected function hashPassword(array $data)
- {
- if (isset($data['data']['PASSWORD'])) {
- $data['data']['PASSWORD'] = password_hash($data['data']['PASSWORD'], PASSWORD_DEFAULT);
- }
- return $data;
- }
-
- /**
- * 인플루언서 기본값 설정
- */
- protected function setInfluencerDefaults(array $data)
- {
- if (!isset($data['data']['MEMBER_TYPE'])) {
- $data['data']['MEMBER_TYPE'] = 'INFLUENCER';
- }
- if (!isset($data['data']['STATUS'])) {
- $data['data']['STATUS'] = 'PENDING';
- }
- if (!isset($data['data']['IS_ACT'])) {
- $data['data']['IS_ACT'] = 'Y';
- }
- if (!isset($data['data']['VERIFICATION_STATUS'])) {
- $data['data']['VERIFICATION_STATUS'] = 'PENDING';
- }
- return $data;
- }
-
- /**
- * 인플루언서 목록 조회 (필터링)
- */
- public function getInfluencers($filters = [])
- {
- $builder = $this->builder();
- $builder->where('MEMBER_TYPE', 'INFLUENCER');
- $builder->where('IS_ACT', 'Y');
-
- // 상태 필터
- if (isset($filters['status'])) {
- $builder->where('STATUS', $filters['status']);
- }
-
- // 카테고리 필터
- if (isset($filters['category'])) {
- $builder->where('PRIMARY_CATEGORY', $filters['category']);
- }
-
- // 지역 필터
- if (isset($filters['region'])) {
- $builder->where('REGION', $filters['region']);
- }
-
- // 팔로워 수 범위
- if (isset($filters['min_followers'])) {
- $builder->where('FOLLOWER_COUNT >=', $filters['min_followers']);
- }
- if (isset($filters['max_followers'])) {
- $builder->where('FOLLOWER_COUNT <=', $filters['max_followers']);
- }
-
- // 인플루언서 타입
- if (isset($filters['influencer_type'])) {
- $builder->where('INFLUENCER_TYPE', $filters['influencer_type']);
- }
-
- // 검증 상태
- if (isset($filters['verification_status'])) {
- $builder->where('VERIFICATION_STATUS', $filters['verification_status']);
- }
-
- // 키워드 검색
- if (isset($filters['keyword'])) {
- $builder->groupStart()
- ->like('NICK_NAME', $filters['keyword'])
- ->orLike('NAME', $filters['keyword'])
- ->orLike('DESCRIPTION', $filters['keyword'])
- ->groupEnd();
- }
-
- // 정렬
- $sortBy = $filters['sort_by'] ?? 'REG_DATE';
- $sortOrder = $filters['sort_order'] ?? 'DESC';
- $builder->orderBy($sortBy, $sortOrder);
-
- return $builder;
- }
-
- /**
- * 인플루언서 프로필 조회
- */
- public function getProfile($influencerSeq)
- {
- return $this->select('
- SEQ, ID, NICK_NAME, NAME, EMAIL, PHONE, PROFILE_IMAGE,
- INFLUENCER_TYPE, PRIMARY_CATEGORY, SECONDARY_CATEGORY,
- FOLLOWER_COUNT, ENGAGEMENT_RATE, AVERAGE_VIEWS,
- SNS_CHANNELS, REGION, DESCRIPTION, PORTFOLIO_URL,
- RATING, VERIFICATION_STATUS, PREFERRED_CATEGORIES,
- MIN_COMMISSION_RATE, AVAILABLE_REGIONS,
- REG_DATE, MOD_DATE, LAST_LOGIN_DATE
- ')
- ->where('SEQ', $influencerSeq)
- ->where('MEMBER_TYPE', 'INFLUENCER')
- ->where('IS_ACT', 'Y')
- ->first();
- }
-
- /**
- * 인플루언서 통계 조회
- */
- public function getStats($influencerSeq)
- {
- // 파트너십 통계는 별도 모델에서 처리
- $partnershipModel = new \App\Models\InfluencerPartnershipModel();
- return $partnershipModel->getInfluencerStats($influencerSeq);
- }
-
- /**
- * 인플루언서 검증 상태 업데이트
- */
- public function updateVerificationStatus($influencerSeq, $status, $reason = '')
- {
- $data = [
- 'VERIFICATION_STATUS' => $status,
- 'MOD_DATE' => date('Y-m-d H:i:s')
- ];
-
- if (!empty($reason)) {
- $data['VERIFICATION_REASON'] = $reason;
- }
-
- return $this->update($influencerSeq, $data);
- }
-
- /**
- * 카테고리별 인플루언서 수 조회
- */
- public function getCountByCategory()
- {
- return $this->select('PRIMARY_CATEGORY, COUNT(*) as count')
- ->where('MEMBER_TYPE', 'INFLUENCER')
- ->where('IS_ACT', 'Y')
- ->where('STATUS', 'ACTIVE')
- ->groupBy('PRIMARY_CATEGORY')
- ->findAll();
- }
-
- /**
- * 인플루언서 타입별 통계
- */
- public function getCountByType()
- {
- return $this->select('INFLUENCER_TYPE, COUNT(*) as count')
- ->where('MEMBER_TYPE', 'INFLUENCER')
- ->where('IS_ACT', 'Y')
- ->where('STATUS', 'ACTIVE')
- ->groupBy('INFLUENCER_TYPE')
- ->findAll();
- }
-
- /**
- * 로그인 검증
- */
- public function verifyLogin($id, $password)
- {
- $user = $this->where('ID', $id)
- ->where('MEMBER_TYPE', 'INFLUENCER')
- ->where('IS_ACT', 'Y')
- ->first();
-
- if ($user && password_verify($password, $user['PASSWORD'])) {
- // 마지막 로그인 시간 업데이트
- $this->update($user['SEQ'], [
- 'LAST_LOGIN_DATE' => date('Y-m-d H:i:s')
- ]);
-
- unset($user['PASSWORD']); // 패스워드 제거 후 반환
- return $user;
- }
-
- return false;
- }
-
- /**
- * 인플루언서 랭킹 조회
- */
- public function getTopInfluencers($limit = 10, $category = null)
- {
- $builder = $this->select('
- SEQ, NICK_NAME, PROFILE_IMAGE, FOLLOWER_COUNT,
- ENGAGEMENT_RATE, RATING, PRIMARY_CATEGORY
- ');
- $builder->where('MEMBER_TYPE', 'INFLUENCER');
- $builder->where('IS_ACT', 'Y');
- $builder->where('STATUS', 'ACTIVE');
- $builder->where('VERIFICATION_STATUS', 'VERIFIED');
-
- if ($category) {
- $builder->where('PRIMARY_CATEGORY', $category);
- }
-
- $builder->orderBy('RATING', 'DESC');
- $builder->orderBy('FOLLOWER_COUNT', 'DESC');
- $builder->limit($limit);
-
- return $builder->get()->getResultArray();
- }
- }
|