testRunner = $testRunner; } public function getCampaignFolders() { $requests = $this->testRunner->getAvailableRequests(); // Find the "Retrieve Localized Campaign Folders" request foreach ($requests as $index => $request) { if (strpos(strtolower($request['name']), 'localized campaign') !== false) { $result = $this->testRunner->runSingleTest($request, $index); if ($result['status'] === 'PASS') { $responseData = json_decode($result['response']['body'], true); // Handle the actual API response structure if (isset($responseData['search_result_resource']['search_result']['asset_list'])) { $this->campaignData = ['items' => $responseData['search_result_resource']['search_result']['asset_list']]; } else { $this->campaignData = $responseData; } return $result; } break; } } return null; } public function getActionableCampaigns() { if (empty($this->campaignData) || !isset($this->campaignData['items'])) { return []; } $actionable = []; foreach ($this->campaignData['items'] as $campaign) { if ($this->shouldProcessCampaign($campaign)) { $actionable[] = [ 'id' => $campaign['asset_id'] ?? $campaign['id'] ?? 'Unknown', 'name' => $this->getCampaignMetadata($campaign, 'FERRERO.FIELD.CAMPAIGN_NAME') ?? 'Unnamed', 'campaign_id' => $this->getCampaignMetadata($campaign, 'FERRERO.FIELD.CAMPAIGN ID'), 'campaign_name' => $this->getCampaignMetadata($campaign, 'FERRERO.FIELD.CAMPAIGN NAME'), 'campaign_type' => $this->getCampaignMetadata($campaign, 'FERRERO.FIELD.CAMPAIGN TYPE'), 'folder_data' => $campaign ]; } } return $actionable; } private function shouldProcessCampaign($campaign) { // Define your criteria for campaigns that need processing $campaignType = $this->getCampaignMetadata($campaign, 'FERRERO.FIELD.CAMPAIGN TYPE'); // Example criteria - adjust based on your business rules $actionableTypes = ['ACTIVE', 'PENDING', 'IN_PROGRESS', 'READY_FOR_SCALING']; if (in_array($campaignType, $actionableTypes)) { return true; } // Additional criteria can be added here // - Modified in last X days // - Missing certain metadata // - Specific naming patterns return false; } private function getCampaignMetadata($campaign, $fieldName) { // Use the same metadata extraction logic as ResponseFormatter return $this->getMetadataValue($campaign, $fieldName); } private function getMetadataValue($asset, $fieldId) { if (!isset($asset['metadata']['metadata_element_list'])) { return null; } foreach ($asset['metadata']['metadata_element_list'] as $category) { if (!isset($category['metadata_element_list'])) { continue; } foreach ($category['metadata_element_list'] as $element) { if ($element['id'] === $fieldId && isset($element['value']['value']['value'])) { return $element['value']['value']['value']; } // Handle tabular fields (like brand, market) if (isset($element['metadata_element_list'])) { foreach ($element['metadata_element_list'] as $tableField) { if ($tableField['id'] === $fieldId && isset($tableField['value']['value']['value'])) { return $tableField['value']['value']['value']; } // Handle domain values if ($tableField['id'] === $fieldId && isset($tableField['value']['value']['field_value']['value'])) { return $tableField['value']['value']['display_value'] ?? $tableField['value']['value']['field_value']['value']; } } } } } return null; } public function processCampaign($campaignId) { $workflow = []; // Step 1: Get Master Asset and Final Asset folders $folderResult = $this->getMasterAndFinalAssetFolders($campaignId); $workflow['folders'] = $folderResult; if ($folderResult['status'] === 'PASS') { $folders = json_decode($folderResult['response']['body'], true); foreach ($folders['items'] ?? [] as $folder) { $folderName = strtolower($folder['name'] ?? ''); // Step 2: Process Master Asset folder if (strpos($folderName, 'master') !== false) { $assetsResult = $this->getAssetsFromFolder($folder['id']); $workflow['master_assets'] = $assetsResult; } // Step 3: Process Final Asset folder if (strpos($folderName, 'final') !== false) { $assetsResult = $this->getAssetsFromFolder($folder['id']); $workflow['final_assets'] = $assetsResult; } } } return $workflow; } private function getMasterAndFinalAssetFolders($campaignId) { $requests = $this->testRunner->getAvailableRequests(); foreach ($requests as $index => $request) { $name = strtolower($request['name']); if (strpos($name, 'master asset folder') !== false && strpos($name, 'final asset') !== false) { // Modify request to use specific campaign ID $modifiedRequest = $request; if (isset($modifiedRequest['request']['url'])) { if (is_array($modifiedRequest['request']['url'])) { $url = $modifiedRequest['request']['url']['raw']; } else { $url = $modifiedRequest['request']['url']; } // Replace placeholder ID with actual campaign ID $url = str_replace(':id', $campaignId, $url); $url = str_replace('6930c59abea5bd4259b67f7647f65cd01d36278d', $campaignId, $url); if (is_array($modifiedRequest['request']['url'])) { $modifiedRequest['request']['url']['raw'] = $url; } else { $modifiedRequest['request']['url'] = $url; } } return $this->testRunner->runSingleTest($modifiedRequest, $index); } } return ['status' => 'ERROR', 'message' => 'Master/Final Asset folder request not found']; } private function getAssetsFromFolder($folderId) { $requests = $this->testRunner->getAvailableRequests(); foreach ($requests as $index => $request) { $name = strtolower($request['name']); if (strpos($name, 'all assets from') !== false) { // Modify request to use specific folder ID $modifiedRequest = $request; if (isset($modifiedRequest['request']['url'])) { if (is_array($modifiedRequest['request']['url'])) { $url = $modifiedRequest['request']['url']['raw']; } else { $url = $modifiedRequest['request']['url']; } // Replace placeholder ID with actual folder ID $url = str_replace(':id', $folderId, $url); $url = preg_replace('/folders\/[^\/]+\//', "folders/{$folderId}/", $url); if (is_array($modifiedRequest['request']['url'])) { $modifiedRequest['request']['url']['raw'] = $url; } else { $modifiedRequest['request']['url'] = $url; } } return $this->testRunner->runSingleTest($modifiedRequest, $index); } } return ['status' => 'ERROR', 'message' => 'Assets request not found']; } public function generateWorkflowReport($campaigns) { $report = "
Generated: " . date('Y-m-d H:i:s') . "
"; if (empty($campaigns)) { $report .= "No campaigns require action at this time.
"; } else { $report .= "" . count($campaigns) . " campaigns identified for content scaling:
"; foreach ($campaigns as $index => $campaign) { $report .= "Campaign ID: " . htmlspecialchars($campaign['campaign_id'] ?? 'N/A') . "
"; $report .= "Type: " . htmlspecialchars($campaign['campaign_type'] ?? 'N/A') . "
"; $report .= "Folder ID: " . htmlspecialchars($campaign['id']) . "
"; $report .= "