db = \Config\Database::connect('google'); $this->zenith = \Config\Database::connect(); } public function __call(string $method, array $data) { if (is_array($data)) { array_walk_recursive($data, function (&$v) { if (is_string($v)) $v = $this->db->escape($v); }); } if (!method_exists($this, $method)) trigger_error('Call to undefined method ' . __CLASS__ . '::' . $method . '()', E_USER_ERROR); return call_user_func_array([$this, $method], $data); } public function updateAccount($data, $is_hidden = 0) { //1 숨김, 0 활성화 $is_update = 0; if ($is_hidden == '0') { $is_update = 1; //1 업데이트, 0 제외 } if(!isset($data['customerId'])) return; $sql = "INSERT INTO aw_ad_account ( customerId, manageCustomer, name, status, level, canManageClients, currencyCode, dateTimeZone, testAccount, is_hidden, is_manager, create_time) VALUES ( :customerId:, :manageCustomer:, :name:, :status:, :level:, :canManageClients:, :currencyCode:, :dateTimeZone:, :testAccount:, :is_hidden:, :is_manager:, NOW() ) ON DUPLICATE KEY UPDATE customerId = :customerId:, manageCustomer = :manageCustomer:, is_update = :is_update:, name = :name:, status = :status:, level = :level:, canManageClients = :canManageClients:, currencyCode = :currencyCode:, dateTimeZone = :dateTimeZone:, testAccount = :testAccount:, is_hidden = :is_hidden:, is_manager = :is_manager:, update_time = NOW();"; $params = [ 'customerId' => $data['customerId'], 'manageCustomer' => $data['manageCustomer'], 'name' => $data['name'], 'status' => $data['status'], 'level' => $data['level'], 'canManageClients' => (integer)$data['canManageClients'], 'currencyCode' => $data['currencyCode'], 'dateTimeZone' => $data['dateTimeZone'], 'testAccount' => (integer)$data['testAccount'], 'is_hidden' => (integer)$data['is_hidden'], 'is_update' => (integer)$is_update, 'is_manager' => $data['is_manager'], ]; $result = $this->db->query($sql, $params); return $result; } public function modifyAccountBudget($data) { $sql = "UPDATE aw_ad_account SET amountSpendingLimit = :amountSpendingLimit:, amountServed = :amountServed: WHERE customerId = :customerId:"; $params = [ 'amountSpendingLimit' => $data['amountSpendingLimit'], 'amountServed' => $data['amountServed'], 'customerId' => $data['customerId'] ]; $result = $this->db->query($sql, $params); return $result; } public function getAccounts($is_hidden = 0, $order = false) { $sql = "SELECT * FROM aw_ad_account WHERE 1"; if (!is_null($is_hidden)) $sql .= " AND is_hidden = {$is_hidden}"; if ($order) $sql .= " " . $order; $result = $this->db_query($sql); return $result; } public function getCampaign($id) { if (is_null($id)) return false; $sql = "SELECT * FROM aw_campaign WHERE id = {$id}"; $result = $this->db_query($sql, true); return $result; } public function updateAdSchedule($data = null) { if (is_null($data)) return false; $sql = "INSERT INTO aw_campaign_ad_schedule(`campaignId`, `id`, `status`, `dayOfWeek`, `startHour`, `startMinute`, `endHour`, `endMinute`) VALUES(:campaignId:, :id:, :status:, :dayOfWeek:, :startHour:, :startMinute:, :endHour:, :endMinute:) ON DUPLICATE KEY UPDATE campaignId=:campaignId:, id=:id:, status=:status:, dayOfWeek=:dayOfWeek:, startHour=:startHour:, startMinute=:startMinute:, endHour=:endHour:, endMinute=:endMinute:"; $params = [ 'campaignId' => $data['campaignId'], 'id' => $data['id'], 'status' => $data['status'], 'dayOfWeek' => $data['dayOfWeek'], 'startHour' => $data['startHour'], 'startMinute' => $data['startMinute'], 'endHour' => $data['endHour'], 'endMinute' => $data['endMinute'] ]; $result = $this->db->query($sql, $params); return $result; } public function updateCampaign($data = null) { if (is_null($data)) return false; //print_r($data);exit; $sql = "INSERT INTO aw_campaign(customerId, id, name, status, servingStatus, startDate, endDate, budgetId, budgetName, budgetReferenceCount, budgetStatus, amount, deliveryMethod, advertisingChannelType, advertisingChannelSubType, AdServingOptimizationStatus, cpaBidAmount, create_time) VALUES( :customerId:, :id:, :name:, :status:, :servingStatus:, :startDate:, :endDate:, :budgetId:, :budgetName:, :budgetReferenceCount:, :budgetStatus:, :budgetAmount:, :budgetDeliveryMethod:, :advertisingChannelType:, :advertisingChannelSubType:, :adServingOptimizationStatus:, :cpaBidAmount:, NOW()) ON DUPLICATE KEY UPDATE name = :name:, status = :status:, servingStatus = :servingStatus:, startDate = :startDate:, endDate = :endDate:, budgetId = :budgetId:, budgetName = :budgetName:, budgetReferenceCount = :budgetReferenceCount:, budgetStatus = :budgetStatus:, amount = :budgetAmount:, deliveryMethod = :budgetDeliveryMethod:, advertisingChannelType = :advertisingChannelType:, advertisingChannelSubType = :advertisingChannelSubType:, AdServingOptimizationStatus = :adServingOptimizationStatus:, cpaBidAmount = :cpaBidAmount:, is_updating = 0, update_time = NOW()"; $params = [ 'customerId' => $data['customerId'], 'id' => $data['id'], 'name' => $data['name'], 'status' => $data['status'], 'servingStatus' => $data['servingStatus'], 'startDate' => $data['startDate'], 'endDate' => $data['endDate'], 'budgetId' => (integer)$data['budgetId'], 'budgetName' => $data['budgetName'], 'budgetReferenceCount' => (integer)$data['budgetReferenceCount'], 'budgetStatus' => $data['budgetStatus'], 'budgetAmount' => (integer)$data['budgetAmount'], 'budgetDeliveryMethod' => $data['budgetDeliveryMethod'], 'advertisingChannelType' => $data['advertisingChannelType'], 'advertisingChannelSubType' => $data['advertisingChannelSubType'], 'adServingOptimizationStatus' => $data['adServingOptimizationStatus'], 'cpaBidAmount' => (integer)$data['cpaBidAmount'] ?? 0, ]; $result = $this->db->query($sql, $params); return $result; } public function updateCampaignField($data = null) { if (is_null($data)) return false; $builder = $this->db->table('aw_campaign'); $updateData = []; if (isset($data['name'])) { $updateData['name'] = $data['name']; } if (isset($data['status'])) { $updateData['status'] = $data['status']; } if (isset($data['amount'])) { $updateData['amount'] = $data['amount']; } if (isset($data['cpaBidAmount'])) { $updateData['cpaBidAmount'] = $data['cpaBidAmount']; } $builder->set($updateData); $builder->where('id', $data['id']); $result = $builder->update(); return $result; } public function getAdGroupIdByAd($id) { if (is_null($id)) return false; $sql = "SELECT adgroupId FROM aw_ad WHERE id = {$id}"; $result = $this->db_query($sql, true); return $result; } public function updateAdGroup($data = null) { if (is_null($data)) return false; $sql = "INSERT INTO aw_adgroup(campaignId, id, name, status, adGroupType, biddingStrategyType, cpcBidAmount, cpcBidSource, cpmBidAmount, cpmBidSource, cpaBidAmount, cpaBidSource, create_time) VALUES( :campaignId:, :id:, :name:, :status:, :adGroupType:, :biddingStrategyType:, :cpcBidAmount:, :cpcBidSource:, :cpmBidAmount:, :cpmBidSource:, :cpaBidAmount:, '', NOW()) ON DUPLICATE KEY UPDATE name = :name:, status = :status:, adGroupType = :adGroupType:, biddingStrategyType = :biddingStrategyType:, cpcBidAmount = :cpcBidAmount:, cpcBidSource = :cpcBidSource:, cpmBidAmount = :cpmBidAmount:, cpmBidSource = :cpmBidSource:, cpaBidAmount = :cpaBidAmount:, cpaBidSource = '', update_time = NOW()"; $params = [ 'campaignId' => $data['campaignId'], 'id' => $data['id'], 'name' => $data['name'], 'status' => $data['status'], 'adGroupType' => $data['adGroupType'], 'biddingStrategyType' => $data['biddingStrategyType'], 'cpcBidAmount' => (integer)$data['cpcBidAmount'] ?? 0, 'cpcBidSource' => $data['cpcBidSource'], 'cpmBidAmount' => (integer)$data['cpmBidAmount'] ?? 0, 'cpmBidSource' => $data['cpmBidSource'], 'cpaBidAmount' => (integer)$data['cpaBidAmount'] ?? 0, ]; $result = $this->db->query($sql, $params); return $result; } public function updateAdgroupField($data = null) { if (is_null($data)) return false; $builder = $this->db->table('aw_adgroup'); $updateData = []; if (isset($data['name'])) { $updateData['name'] = $data['name']; } if (isset($data['status'])) { $updateData['status'] = $data['status']; } if (isset($data['cpcBidAmount'])) { $updateData['cpcBidAmount'] = $data['cpcBidAmount']; } if (isset($data['cpmBidAmount'])) { $updateData['cpmBidAmount'] = $data['cpmBidAmount']; } if (isset($data['cpaBidAmount'])) { $updateData['cpaBidAmount'] = $data['cpaBidAmount']; } $builder->set($updateData); $builder->where('id', $data['id']); $result = $builder->update(); return $result; } public function updateAd($data = null) { if (is_null($data)) return false; $this->db->transStart(); $sql = "INSERT INTO aw_ad(adgroupId, id, name, status, reviewStatus, approvalStatus, policyTopic, code, adType, mediaType, assets, imageUrl, finalUrl, create_time) VALUES( :adgroupId:, :id:, :name:, :status:, :reviewStatus:, :approvalStatus:, :policyTopic:, :code:, :adType:, :mediaType:, :assets:, :imageUrl:, :finalUrl:, NOW() ) ON DUPLICATE KEY UPDATE name = :name:, status = :status:, reviewStatus = :reviewStatus:, approvalStatus = :approvalStatus:, policyTopic = :policyTopic:, adType = :adType:, mediaType = :mediaType:, assets = :assets:, imageUrl = :imageUrl:, finalUrl = :finalUrl:, update_time = NOW()"; $params = [ 'adgroupId' => $data['adgroupId'], 'id' => $data['id'], 'name' => $data['name'], 'status' => $data['status'], 'reviewStatus' => $data['reviewStatus'], 'approvalStatus' => $data['approvalStatus'], 'policyTopic' => $data['policyTopic'], 'code' => $data['code'], 'adType' => $data['adType'], 'mediaType' => $data['mediaType'], 'assets' => $data['assets'], 'imageUrl' => $data['imageUrl'], 'finalUrl' => $data['finalUrl'] ]; if ($result = $this->db->query($sql, $params)) { // $this->insertReport($data); } $this->db->transComplete(); return $result; } public function updateAdField($data = null) { if (is_null($data)) return false; $builder = $this->db->table('aw_ad'); $updateData = []; if (isset($data['name'])) { $updateData['name'] = $data['name']; } if (isset($data['status'])) { $updateData['status'] = $data['status']; } $builder->set($updateData); $builder->where('id', $data['id']); $result = $builder->update(); return $result; } public function updateAsset($data) { if (is_null($data)) return false; if(empty($data['video_id'])){ $data['video_id'] = ''; } if(empty($data['url'])){ $data['url'] = ''; } $data = [ 'id' => $this->db->escape($data['id']), 'name' => $this->db->escape($data['name'] ?? ''), 'type' => $this->db->escape($data['type'] ?? ''), 'video_id' => $this->db->escape($data['video_id'] ?? ''), 'url' => $this->db->escape($data['url'] ?? ''), ]; $builder = $this->db->table('aw_asset'); $builder->setData($data, false); $updateTime = ['update_time' => new RawSql('NOW()')]; $builder->updateFields($updateTime, true); $result = $builder->upsert(); return $result; } public function getDbCount($ad_id, $date) { if (empty($ad_id) || empty($date)) return NULL; $sql = "SELECT * FROM aw_db_count WHERE ad_id = '{$ad_id}' AND date = '{$date}'"; $result = $this->db_query($sql); if (!$result) return null; return $result->getResultArray(); } public function getAppSubscribeCount($data, $date) { if (empty($data['db_prefix'])) return 0; $sql = "SELECT * FROM app_subscribe WHERE group_id = '{$data['app_id']}' AND status = 1 AND site = '{$data['site']}' AND DATE_FORMAT(reg_date, '%Y-%m-%d') = '{$date}' AND deleted = 0"; $res = $this->zenith->query($sql); $num_rows = $res->getNumRows(); return $num_rows; } public function getAdLeads($date, $ids = []) { $sql = "SELECT his.ad_id, ag.id AS adgroup_id, CONCAT('{',GROUP_CONCAT('\"',his.`hour`,'\":',his.cost),'}') AS spend_data, ad.code, ad.finalUrl, ad.name AS ad_name, ac.name AS campaign_name FROM `aw_ad_report_history` AS his LEFT JOIN aw_ad AS ad ON his.ad_id = ad.id LEFT JOIN aw_adgroup AS ag ON ad.adgroupId = ag.id LEFT JOIN aw_campaign AS ac ON ag.campaignId = ac.id WHERE his.date = '{$date}'"; if(!empty($ids)){ $sql .= " AND his.ad_id IN (".implode(',', $ids).")"; } $sql .= " GROUP BY his.ad_id"; $result = $this->db_query($sql); return $result; } public function getDbPrice($data) { if (empty($data['ad_id']) || empty($data['date'])){ return NULL; } $sql = "SELECT ad_id, date, db_price FROM `z_adwords`.`aw_ad_report_history` WHERE `ad_id` = '{$data['ad_id']}' AND `date` = '{$data['date']}' GROUP BY date ORDER BY hour DESC LIMIT 1;"; $result = $this->db_query($sql); $result = $result->getResultArray(); if (empty($result)){return null;} return $result; } public function getLeads($data) { if (empty($data['event_seq'])) return null; $sql = "SELECT event_seq, site, date(from_unixtime(reg_timestamp)) AS date, HOUR(from_unixtime(reg_timestamp)) AS hour, count(event_seq) AS db_count FROM `zenith`.`event_leads` WHERE `reg_timestamp` >= unix_timestamp('{$data['date']}') AND `status` = 1 AND `is_deleted` = 0 AND `event_seq` = {$data['event_seq']} AND `site` = '{$data['site']}' AND DATE_FORMAT(`reg_date`, '%Y-%m-%d') = '{$data['date']}' GROUP BY `event_seq`, `site`, HOUR(from_unixtime(reg_timestamp))"; $result = $this->zenith->query($sql); return $result; } public function insertReport($data) { if (empty($data)) { return false; } $row = $data; if ($row['id']) { $row['date'] = trim($row['date'], "'"); // 불필요한 따옴표 제거 $data = [ 'ad_id' => $row['id'], 'date' => trim($row['date'], "'"), // 불필요한 따옴표 제거 'impressions' => $row['impressions'], 'clicks' => $row['clicks'], 'cost' => $row['cost'], 'create_time' => new RawSql('NOW()') ]; $builder = $this->db->table('aw_ad_report'); $builder->setData($data); $updateTime = ['update_time' => new RawSql('NOW()')]; $builder->updateFields($updateTime, true); $result = $builder->upsert(); if ($row['date'] != date('Y-m-d')) return $result; $data_history = [ 'ad_id' => $row['id'], 'date' => trim($row['date'], "'"), // 불필요한 따옴표 제거 'hour' => date('H', strtotime('-10 minutes')), 'impressions' => $row['impressions'], 'clicks' => $row['clicks'], 'cost' => $row['cost'], 'create_time' => new RawSql('NOW()') ]; $h_builder = $this->db->table('aw_ad_report_history'); $h_builder->setData($data_history); $updateTime = ['update_time' => new RawSql('NOW()')]; $h_builder->updateFields($updateTime, true); $result = $h_builder->upsert(); return $result; } } private function getPreviousReportData($ad_id, $date) { $builder = $this->db->table('aw_ad_report_history'); $builder->select('SUM(impressions) AS impressions, SUM(clicks) AS clicks, SUM(cost) AS cost'); $builder->where('ad_id', $ad_id); $builder->where('date', $date); $builder->where('hour <', 'HOUR(NOW())', false); $result = $builder->get(); if ($result === false) { return null; } return $result->getRowArray(); } public function insertAdGroupReport($data) { if (empty($data)) { return false; } $row = $data; if ($row['id']) { $row['date'] = trim($row['date'], "'"); // 불필요한 따옴표 제거 $data = [ 'adgroup_id' => $row['id'], 'date' => trim($row['date'], "'"), 'hour' => $row['hour'], 'impressions' => $row['impressions'], 'clicks' => $row['clicks'], 'cost' => $row['cost'], 'create_time' => new RawSql('NOW()') ]; $builder = $this->db->table('aw_adgroup_report_history'); $builder->setData($data); $updateTime = ['update_time' => new RawSql('NOW()')]; $builder->updateFields($updateTime, true); $result = $builder->upsert(); return $result; } } public function updateAdGroupreport($adGroupId, $date, $data) { if (empty($adGroupId) || empty($date) || empty($data)) { return false; } for ($i = 0; $i <= 23; $i++) { $hourData = [ 'adgroup_id' => $adGroupId, 'date' => $date, 'hour' => $i, 'db_count' => $data['count'][$i] ?? 0, 'sales' => $data['sales'][$i] ?? 0, 'margin' => $data['margin'][$i] ?? 0, ]; $builder = $this->db->table('aw_adgroup_report_history'); $builder->setData($hourData); $updateTime = ['update_time' => new RawSql('NOW()')]; $builder->updateFields($updateTime, true); $builder->upsert(); } return true; } public function updateReportByHour($data) { if(!empty($data)){ $row = $data; }else{ return false; } if(isset($row['data'])){ foreach($row['data'] as $v) { if ($row['ad_id']) { $data = [ 'ad_id' => $row['ad_id'], 'date' => $row['date'], 'hour' => $v['hour'], 'media' => $row['media'], 'period' => is_numeric($row['period_ad']) ? $row['period_ad'] : 0, 'event_seq' => $row['event_seq'], 'site' => $row['site'], 'db_price' => $row['db_price'], 'db_count' => $v['count'], 'margin' => $v['margin'], 'sales' => $v['sales'], ]; $builder = $this->db->table('aw_ad_report_history'); $builder->setData($data); $updateTime = ['update_time' => new RawSql('NOW()')]; $builder->updateFields($updateTime, true); // d($builder->getCompiledUpsert()); $builder->upsert(); } } } } public function updateReport($data) { if(!empty($data)){ $row = $data; }else{ return false; } if(isset($row['total'])){ foreach($row['total'] as $v) { if ($row['ad_id']) { $data = [ 'ad_id' => $row['ad_id'], 'date' => $row['date'], 'media' => $row['media'], 'period' => is_numeric($row['period_ad']) ? $row['period_ad'] : 0, 'event_seq' => $row['event_seq'], 'site' => $row['site'], 'db_price' => $row['db_price'], 'db_count' => $v['count'], 'margin' => $v['margin'], 'sales' => $v['sales'], ]; $builder = $this->db->table('aw_ad_report'); $builder->setData($data); $updateTime = ['update_time' => new RawSql('NOW()')]; $builder->updateFields($updateTime, true); // d($builder->getCompiledUpsert()); $builder->upsert(); } } } } public function db_query($sql, $error = false) { if (!$sql) return false; $result = null; $this->sltDB = $this->db; $this->sltDB->query("BEGIN"); if ($error) $result = $this->sltDB->query($sql) or die("ERROR :" . $this->sltDB->error . ' :' . $sql); else $result = $this->sltDB->query($sql); if ($result) { //$this->tracking($sql); } $this->sltDB->query("COMMIT"); return $result; } }