From f32f40bc509ad8c58bb3015a27343a4d4f58ee31 Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Wed, 1 Jan 2025 23:34:52 +0100 Subject: [PATCH] Add Allegro import functionality and enhance product history management --- .vscode/ftp-kr.sync.cache.json | 8 +- autoload/class.S.php | 35 ++++++ autoload/controls/class.Allegro.php | 177 ++++++++++++++++++++++++++++ autoload/controls/class.Cron.php | 1 + autoload/factory/class.Products.php | 4 +- templates/allegro/main_view.php | 35 ++++++ templates/site/layout-logged.php | 3 + 7 files changed, 257 insertions(+), 6 deletions(-) create mode 100644 autoload/controls/class.Allegro.php create mode 100644 templates/allegro/main_view.php diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json index 768bf22..0bb540b 100644 --- a/.vscode/ftp-kr.sync.cache.json +++ b/.vscode/ftp-kr.sync.cache.json @@ -29,8 +29,8 @@ }, "class.Cron.php": { "type": "-", - "size": 18602, - "lmtime": 1733867229914, + "size": 18166, + "lmtime": 1734812301104, "modified": false }, "class.Products.php": { @@ -67,8 +67,8 @@ }, "class.Products.php": { "type": "-", - "size": 3709, - "lmtime": 1734386591635, + "size": 3708, + "lmtime": 1734812409871, "modified": false }, "class.Users.php": { diff --git a/autoload/class.S.php b/autoload/class.S.php index 84cd38a..d0bcbd9 100644 --- a/autoload/class.S.php +++ b/autoload/class.S.php @@ -13,6 +13,41 @@ class S } + static public function to_decimal( $number = 0, $no_of_decimals = 2 ) { + $decimal_separator = '.'; + $thousand_separator = ''; + $number = is_null($number) ? 0 : $number; + $no_of_decimals = 2; + + $negative_sign = ""; + if ($number < 0) + { + $number = $number * -1; + $negative_sign = "-"; + } + + $currency_position = 'right'; + + if ($decimal_separator === ",") + { + if ($thousand_separator !== " ") + { + $thousand_separator = "."; + } + + return $negative_sign . number_format($number, $no_of_decimals, ",", $thousand_separator); + } + else + { + if ($thousand_separator !== " ") + { + $thousand_separator = ","; + } + + return $negative_sign . number_format($number, $no_of_decimals, ".", $thousand_separator); + } + } + static public function number_display( $value ) { return number_format( $value, 2, ',', ' ' ) . ' zł'; diff --git a/autoload/controls/class.Allegro.php b/autoload/controls/class.Allegro.php new file mode 100644 index 0000000..6fe6950 --- /dev/null +++ b/autoload/controls/class.Allegro.php @@ -0,0 +1,177 @@ + \factory\Campaigns::get_clients(), + 'offers_added' => $offers_added, + 'history_added' => $history_added, + 'history_updated' => $history_updated + ] ); + } + + static public function import_data() + { + global $mdb; + + $offers_added = 0; + $history_added = 0; + $history_updated = 0; + + $file = $_FILES['file']['tmp_name']; + + if ( ( $handle = fopen( $file, 'r' ) ) !== false ) + { + // Pomiń pierwszy wiersz (nagłówki) + fgetcsv($handle, null, ";"); + + // Tablica asocjacyjna do przechowywania skumulowanych danych + $data = []; + + while (($row_data = fgetcsv($handle, null, ";")) !== false) + { + // Upewnij się, że wiersz jest poprawnie wczytany + if ( is_array( $row_data ) && count( $row_data ) > 1 ) + { + $client_name_part_1 = $row_data[0]; + $client_name_part_2 = $row_data[1]; + + $offer_id = $row_data[3]; + $date_add = date( 'Y-m-d', strtotime( $row_data[13] ) ); + + // Klucz składający się z offer_id i date_add, aby śledzić powtórzenia + $key = \S::seo( $client_name_part_1 ) . '_' . \S::seo( $client_name_part_2 ) . '_' . $offer_id . '_' . $date_add; + + // Przygotowanie danych z wiersza CSV + $impressions = (int)$row_data[4]; + $clicks = (int)$row_data[5]; + $cost = \S::to_decimal( str_replace( [' PLN', ','], ['', '.'], $row_data[9] ) ); + $conversions = (int)$row_data[11]; + $conversions_value = \S::to_decimal(str_replace([' PLN', ','], ['', '.'], $row_data[12])); + + // Jeśli ten klucz (offer_id + date_add) już istnieje, sumujemy dane + if (isset($data[$key])) + { + $data[$key]['campaign_name'] = $client_name_part_1; + $data[$key]['group_name'] = $client_name_part_2; + $data[$key]['impressions'] += $impressions; + $data[$key]['clicks'] += $clicks; + $data[$key]['cost'] += $cost; + $data[$key]['conversions'] += $conversions; + $data[$key]['conversions_value'] += $conversions_value; + } + else + { + // Jeśli klucz nie istnieje, dodajemy nowy wpis + $data[$key] = [ + 'campaign_name' => $client_name_part_1, + 'group_name' => $client_name_part_2, + 'offer_id' => $offer_id, + 'offer_name' => $row_data[2], + 'impressions' => $impressions, + 'clicks' => $clicks, + 'cost' => $cost, + 'conversions' => $conversions, + 'conversions_value' => $conversions_value, + 'date_add' => $date_add + ]; + } + } + } + + // Zamknij plik po przetworzeniu + fclose( $handle ); + } + + foreach ( $data as $offer ) + { + $offer_data = []; + + $campain_name = 'allegro.pl - ' . $offer['campaign_name'] . ' - ' . $offer['group_name']; + + $client_id = $mdb -> get( 'clients', 'id', [ 'name' => $campain_name ] ); + if ( !$client_id ) + { + $mdb -> insert( 'clients', [ 'name' => $campain_name ] ); + $client_id = $mdb -> id(); + } + + if ( !$mdb -> count( 'products', [ 'AND' => [ 'client_id' => $client_id, 'offer_id' => $offer['offer_id'] ] ] ) ) + { + $offer_tmp['client_id'] = $client_id; + $offer_tmp['offer_id'] = $offer['offer_id']; + $offer_tmp['name'] = $offer['offer_name']; + + if ( $mdb -> insert( 'products', $offer_tmp ) ) + { + $product_id = $mdb -> id(); + $offers_added++; + } + + } + else + { + $product_id = $mdb -> get( 'products', 'id', [ 'AND' => [ 'client_id' => $client_id, 'offer_id' => $offer['offer_id'] ] ] ); + $offer_current_name = $mdb -> get( 'products', 'name', [ 'AND' => [ 'client_id' => $client_id, 'offer_id' => $offer['offer_id'] ] ] ); + + if ( $offer_current_name != $offer['offer_name'] and $offer['date_add'] == date( 'Y-m-d', strtotime( '-1 days', time() ) ) ) + { + $mdb -> update( 'products', [ 'name' => $offer['offer_name'] ], [ 'AND' => [ 'client_id' => $client_id, 'offer_id' => $offer['offer_id'] ] ] ); + $mdb -> insert( 'products_comments', [ 'product_id' => $product_id, 'comment' => 'Zmiana nazwy oferty na: ' . $offer['offer_name'], 'type' => 2, 'date_add' => $offer['date_add'] ] ); + } + } + + if ( $offer_id ) + { + $offer_data['impressions'] = $offer['impressions']; + $offer_data['clicks'] = $offer['clicks']; + $offer_data['cost'] = $offer['cost']; + $offer_data['conversions'] = $offer['conversions']; + $offer_data['conversions_value'] = $offer['conversions_value']; + $offer_data['ctr'] = $offer['clicks'] ? round( $offer['impressions'] / $offer['clicks'], 4 ) : 0; + $offer_data['updated'] = 1; + + if ( $mdb -> count( 'products_history', [ 'AND' => [ 'product_id' => $product_id, 'date_add' => $offer['date_add'] ] ] ) ) + { + $mdb -> update( 'products_history', $offer_data, [ 'AND' => [ 'product_id' => $product_id, 'date_add' => $offer['date_add'] ] ] ); + $history_updated++; + } + else + { + $offer_data['product_id'] = $product_id; + $offer_data['date_add'] = $offer['date_add']; + $mdb -> insert( 'products_history', $offer_data ); + $history_added++; + } + } + } + + \S::set_session( 'offers_added', $offers_added ); + \S::set_session( 'history_added', $history_added ); + \S::set_session( 'history_updated', $history_updated ); + + header( 'Location: /allegro/main_view/' ); + exit; + } +} \ No newline at end of file diff --git a/autoload/controls/class.Cron.php b/autoload/controls/class.Cron.php index 15d7f25..fbafeeb 100644 --- a/autoload/controls/class.Cron.php +++ b/autoload/controls/class.Cron.php @@ -103,6 +103,7 @@ class Cron // Zapisujemy każdy zsumowany wpis do offers_temp $clicks_30 = \factory\Products::get_clicks_30( $offer_data['product_id'] ); + $mdb -> insert( 'products_temp', [ 'product_id' => $offer_data['product_id'], 'name' => $offer_data['name'], diff --git a/autoload/factory/class.Products.php b/autoload/factory/class.Products.php index 475f517..7dae361 100644 --- a/autoload/factory/class.Products.php +++ b/autoload/factory/class.Products.php @@ -55,13 +55,13 @@ class Products static public function get_impressions_30( $product_id ) { global $mdb; - return $mdb -> query( 'SELECT SUM(impressions) FROM products_history WHERE product_id = \'' . $product_id . '\'' ) -> fetchColumn(); + return $mdb -> query( 'SELECT SUM(impressions) FROM products_history WHERE product_id = \'' . $product_id . '\' AND date_add >= \'' . date( 'Y-m-d', strtotime( '-30 days', time() ) ) . '\'' ) -> fetchColumn(); } static public function get_clicks_30( $product_id ) { global $mdb; - return $mdb -> query( 'SELECT SUM(clicks) FROM products_history WHERE product_id = \'' . $product_id . '\'' ) -> fetchColumn(); + return $mdb -> query( 'SELECT SUM(clicks) FROM products_history WHERE product_id = \'' . $product_id . '\' AND date_add >= \'' . date( 'Y-m-d', strtotime( '-30 days', time() ) ) . '\'' ) -> fetchColumn(); } static public function add_product_comment( $product_id, $type, $comment ) diff --git a/templates/allegro/main_view.php b/templates/allegro/main_view.php new file mode 100644 index 0000000..a050955 --- /dev/null +++ b/templates/allegro/main_view.php @@ -0,0 +1,35 @@ +
+
+
+
+
+
+ offers_added ): ?> + + + history_added ): ?> + + + history_updated ): ?> + + +
+
+
+
+ +
+
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/templates/site/layout-logged.php b/templates/site/layout-logged.php index 090bdfb..903ac04 100644 --- a/templates/site/layout-logged.php +++ b/templates/site/layout-logged.php @@ -63,6 +63,9 @@
  • Produkty
  • +
  • + Allegro import +