87 lines
3.0 KiB
PHP
87 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Client;
|
|
use App\Services\GoogleAdsService;
|
|
use App\Services\UserHierarchyService;
|
|
use Inertia\Inertia;
|
|
use Inertia\Response;
|
|
// use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Carbon\Carbon;
|
|
|
|
class GoogleController extends Controller
|
|
{
|
|
protected $adsService;
|
|
|
|
public function __construct(
|
|
GoogleAdsService $adsService,
|
|
private UserHierarchyService $hierarchyService,
|
|
)
|
|
{
|
|
$this->adsService = $adsService;
|
|
}
|
|
|
|
public function campaigns($id)
|
|
{
|
|
$campaigns = $this->adsService->listCampaigns($id);
|
|
return response()->json($campaigns);
|
|
}
|
|
|
|
public function listCampaignsMetrics(Request $request)
|
|
{
|
|
$clientCustomerId = $request->clientCustomerId;
|
|
$startDate = $request->startDate;
|
|
$endDate = $request->endDate;
|
|
|
|
$client = Client::where('customer_id', $clientCustomerId)->firstOrFail();
|
|
abort_unless($this->hierarchyService->canViewClient(Auth::user(), $client), 403);
|
|
|
|
$campaigns = $this->adsService->listCampaigns($clientCustomerId);
|
|
$campaignsWithMetrics = [];
|
|
foreach ($campaigns as $campaign) {
|
|
$metrics = $this->adsService->listCampaignsMetrics(
|
|
$clientCustomerId,
|
|
$campaign['id'],
|
|
$startDate,
|
|
$endDate
|
|
);
|
|
$campaign['total_actual_spend'] = 0;
|
|
$campaign['total_impressions'] = 0;
|
|
$campaign['total_clicks'] = 0;
|
|
$campaign['metrics'] = [];
|
|
|
|
foreach ($metrics as $metric) {
|
|
$campaign['total_actual_spend'] += $metric['actual_spend'] ?? 0;
|
|
$campaign['total_impressions'] += $metric['impressions'] ?? 0;
|
|
$campaign['total_clicks'] += $metric['clicks'] ?? 0;
|
|
}
|
|
|
|
// CPC calculation
|
|
$campaign['cpc'] = $campaign['total_clicks'] > 0
|
|
? $campaign['total_actual_spend'] / $campaign['total_clicks']
|
|
: 0;
|
|
|
|
$campaign['total_actual_spend'] = number_format($campaign['total_actual_spend'], 2, '.', '');
|
|
|
|
$campaign['metrics'] = $metrics;
|
|
|
|
$campaignsWithMetrics[] = $campaign;
|
|
}
|
|
$totalSpend = array_sum(array_column($campaignsWithMetrics, 'total_actual_spend'));
|
|
$totalClicks = array_sum(array_column($campaignsWithMetrics, 'total_clicks'));
|
|
return response()->json([
|
|
'campaigns' => $campaignsWithMetrics,
|
|
'summary' => [
|
|
'total_actual_spend' => number_format(array_sum(array_column($campaignsWithMetrics, 'total_actual_spend')), 2, '.', ''),
|
|
'total_impressions' => array_sum(array_column($campaignsWithMetrics, 'total_impressions')),
|
|
'total_clicks' => array_sum(array_column($campaignsWithMetrics, 'total_clicks')),
|
|
]
|
|
]);
|
|
}
|
|
}
|