programme-pulse-chat/tests/fixtures/sample_projects.json
DJP b70d148b94 Productionise Programme Pulse
Backend
- Routes moved under /api/, JWT bearer auth via @before_request
- DEV_AUTH_BYPASS escape hatch for local dev
- In-memory chat history and report state replaced with Postgres tables
  (preferences, chat_messages, reports, feedback_events) keyed on user
- SQLAlchemy 2.x + Alembic migrations run on container start
- Graceful Airtable failure handling — bad creds no longer 500 the API
- Per-user data isolation via g.user_email from validated token

Frontend
- React + Vite + TypeScript SPA at /programme-pulse/
- MSAL.js (PKCE, sessionStorage, ID token to backend)
- VITE_DEV_AUTH_BYPASS mirrors backend bypass for local dev
- Streaming chat via fetch ReadableStream + SSE parsing
- Charts via chart.js, markdown via react-markdown + remark-gfm
- Full UI parity with the original templates/index.html

Deploy (optical-dev split-build pattern)
- Dockerfile + docker-compose.yml (name: programme-pulse pinned;
  app + Postgres; 127.0.0.1 binding only)
- deploy/apache-programme-pulse.conf.tmpl with flushpackets=on for SSE
- deploy/deploy.sh mirrors OSOP — port auto-pick (5051..5099),
  apache conf render, frontend build in throwaway node container,
  rsync to /var/www/html/programme-pulse, /api/health poll

Tests
- 49 passing; new tests for DB-backed preferences and JWT auth helpers
- SQLite-backed test fixture in tests/conftest.py

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 11:08:28 -04:00

166 lines
6.6 KiB
JSON

[
{
"Project Number": "LLD-001",
"Project Name": "Lancôme Visionnaire Campaign",
"Project Type": "Campaign",
"Brand": "LANCOME",
"Hub": "Global",
"Country": "FR",
"Division": "LLD",
"PM": "Sarah Jones",
"Current Stage": "Stage 3 - Production",
"Project Status": "On Track - OLIVER",
"Project Risk - NEW": "On Track - OLIVER",
"Current Stage Status": "In Progress",
"Project End Date": "2026-05-30",
"Current Stage Deadline": "2026-04-20",
"Action Required": "",
"Last Modified Time (on row)": "2026-04-10T09:00:00.000Z",
"Asset Count (Deliverable Roll Up)": 10,
"Completed Deliverable Count": 7,
"7. Opera Upload": "Not Started",
"7. Opera Upload DDL": "2026-05-25",
"7. Opera Upload Status": "Not Started",
"Has Deadline Slipped": false,
"Syndication Deadline Slip (Days)": 0,
"New Deadline Proposed by Oliver": "",
"Brief Submitted Date": "2026-02-01",
"Brief Acceptance Date (from Briefs Link) 2": "2026-02-03",
"Market's Action Needed": false,
"1. Missing DMI Asset Creation DDL": "2026-02-10",
"1. Missing DMI Asset Creation Status": "Complete",
"2. Mastering, Copy Creation / Extraction DDL": "2026-03-01",
"2. Mastering, Copy Creation / Extraction Status": "Complete",
"3. Global Rollout Invitation DDL": "2026-03-15",
"3. Global Rollout Invitation Status": "Complete",
"4. Translation (Salsify PDP) DDL": "2026-04-01",
"4. Translation (Salsify PDP) Status": "Complete",
"5. Translation (Asset) DDL": "2026-04-10",
"5. Translation (Asset) Status": "In Progress",
"6. Production DDL": "2026-04-20",
"6. Production Status": "In Progress"
},
{
"Project Number": "LLD-002",
"Project Name": "YSL Beauty Hero Asset",
"Project Type": "Asset Production",
"Brand": "YSL",
"Hub": "EMEA",
"Country": "UK",
"Division": "LLD",
"PM": "",
"Current Stage": "Stage 2 - Development",
"Project Status": "Attention Required - ECF",
"Project Risk - NEW": "Attention Required - OLIVER",
"Current Stage Status": "Delayed",
"Project End Date": "2026-04-01",
"Current Stage Deadline": "2026-03-25",
"Action Required": "Awaiting client feedback",
"Last Modified Time (on row)": "2026-03-28T14:00:00.000Z",
"Asset Count (Deliverable Roll Up)": 5,
"Completed Deliverable Count": 1,
"7. Opera Upload": "Not Started",
"7. Opera Upload DDL": "2026-03-28",
"7. Opera Upload Status": "Not Started",
"Has Deadline Slipped": true,
"Syndication Deadline Slip (Days)": 18,
"New Deadline Proposed by Oliver": "2026-04-15",
"Brief Submitted Date": "2026-01-15",
"Brief Acceptance Date (from Briefs Link) 2": "2026-01-22",
"Market's Action Needed": false,
"1. Missing DMI Asset Creation DDL": "2026-02-01",
"1. Missing DMI Asset Creation Status": "Complete",
"2. Mastering, Copy Creation / Extraction DDL": "2026-03-01",
"2. Mastering, Copy Creation / Extraction Status": "Delayed",
"3. Global Rollout Invitation DDL": "2026-03-15",
"3. Global Rollout Invitation Status": "Not Started",
"4. Translation (Salsify PDP) DDL": "2026-03-20",
"4. Translation (Salsify PDP) Status": "Not Started",
"5. Translation (Asset) DDL": "2026-03-25",
"5. Translation (Asset) Status": "Not Started",
"6. Production DDL": "2026-03-28",
"6. Production Status": "Not Started"
},
{
"Project Number": "LLD-003",
"Project Name": "Armani Beauty Refresh",
"Project Type": "Refresh",
"Brand": "ARMANI",
"Hub": "Global",
"Country": "IT",
"Division": "LLD",
"PM": "Tom Baker",
"Current Stage": "Stage 4 - Review",
"Project Status": "On Track - Market",
"Project Risk - NEW": "On Track - Market",
"Current Stage Status": "In Review",
"Project End Date": "2026-06-15",
"Current Stage Deadline": "2026-04-30",
"Action Required": "",
"Last Modified Time (on row)": "2026-04-11T11:00:00.000Z",
"Asset Count (Deliverable Roll Up)": 8,
"Completed Deliverable Count": 8,
"7. Opera Upload": "Not Started",
"7. Opera Upload DDL": "2026-06-10",
"7. Opera Upload Status": "Not Started",
"Has Deadline Slipped": false,
"Syndication Deadline Slip (Days)": 0,
"New Deadline Proposed by Oliver": "",
"Brief Submitted Date": "2026-01-20",
"Brief Acceptance Date (from Briefs Link) 2": "2026-01-21",
"Market's Action Needed": true,
"1. Missing DMI Asset Creation DDL": "2026-02-15",
"1. Missing DMI Asset Creation Status": "Complete",
"2. Mastering, Copy Creation / Extraction DDL": "2026-03-10",
"2. Mastering, Copy Creation / Extraction Status": "Complete",
"3. Global Rollout Invitation DDL": "2026-03-25",
"3. Global Rollout Invitation Status": "Complete",
"4. Translation (Salsify PDP) DDL": "2026-04-15",
"4. Translation (Salsify PDP) Status": "In Review",
"5. Translation (Asset) DDL": "2026-04-20",
"5. Translation (Asset) Status": "Not Started",
"6. Production DDL": "2026-04-30",
"6. Production Status": "Not Started"
},
{
"Project Number": "LLD-004",
"Project Name": "Biotherm Blue Therapy",
"Project Type": "Campaign",
"Brand": "BIOTHERM",
"Hub": "APAC",
"Country": "CN",
"Division": "LLD",
"PM": "Emma Liu",
"Current Stage": "Stage 1 - Briefing",
"Project Status": "Attention Required - Market",
"Project Risk - NEW": "",
"Current Stage Status": "",
"Project End Date": "2026-04-05",
"Current Stage Deadline": "2026-03-30",
"Action Required": "",
"Last Modified Time (on row)": "2026-03-20T08:00:00.000Z",
"Asset Count (Deliverable Roll Up)": 12,
"Completed Deliverable Count": 0,
"7. Opera Upload": "Not Started",
"7. Opera Upload DDL": "2026-04-01",
"7. Opera Upload Status": "Not Started",
"Has Deadline Slipped": true,
"Syndication Deadline Slip (Days)": 7,
"New Deadline Proposed by Oliver": "",
"Brief Submitted Date": "2026-02-10",
"Brief Acceptance Date (from Briefs Link) 2": "",
"Market's Action Needed": true,
"1. Missing DMI Asset Creation DDL": "2026-03-01",
"1. Missing DMI Asset Creation Status": "Not Started",
"2. Mastering, Copy Creation / Extraction DDL": "2026-03-15",
"2. Mastering, Copy Creation / Extraction Status": "Not Started",
"3. Global Rollout Invitation DDL": "2026-03-25",
"3. Global Rollout Invitation Status": "Not Started",
"4. Translation (Salsify PDP) DDL": "2026-03-30",
"4. Translation (Salsify PDP) Status": "Not Started",
"5. Translation (Asset) DDL": "2026-04-01",
"5. Translation (Asset) Status": "Not Started",
"6. Production DDL": "2026-04-05",
"6. Production Status": "Not Started"
}
]