AssetUploaderSimple - exact copy of standalone logic:
- Only 5 metadata fields (not 17)
- Same field order and structure
- Same cURL options
- Produces ~1200 byte payload like standalone
Test upload now uses AssetUploaderSimple for exact match.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
BREAKTHROUGH: Standalone script successfully uploaded with HTTP 202!
Job ID: 214651
Changes to match working standalone:
- Always use full Postman metadata structure
- Fix field order: asset_representation, parent_folder_id, manifest, files
- Ensure Bearer token doesn't have double 'Bearer' prefix
- Match exact cURL options from standalone
Standalone test proved:
✅ OAuth credentials work for uploads
✅ Endpoint is correct
✅ Metadata structure is correct
✅ Folder allows uploads
✅ File extensions are allowed
Issue was in main workflow implementation, not API restrictions!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE to maintain JSESSIONID.
Successful Postman cURL includes:
Cookie: JSESSIONID=916FDCDDBF50464F2D7A27AF28E90E20
This session cookie might be required in addition to OAuth token.
Cookie jar will persist session across requests.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Replicated complete asset_representation from client's successful Postman upload:
- All 17 metadata fields from working cURL
- Tabular fields: MAIN_LANGUAGES, ASSETCOMPLIANCE, MARKETING_TAG, TYPE_VID
- Domain value fields with field_value structure
- All required fields: MKTG.ASSET TYPE, FISCAL YEAR, STATE, etc.
- ECOMMERCE model + security policy 1594
This is the EXACT structure that returned 202 Accepted for the client.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Shows exact upload URL being used and verifies it matches Ferrero's confirmed endpoint.
Debug output now displays:
- Actual upload URL being called
- Expected URL (from Ferrero tech team)
- URL match verification (YES/NO)
This confirms we are using the correct endpoint:
https://ppr.dam.ferrero.com/otmmapi/v6/assets🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Match exact metadata structure from working V3 Postman collection:
- ECOMMERCE metadata model
- Security policy ID 1594
- Required metadata fields:
- FERRERO.FIELD.MKTG.ASSET TYPE = heroimage
- FERRERO.FIELD.FISCAL YEAR = 2025/2026
- ARTESIA.FIELD.ASSET NAME = uploaded filename
- FERRERO.FIELD.STATE = Local
- Normalize MIME type (image/jpg → image/jpeg)
- Structure confirmed working by Ferrero tech team in Postman
This matches the asset_representation from the V3 collection
that successfully uploads files.
Upload workflow issues:
- Master asset metadata structures too large for PHP to process
- Causes session storage crashes and HTTP 500 errors
- Temporarily disabled master assets fetching
- Upload folder finding still works
Current upload status:
- ALL file extensions (.tif, .jpg, .png) rejected by API
- Error: "Cannot import asset having restricted file extension"
- Tested with minimal payloads (just manifest + folder + file)
- Suggests server-level restrictions or account permissions issue
Awaiting client confirmation on:
- API upload permissions for user account
- Allowed file extensions for API uploads
- Alternative upload methods if API is restricted
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major improvements to workflow_v3.php and supporting classes:
**Status Updates (A1→A2, A2→A3, A5→A6):**
- Fix StatusManager to use correct PATCH endpoint: /v6/folders/{id}
- Add lock_strategy=optimistic parameter to prevent locking errors
- Update request body structure to use edited_folder format
- Status updates now working correctly
**Status Field Extraction:**
- Fix CampaignFormatter to extract CONTENT.SCALING.STATUS field
- Handle domain values with field_value.value path
- Now correctly filters campaigns by status (A1, A2, A5, etc.)
**Error Handling:**
- Extract and display actual API error messages
- Show HTTP status codes in all error messages
- Add expandable debug panels with full API responses
- Enhanced upload error reporting with detailed diagnostics
**Campaign Search:**
- Update to use Postman collection requests directly (avoids 503 errors)
- Fix URL encoding (rawurlencode instead of urlencode)
- Add comprehensive debug output showing OAuth status and API responses
- Search now attempts Postman request first, falls back to manual query
**Upload Improvements:**
- Rewrite AssetUploader to use native PHP CURLFile for multipart uploads
- Add support for additional file types: .mov, .mp4, .avi, .zip, .txt, .doc, .xlsx
- Increase max upload size to 100MB for video files
- Simplify asset_representation to minimal structure
- Add infrastructure to inherit metadata from master assets
**Testing Features:**
- Add "Reset to A1" button for testing workflow iterations
- Add debug mode to view all campaigns and their metadata
- Show Content Scaling Status on all campaign cards
- Display filtering debug info (total vs filtered counts)
**UI Improvements:**
- Rename buttons to clarify "Content Scaling Status" terminology
- Add status badges to campaign cards showing current status
- Better visual feedback for successful/failed operations
Current Status: Workflow A1→A2 fully working. Upload A2→A3 ready for testing
once DAM server recovers from HTTP 503 errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
NEW: Upload Workflow (A2→A3)
- Load campaigns with status A2 (assets sent to agency)
- Select campaign and find upload target folder (Final Assets)
- Multi-file upload with drag-drop interface
- AssetUploader class with multipart/form-data support
- Upload files with metadata to DAM
- Update status to A3 after upload
NEW: Rework Workflow (A5→A6)
- Load campaigns with status A5 (rework needed from agency)
- Select campaign and get rework assets
- Download individual or bulk rework assets
- Beautiful metadata display
- Update status to A6 when rework assets received
Features:
- Three complete workflow tabs (Download, Upload, Rework)
- Status transitions: A1→A2, A2→A3, A5→A6
- Session-based workflow state management
- Clear workflow data button for each tab
- Campaign selection with visual feedback
- Download confirmed working (tested with real asset)
- OAuth2 auto-refresh throughout all workflows
Technical:
- AssetUploader class for multipart file uploads
- Proper metadata JSON structure for uploads
- Support for multiple file formats (JPG, PNG, PDF, AI, PSD, etc.)
- Error handling for each workflow step
- Beautiful UI with color-coded status badges
Ready for testing with real campaign data!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>