MAJOR FIX: Dashboard now shows actual business data instead of mock values
The Bug:
--------
Dashboard insights were displaying hardcoded values:
- Savings: Always showed "€124 this week"
- Deliveries: Always showed "0 arriving today"
- Not reflecting actual business activity
Root Cause:
-----------
Line 468-472 in dashboard.py had hardcoded mock savings data:
```python
savings_data = {
"weekly_savings": 124,
"trend_percentage": 12
}
```
Deliveries data wasn't being fetched from any service.
The Fix:
--------
1. **Real Savings Calculation:**
- Fetches last 7 days of purchase orders
- Sums up actual savings from price optimization
- Uses po.optimization_data.savings field
- Calculates: weekly_savings from PO optimization savings
- Result: Shows €X based on actual cost optimizations
2. **Real Deliveries Data:**
- Fetches pending purchase orders from procurement service
- Counts POs with expected_delivery_date == today
- Result: Shows actual number of deliveries arriving today
3. **Data Flow:**
```
procurement_client.get_pending_purchase_orders()
→ Filter by created_at (last 7 days) for savings
→ Filter by expected_delivery_date (today) for deliveries
→ Calculate totals
→ Pass to dashboard_service.calculate_insights()
```
Benefits:
---------
✅ Savings widget shows real optimization results
✅ Deliveries widget shows actual incoming deliveries
✅ Inventory widget already uses real stock data
✅ Waste widget already uses real sustainability data
✅ Dashboard reflects actual business activity
Note: Trend percentage for savings still defaults to 12% as it
requires historical comparison data (future enhancement).
Moved alert-related methods from ProcurementServiceClient to a new
dedicated AlertsServiceClient for better separation of concerns.
Changes:
- Created shared/clients/alerts_client.py:
* get_alerts_summary() - Alert counts by severity/status
* get_critical_alerts() - Filtered list of urgent alerts
* get_alerts_by_severity() - Filter by any severity level
* get_alert_by_id() - Get specific alert details
* Includes severity mapping (critical → urgent)
- Updated shared/clients/__init__.py:
* Added AlertsServiceClient import/export
* Added get_alerts_client() factory function
- Updated procurement_client.py:
* Removed get_critical_alerts() method
* Removed get_alerts_summary() method
* Kept only procurement-specific methods
- Updated dashboard.py:
* Import and initialize alerts_client
* Use alerts_client for alert operations
* Use procurement_client only for procurement operations
Benefits:
- Better separation of concerns
- Alerts logically grouped with alert_processor service
- Cleaner, more maintainable service client architecture
- Each client maps to its domain service
Completed migration from generic .get() calls to typed service client
methods for better code clarity and maintainability.
Changes:
- Production timeline: Use get_todays_batches() instead of .get()
- Insights: Use get_sustainability_widget() and get_stock_status()
All dashboard endpoints now use domain-specific typed methods instead
of raw HTTP paths, making the code more discoverable and type-safe.
Created typed, domain-specific methods in service clients instead of
using generic .get() calls with paths. This improves type safety,
discoverability, and maintainability.
Service Client Changes:
- ProcurementServiceClient:
* get_pending_purchase_orders() - POs awaiting approval
* get_critical_alerts() - Critical severity alerts
* get_alerts_summary() - Alert counts by severity
- ProductionServiceClient:
* get_todays_batches() - Today's production timeline
* get_production_batches_by_status() - Filter by status
- InventoryServiceClient:
* get_stock_status() - Dashboard stock metrics
* get_sustainability_widget() - Sustainability data
Dashboard API Changes:
- Updated all endpoints to use new dedicated methods
- Cleaner, more maintainable code
- Better error handling and logging
- Fixed inventory data type handling (list vs dict)
Note: Alert endpoints return 404 - alert_processor service needs
endpoints: /alerts/summary and /alerts (filtered by severity).
Fixed 404 errors by adding service name prefixes to all client endpoint calls.
Gateway routing requires paths like /production/..., /procurement/..., /inventory/...
Changes:
- Production endpoints: Add /production/ prefix
- Procurement endpoints: Add /procurement/ prefix
- Inventory endpoints: Add /inventory/ prefix
- Handle inventory API returning list instead of dict for stock-status
Fixes:
- 404 errors for production-batches, purchase-orders, alerts endpoints
- AttributeError when inventory_data is a list
All service client calls now match gateway routing expectations.
Replace direct httpx calls with shared service client architecture for
better fault tolerance, authentication, and consistency.
Changes:
- Remove httpx import and usage
- Add service client imports (inventory, production, procurement)
- Initialize service clients at module level
- Refactor all 5 dashboard endpoints to use service clients:
* health-status: Use inventory/production/procurement clients
* orchestration-summary: Use procurement/production clients
* action-queue: Use procurement client
* production-timeline: Use production client
* insights: Use inventory client
Benefits:
- Built-in circuit breaker pattern for fault tolerance
- Automatic service authentication with JWT tokens
- Consistent error handling and retry logic
- Removes hardcoded service URLs
- Better testability and maintainability
- Fix frontend import: Change from useAppContext to useTenant store
- Fix backend imports: Use app.core.database instead of shared.database
- Remove auth dependencies from dashboard endpoints
- Add database migrations for reasoning fields in procurement and production
Migrations:
- procurement: Add reasoning, consequence, reasoning_data to purchase_orders
- production: Add reasoning, reasoning_data to production_batches
Implements comprehensive dashboard redesign based on Jobs To Be Done methodology
focused on answering: "What requires my attention right now?"
## Backend Implementation
### Dashboard Service (NEW)
- Health status calculation (green/yellow/red traffic light)
- Action queue prioritization (critical/important/normal)
- Orchestration summary with narrative format
- Production timeline transformation
- Insights calculation and consequence prediction
### API Endpoints (NEW)
- GET /dashboard/health-status - Overall bakery health indicator
- GET /dashboard/orchestration-summary - What system did automatically
- GET /dashboard/action-queue - Prioritized tasks requiring attention
- GET /dashboard/production-timeline - Today's production schedule
- GET /dashboard/insights - Key metrics (savings, inventory, waste, deliveries)
### Enhanced Models
- PurchaseOrder: Added reasoning, consequence, reasoning_data fields
- ProductionBatch: Added reasoning, reasoning_data fields
- Enables transparency into automation decisions
## Frontend Implementation
### API Hooks (NEW)
- useBakeryHealthStatus() - Real-time health monitoring
- useOrchestrationSummary() - System transparency
- useActionQueue() - Prioritized action management
- useProductionTimeline() - Production tracking
- useInsights() - Glanceable metrics
### Dashboard Components (NEW)
- HealthStatusCard: Traffic light indicator with checklist
- ActionQueueCard: Prioritized actions with reasoning/consequences
- OrchestrationSummaryCard: Narrative of what system did
- ProductionTimelineCard: Chronological production view
- InsightsGrid: 2x2 grid of key metrics
### Main Dashboard Page (REPLACED)
- Complete rewrite with mobile-first design
- All sections integrated with error handling
- Real-time refresh and quick action links
- Old dashboard backed up as DashboardPage.legacy.tsx
## Key Features
### Automation-First
- Shows what orchestrator did overnight
- Builds trust through transparency
- Explains reasoning for all automated decisions
### Action-Oriented
- Prioritizes tasks over information display
- Clear consequences for each action
- Large touch-friendly buttons
### Progressive Disclosure
- Shows 20% of info that matters 80% of time
- Expandable details when needed
- No overwhelming metrics
### Mobile-First
- One-handed operation
- Large touch targets (min 44px)
- Responsive grid layouts
### Trust-Building
- Narrative format ("I planned your day")
- Reasoning inputs transparency
- Clear status indicators
## User Segments Supported
1. Solo Bakery Owner (Primary)
- Simple health indicator
- Action checklist (max 3-5 items)
- Mobile-optimized
2. Multi-Location Owner
- Multi-tenant support (existing)
- Comparison capabilities
- Delegation ready
3. Enterprise/Central Bakery (Future)
- Network topology support
- Advanced analytics ready
## JTBD Analysis Delivered
Main Job: "Help me quickly understand bakery status and know what needs my intervention"
Emotional Jobs Addressed:
- Feel in control despite automation
- Reduce daily anxiety
- Feel competent with technology
- Trust system as safety net
Social Jobs Addressed:
- Demonstrate professional management
- Avoid being bottleneck
- Show sustainability
## Technical Stack
Backend: Python, FastAPI, SQLAlchemy, PostgreSQL
Frontend: React, TypeScript, TanStack Query, Tailwind CSS
Architecture: Microservices with circuit breakers
## Breaking Changes
- Complete dashboard page rewrite (old version backed up)
- New API endpoints require orchestrator service deployment
- Database migrations needed for reasoning fields
## Migration Required
Run migrations to add new model fields:
- purchase_orders: reasoning, consequence, reasoning_data
- production_batches: reasoning, reasoning_data
## Documentation
See DASHBOARD_REDESIGN_SUMMARY.md for complete implementation details,
JTBD analysis, success metrics, and deployment guide.
BREAKING CHANGE: Dashboard page completely redesigned with new data structures