From 7d3d513ffb0dcbf50292fcfd720b08bc9f68fc45 Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Fri, 20 Mar 2026 15:10:25 +0100 Subject: [PATCH] update --- .vscode/ftp-kr.sync.cache.json | 5 +- api.php | 155 +++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 2 deletions(-) diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json index 24cfd73..81086af 100644 --- a/.vscode/ftp-kr.sync.cache.json +++ b/.vscode/ftp-kr.sync.cache.json @@ -431,8 +431,8 @@ }, ".htaccess": { "type": "-", - "size": 716, - "lmtime": 1772117932512, + "size": 819, + "lmtime": 1773929242197, "modified": false }, "index.php": { @@ -738,6 +738,7 @@ "modified": false } }, + "raporty": {}, "robots.txt": { "type": "-", "size": 25, diff --git a/api.php b/api.php index 8d2a9cd..c2392ad 100644 --- a/api.php +++ b/api.php @@ -114,6 +114,73 @@ function api_normalize_product_text( $value ) return $value; } +function api_resolve_client( $mdb, $client_id, $google_ads_id ) +{ + if ( $client_id > 0 ) + { + return $mdb -> query( + 'SELECT id, google_ads_customer_id + FROM clients + WHERE id = :client_id + LIMIT 1', + [ + ':client_id' => (int) $client_id + ] + ) -> fetch( \PDO::FETCH_ASSOC ); + } + + if ( $google_ads_id !== '' ) + { + $google_ads_id_clean = str_replace( '-', '', $google_ads_id ); + return $mdb -> query( + 'SELECT id, google_ads_customer_id + FROM clients + WHERE REPLACE( google_ads_customer_id, \'-\', \'\' ) = :google_ads_id + LIMIT 1', + [ + ':google_ads_id' => $google_ads_id_clean + ] + ) -> fetch( \PDO::FETCH_ASSOC ); + } + + return null; +} + +function api_resolve_campaign_for_client( $mdb, $client_id, $campaign_db_id, $campaign_external_id ) +{ + if ( $campaign_db_id > 0 ) + { + return $mdb -> query( + 'SELECT id, campaign_id, campaign_name + FROM campaigns + WHERE id = :campaign_id + AND client_id = :client_id + LIMIT 1', + [ + ':campaign_id' => (int) $campaign_db_id, + ':client_id' => (int) $client_id + ] + ) -> fetch( \PDO::FETCH_ASSOC ); + } + + if ( $campaign_external_id !== '' ) + { + return $mdb -> query( + 'SELECT id, campaign_id, campaign_name + FROM campaigns + WHERE campaign_id = :campaign_external_id + AND client_id = :client_id + LIMIT 1', + [ + ':campaign_external_id' => $campaign_external_id, + ':client_id' => (int) $client_id + ] + ) -> fetch( \PDO::FETCH_ASSOC ); + } + + return null; +} + // dodawanie domeny przez API if ( \S::get( 'action' ) == 'domain_tester_add' ) { @@ -677,6 +744,94 @@ if ( \S::get( 'action' ) == 'products_to_optimize' ) ] ); } +// Odczyt historii ROAS 30 dni dla kampanii (domyslnie 30 rekordow, opcjonalnie cala historia) +if ( \S::get( 'action' ) == 'campaign_roas_history_get' ) +{ + api_validate_api_key( $mdb ); + + $client_id = (int) \S::get( 'client_id' ); + $google_ads_id = trim( (string) \S::get( 'google_ads_id' ) ); + $campaign_db_id = (int) \S::get( 'campaign_db_id' ); + $campaign_external_id = trim( (string) \S::get( 'campaign_id' ) ); + $all = (int) \S::get( 'all' ) === 1; + $limit = (int) \S::get( 'limit' ); + + if ( $client_id <= 0 && $google_ads_id === '' ) + { + api_json_response( [ 'result' => 'error', 'message' => 'Missing required param: client_id or google_ads_id' ], 422 ); + } + + if ( $campaign_db_id <= 0 && $campaign_external_id === '' ) + { + api_json_response( [ 'result' => 'error', 'message' => 'Missing required param: campaign_db_id or campaign_id' ], 422 ); + } + + $client = api_resolve_client( $mdb, $client_id, $google_ads_id ); + + if ( !$client ) + { + api_json_response( [ 'result' => 'error', 'message' => 'Client not found' ], 404 ); + } + + $campaign = api_resolve_campaign_for_client( $mdb, (int) $client['id'], $campaign_db_id, $campaign_external_id ); + + if ( !$campaign ) + { + api_json_response( [ 'result' => 'error', 'message' => 'Campaign not found for selected client' ], 404 ); + } + + if ( !$all ) + { + if ( $limit <= 0 ) + { + $limit = 30; + } + + if ( $limit > 3650 ) + { + $limit = 3650; + } + } + + $history_where = [ + 'campaign_id' => (int) $campaign['id'], + 'ORDER' => [ 'date_add' => 'DESC' ] + ]; + + if ( !$all ) + { + $history_where['LIMIT'] = $limit; + } + + $history_rows = $mdb -> select( + 'campaigns_history', + [ 'date_add', 'roas_30_days' ], + $history_where + ); + + $history = []; + + foreach ( (array) $history_rows as $row ) + { + $history[] = [ + 'date' => (string) ( $row['date_add'] ?? '' ), + 'roas_30_days' => (float) ( $row['roas_30_days'] ?? 0 ) + ]; + } + + api_json_response( [ + 'result' => 'ok', + 'client_id' => (int) $client['id'], + 'google_ads_id' => (string) ( $client['google_ads_customer_id'] ?? '' ), + 'campaign_db_id' => (int) $campaign['id'], + 'campaign_id' => (string) ( $campaign['campaign_id'] ?? '' ), + 'campaign_name' => (string) ( $campaign['campaign_name'] ?? '' ), + 'all' => $all ? 1 : 0, + 'count' => count( $history ), + 'history' => $history + ] ); +} + // Open Page Rank - zapis if ( \S::get( 'action' ) == 'domain_opr_save' ) {