===== PART 5/12 ===== tiser_price = $campaign_item->advertiser_price; $paidAds->publisher_price = $campaign_item->publisher_price; $paidAds->ci = $campaign_item->campaign_id; $paidAds->cui = $campaign_item->campaign->user_id; $paidAds->cii = $campaign_item->id; $paidAds->website_url = $campaign_item->campaign->website_url; $paidAds->banner_size = $campaign_item->campaign->banner_size; $paidAds->banner_code = $campaign_item->campaign->banner_code; $paidAds->content = $campaign_item->campaign->content ?? ''; return $paidAds; } } } // If no saved campaign or force_new, select a new one $CampaignItems = TableRegistry::getTableLocator()->get('CampaignItems'); // Debug: Log query parameters $debug_log = ROOT . DS . 'logs' . DS . 'campaign_debug.log'; file_put_contents($debug_log, "[" . date('Y-m-d H:i:s') . "] [QUERY] Searching campaigns - ad_type: {$ad_type}, traffic_source: {$traffic_source}, country: {$country}\n", FILE_APPEND); $campaign_items = $CampaignItems->find() ->contain(['Campaigns']) ->where([ 'Campaigns.default_campaign' => 0, 'Campaigns.ad_type' => $ad_type, 'Campaigns.status' => 1, "Campaigns.traffic_source IN (1, :traffic_source)", 'CampaignItems.weight <=' => 100, 'CampaignItems.country' => $country, 'CampaignItems.views < (CampaignItems.purchase * 1000)' // Còn codes chưa dùng hết ]) ->order(['CampaignItems.weight' => 'ASC']) ->bind(':traffic_source', $traffic_source, 'integer') ->toArray(); file_put_contents($debug_log, "[" . date('Y-m-d H:i:s') . "] [QUERY] Query 1 (specific country) - Found: " . count($campaign_items) . " campaigns\n", FILE_APPEND); if (count($campaign_items) == 0) { $campaign_items = $CampaignItems->find() ->contain(['Campaigns']) ->where([ 'Campaigns.default_campaign' => 0, 'Campaigns.ad_type' => $ad_type, 'Campaigns.status' => 1, "Campaigns.traffic_source IN (1, :traffic_source)", 'CampaignItems.weight <=' => 100, 'CampaignItems.country' => 'all', 'CampaignItems.views < (CampaignItems.purchase * 1000)' ]) ->order(['CampaignItems.weight' => 'ASC']) ->bind(':traffic_source', $traffic_source, 'integer') ->toArray(); file_put_contents($debug_log, "[" . date('Y-m-d H:i:s') . "] [QUERY] Query 2 (country='all') - Found: " . count($campaign_items) . " campaigns\n", FILE_APPEND); } if (count($campaign_items) == 0) { $campaign_items = $CampaignItems->find() ->contain(['Campaigns']) ->where([ 'Campaigns.default_campaign' => 1, 'Campaigns.ad_type' => $ad_type, 'Campaigns.status' => 1, "Campaigns.traffic_source IN (1, :traffic_source)", 'CampaignItems.weight <=' => 100, "CampaignItems.country IN ( 'all', :country)", ]) ->order(['CampaignItems.weight' => 'ASC']) ->bind(':traffic_source', $traffic_source, 'integer') ->bind(':country', $country, 'string') ->limit(50) ->toArray(); } // Filter campaigns based on schedule and limits $valid_campaign_items = []; $current_ip = get_ip(); $time_zone = get_option('timezone', 'UTC'); $now = Time::now($time_zone); file_put_contents($debug_log, "[" . date('Y-m-d H:i:s') . "] [FILTER] Starting filter - Total campaigns to check: " . count($campaign_items) . ", IP: {$current_ip}\n", FILE_APPEND); foreach ($campaign_items as $item) { $campaign = $item->campaign; $is_valid = true; $reject_reason = ''; // Check start_date if (!empty($campaign->start_date)) { $start_date = $campaign->start_date->timezone($time_zone); if ($now < $start_date) { $is_valid = false; $reject_reason = "Start date not reached (start: {$start_date->format('Y-m-d H:i:s')})"; } } // Check end_date if ($is_valid && !empty($campaign->end_date)) { $end_date = $campaign->end_date->timezone($time_zone); if ($now > $end_date) { $is_valid = false; $reject_reason = "End date passed (end: {$end_date->format('Y-m-d H:i:s')})"; } } // Check daily_limit (only for traffic campaigns) if ($is_valid && $ad_type == 4 && !empty($campaign->daily_limit) && $campaign->daily_limit > 0) { $Statistics = TableRegistry::getTableLocator()->get('Statistics'); // Get today's start and end in local timezone, then convert to UTC for database query $today_start_local = Time::now($time_zone)->startOfDay(); $today_end_local = Time::now($time_zone)->endOfDay(); // Convert to UTC (database stores in UTC) $today_start_utc = $today_start_local->timezone('UTC')->format('Y-m-d H:i:s'); $today_end_utc = $today_end_local->timezone('UTC')->format('Y-m-d H:i:s'); $today_count = $Statistics->find() ->where([