Files
facebook-api/FBDB.php
T
2025-03-05 04:34:16 +00:00

863 lines
36 KiB
PHP

<?php
namespace App\ThirdParty\facebook_api;
use CodeIgniter\CLI\CLI;
use CodeIgniter\Database\Config;
use CodeIgniter\Database\RawSql;
use DateTime;
use DateTimeZone;
class FBDB extends Config
{
private $db, $zenith;
private $sltDB;
public function __construct()
{
$this->db = \Config\Database::connect('facebook');
$this->zenith = \Config\Database::connect();
// $this->db_query("SET FOREIGN_KEY_CHECKS = 0;");
}
// 메인 계정에 대한 엑세스 토큰 로드
public function getAccessToken()
{
$sql = "SELECT access_token, ad_account_id FROM fb_ad_account WHERE is_admin = 1";
$result = $this->db_query($sql);
$row = $result->getRowArray();
return $row;
}
// 광고 계정 목록
public function getAdAccounts($perm = true, $query = "")
{
$sql = "SELECT * FROM fb_ad_account WHERE 1 AND status = 1";
if ($perm) {
$sql .= " AND perm = 1";
}
if ($query) {
$sql .= $query;
}
$sql .= " ORDER BY name DESC";
$result = $this->db_query($sql);
return $result;
}
public function getCampaign($campaign_id)
{
if (empty($campaign_id)) {
return null;
}
$sql = "SELECT * FROM fb_campaign WHERE campaign_id = {$campaign_id}";
$result = $this->db_query($sql);
$row = $result->getRowArray();
return $row;
}
public function getAdset($adset_id)
{
if (empty($adset_id)) {
return null;
}
$sql = "SELECT * FROM fb_adset WHERE adset_id = {$adset_id}";
$result = $this->db_query($sql);
$row = $result->getRowArray();
return $row;
}
// 광고 목록
public function getAds($query = '')
{
$sql = "SELECT ad_id, adset_id, ad_name, effective_status FROM fb_ad WHERE 1 {$query} ORDER BY update_date DESC";
$result = $this->db_query($sql);
return $result;
}
public function getAdsWithAccount($query = '')
{
$sql = "SELECT ad_id, adset_id, ad_name, effective_status FROM fb_ad_with_account WHERE 1 {$query} ORDER BY update_date DESC";
$result = $this->db_query($sql);
return $result;
}
public function getAdSetsWithAccount($selector = ['adset_id', 'campaign_id'], $query = '')
{
$select = implode(',', $selector);
$sql = "SELECT {$select} FROM fb_adset_with_account WHERE 1 {$query} ORDER BY update_date DESC";
$result = $this->db_query($sql);
return $result;
}
public function getCampaignsWithAccount($query = '')
{
$sql = "SELECT campaign_id, budget FROM fb_campaign_with_account WHERE 1 {$query} ORDER BY update_date DESC";
$result = $this->db_query($sql);
return $result;
}
public function getLeadgenAds() {
$sql = "SELECT * FROM fb_ad WHERE (leadgen_id IS NOT NULL AND leadgen_id <> '')";
$result = $this->db_query($sql);
return $result;
}
public function updateAdAccounts($list)
{
if (empty($list)) {
return null;
}
if(!empty($list[0][0])){
$this->db->query("UPDATE fb_ad_account SET status = 0, disable_reason = 0, perm = 0 WHERE business_id = '{$list[0][0]}'");
}
foreach ($list as $key => $row) {
if (empty($row)) {
continue;
}
$sql = "INSERT INTO fb_ad_account (business_id, ad_account_id, name, funding_source, status, disable_reason, pixel_id, perm, update_time)
VALUES ('{$row[0]}', '{$row[1]}', '{$row[2]}', '{$row[3]}', {$row[4]}, {$row[5]}, {$row[6]}, 1, NOW())
ON DUPLICATE KEY
UPDATE name = '{$row[2]}', funding_source = '{$row[3]}', status = {$row[4]}, disable_reason = {$row[5]}, pixel_id = {$row[6]}, perm = 1, update_time = NOW();";
$result = $this->db_query($sql);
}
}
public function insertAsyncInsights($lists)
{
foreach ($lists as $key => $report) {
if ($report['date_start'] != $report['date_stop']) continue;
$hour = ($report['date_start'] == date('Y-m-d')) ? date('H') : 23;
if(isset($report['hourly_stats_aggregated_by_audience_time_zone']))
$hour = preg_replace('/^([0-9]{2}).+$/', '$1', $report['hourly_stats_aggregated_by_audience_time_zone']);
$data = [
'ad_id' => $report['ad_id'],
'date' => $report['date_start'],
'hour' => $hour,
'impressions' => $report['impressions']??0,
'clicks' => $report['clicks']??0,
'inline_link_clicks' => $report['inline_link_clicks']??0,
'spend' => $report['spend']??0,
];
$builder = $this->db->table('fb_ad_insight_history');
$builder->setData($data);
$updateTime = ['update_date' => new RawSql('NOW()')];
$builder->updateFields($updateTime, true);
$result = $builder->upsert();
// 캠페인 저장
$data = [
'campaign_id' => $report['campaign_id'],
'campaign_name' => $report['campaign_name'],
'account_id' => $report['account_id']
];
$builder = $this->db->table('fb_campaign');
$builder->setData($data);
$updateTime = ['update_date' => new RawSql('NOW()')];
$builder->updateFields($updateTime, true);
$result = $builder->upsert();
// 광고세트 저장
$data = [
'adset_id' => $report['adset_id'],
'adset_name' => $report['adset_name'],
'campaign_id' => $report['campaign_id']
];
$builder = $this->db->table('fb_adset');
$builder->setData($data);
$updateTime = ['update_date' => new RawSql('NOW()')];
$builder->updateFields($updateTime, true);
$result = $builder->upsert();
// 광고 저장
$use_landing = 0;
if (preg_match('/\#[0-9\_]+.+\*[0-9]+.+\&[a-z]+.*/i', $report['ad_name'])) {
$use_landing = 1;
}
$data = [
'ad_id' => $report['ad_id'],
'ad_name' => $report['ad_name'],
'adset_id' => $report['adset_id'],
'use_landing' => $use_landing
];
$builder = $this->db->table('fb_ad');
$builder->setData($data);
$updateTime = ['update_date' => new RawSql('NOW()')];
$builder->updateFields($updateTime, true);
$result = $builder->upsert();
}
}
public function updateAdCreatives($lists)
{
if (!is_array($lists) && !count($lists)) return;
foreach ($lists as $row) {
if (empty($row)) continue;
$data = [
'adcreative_id' => $row['adcreative_id'],
'ad_id' => $row['ad_id'],
'object_type' => $row['object_type']??null,
'thumbnail' => $row['thumbnail_url']??null,
'link' => $row['link']??null
];
$builder = $this->db->table('fb_adcreative');
$builder->setData($data);
$updateTime = ['update_date' => new RawSql('NOW()')];
$builder->updateFields($updateTime, true);
$result = $builder->upsert();
}
}
public function updateAds($data)
{
$cnt = 0;
foreach ($data as $key => $report) {
$report['page'] = null;
$report['fb_pixel'] = null;
$report['post'] = null;
$created_time = null;
$updated_time = null;
if (!empty($report['tracking_specs'])) {
foreach ($report['tracking_specs'] as $list) {
foreach ($list as $key => $data) {
if ($key == 'page') {
$report['page'] = $list['page'][0];
}
if ($key == 'fb_pixel') {
$report['fb_pixel'] = $list['fb_pixel'][0];
}
if ($key == 'post') {
$report['post'] = $list['post'][0];
}
}
}
}
$report['leadgen'] = null;
if (!empty($report['conversion_specs'])) {
foreach ($report['conversion_specs'] as $list) {
foreach ($list as $key => $data) {
if ($key == 'leadgen') {
$report['leadgen'] = $list['leadgen'][0];
}
}
}
}
$created_time = $report['created_time'] && $report['created_time'] != '1970-01-01T08:59:59+0900' ? date('Y-m-d H:i:s', strtotime($report['created_time'])) : null;
$updated_time = $report['updated_time'] && $report['updated_time'] != '1970-01-01T08:59:59+0900' ? date('Y-m-d H:i:s', strtotime($report['updated_time'])) : null;
// $name = addslashes($report['name']);
$use_landing = 0;
if (preg_match('/\#[0-9\_]+.+\*[0-9]+.+\&[a-z]+.*/i', $report['name'])) {
$use_landing = 1;
}
$sql = "INSERT INTO fb_ad (
ad_id,
ad_name,
effective_status,
status,
fb_pixel,
page_id,
adset_id,
use_landing,
leadgen_id,
created_time,
updated_time,
create_date
) VALUES (
:ad_id:,
:name:,
:effective_status:,
:status:,
:fb_pixel:,
:page_id:,
:adset_id:,
:use_landing:,
:leadgen_id:,
:created_time:,
:updated_time:,
NOW()
) ON DUPLICATE KEY UPDATE
ad_name = :name:,
effective_status = :effective_status:,
status = :status:,
fb_pixel = :fb_pixel:,
page_id = :page_id:,
use_landing = :use_landing:,
leadgen_id = :leadgen_id:,
created_time = :created_time:,
updated_time = :updated_time:,
update_date = NOW()";
$result = $this->db->query($sql, [
'ad_id' => $report['id'],
'name' => $report['name'],
'effective_status' => $report['effective_status'],
'status' => $report['status'],
'fb_pixel' => $report['fb_pixel'] ?? '',
'page_id' => $report['page_id'] ?? '',
'adset_id' => $report['adset_id'],
'use_landing' => $use_landing,
'leadgen_id' => $report['leadgen'] ?? '',
'created_time' => $created_time,
'updated_time' => $updated_time
]);
if(!$result){return false;};
/*
$this->db_query("DELETE FROM fb_recommendations WHERE ad_id = '{$report['id']}'");
if (!empty($report['recommendations'])) { //권고사항 정보 같이 저장
foreach ($report['recommendations'] as $data) {
$sql = "INSERT INTO fb_recommendations (
ad_id,
code,
title,
message,
importance,
confidence,
blame_field
) VALUES (
'{$report['id']}',
'{$data['code']}',
'".addslashes($data['title'])."',
'".addslashes($data['message'])."',
'{$data['importance']}',
'{$data['confidence']}',
'{$data['blame_field']}'
) ON DUPLICATE KEY UPDATE
ad_id = '{$report['id']}';";
$this->db_query($sql);
$sql = " INSERT IGNORE INTO fb_translation (seq, original_txt) VALUES ((SELECT MAX(seq)+1 FROM fb_translation a), '".addslashes($data['title'])."') ";
$this->db_query($sql);
$sql = " INSERT IGNORE INTO fb_translation (seq, original_txt) VALUES ((SELECT MAX(seq)+1 FROM fb_translation a), '".addslashes($data['message'])."') ";
$this->db_query($sql);
}
}
*/
}
return true;
}
public function updateAdsets($data)
{
$cnt = 0;
foreach ($data as $key => $report) {
if (!$report['budget_remaining']) $report['budget_remaining'] = NULL;
$start_time = $report['start_time'] && $report['start_time'] != '1970-01-01T08:59:59+0900' ? date('Y-m-d H:i:s', strtotime($report['start_time'])) : NULL;
$created_time = $report['created_time'] && $report['created_time'] != '1970-01-01T08:59:59+0900' ? date('Y-m-d H:i:s', strtotime($report['created_time'])) : NULL;
$updated_time = $report['updated_time'] && $report['updated_time'] != '1970-01-01T08:59:59+0900' ? date('Y-m-d H:i:s', strtotime($report['updated_time'])) : NULL;
if (isset($report['lifetime_budget'])) {
$budget_type = 'lifetime';
$budget = (integer)$report['lifetime_budget'];
} elseif (isset($report['daily_budget'])) {
$budget_type = 'daily';
$budget = (integer)$report['daily_budget'];
} else {
$budget_type = NULL;
$budget = NULL;
}
$lst_sig_edit_ts = NULL;
$lsiConversions = 0;
$lsiStatus = '';
if(!empty($report['learning_stage_info'])){
if(!empty($report['learning_stage_info']['last_sig_edit_ts'])){
$lst_sig_edit_ts = date('Y-m-d H:i:s', $report['learning_stage_info']['last_sig_edit_ts']);
}
if(!empty($report['learning_stage_info']['conversions'])){
$lsiConversions = (integer)$report['learning_stage_info']['conversions'];
}
if(!empty($report['learning_stage_info']['status'])){
$lsiStatus = (integer)$report['learning_stage_info']['status'];
}
}
$sql = "INSERT INTO fb_adset (
adset_id,
adset_name,
campaign_id,
effective_status,
status,
start_time,
lsi_conversions,
lsi_status,
lsi_last_sig_edit_ts,
created_time,
updated_time,
create_date
) VALUES (
:adset_id:,
:name:,
:campaign_id:,
:effective_status:,
:status:,
:start_time:,
:lsi_conversions:,
:lsiStatus:,
:lst_sig_edit_ts:,
:created_time:,
:updated_time:,
NOW()
) ON DUPLICATE KEY UPDATE
adset_name = :name:,
budget_type = :budget_type:,
budget = :budget:,
budget_remaining = :budget_remaining:,
effective_status = :effective_status:,
status = :status:,
start_time = :start_time:,
lsi_conversions = :lsi_conversions:,
lsi_status = :lsiStatus:,
lsi_last_sig_edit_ts = :lst_sig_edit_ts:,
created_time = :created_time:,
updated_time = :updated_time:,
update_date = NOW()";
$result = $this->db->query($sql, [
'adset_id' => $report['id'],
'name' => $report['name'],
'campaign_id' => $report['campaign_id'],
'effective_status' => $report['effective_status'],
'status' => $report['status'],
'start_time' => $start_time,
'lsi_conversions' => $lsiConversions,
'lsiStatus' => $lsiStatus,
'lst_sig_edit_ts' => $lst_sig_edit_ts,
'created_time' => $created_time,
'updated_time' => $updated_time,
'budget_type' => $budget_type,
'budget' => $budget,
'budget_remaining' => $report['budget_remaining'],
]);
if(!$result){return false;};
/*
$this->db_query("DELETE FROM fb_recommendations WHERE adset_id = '{$report['id']}'");
if (!empty($report['recommendations'])) { //권고사항 정보 같이 저장
foreach ($report['recommendations'] as $data) {
$sql = "INSERT INTO fb_recommendations (
adset_id,
code,
title,
message,
importance,
confidence,
blame_field
) VALUES (
'{$report['id']}',
'{$data['code']}',
'".addslashes($data['title'])."',
'".addslashes($data['message'])."',
'{$data['importance']}',
'{$data['confidence']}',
'{$data['blame_field']}'
) ON DUPLICATE KEY UPDATE
adset_id = '{$report['id']}';";
$this->db_query($sql);
$sql = " INSERT IGNORE INTO fb_translation (seq, original_txt) VALUES ((SELECT MAX(seq)+1 FROM fb_translation a), '".addslashes($data['title'])."') ";
$this->db_query($sql);
$sql = " INSERT IGNORE INTO fb_translation (seq, original_txt) VALUES ((SELECT MAX(seq)+1 FROM fb_translation a), '".addslashes($data['message'])."') ";
$this->db_query($sql);
}
}
*/
}
return true;
}
public function updateCampaigns($data)
{
foreach ($data as $key => $report) {
if (empty($report['budget_remaining'])) (integer)$report['budget_remaining'] = NULL;
$start_time = $report['start_time'] && $report['start_time'] != '1970-01-01T08:59:59+0900' ? date('Y-m-d H:i:s', strtotime($report['start_time'])) : NULL;
$created_time = $report['created_time'] && $report['created_time'] != '1970-01-01T08:59:59+0900' ? date('Y-m-d H:i:s', strtotime($report['created_time'])) : NULL;
$updated_time = $report['updated_time'] && $report['updated_time'] != '1970-01-01T08:59:59+0900' ? date('Y-m-d H:i:s', strtotime($report['updated_time'])) : NULL;
$can_use_spend_cap = $report['can_use_spend_cap'] ? $report['can_use_spend_cap'] : '0';
$budget_rebalance_flag = $report['budget_rebalance_flag'] ? $report['budget_rebalance_flag'] : '0';
$spend_cap = isset($report['spend_cap']) ? (integer)$report['spend_cap'] : NULL;
if (isset($report['lifetime_budget']) && $report['lifetime_budget']) {
$budget_type = 'lifetime';
$budget = (integer)$report['lifetime_budget'];
} elseif (isset($report['daily_budget']) && $report['daily_budget']) {
$budget_type = 'daily';
$budget = (integer)$report['daily_budget'];
} else {
$budget_type = "";
$budget = NULL;
}
$sql = "INSERT INTO fb_campaign (
campaign_id,
campaign_name,
account_id,
effective_status,
status,
budget_type,
budget,
budget_remaining,
budget_rebalance_flag,
can_use_spend_cap,
spend_cap,
objective,
start_time,
created_time,
updated_time,
create_date
) VALUES (
:campaign_id:,
:name:,
:account_id:,
:effective_status:,
:status:,
:budget_type:,
:budget:,
:budget_remaining:,
:budget_rebalance_flag:,
:can_use_spend_cap:,
:spend_cap:,
:objective:,
:start_time:,
:created_time:,
:updated_time:,
NOW()
) ON DUPLICATE KEY UPDATE
campaign_name = :name:,
budget_type = :budget_type:,
budget = :budget:,
budget_remaining = :budget_remaining:,
budget_rebalance_flag = :budget_rebalance_flag:,
can_use_spend_cap = :can_use_spend_cap:,
spend_cap = :spend_cap:,
objective = :objective:,
effective_status = :effective_status:,
status = :status:,
start_time = :start_time:,
created_time = :created_time:,
updated_time = :updated_time:,
is_updating = 0,
update_date = NOW()";
$result = $this->db->query($sql, [
'campaign_id' => $report['id'],
'name' => $report['name'],
'account_id' => $report['account_id'],
'effective_status' => $report['effective_status'],
'status' => $report['status'],
'budget_type' => $budget_type,
'budget' => $budget,
'budget_remaining' => $report['budget_remaining'],
'budget_rebalance_flag' => $budget_rebalance_flag,
'can_use_spend_cap' => $can_use_spend_cap,
'spend_cap' => $spend_cap,
'objective' => $report['objective'],
'start_time' => $start_time,
'created_time' => $created_time,
'updated_time' => $updated_time,
]);
if(!$result){return false;};
/*
$this->db_query("DELETE FROM fb_recommendations WHERE campaign_id = '{$report['id']}'");
if (!empty($report['recommendations'])) { //권고사항 정보 같이 저장
foreach ($report['recommendations'] as $data) {
$sql = "INSERT INTO fb_recommendations (
campaign_id,
code,
title,
message,
importance,
confidence,
blame_field
) VALUES (
'{$report['id']}',
'{$data['code']}',
'".addslashes($data['title'])."',
'".addslashes($data['message'])."',
'{$data['importance']}',
'{$data['confidence']}',
'{$data['blame_field']}'
) ON DUPLICATE KEY UPDATE
campaign_id = '{$report['id']}';";
$this->db_query($sql);
$sql = " INSERT IGNORE INTO fb_translation (seq, original_txt) VALUES ((SELECT MAX(seq)+1 FROM fb_translation a), '".addslashes($data['title'])."') ";
$this->db_query($sql);
$sql = " INSERT IGNORE INTO fb_translation (seq, original_txt) VALUES ((SELECT MAX(seq)+1 FROM fb_translation a), '".addslashes($data['message'])."') ";
$this->db_query($sql);
}
}
*/
}
return true;
}
public function insertAdLeads($data)
{
if (count($data) > 0) {
$total = count($data);
$step = 1;
$insert = "INSERT INTO `fb_ad_lead` SET ";
$this->db_query('BEGIN');
foreach ($data as $key => $lead) {
CLI::showProgress($step++, $total);
$time = new DateTime($lead['created_time']);
$korea = new DateTimeZone('Asia/Seoul');
$time->setTimezone($korea);
$created_time = $time->format('Y-m-d H:i:s');
$full_name = $phone_number = $date_of_birth = $gender = null;
$is_organic = (strlen($lead['is_organic']) == 0) ? 0 : 1;
$custom_fields = array();
$values = "id = '{$lead['id']}', form_id = '{$lead['form_id']}', ad_id = '{$lead['ad_id']}', is_organic = '{$is_organic}'";
if (count($lead['field_data']) > 0) {
foreach ($lead['field_data'] as $key => $field) {
switch ($field['name']) {
case '이름':
$field['name'] = 'full_name';
break;
case '전화번호':
$field['name'] = 'phone_number';
break;
case '성별':
$field['name'] = 'gender';
break;
case '생년월일':
$field['name'] = 'date_of_birth';
break;
}
if (preg_match("/[a-z\_]+/i", $field['name']) && !preg_match("/[가-힣]+/i", $field['name'])) {
$val = "";
if(isset($field['values']) && isset($field['values'][0])) $val = trim(addslashes($field['values'][0]));
// @$this->db->query("ALTER TABLE `fb_ad_lead` ADD `{$field['name']}` VARCHAR(50) NULL DEFAULT NULL AFTER `gender`;");
// @$this->db->query("ALTER TABLE `fb_ad_lead_delete` ADD `{$field['name']}` VARCHAR(50) NULL DEFAULT NULL AFTER `gender`;");
if (trim($val)) {
$values .= ", {$field['name']} = '{$val}'";
}
} else {
array_push($custom_fields, $field);
}
}
$field_data = addslashes(var_export($custom_fields, true)); // 배열 그대로 저장하는데 조금 이상하다...이상해씨
$values .= ", field_data = '{$field_data}'";
$sql = $insert . $values . ", created_time = '{$created_time}' ON DUPLICATE KEY UPDATE {$values}, update_date = NOW();";
$result = $this->db_query($sql, true);
}
}
$this->db_query('COMMIT');
}
}
// 광고 활성/종료 업데이트하는
public function setCampaignStatus($campaign_id, $status)
{
if (empty($campaign_id) || empty($status)) {
return null;
}
$sql = "UPDATE fb_campaign SET status = '$status' WHERE campaign_id = '$campaign_id'";
$result = $this->db_query($sql);
}
public function setAdsetStatus($adset_id, $status)
{
if (empty($adset_id) || empty($status)) {
return null;
}
$sql = "UPDATE fb_adset SET status = '$status' WHERE adset_id = '$adset_id'";
$this->db_query($sql);
}
public function setAdStatus($ad_id, $status)
{
if (empty($ad_id) || empty($status)) {
return null;
}
$sql = "UPDATE fb_ad SET status = '$status' WHERE ad_id = '$ad_id'";
$this->db_query($sql);
}
public function updateCampaignName($data)
{
if (empty($data)) {
return null;
}
$sql = "UPDATE fb_campaign SET campaign_name = '{$data['name']}' WHERE campaign_id = {$data['id']}";
$result = $this->db_query($sql);
}
public function updateAdsetName($data)
{
if (empty($data)) {
return null;
}
$sql = "UPDATE fb_adset SET adset_name = '{$data['name']}' WHERE adset_id = {$data['id']}";
$result = $this->db_query($sql);
}
public function updateAdName($data)
{
if (empty($data)) {
return null;
}
$sql = "UPDATE fb_ad SET ad_name = '{$data['name']}' WHERE ad_id = {$data['id']}";
$result = $this->db_query($sql);
}
public function updateInsight($data)
{
$row = $data;
if(empty($row['data'])) return;
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' => $row['period_ad'],
'event_seq' => $row['event_seq'],
'site' => $row['site'],
'db_price' => (integer)$row['db_price'],
'db_count' => (integer)$v['count'],
'margin' => (integer)$v['margin'],
'sales' => (integer)$v['sales'],
];
$builder = $this->db->table('fb_ad_insight_history');
$builder->setData($data);
$updateTime = ['update_date' => new RawSql('NOW()')];
$builder->updateFields($updateTime, true);
// d($builder->getCompiledUpsert());
$builder->upsert();
/*
$sql = "UPDATE `z_facebook`.`fb_ad_insight_history`
SET `media` = '{$row['media']}', `period` = '{$row['period_ad']}', `event_seq` = '{$row['event_seq']}', `site` = '{$row['site']}', `db_price` = '{$row['db_price']}', `db_count` = '{$v['count']}', `margin` = '{$v['margin']}', `sales` = '{$v['sales']}', `update_date` = NOW()
WHERE `ad_id` = '{$row['ad_id']}' AND `date` = '{$row['date']}' AND `hour` = '{$v['hour']}'";
$this->db_query($sql, true);
*/
}
}
}
public function getAdLeads($date)
{
$sql = "SELECT his.ad_id, CONCAT('{',GROUP_CONCAT('\"',his.`hour`,'\":',his.spend),'}') AS spend_data, ad.code, ad.ad_name, adset.adset_name, campaign.campaign_name
FROM `z_facebook`.`fb_ad_insight_history` AS his
LEFT JOIN `z_facebook`.fb_ad AS ad
ON his.ad_id = ad.ad_id
LEFT JOIN `z_facebook`.fb_adset AS adset
ON adset.adset_id = ad.adset_id
LEFT JOIN `z_facebook`.fb_campaign AS campaign
ON adset.campaign_id = campaign.campaign_id
LEFT JOIN `z_facebook`.fb_ad_account AS account
ON campaign.account_id = account.ad_account_id
WHERE his.date = '{$date}' AND account.perm = 1 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_facebook`.`fb_ad_insight_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);
if (empty($result)) return null;
return $result->getResultArray();
}
public function updateCampaignBudget($campaign_id, $budget)
{
$sql = "UPDATE fb_campaign set budget = {$budget} where campaign_id = {$campaign_id}";
$result = $this->db_query($sql);
$sql = "UPDATE fb_adset set budget_type = '', budget = NULL, budget_remaining = NULL where campaign_id = {$campaign_id}";
$result = $this->db_query($sql);
if (empty($result)) return null;
return true;
}
public function updateAdSetBudget($adset_id, $budget)
{
$sql = "UPDATE fb_adset set budget = {$budget} where adset_id = {$adset_id}";
$result = $this->db_query($sql);
if (empty($result)) return null;
return true;
}
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 db_query($sql, $error = false)
{
if (empty($sql)) return false;
$result = null;
$this->sltDB = $this->db;
$this->sltDB->transStart();
$result = $this->sltDB->query($sql);
if (!$result && $error) {
$err = $this->sltDB->error();
exit($err['code'] .' : '. $err['message'] .' - '. $sql);
}
$this->sltDB->transComplete();
return $result;
}
////////////////////////////////////////////////////
public function getMemo($p)
{
$query = "";
if ($p['id']) $query = " AND fm.id = '{$p['id']}' ";
$sql = "SELECT fc.campaign_name, fac.name AS account_name, fm.*
FROM fb_memo AS fm
LEFT JOIN fb_campaign AS fc ON fm.id = fc.campaign_id
LEFT JOIN fb_ad_account AS fac ON fc.account_id = fac.ad_account_id
WHERE 1 AND fm.type = '{$p['type']}'{$query} AND (fm.datetime >= DATE_SUB(NOW(), INTERVAL 3 DAY) OR (fm.datetime <= DATE_SUB(NOW(), INTERVAL 3 DAY) AND fm.is_done = 0)) ORDER BY fm.is_done ASC, fac.name ASC, fm.datetime DESC";
// echo $sql;
$result = $this->db_query($sql);
if ($result->num_rows) {
foreach ($result->getResultArray() as $row) {
$memo[] = $row;
}
}
return $memo;
}
public function addMemo($data)
{
$data['memo'] = $this->db->escape($data['memo']);
$sql = "INSERT INTO fb_memo (`id`, `type`, `memo`, `mb_name`, `datetime`) VALUES({$data['id']}, '{$data['type']}', {$data['memo']}, '{$data['mb_name']}', NOW())";
if ($this->db_query($sql))
return $data['id'];
}
public function updateMemo($data)
{
$query = "";
if ($data['is_done']) {
$query = ", done_mb_name = '{$data['done_mb_name']}', done_datetime = NOW()";
}
$sql = "UPDATE fb_memo SET is_done = '{$data['is_done']}'{$query} WHERE seq = {$data['seq']}";
if ($this->db_query($sql))
return $data['seq'];
}
}