Files
2025-03-05 14:02:29 +09:00

327 lines
13 KiB
PHP

<?php
namespace App\Models\EventManage;
use CodeIgniter\Model;
class EventModel extends Model
{
protected $facebook, $google, $kakao;
public function __construct()
{
$this->db = \Config\Database::connect();
$this->facebook = \Config\Database::connect('facebook');
$this->google = \Config\Database::connect('google');
$this->kakao = \Config\Database::connect('kakao');
}
public function getInformation($data)
{
$srch = $data['searchData'];
$builder = $this->db->table('event_information AS info');
$builder->select('IFNULL(db.db_count, 0) AS db, adv.name AS advertiser_name, med.media AS media_name, SUM(imp.impressions) AS impressions, info.*');
$builder->join('event_advertiser AS adv', 'info.advertiser = adv.seq', 'left');
$builder->join('event_media AS med', 'info.media = med.seq', 'left');
if(!empty($srch['stx'])){
$builder->join('event_keyword_idx AS eki', 'eki.ei_seq = info.seq', 'left');
$builder->join('event_keyword AS ek', 'ek.seq = eki.ek_seq', 'left');
}
$builder->join('(SELECT seq, SUM(db_count) AS db_count FROM event_leads_count GROUP BY seq) AS db', 'info.seq = db.seq', 'left');
$builder->join('event_impressions_history AS imp', 'info.seq = imp.seq', 'left');
if(!empty($srch['sdate']) && !empty($srch['edate'])){
$builder->where('info.ei_datetime >=', $srch['sdate']);
$builder->where('info.ei_datetime <', date('Y-m-d', strtotime($srch['edate'].' + 1day')));
}
if(!empty($srch['stx'])){
$builder->groupStart();
$stx[] = $srch['stx'];
if(preg_match('/\s/', $srch['stx']))
$stx = @explode(" ", $srch['stx']);
foreach($stx as $v) {
$builder->orLike('ek.keyword', trim($v));
$builder->orLike('info.title', trim($v));
$builder->orLike('adv.name', trim($v));
$builder->orLike('med.media', trim($v));
$builder->orLike('info.description', trim($v));
$builder->orLike('info.seq', trim($v));
}
$builder->groupEnd();
}
$builder->groupBy('info.seq');
// limit 적용하지 않은 쿼리
$builderNoLimit = clone $builder;
$orderBy = [];
if(!empty($data['order'])) {
foreach($data['order'] as $row) {
$col = $data['columns'][$row['column']]['data'];
if($col) $orderBy[] = "{$col} {$row['dir']}";
}
}
$orderBy[] = "info.seq DESC";
$builder->orderBy(implode(",", $orderBy),'',true);
if($data['length'] > 0) $builder->limit($data['length'], $data['start']);
// exit($builder->getCompiledSelect());
// 결과 반환
$_result = $builder->get();
$result = $_result->getResultArray();
//->getResultArray();
// var_dump($builderNoLimit->countAll()); exit;
$resultNoLimit = $builderNoLimit->countAll();
return [
'data' => $result,
'allCount' => $resultNoLimit
];
}
public function getInformationAll()
{
$builder = $this->db->table('event_information AS info');
$builder->select('*');
$builder->where('(designer IS NULL OR designer = "") OR (developer IS NULL OR developer = "")');
$builder->orderBy('seq', 'desc');
$builder->limit(200);
$result = $builder->get()->getResultArray();
return $result;
}
public function getIssuesFromMantis()
{
$builder = $this->db->table('mantis.mantis_bug_table AS A');
$builder->select('A.id, B.text, D.realname AS developer, C.value AS designer');
$builder->join('mantis.mantis_custom_field_string_table AS B', 'A.id = B.bug_id AND B.field_id = "20" AND B.text LIKE "%//%"', 'left');
$builder->join('mantis.mantis_custom_field_string_table AS C', 'A.id = C.bug_id AND C.field_id = "10"', 'left');
$builder->join('mantis.mantis_user_table AS D', 'A.handler_id = D.id', 'left');
$builder->where('B.text IS NOT NULL');
$result = $builder->get()->getResultArray();
return $result;
}
public function getEnabledAds()
{
// if($this->facebook->getConnection() == false || $this->google->getConnection() == false || $this->kakao->getConnection() == false) return false;
if(null === ($result = cache("getEnabledAds"))) {
$fbSubQuery = $this->db->table('z_facebook.fb_ad AS ad');
$fbSubQuery->select('ad.ad_name AS name, cr.link AS link');
$fbSubQuery->join('z_facebook.fb_adcreative AS cr', 'cr.ad_id = ad.ad_id', 'left');
$fbSubQuery->where('ad.effective_status', 'ACTIVE');
$fbSubQuery->groupStart();
$fbSubQuery->like('ad.ad_name', '#');
$fbSubQuery->orLike('ad.code', '#');
$fbSubQuery->orGroupStart();
$fbSubQuery->where('cr.link !=', '');
$fbSubQuery->groupEnd();
$fbSubQuery->groupEnd();
$awSubQuery = $this->db->table('z_adwords.aw_ad AS ad');
$awSubQuery->select("IF(INSTR(code, '#')>0, ad.code, ad.name) AS name, ad.finalUrl AS link");
$awSubQuery->join('z_adwords.aw_adgroup AS ag', 'ad.adgroupId = ag.id', 'left');
$awSubQuery->join('z_adwords.aw_campaign AS ac', 'ag.campaignId = ac.id', 'left');
$awSubQuery->where('ad.status', 'ENABLED');
$awSubQuery->where('ag.status', 'ENABLED');
$awSubQuery->where('ac.status', 'ENABLED');
$awSubQuery->groupStart();
$awSubQuery->like('ad.name', '#');
$awSubQuery->orLike('ad.code', '#');
$awSubQuery->orGroupStart();
$awSubQuery->where('ad.finalUrl !=', '');
$awSubQuery->groupEnd();
$awSubQuery->groupEnd();
$mmSubQuery = $this->db->table('z_moment.mm_creative AS ad');
$mmSubQuery->select('ad.name, ad.landingUrl AS link');
$mmSubQuery->join('z_moment.mm_adgroup AS ag', 'ad.adgroup_id = ag.id', 'left');
$mmSubQuery->join('z_moment.mm_campaign AS ac', 'ag.campaign_id = ac.id', 'left');
$mmSubQuery->where('ad.config', 'ON');
$mmSubQuery->where('ag.config', 'ON');
$mmSubQuery->where('ac.config', 'ON');
$mmSubQuery->groupStart();
$mmSubQuery->like('ad.name', '#');
$mmSubQuery->orLike('ad.code', '#');
$mmSubQuery->orGroupStart();
$mmSubQuery->where('ad.landingUrl !=', '');
$mmSubQuery->groupEnd();
$mmSubQuery->groupEnd();
$fbSubQuery->union($awSubQuery)->union($mmSubQuery);
$resultQuery = $this->db->newQuery()->fromSubquery($fbSubQuery, 'tb');
$resultQuery->where("tb.name REGEXP('^.*#([0-9]+).*') OR tb.link REGEXP('.+(kr|com|event)\/([0-9]+)')");
$result = $resultQuery->get()->getResultArray();
cache()->save("getEnabledAds", $result, 1800); //save to cache
}
foreach($result as $row) {
if(preg_match('/^.+(kr|com|event)\/([0-9]{3,6})(\?.+)?$/', $row['link'])) {
$data[] = preg_replace('/^.+(kr|com|event)\/([0-9]{3,6})(\?.+)?/', '$2', $row['link']);
} else if(preg_match('/^.*\#([0-9]+).*/', $row['name'])) {
$data[] = preg_replace('/^.*\#([0-9]+).*/', '$1', $row['name']);
}
}
$data = array_unique($data);
return $data;
}
public function getAdv($stx)
{
$builder = $this->db->table('event_advertiser');
$builder->select('seq as id, name as value');
if(!empty($stx)){
$builder->like('name', $stx);
}
$result = $builder->get()->getResultArray();
return $result;
}
public function getMedia($stx)
{
$builder = $this->db->table('event_media');
$builder->select('seq as id, media as value');
if(!empty($stx)){
$builder->like('media', $stx);
}
$result = $builder->get()->getResultArray();
return $result;
}
public function createEvent($data)
{
$this->db->transStart();
$keyword = $data['keyword'];
unset($data['keyword']);
$builder = $this->db->table('event_information');
$builder->insert($data);
$seq = $this->db->insertID();
$event = $builder->getWhere(['seq' => $seq])->getRowArray();
$result = $this->db->transComplete();
if(!empty($event)){
$this->syncKeyword($keyword, $event['seq']);
return $result;
}
}
public function updateEvent($data, $seq)
{
$this->db->transStart();
$keyword = $data['keyword'];
unset($data['keyword']);
$builder = $this->db->table('event_information');
$builder->where('seq', $seq);
$builder->update($data);
$result = $this->db->transComplete();
if($result){
$this->syncKeyword($keyword, $seq);
}
return $result;
}
public function updateEventWorker($data, $seq)
{
$this->db->transStart();
$builder = $this->db->table('event_information');
$builder->where('seq', $seq);
$builder->update($data);
$result = $this->db->transComplete();
return $result;
}
public function copyEvent($seq)
{
$this->db->transStart();
$data = $this->db->table('event_information')->select('advertiser, media, lead, title, description, subtitle, object, object_items, interlock, partner_id, partner_name, paper_code, paper_name, pixel_id, view_script, done_script, db_price, check_gender, check_age_min, check_age_max, duplicate_term, check_phone, check_name, check_cookie, custom')
->where('seq', $seq)
->get()->getRowArray();
$data['is_stop'] = 0;
$data['username'] = auth()->user()->nickname;
$data['ei_datetime'] = date('Y-m-d H:i:s');
$builder = $this->db->table('event_information');
$builder->insert($data);
$insert_id = $this->db->insertID();
$result = $this->db->transComplete();
if($result) {
return $insert_id;
}
return $result;
}
public function getEvent($seq)
{
$builder = $this->db->table('event_information AS info');
$builder->select('info.*, adv.name AS advertiser_name, med.media AS media_name, GROUP_CONCAT(ek.keyword) AS keywords');
$builder->join('event_advertiser AS adv', 'info.advertiser = adv.seq', 'left');
$builder->join('event_media AS med', 'info.media = med.seq', 'left');
$builder->join('event_keyword_idx AS ki', 'info.seq = ki.ei_seq', 'left');
$builder->join('event_keyword AS ek', 'ki.ek_seq = ek.seq', 'left');
$builder->where('info.seq', $seq);
$result = $builder->get()->getRowArray();
return $result;
}
public function getEventImpressions($seq)
{
$builder = $this->db->table('event_impressions_history');
$builder->select('seq, code, site, SUM(impressions) AS impressions');
$builder->where('seq', $seq);
$builder->groupBy(['seq', 'code', 'site']);
$result = $builder->get()->getResultArray();
return $result;
}
public function deleteEvent($seq)
{
$this->db->transStart();
$builder = $this->db->table('event_information');
$builder->where('seq', $seq);
$result = $builder->delete();
$result = $this->db->transComplete();
return $result;
}
public function syncKeyword($keywords, $seq)
{
$this->db->transStart();
$builder_3 = $this->db->table('event_keyword_idx');
$builder_3->where('ei_seq', $seq);
$builder_3->delete();
if(!empty($keywords)){
$keywords = explode(',', $keywords);
foreach ($keywords as $keyword) {
$builder_1 = $this->db->table('event_keyword');
$builder_1->select('seq, keyword');
$builder_1->where('keyword', $keyword);
$existRow = $builder_1->get()->getRowArray();
if(empty($existRow)){
$builder_2 = $this->db->table('event_keyword');
$builder_2->set('keyword', $keyword);
$builder_2->insert();
$existRow = $builder_2->getWhere(['seq' => $this->db->insertID()])->getRowArray();
}
$builder_4 = $this->db->table('event_keyword_idx');
$builder_4->set('ei_seq', $seq);
$builder_4->set('ek_seq', $existRow['seq']);
$builder_4->insert();
}
}
$result = $this->db->transComplete();
return $result;
}
}