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

1391 lines
56 KiB
PHP

<?php
namespace App\Controllers\AdvertisementManager;
use App\Controllers\BaseController;
use App\Libraries\Calc;
use App\Models\Advertiser\AdvFacebookManagerModel;
use App\Models\Advertiser\AdvGoogleManagerModel;
use App\Models\Advertiser\AdvKakaoManagerModel;
use App\Models\Advertiser\AdvManagerModel;
use App\Services\AdvLoggerService;
use CodeIgniter\API\ResponseTrait;
use App\ThirdParty\facebook_api\ZenithFB;
use App\ThirdParty\googleads_api\ZenithGG;
use App\ThirdParty\moment_api\ZenithKM;
class AdvManagerController extends BaseController
{
use ResponseTrait;
protected $admanager, $facebook, $google, $kakao;
private $campaign;
public function __construct()
{
$this->admanager = model(AdvManagerModel::class);
$this->facebook = model(AdvFacebookManagerModel::class);
$this->google = model(AdvGoogleManagerModel::class);
$this->kakao = model(AdvKakaoManagerModel::class);
}
public function index()
{
return view('advertisements/manage');
}
public function getData(){
if(!$this->request->isAJAX() || strtolower($this->request->getMethod()) !== 'get') return $this->fail("잘못된 요청");
$arg = $this->request->getGet();
if(getenv('MY_SERVER_NAME') === 'resta' && isset($arg['searchData']['carelabs']) && $arg['searchData']['carelabs'] == 1) {
$arg['external'] = 'resta';
return $this->getCareLabsData($arg);
}
// print_r($arg['searchData']);
switch ($arg['searchData']['type']) {
case 'ads':
$result = $this->getAds($arg);
break;
case 'adsets':
$result = $this->getAdSets($arg);
break;
case 'campaigns':
$result = $this->getCampaigns($arg);
break;
default:
$result = $this->getCampaigns($arg);
break;
}
if(!isset($result['data'])) return $this->respond([]);
$orderBy = [];
if(!empty($arg['order'])) {
foreach($arg['order'] as $row) {
if($row['dir'] == 'desc'){
$sort = SORT_DESC;
}else{
$sort = SORT_ASC;
}
$col = $arg['columns'][$row['column']]['data'];
if($col) $orderBy[$col] = $sort;
}
array_sort_by_multiple_keys($result['data'], $orderBy);
}
foreach ($result['data'] as &$value) {
$value['class'] = [];
if(!empty($value['status']) || !empty($value['approval_status'])){
if (isset($value['status']) && $value['status'] != 'ON') {
$value['class'][] = 'off';
}
$policyTopic = [];
if(!empty($value['policyTopic'])){
$policyTopic = explode(',', $value['policyTopic']);
}
if (isset($value['approval_status']) && ($value['approval_status'] == 'DISAPPROVED' || $value['approval_status'] == 'REJECTED' || $value['approval_status'] == 'AREA_OF_INTEREST_ONLY' || ($value['approval_status'] == 'APPROVED_LIMITED' && in_array('YOUTUBE_AD_REQUIREMENTS_AUTOMATED_CONTENT_POLICY_DECISION', $policyTopic)))) {
$value['class'][] = 'disapproval';
} else if (isset($value['approval_status']) && ($value['approval_status'] == 'APPROVED_LIMITED' || ($value['approval_status'] == 'APPROVED' && in_array('HEALTH_IN_PERSONALIZED_ADS', $policyTopic)))) {
$value['class'][] = 'approved_limited';
}
if (isset($value['class'])) {
$value['class'] = implode(" ", $value['class']);
}
}
$value['campaign_bidamount'] = number_format($value['campaign_bidamount'] ?? 0);
$value['bidamount'] = number_format($value['bidamount']);
$value['budget'] = number_format($value['budget']);
$value['impressions'] = number_format($value['impressions']);
$value['click'] = number_format($value['click']);
$value['spend'] = number_format($value['spend']);
$value['sales'] = number_format($value['sales']);
$value['unique_total'] = number_format($value['unique_total']);
$value['margin'] = number_format($value['margin']);
$value['margin_ratio'] = number_format($value['margin_ratio']);
$value['cpa'] = number_format($value['cpa']);
$value['cpc'] = number_format($value['cpc']);
if(isset($arg['noLimit'])) {
return $this->respond($result['data']);
}
}
// $result['report'] = $this->getReport($arg);
// $result['accounts'] = $this->getAccounts($arg);
// $result['media_accounts'] = $this->getMediaAccounts($arg);
return $this->respond($result);
}
public function getReportData() {
if(!$this->request->isAJAX() || strtolower($this->request->getMethod()) !== 'get') return $this->fail("잘못된 요청");
$arg = $this->request->getGet();
$result = $this->getReport($arg);
return $this->respond($result);
}
public function getAccountsData() {
if(!$this->request->isAJAX() || strtolower($this->request->getMethod()) !== 'get') return $this->fail("잘못된 요청");
$arg = $this->request->getGet();
$result = $this->getAccounts($arg);
return $this->respond($result);
}
public function getMediaAccountsData() {
if(!$this->request->isAJAX() || strtolower($this->request->getMethod()) !== 'get') return $this->fail("잘못된 요청");
$arg = $this->request->getGet();
$result = $this->getMediaAccounts($arg);
return $this->respond($result);
}
private function getAccounts($arg)
{
$result = $this->admanager->getAccounts($arg);
return $result;
}
private function getMediaAccounts($arg)
{
$result = $this->admanager->getMediaAccounts($arg);
$accounts = $this->setAccountData($result);
return $accounts;
}
public function getAccountStat()
{
$arg = $this->request->getGet();
$result = $this->admanager->getAccountStat($arg);
return $this->respond($result);
}
private function setAccountData($accounts)
{
$facebookApprovals = [];
$googleApprovals = [];
$kakaoApprovals = [];
if(array_search('facebook', array_column($accounts, 'media')) !== false){
$facebookApprovals = $this->facebook->getDisapproval();
}
if(array_search('google', array_column($accounts, 'media')) !== false){
$disapprovalGoogle = $this->google->getDisapproval();
foreach ($disapprovalGoogle as $row) {
$policyTopic = [];
if(!empty($row['policyTopic'])) $policyTopic = explode(',', $row['policyTopic']);
if($row['approvalStatus'] == 'APPROVED_LIMITED' && in_array('YOUTUBE_AD_REQUIREMENTS_AUTOMATED_CONTENT_POLICY_DECISION', $policyTopic)) {
$row['approvalStatus'] = 'DISAPPROVED';
} else if($row['approvalStatus'] == 'APPROVED' && in_array('HEALTH_IN_PERSONALIZED_ADS', $policyTopic)) {
$row['approvalStatus'] = 'APPROVED_LIMITED';
}
if(!isset($googleApprovals[$row['approvalStatus']])) $googleApprovals[$row['approvalStatus']] = [];
if(!in_array($row['customerId'], $googleApprovals[$row['approvalStatus']]))
$googleApprovals[$row['approvalStatus']][] = $row['customerId'];
}
}
if(array_search('kakao', array_column($accounts, 'media')) !== false){
$kakaoApprovals = $this->kakao->getDisapproval();
}
foreach ($accounts as &$account) {
if($account['media'] == 'facebook'){
$account['db_ratio'] = 0;
if ($account['status'] != 1){
$account['tag_inactive'] = 'tag_inactive';
}
if (in_array($account['media_account_id'], $facebookApprovals)){
$account['disapproval'] = 'disapproval';
}
$account['db_count'] = $account['db_count'] * $account['date_count'];
if($account['db_sum'] && $account['db_count']){
$account['db_ratio'] = round($account['db_sum'] / $account['db_count'] * 100,1);
}
if($account['db_ratio'] >= 100) {
$account['db_ratio'] = 100;
$account['over'] = 'over';
}
if(!$account['db_sum']){
$account['db_sum'] = 0;
}
continue;
}
if($account['media'] == 'google'){
$account['db_ratio'] = 0;
if($account['is_exposed'] === 0){
$account['tag_inactive'] = 'tag_inactive';
}
if((isset($googleApprovals['DISAPPROVED']) && in_array($account['media_account_id'], $googleApprovals['DISAPPROVED'])) ||
(isset($googleApprovals['AREA_OF_INTEREST_ONLY']) && in_array($account['media_account_id'], $googleApprovals['AREA_OF_INTEREST_ONLY'])))
{
$account['disapproval'] = 'disapproval';
}
if(isset($googleApprovals['APPROVED_LIMITED']) && in_array($account['media_account_id'], $googleApprovals['APPROVED_LIMITED']))
{
$account['approved_limited'] = 'approved_limited';
}
$account['db_count'] = $account['db_count'] * $account['date_count'];
if($account['db_sum'] && $account['db_count']){
$account['db_ratio'] = round($account['db_sum'] / $account['db_count'] * 100,1);
}
if($account['db_ratio'] >= 100) {
$account['db_ratio'] = 100;
$account['over'] = 'over';
}
if(!$account['db_sum']){
$account['db_sum'] = 0;
}
continue;
}
if($account['media'] == 'kakao'){
if($account['status'] == 'OFF' || (isset($account['isAdminStop']) && $account['isAdminStop'] == 1)){
$account['tag_inactive'] = 'tag_inactive';
}
if(is_array($kakaoApprovals) && in_array($account['media_account_id'], $kakaoApprovals)){
$account['disapproval'] = 'disapproval';
}
continue;
}
}
return $accounts;
}
public function getCheckData(){
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'get'){
$arg = $this->request->getGet();
$result['report'] = $this->getReport($arg);
$result['account'] = $this->getAccounts($arg);
$result['media_accounts'] = $this->getMediaAccounts($arg);
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
public function getDiffReport(){
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'get'){
$arg = $this->request->getGet();
$currentDate = date("Y-m-d");
$arg['check'] = true;
$arg['searchData']['sdate'] = $currentDate;
$arg['searchData']['edate'] = $currentDate;
$result['today'] = $this->getReport($arg);
$arg['searchData']['sdate'] = date("Y-m-d", strtotime("-1 days", strtotime($currentDate)));
$arg['searchData']['edate'] = date("Y-m-d", strtotime("-1 days", strtotime($currentDate)));
$result['yesterday'] = $this->getReport($arg);
switch ($arg['searchData']['diff']) {
case '7days':
$arg['searchData']['sdate'] = date("Y-m-d", strtotime("-1 week"));
$arg['searchData']['edate'] = $currentDate;
break;
case '14days':
$arg['searchData']['sdate'] = date("Y-m-d", strtotime("-2 week"));
$arg['searchData']['edate'] = $currentDate;
break;
case '30days':
$arg['searchData']['sdate'] = date("Y-m-d", strtotime("-1 month"));
$arg['searchData']['edate'] = $currentDate;
break;
case 'prevmonth':
$arg['searchData']['sdate'] = date("Y-m-01", strtotime("-1 month", strtotime($currentDate)));
$arg['searchData']['edate'] = date("Y-m-t", strtotime("-1 month", strtotime($currentDate)));
break;
case 'thismonth':
$arg['searchData']['sdate'] = date("Y-m-01", strtotime($currentDate));
$arg['searchData']['edate'] = $currentDate;
break;
default:
break;
}
$result['customDate'] = $this->getReport($arg);
$result['customDate']['date'] = [
'sdate' => $arg['searchData']['sdate'],
'edate' => $arg['searchData']['edate'],
];
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
private function getReport($arg)
{
$result = $this->admanager->getReport($arg);
$columnIndex = 0;
$data = [];
foreach($result as $row) {
$data[] = $row;
foreach ($row as $col => $val) {
if ($val == NULL) $val = "0";
$total[$col][$columnIndex] = $val;
}
$columnIndex++;
}
$report['impressions_sum'] = $report['clicks_sum'] = $report['click_ratio_sum'] = $report['spend_sum'] = $report['unique_total_sum'] = $report['unique_one_price_sum'] = $report['conversion_ratio_sum'] = $report['profit_sum'] = $report['per_sum'] = $report['price_sum'] = $report['spend_ratio_sum'] =$report['cpc'] = 0;
if(!empty($result)){
$report['impressions_sum'] = array_sum($total['impressions']); //총 노출수
$report['clicks_sum'] = array_sum($total['click']); //총 클릭수
if ($report['clicks_sum'] != 0 && $report['impressions_sum'] != 0) {
$report['click_ratio_sum'] = round(($report['clicks_sum'] / $report['impressions_sum']) * 100, 2); //총 클릭률
}
$report['spend_sum'] = array_sum($total['spend']); //총 지출액
$report['spend_ratio_sum'] = floor(array_sum($total['spend']) * 0.85); //총 매체비
if ($report['clicks_sum'] != 0) {
$report['cpc'] = round($report['spend_sum'] / $report['clicks_sum'], 2);
} else {
$report['cpc'] = 0;
}
$report['unique_total_sum'] = array_sum($total['unique_total']); //총 유효db수
if ($report['spend_sum'] != 0 && $report['unique_total_sum'] != 0) {
$report['unique_one_price_sum'] = round($report['spend_sum'] / $report['unique_total_sum'], 0); //총 db당 단가
}
if ($report['unique_total_sum'] != 0 && $report['clicks_sum'] != 0) {
$report['conversion_ratio_sum'] = round(($report['unique_total_sum'] / $report['clicks_sum']) * 100, 2); //총 전환율
}
$report['price_sum'] = array_sum($total['price']); //총 매출액
$report['profit_sum'] = array_sum($total['profit']); //총 수익
if ($report['profit_sum'] != 0 && $report['price_sum'] != 0) {
$report['per_sum'] = round(($report['profit_sum'] / $report['price_sum']) * 100, 2); //총 수익률
}
$report['impressions_sum'] = number_format($report['impressions_sum']);
$report['clicks_sum'] = number_format($report['clicks_sum']);
$report['spend_sum'] = number_format($report['spend_sum']);
$report['unique_one_price_sum'] = number_format($report['unique_one_price_sum']);
$report['spend_ratio_sum'] = number_format($report['spend_ratio_sum']);
$report['price_sum'] = number_format($report['price_sum']);
$report['profit_sum'] = number_format($report['profit_sum']);
}
return $report;
}
public function getOnlyAdAccount()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'get'){
$param = $this->request->getGet();
$result = $this->admanager->getOnlyAdAccount($param);
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
public function getAdvs()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'get'){
$param = $this->request->getGet();
$result = $this->admanager->getAdvs($param);
foreach ($result as &$row) {
if(isset($row['status']) && $row['status'] == 1 || $row['status'] == 'ON' || $row['status'] == 'ENABLED' || $row['status'] == 'ACTIVE'){
$row['status'] = '활성';
}else{
$row['status'] = '비활성';
}
}
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
private function getCampaigns($arg)
{
$campaigns = $this->admanager->getCampaigns($arg);
if(!empty($campaigns)){
$campaigns = $this->setData($campaigns);
$total = $this->getTotal($campaigns);
$result = [
'total' => $total,
'data' => $campaigns,
];
return $result;
}else{
return false;
}
}
private function getAdSets($arg)
{
$result = [];
$adsets = $this->admanager->getAdSets($arg);
if(!empty($adsets)){
$adsets = $this->setData($adsets);
$result = array_merge($result, $adsets);
$total = $this->getTotal($result);
$result = [
'total' => $total,
'data' => $result,
];
return $result;
}else{
return false;
}
}
private function getAds($arg)
{
$result = [];
$ads = $this->admanager->getAds($arg);
if(!empty($ads)){
$ads = $this->setData($ads);
$result = array_merge($result, $ads);
$total = $this->getTotal($result);
$result = [
'total' => $total,
'data' => $result,
];
return $result;
}else{
return false;
}
}
private function setData($result)
{
foreach ($result as &$row) {
if($row['media'] == 'google' && isset($row['thumbnail'])){
if (!empty($row['assets'])){
$assets = $this->google->getAsset($row['assets']);
$row['thumbnail'] = $assets['url'];
}
}
$row['status'] = $this->setStatus($row['status']);
$row['margin_ratio'] = Calc::margin_ratio($row['margin'], $row['sales']); // 수익률
$row['cpc'] = Calc::cpc($row['spend'], $row['click']); // 클릭당단가 (1회 클릭당 비용)
$row['ctr'] = Calc::ctr($row['click'], $row['impressions']); // 클릭율 (노출 대비 클릭한 비율)
$row['cpa'] = Calc::cpa($row['unique_total'], $row['spend']); //DB단가(전환당 비용)
$row['cvr'] = Calc::cvr($row['unique_total'], $row['click']); //전환율
if($row['bidamount_type'] == 'cpm' && $row['bidamount'] <= 1){
$row['bidamount_type'] = '';
$row['bidamount'] = 0;
}
if(!empty($row['biddingStrategyType'])){
switch($row['biddingStrategyType']) {
case 'TARGET_CPA' :
$row['biddingStrategyType'] = '타겟 CPA';
break;
case 'TARGET_ROAS' :
$row['biddingStrategyType'] = '타겟 광고 투자수익(ROAS)';
break;
case 'TARGET_SPEND' :
$row['biddingStrategyType'] = '클릭수 최대화';
break;
case 'MAXIMIZE_CONVERSIONS' :
$row['biddingStrategyType'] = '전환수 최대화';
break;
/* //값이 뭔지 모름ㅠㅠ
case '' :
$row['biddingStrategyType'] = '검색 결과 위치 타겟';
break;
case '' :
$row['biddingStrategyType'] = '경쟁 광고보다 내 광고가 높은 순위에 게재되는 비율 타겟';
break;
case '' :
$row['biddingStrategyType'] = '타겟 노출 점유율';
break;
*/
case 'PAGE_ONE_PROMOTED' :
$row['biddingStrategyType'] = '향상된 CPC 입찰기능';
break;
case 'MANUAL_CPM' :
$row['biddingStrategyType'] = '수동 입찰 전략';
break;
case 'MANUAL_CPC' :
$row['biddingStrategyType'] = '수동 CPC';
break;
case 'UNKNOWN' :
$row['biddingStrategyType'] = '알수없음';
break;
default :
break;
}
}
}
return $result;
}
private function setStatus($status)
{
/*
ON = 인정,
READY = 집행 예정,
FINISHED = 집행 완료,
STOPPED = 정지,
ARCHIVED = 보관,
DELETED = 삭제
UNKNOWN = 알수 없음
UNSPECIFIED = 명시되지 않음
EXCEED_DAILY_BUDGET = 일 예산 초과
NO_AVAILABLE_CREATIVE = 집행 가능한 소재가 없음
CANCELED = 계약 해지
SYSTEM_CONFIG_EXTERNAL_SERVICE_STOP = 연결 서비스 제한으로 운영불가인 상태
ADACCOUNT_UNAVAILABLE = 광고계정 운영불가
CAMPAIGN_UNAVAILABLE = 캠페인 운영불가
ADGROUP_UNAVAILABLE = 광고 상위단위인 광고그룹이 운영불가인 상태
SYSTEM_CONFIG_ADMIN_STOP = 관리자 정지
OPERATING = 운영가능 상태
UNAPPROVED = 심사승인이 아닌 상태(심사중, 심사보류를 모두 포함)
INVALID_DATE = 집행기간이 도래하지 않았거나 이미 지난 상태
MONITORING_REJECTED = 관리자정지 상태
SYSTEM_CONFIG_VOID = 소재 콘텐츠 오류로 소재 운영불가인 상태
*/
if(!empty($status)){
if(in_array($status, ['ENABLED', 'ACTIVE', 'LIVE', 'ON'])){$status = 'ON';}
else if(in_array($status, ['READY'])){$status = 'READY';}
else if(in_array($status, ['FINISHED'])){$status = 'FINISHED';}
else if(in_array($status, ['OFF', 'PAUSED'])){$status = 'OFF';}
else if(in_array($status, ['ARCHIVED'])){$status = 'ARCHIVED';}
else if(in_array($status, ['DELETED', 'REMOVED'])){$status = 'DELETED';}
else if(in_array($status, ['UNKNOWN'])){$status = 'UNKNOWN';}
else if(in_array($status, ['UNSPECIFIED'])){$status = 'UNSPECIFIED';}
else if(in_array($status, ['EXCEED_DAILY_BUDGET'])){$status = 'EXCEED_DAILY_BUDGET';}
else if(in_array($status, ['NO_AVAILABLE_CREATIVE'])){$status = 'NO_AVAILABLE_CREATIVE';}
else if(in_array($status, ['CANCELED'])){$status = 'CANCELED';}
else if(in_array($status, ['SYSTEM_CONFIG_EXTERNAL_SERVICE_STOP'])){$status = 'SYSTEM_CONFIG_EXTERNAL_SERVICE_STOP';}
else if(in_array($status, ['ADACCOUNT_UNAVAILABLE'])){$status = 'ADACCOUNT_UNAVAILABLE';}
else if(in_array($status, ['CAMPAIGN_UNAVAILABLE'])){$status = 'CAMPAIGN_UNAVAILABLE';}
else if(in_array($status, ['SYSTEM_CONFIG_ADMIN_STOP'])){$status = 'SYSTEM_CONFIG_ADMIN_STOP';}
else if(in_array($status, ['OPERATING'])){$status = 'OPERATING';}
else if(in_array($status, ['UNAPPROVED'])){$status = 'UNAPPROVED';}
else if(in_array($status, ['INVALID_DATE'])){$status = 'INVALID_DATE';}
else if(in_array($status, ['MONITORING_REJECTED'])){$status = 'MONITORING_REJECTED';}
else if(in_array($status, ['ADGROUP_UNAVAILABLE'])){$status = 'ADGROUP_UNAVAILABLE';}
else if(in_array($status, ['SYSTEM_CONFIG_VOID'])){$status = 'SYSTEM_CONFIG_VOID';}
else{$status = 'ETC';};
}else{
$status = NULL;
};
return $status;
}
private function getTotal($datas)
{
$total = [];
$total['impressions'] = 0;
$total['click'] = 0;
$total['spend'] = 0;
$total['margin'] = 0;
$total['unique_total'] = 0;
$total['sales'] = 0;
$total['budget'] = 0;
$total['bidamount'] = 0;
$total['cpc'] = 0;
$total['ctr'] = 0;
$total['cpa'] = 0;
$total['cvr'] = 0;
$total['margin_ratio'] = 0;
$total['expect_db'] = 0;
$total['avg_cpc'] = 0;
$total['avg_cpa'] = 0;
$total['avg_cvr'] = 0;
$total['avg_ctr'] = 0;
foreach($datas as $data){
$total['impressions'] +=$data['impressions'];
$total['click'] +=$data['click'];
$total['spend'] +=$data['spend'];
$total['margin'] +=$data['margin'];
$total['unique_total'] +=$data['unique_total'];
$total['sales'] +=$data['sales'];
$total['bidamount'] +=$data['bidamount'];
$total['budget'] +=$data['budget'];
$total['cpc'] +=$data['cpc'];
$total['ctr'] +=$data['ctr'];
$total['cpa'] +=$data['cpa'];
$total['cvr'] +=$data['cvr'];
$total['margin_ratio'] +=$data['margin_ratio'];
//CPC(Cost Per Click: 클릭당단가 (1회 클릭당 비용)) = 지출액/링크클릭
if($total['click'] > 0){
$total['avg_cpc'] = $total['spend'] / $total['click'];
}
//CTR(Click Through Rate: 클릭율 (노출 대비 클릭한 비율)) = (링크클릭/노출수)*100
if($total['impressions'] > 0){
$total['avg_ctr'] = ($total['click'] / $total['impressions']) * 100;
}
//CPA(Cost Per Action: 현재 DB단가(전환당 비용)) = 지출액/유효db
if($total['unique_total'] > 0){
$total['avg_cpa'] = $total['spend'] / $total['unique_total'];
}
//CVR(Conversion Rate:전환율 = (유효db / 링크클릭)*100
if ($total['click'] > 0) {
$total['avg_cvr'] = ($total['unique_total'] / $total['click']) * 100;
}
//수익률 = (수익/매출액)*100
if ($total['sales'] > 0) {
$total['avg_margin_ratio'] = ($total['margin'] / $total['sales']) * 100;
} else {
$total['avg_margin_ratio'] = 0;
}
if ($data['status'] == 'ON' && $data['unique_total'] && $data['cpa'] != 0){
$total['expect_db'] += round($data['budget'] / $data['cpa']);
}
}
$total['impressions'] = number_format($total['impressions']);
$total['bidamount'] = number_format($total['bidamount']);
$total['budget'] = number_format($total['budget']);
$total['click'] = number_format($total['click']);
$total['spend'] = number_format($total['spend']);
$total['avg_cpa'] = number_format($total['avg_cpa']);
$total['margin'] = number_format($total['margin']);
$total['sales'] = number_format($total['sales']);
$total['avg_cpc'] = number_format($total['avg_cpc']);
return $total;
}
public function setDbCount()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'put'){
$param = $this->request->getRawInput();
$sliceId = explode("_", $param['id']);
$data = [
'media' => $sliceId[0],
'id' => $sliceId[1],
'db_count' => $param['db_count']
];
switch ($data['media']) {
case 'facebook':
$result = $this->facebook->updateDbCount($data);
break;
case 'google':
$result = $this->google->updateDbCount($data);
break;
default:
return $this->fail("잘못된 요청");
}
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
public function setExposed()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'put'){
$param = $this->request->getRawInput();
$sliceId = explode("_", $param['id']);
$data = [
'media' => $sliceId[0],
'id' => $sliceId[1],
'is_exposed' => $param['is_exposed']
];
switch ($data['media']) {
case 'google':
$result = $this->google->updateExposed($data);
break;
default:
return $this->fail("잘못된 요청");
}
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
public function updateStatus()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'put'){
if (auth()->user()->inGroup('test')) {
return $this->fail("테스트 계정");
}
$param = $this->request->getRawInput();
$sliceId = explode("_", $param['id']);
$data = [
'media' => $sliceId[0],
'id' => $sliceId[1],
'tab' => $param['tab'],
'status' => $param['status'],
'old_status' => $param['old_status'],
'customerId' => $param['customerId'],
];
switch ($data['tab']) {
case 'ads':
switch ($data['media']) {
case 'facebook':
if($data['status'] === "ON"){
$status = 'ACTIVE';
}else{
$status = 'PAUSED';
}
$zenith = new ZenithFB();
$result = $zenith->setAdStatus($data['id'], $status);
break;
case 'kakao':
if($data['status'] === "ON"){
$status = 'ON';
}else{
$status = 'OFF';
}
$zenith = new ZenithKM();
$result = $zenith->setCreativeOnOff($data['id'], $data['status']);
break;
case 'google':
if($data['status'] === "ON"){
$param = ['status' => 'ENABLED'];
}else{
$param = ['status' => 'PAUSED'];
}
$zenith = new ZenithGG();
$result = $zenith->updateAdGroupAd($data['customerId'], null, $data['id'], $param);
break;
default:
return $this->fail("지원하지 않는 매체입니다.");
}
break;
case 'adsets':
switch ($data['media']) {
case 'facebook':
if($data['status'] === "ON"){
$status = 'ACTIVE';
}else{
$status = 'PAUSED';
}
$zenith = new ZenithFB();
$result = $zenith->setAdsetStatus($data['id'], $status);
break;
case 'kakao':
$zenith = new ZenithKM();
$result = $zenith->setAdGroupOnOff($data['id'], $data['status']);
break;
case 'google':
if($data['status'] === "ON"){
$param = ['status' => 'ENABLED'];
}else{
$param = ['status' => 'PAUSED'];
}
$zenith = new ZenithGG();
$result = $zenith->updateAdGroup($data['customerId'], $data['id'], $param);
break;
default:
return $this->fail("지원하지 않는 매체입니다.");
}
break;
case 'campaigns':
switch ($data['media']) {
case 'facebook':
if($data['status'] === "ON"){
$status = 'ACTIVE';
}else{
$status = 'PAUSED';
}
$zenith = new ZenithFB();
$result = $zenith->setCampaignStatus($data['id'], $status);
break;
case 'kakao':
$zenith = new ZenithKM();
$result = $zenith->setCampaignOnOff($data['id'], $data['status']);
break;
case 'google':
if($data['status'] === "ON"){
$param = ['status' => 'ENABLED'];
}else{
$param = ['status' => 'PAUSED'];
}
$zenith = new ZenithGG();
$result = $zenith->updateCampaign($data['customerId'], $data['id'], $param);
break;
default:
return $this->fail("지원하지 않는 매체입니다.");
}
break;
default:
return $this->fail("잘못된 요청");
}
if(!empty($result)){
$logData = [
'media' => $data['media'] ?? '',
'id' => $data['id'] ?? '',
'type' => $data['tab'] ?? '',
'change_type' => 'status',
'old_value' => $data['old_status'] ?? '',
'change_value' => $data['status'] ?? '',
'nickname' => auth()->user()->username ?? '',
];
$logger = new AdvLoggerService();
$logger->insertLog($logData);
$result['response'] = true;
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}else{
return $this->fail("잘못된 요청");
}
}
public function updateName()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'put'){
if (auth()->user()->inGroup('test')) {
return $this->fail("테스트 계정");
}
$param = $this->request->getRawInput();
$sliceId = explode("_", $param['id']);
$data = [
'media' => $sliceId[0],
'id' => $sliceId[1],
'tab' => $param['tab'],
'name' => $param['name'],
'old_name' => $param['old_name'],
'customerId' => $param['customerId'],
];
$param = [
'id' => $data['id'],
'name' => $data['name'],
];
switch ($data['tab']) {
case 'ads':
switch ($data['media']) {
case 'facebook':
$param['type'] = $data['tab'];
$zenith = new ZenithFB();
$result = $zenith->updateName($param);
break;
case 'kakao':
$zenith = new ZenithKM();
$result = $zenith->setCreative($param, $data['customerId']);
break;
case 'google':
return $this->fail("지원하지 않는 매체입니다.");
break;
default:
return $this->fail("지원하지 않는 매체입니다.");
}
break;
case 'adsets':
switch ($data['media']) {
case 'facebook':
$param['type'] = $data['tab'];
$zenith = new ZenithFB();
$result = $zenith->updateName($param);
break;
case 'kakao':
return $this->fail("지원하지 않는 매체입니다.");
break;
case 'google':
$zenith = new ZenithGG();
$result = $zenith->updateAdGroup($data['customerId'], $data['id'], $param);
break;
default:
return $this->fail("지원하지 않는 매체입니다.");
}
break;
case 'campaigns':
switch ($data['media']) {
case 'facebook':
$param['type'] = $data['tab'];
$zenith = new ZenithFB();
$result = $zenith->updateName($param);
break;
case 'kakao':
$zenith = new ZenithKM();
$result = $zenith->setCampaign($param, $data['customerId']);
break;
case 'google':
$zenith = new ZenithGG();
$result = $zenith->updateCampaign($data['customerId'], $data['id'], $param);
break;
default:
return $this->fail("지원하지 않는 매체입니다.");
}
break;
default:
return $this->fail("잘못된 요청");
}
if(!empty($result)){
$logData = [
'media' => $data['media'] ?? '',
'id' => $data['id'] ?? '',
'type' => $data['tab'] ?? '',
'change_type' => 'name',
'old_value' => $data['old_name'] ?? '',
'change_value' => $data['name'] ?? '',
'nickname' => auth()->user()->username ?? '',
];
$logger = new AdvLoggerService();
$logger->insertLog($logData);
$result['response'] = true;
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}else{
return $this->fail("잘못된 요청");
}
}
public function updateBudget()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'put'){
if (auth()->user()->inGroup('test')) {
return $this->fail("테스트 계정");
}
$param = $this->request->getRawInput();
$sliceId = explode("_", $param['id']);
$data = [
'media' => $sliceId[0],
'id' => $sliceId[1],
'customer' => $param['customer'],
'tab' => $param['tab'],
'budget' => $param['budget'],
'old_budget' => $param['old_budget']
];
switch ($data['tab']) {
case 'ads':
return $this->fail("지원하지 않습니다.");
break;
case 'adsets':
switch ($data['media']) {
case 'facebook':
$zenith = new ZenithFB();
$result = $zenith->updateAdSetBudget($data);
if(!empty($result)){
$result = [
'id' => $result,
'media' => 'facebook'
];
}
break;
case 'kakao':
$data['type'] = 'adgroup';
$zenith = new ZenithKM();
$result = $zenith->setDailyBudgetAmount($data);
if(!empty($result)){
$result = [
'id' => $result,
'media' => 'kakao'
];
}
break;
case 'google':
return $this->fail("지원하지 않습니다.");
break;
default:
return $this->fail("지원하지 않습니다.");
}
break;
case 'campaigns':
switch ($data['media']) {
case 'facebook':
$zenith = new ZenithFB();
$result = $zenith->updateCampaignBudget($data);
if(!empty($result)){
$result = [
'id' => $result,
'media' => 'facebook'
];
}
break;
case 'kakao':
$data['type'] = 'campaign';
$zenith = new ZenithKM();
$result = $zenith->setDailyBudgetAmount($data);
if(!empty($result)){
$result = [
'id' => $result,
'media' => 'kakao'
];
}
break;
case 'google':
$param = ['budget' => $data['budget']];
$zenith = new ZenithGG();
$result = $zenith->updateCampaignBudget($data['customer'], $data['id'], $param);
if(!empty($result)){
$result = [
'id' => $result,
'media' => 'google'
];
}
break;
default:
return $this->fail("지원하지 않습니다.");
}
break;
default:
return $this->fail("잘못된 요청");
}
if(!empty($result) && $result['id'] == $data['id']){
$logData = [
'media' => $data['media'] ?? '',
'id' => $data['id'] ?? '',
'type' => $data['tab'] ?? '',
'change_type' => 'budget',
'old_value' => $data['old_budget'] ?? '',
'change_value' => $data['budget'] ?? '',
'nickname' => auth()->user()->username ?? '',
];
$logger = new AdvLoggerService();
$logger->insertLog($logData);
$result = true;
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}else{
return $this->fail("잘못된 요청");
}
}
public function updateBidAmount()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'put'){
if (auth()->user()->inGroup('test')) {
return $this->fail("테스트 계정");
}
$param = $this->request->getRawInput();
$sliceId = explode("_", $param['id']);
$data = [
'media' => $sliceId[0],
'id' => $sliceId[1],
'customer' => $param['customer'],
'tab' => $param['tab'],
'bidamount' => $param['bidamount'],
'bidamount_type' => $param['bidamount_type'] ?? null,
'old_bidamount' => $param['old_bidamount']
];
switch ($data['tab']) {
case 'ads':
return $this->fail("지원하지 않습니다.");
break;
case 'adsets':
switch ($data['media']) {
case 'kakao':
$data['type'] = 'adgroup';
$zenith = new ZenithKM();
$result = $zenith->setAdgroupBidAmount($data['id'], $data['bidamount']);
if(!empty($result)){
$result = [
'id' => $result,
'media' => 'kakao'
];
}
break;
case 'google':
if(!empty($data['bidamount_type'])){
$updateArray = [];
if($data['bidamount_type'] == 'cpc'){
$updateArray['cpcBidAmount'] = $data['bidamount'];
}else if($data['bidamount_type'] == 'cpm'){
$updateArray['cpmBidAmount'] = $data['bidamount'];
}else if($data['bidamount_type'] == 'cpa'){
$updateArray['cpaBidAmount'] = $data['bidamount'];
}
$zenith = new ZenithGG();
$result = $zenith->updateAdGroup($data['customer'], $data['id'], $updateArray);
if(!empty($result)){
$result = [
'id' => $result['id'],
'media' => 'google'
];
}
};
break;
default:
return $this->fail("지원하지 않습니다.");
}
break;
case 'campaigns':
switch ($data['media']) {
case 'google':
$updateArray = ['cpaBidAmount' => $data['bidamount']];
$zenith = new ZenithGG();
$result = $zenith->updateCampaign($data['customer'], $data['id'], $updateArray);
if(!empty($result)){
$result = [
'id' => $result['id'],
'media' => 'google'
];
}
break;
default:
return $this->fail("지원하지 않습니다.");
}
break;
default:
return $this->fail("잘못된 요청");
}
if(!empty($result) && $result['id'] == $data['id']){
$logData = [
'media' => $data['media'] ?? '',
'id' => $data['id'] ?? '',
'type' => $data['tab'] ?? '',
'change_type' => 'bidamount',
'old_value' => $data['old_bidamount'] ?? '',
'change_value' => $data['bidamount'] ?? '',
'nickname' => auth()->user()->username ?? '',
];
$logger = new AdvLoggerService();
$logger->insertLog($logData);
$result = true;
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}else{
return $this->fail("잘못된 요청");
}
}
public function updateAdv()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'put'){
if (auth()->user()->inGroup('test')) {
return $this->fail("테스트 계정");
}
$data = $this->request->getRawInput();
//$data = $this->request->getGet();
$result = false;
$facebookArray = [];
$googleArray = [];
$kakaoArray = [];
foreach ($data['check'] as $id) {
$sliceId = explode("_", $id);
$media = $sliceId[0];
$advId = $sliceId[1];
switch ($media) {
case 'facebook':
$facebookArray[] = $advId;
break;
case 'kakao':
$kakaoArray[] = $advId;
break;
case 'google':
$googleArray[] = $advId;
break;
default:
return $this->fail("지원하지 않는 매체입니다.");
}
}
if (!empty($facebookArray)) {
$this->facebook->setUpdatingByAds($facebookArray);
$zenith = new ZenithFB();
$updated = $zenith->setManualUpdate($facebookArray);
if(!empty($updated)){
$result = true;
}else{
return $this->fail("수동 업데이트 요청에 실패하였습니다.");
}
}
if (!empty($googleArray)) {
$ids = $this->google->getCustomerByCampaignId($googleArray);
$this->google->setUpdatingByAds($googleArray);
$zenith = new ZenithGG();
$updated = $zenith->setManualUpdate($ids);
if(!empty($updated)){
$result = true;
}else{
return $this->fail("수동 업데이트 요청에 실패하였습니다.");
}
}
if (!empty($kakaoArray)) {
$ids = $this->kakao->getAccountByCampaignId($kakaoArray);
$this->kakao->setUpdatingByAds($kakaoArray);
$zenith = new ZenithKM();
$updated = $zenith->setManualUpdate($ids);
if(!empty($updated)){
$result = true;
}else{
return $this->fail("수동 업데이트 요청에 실패하였습니다.");
}
}
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
public function updateCode()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'put'){
$data = $this->request->getRawInput();
$sliceId = explode("_", $data['id']);
$media = $sliceId[0];
$adId = $sliceId[1];
if($data['tab'] == 'ads'){
$data = [
'code' => $data['code'] ?? '',
'id' => $adId
];
switch ($media) {
case 'facebook':
$result = $this->facebook->updateCode($data);
break;
case 'kakao':
$result = $this->kakao->updateCode($data);
break;
case 'google':
$result = $this->google->updateCode($data);
break;
default:
return $this->fail("지원하지 않는 매체입니다.");
}
}
if(isset($result['code'])){
$result['response'] = true;
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}else{
return $this->fail("잘못된 요청");
}
}
public function getMemo()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'get'){
$param = $this->request->getGet();
$result = $this->admanager->getMemo($param);
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
public function addMemo()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'post'){
$param = $this->request->getPost();
$param['nickname'] = auth()->user()->username;
$param['is_done'] = 0;
$result = $this->admanager->addMemo($param);
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
public function checkMemo()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'post'){
$param = $this->request->getPost();
$param['done_nickname'] = auth()->user()->username;
$result = $this->admanager->checkMemo($param);
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
public function getChangeLogs()
{
if($this->request->isAJAX() && strtolower($this->request->getMethod()) === 'get'){
$id = $this->request->getGet('id');
$sdate = $this->request->getGet('sdate');
$edate = $this->request->getGet('edate');
$dates = [
'sdate' => $sdate,
'edate' => $edate
];
if(!empty($id)){
$sliceId = explode("_", $id);
$id = $sliceId[1];
$result = $this->admanager->getChangeLogs($id, $dates);
}else{
$result = $this->admanager->getChangeLogs(null, $dates);
}
return $this->respond($result);
}else{
return $this->fail("잘못된 요청");
}
}
private function getCareLabsData($arg)
{
$url = "https://carezenith.co.kr/resta/get-adv?".http_build_query($arg);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
}