ferrero-opentext/src/WorkflowManager.php
DJP 716f0be068 Initial commit: Ferrero OpenText Content Scaling Application
Complete PHP-based workflow application for Ferrero DAM system:
- OAuth2 authentication with automatic token management
- Campaign discovery and filtering
- Folder structure navigation
- Asset download (individual and bulk)
- Metadata extraction and display
- Clean step-by-step web interface

Status: Fully functional and production-ready

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 14:29:20 -04:00

251 lines
No EOL
10 KiB
PHP

<?php
require_once 'TestRunner.php';
class WorkflowManager
{
private $testRunner;
private $campaignData = [];
public function __construct($testRunner)
{
$this->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 = "<div class='workflow-report'>";
$report .= "<h2>Content Scaling Workflow Report</h2>";
$report .= "<p>Generated: " . date('Y-m-d H:i:s') . "</p>";
if (empty($campaigns)) {
$report .= "<p>No campaigns require action at this time.</p>";
} else {
$report .= "<p><strong>" . count($campaigns) . " campaigns</strong> identified for content scaling:</p>";
foreach ($campaigns as $index => $campaign) {
$report .= "<div class='campaign-summary' style='border: 1px solid #ddd; margin: 10px 0; padding: 15px; border-radius: 4px;'>";
$report .= "<h4>" . ($index + 1) . ". " . htmlspecialchars($campaign['campaign_name'] ?? $campaign['name']) . "</h4>";
$report .= "<p><strong>Campaign ID:</strong> " . htmlspecialchars($campaign['campaign_id'] ?? 'N/A') . "</p>";
$report .= "<p><strong>Type:</strong> " . htmlspecialchars($campaign['campaign_type'] ?? 'N/A') . "</p>";
$report .= "<p><strong>Folder ID:</strong> " . htmlspecialchars($campaign['id']) . "</p>";
$report .= "</div>";
}
}
$report .= "</div>";
return $report;
}
}