diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json
index 3f69b08..fa4ec06 100644
--- a/.vscode/ftp-kr.sync.cache.json
+++ b/.vscode/ftp-kr.sync.cache.json
@@ -101,8 +101,8 @@
},
"class.Cron.php": {
"type": "-",
- "size": 185030,
- "lmtime": 1772117310268,
+ "size": 185177,
+ "lmtime": 1772899996837,
"modified": false
},
"class.FacebookAds.php": {
@@ -137,8 +137,8 @@
},
"class.Users.php": {
"type": "-",
- "size": 21234,
- "lmtime": 1772117354114,
+ "size": 21677,
+ "lmtime": 1772899952961,
"modified": false
},
"class.XmlFiles.php": {
@@ -289,9 +289,9 @@
},
"config.php": {
"type": "-",
- "size": 921,
- "lmtime": 1771497460705,
- "modified": true
+ "size": 623,
+ "lmtime": 1772899939468,
+ "modified": false
},
"cron.php": {
"type": "-",
@@ -431,8 +431,8 @@
},
"index.php": {
"type": "-",
- "size": 4599,
- "lmtime": 1772382133382,
+ "size": 4702,
+ "lmtime": 1772899671144,
"modified": false
},
"install.php": {
@@ -826,8 +826,8 @@
},
"settings.php": {
"type": "-",
- "size": 11754,
- "lmtime": 1771198773079,
+ "size": 31507,
+ "lmtime": 1772899947661,
"modified": false
}
},
diff --git a/autoload/controls/class.Products.php b/autoload/controls/class.Products.php
index 40b8161..9d4feab 100644
--- a/autoload/controls/class.Products.php
+++ b/autoload/controls/class.Products.php
@@ -263,11 +263,14 @@ class Products
'cooldown_period' => \S::get( 'cooldown_period' )
];
- $count = \factory\Products::get_client_bestseller_preview_count( $client_id, $settings );
+ $stats = \factory\Products::get_client_bestseller_preview_stats( $client_id, $settings );
echo json_encode( [
'status' => 'ok',
- 'count' => (int) $count
+ 'count' => (int) ( $stats['total_count'] ?? 0 ),
+ 'entry_count' => (int) ( $stats['entry_count'] ?? 0 ),
+ 'cooldown_count' => (int) ( $stats['cooldown_count'] ?? 0 ),
+ 'total_count' => (int) ( $stats['total_count'] ?? 0 )
] );
exit;
}
diff --git a/autoload/factory/class.Products.php b/autoload/factory/class.Products.php
index cdd7dad..607d3d0 100644
--- a/autoload/factory/class.Products.php
+++ b/autoload/factory/class.Products.php
@@ -280,14 +280,18 @@ class Products
], [ 'id' => $client_id ] );
}
- static public function get_client_bestseller_preview_count( $client_id, $settings )
+ static public function get_client_bestseller_preview_stats( $client_id, $settings )
{
global $mdb;
$client_id = (int) $client_id;
if ( $client_id <= 0 || !is_array( $settings ) )
{
- return 0;
+ return [
+ 'entry_count' => 0,
+ 'cooldown_count' => 0,
+ 'total_count' => 0
+ ];
}
$entry_raw = trim( (string) ( $settings['bestseller_roas_entry'] ?? '' ) );
@@ -295,7 +299,11 @@ class Products
if ( !is_numeric( $entry_raw ) || !is_numeric( $exit_raw ) )
{
- return 0;
+ return [
+ 'entry_count' => 0,
+ 'cooldown_count' => 0,
+ 'total_count' => 0
+ ];
}
$entry = (float) $entry_raw;
@@ -319,7 +327,11 @@ class Products
if ( empty( $rows ) )
{
- return 0;
+ return [
+ 'entry_count' => 0,
+ 'cooldown_count' => 0,
+ 'total_count' => 0
+ ];
}
$product_ids = [];
@@ -334,7 +346,11 @@ class Products
if ( empty( $product_ids ) )
{
- return 0;
+ return [
+ 'entry_count' => 0,
+ 'cooldown_count' => 0,
+ 'total_count' => 0
+ ];
}
$history_by_product = [];
@@ -368,7 +384,9 @@ class Products
$history_by_product[ $pid ][] = (float) ( $history_row['roas'] ?? 0 );
}
- $count = 0;
+ $entry_count = 0;
+ $cooldown_count = 0;
+ $total_count = 0;
foreach ( $rows as $row )
{
$product_id = (int) ( $row['id'] ?? 0 );
@@ -389,9 +407,11 @@ class Products
$entry_met = $roas_30 >= $entry && $conversions_30 >= $min_conversions;
$is_bestseller = false;
+ $is_kept_by_cooldown = false;
if ( $entry_met )
{
+ $entry_count++;
$is_bestseller = true;
}
else if ( $current_label === 'bestseller' )
@@ -417,15 +437,31 @@ class Products
}
$is_bestseller = !$below_exit_all_days;
+ $is_kept_by_cooldown = $is_bestseller;
}
if ( $is_bestseller )
{
- $count++;
+ $total_count++;
+ }
+
+ if ( $is_kept_by_cooldown )
+ {
+ $cooldown_count++;
}
}
- return $count;
+ return [
+ 'entry_count' => $entry_count,
+ 'cooldown_count' => $cooldown_count,
+ 'total_count' => $total_count
+ ];
+ }
+
+ static public function get_client_bestseller_preview_count( $client_id, $settings )
+ {
+ $stats = self::get_client_bestseller_preview_stats( $client_id, $settings );
+ return (int) ( $stats['total_count'] ?? 0 );
}
static private function build_scope_filters( &$sql, &$params, $campaign_id, $ad_group_id )
@@ -481,7 +517,10 @@ class Products
p.id AS product_id,
p.offer_id,
p.min_roas,
- pa.campaign_id,
+ CASE
+ WHEN COUNT( DISTINCT pa.campaign_id ) = 1 THEN MAX( pa.campaign_id )
+ ELSE 0
+ END AS campaign_id,
CASE
WHEN COUNT( DISTINCT pa.campaign_id ) > 1 THEN \'--- wiele kampanii ---\'
ELSE COALESCE( MAX( c.campaign_name ), \'--- brak kampanii ---\' )
@@ -542,7 +581,7 @@ class Products
$params[':custom_label_4'] = '%' . $custom_label_4 . '%';
}
- $sql .= ' GROUP BY p.id, p.offer_id, p.min_roas, pa.campaign_id, p.name, p.title';
+ $sql .= ' GROUP BY p.id, p.offer_id, p.min_roas, p.name, p.title';
$sql .= ' ORDER BY ' . $order_sql . ' ' . $order_dir . ', product_id DESC LIMIT ' . $start . ', ' . $limit;
return $mdb -> query( $sql, $params ) -> fetchAll( \PDO::FETCH_ASSOC );
@@ -626,7 +665,7 @@ class Products
$params = [ ':client_id' => (int) $client_id ];
$sql = 'SELECT COUNT(0)
FROM (
- SELECT p.id, pa.campaign_id
+ SELECT p.id
FROM products_aggregate AS pa
INNER JOIN products AS p ON p.id = pa.product_id
LEFT JOIN campaigns AS c ON c.id = pa.campaign_id
@@ -654,7 +693,7 @@ class Products
$params[':custom_label_4'] = '%' . $custom_label_4 . '%';
}
- $sql .= ' GROUP BY p.id, pa.campaign_id
+ $sql .= ' GROUP BY p.id
) AS grouped_rows';
return $mdb -> query( $sql, $params ) -> fetchColumn();
diff --git a/templates/products/main_view.php b/templates/products/main_view.php
index 6a422b6..2c92564 100644
--- a/templates/products/main_view.php
+++ b/templates/products/main_view.php
@@ -61,7 +61,7 @@
- Spelnia: -
+ Wejscie: - | Cooldown: - | Lacznie: -
@@ -230,7 +230,7 @@ function reset_client_bestseller_settings_form()
$( '#bestseller_roas_exit' ).val( '' );
$( '#min_conversions' ).val( '10' );
$( '#cooldown_period' ).val( '14' );
- $( '#bestseller_rules_preview' ).text( 'Spelnia: -' );
+ $( '#bestseller_rules_preview' ).text( 'Wejscie: - | Cooldown: - | Lacznie: -' );
}
function preview_client_bestseller_settings()
@@ -239,11 +239,11 @@ function preview_client_bestseller_settings()
if ( !client_id || products_bestseller_settings_loading )
{
- $( '#bestseller_rules_preview' ).text( 'Spelnia: -' );
+ $( '#bestseller_rules_preview' ).text( 'Wejscie: - | Cooldown: - | Lacznie: -' );
return;
}
- $( '#bestseller_rules_preview' ).text( 'Spelnia: licze...' );
+ $( '#bestseller_rules_preview' ).text( 'Wejscie: licze... | Cooldown: licze... | Lacznie: licze...' );
$.ajax({
url: '/products/preview_client_bestseller_settings/',
@@ -259,14 +259,18 @@ function preview_client_bestseller_settings()
}).done( function( res ) {
if ( res && res.status === 'ok' )
{
- $( '#bestseller_rules_preview' ).text( 'Spelnia: ' + Number( res.count || 0 ) );
+ $( '#bestseller_rules_preview' ).text(
+ 'Wejscie: ' + Number( res.entry_count || 0 ) +
+ ' | Cooldown: ' + Number( res.cooldown_count || 0 ) +
+ ' | Lacznie: ' + Number( res.total_count || res.count || 0 )
+ );
}
else
{
- $( '#bestseller_rules_preview' ).text( 'Spelnia: -' );
+ $( '#bestseller_rules_preview' ).text( 'Wejscie: - | Cooldown: - | Lacznie: -' );
}
}).fail( function() {
- $( '#bestseller_rules_preview' ).text( 'Spelnia: -' );
+ $( '#bestseller_rules_preview' ).text( 'Wejscie: - | Cooldown: - | Lacznie: -' );
});
}