Files
bakery-ia/docs/DASHBOARD_JTBD_ANALYSIS.md

1166 lines
36 KiB
Markdown
Raw Normal View History

2025-10-24 13:05:04 +02:00
# Jobs To Be Done (JTBD) Analysis: Bakery Owner Dashboard Reimagination
**Date:** 2025-10-24
**Status:** Planning Phase
**Objective:** Transform the current "Panel de Control" into a decision support companion aligned with bakery owner workflows
---
## 🎯 MAIN FUNCTIONAL JOB
**When** a bakery owner starts their workday and throughout operations,
**They want to** quickly assess the health of their bakery business and make informed decisions,
**So they can** prevent problems, optimize operations, maximize profitability, and go home confident that tomorrow is under control.
---
## 📊 CURRENT STATE ANALYSIS
### Current Dashboard Components
**Location:** `frontend/src/pages/app/DashboardPage.tsx`
**Existing Widgets:**
1. **StatsGrid** - 4 critical metrics (Sales, Pending Orders, Products Sold, Critical Stock)
2. **RealTimeAlerts** - Today's alerts with filtering/grouping
3. **SustainabilityWidget** - SDG 12.3 compliance and environmental impact
4. **PendingPOApprovals** - Purchase orders needing approval
5. **TodayProduction** - Active production batches
### What's Working Well ✅
- **Real-time data aggregation** from multiple services (sales, inventory, orders, production)
- **Sustainability tracking** aligned with SDG 12.3 (unique value proposition)
- **Action-oriented widgets** (approve POs, start batches directly from dashboard)
- **Multi-language support** (Spanish, Basque, English)
- **Mobile-responsive design** with proper breakpoints
- **Demo tour integration** for onboarding
### Critical Gaps ❌
1. **No narrative/story** - Just data widgets without context
2. **Cognitive overload** - Too many metrics without prioritization
3. **Reactive, not proactive** - Shows problems but doesn't guide actions
4. **No time-based workflow** - Doesn't match bakery daily rhythms
5. **Limited business intelligence** - Raw metrics vs. actionable insights
6. **Missing emotional satisfaction** - No celebration of wins or progress
7. **No financial context** - Metrics without business impact in euros
8. **Team visibility absent** - No view of staff capacity or performance
---
## 🎭 MAIN JOB DECOMPOSITION
### 1. **START THE DAY PREPARED**
**Functional Sub-jobs:**
- Understand what happened yesterday (wins/losses)
- Know what's critical TODAY (time-sensitive priorities)
- See what's coming tomorrow/this week (preparation needs)
- Feel confident about current state (peace of mind)
**Emotional Job:** Feel in control and ready to lead
**Social Job:** Be prepared for team questions and customer commitments
**Current Gaps:**
- No "morning briefing" view
- Yesterday's performance buried in trend percentages
- Tomorrow's needs require navigation to production/procurement pages
- No prioritized action list
**Success Metric:** Owner can answer "What do I need to focus on today?" in <30 seconds
---
### 2. **PREVENT PROBLEMS BEFORE THEY HAPPEN**
**Functional Sub-jobs:**
- Identify risks in real-time (stockouts, delays, quality issues)
- Understand WHY problems are occurring (root cause insights)
- Take immediate action or delegate (integrated workflow)
- Track that actions are being handled (accountability)
**Emotional Job:** Feel proactive and competent, avoid embarrassment of stockouts/delays
**Social Job:** Maintain reputation with customers and team
**Current Gaps:**
- Alerts lack context and prioritization (all treated equally)
- No predictive warnings (only reactive alerts)
- Action tracking disconnected from alerts
- No financial impact shown (which alerts cost money?)
**Success Metric:** 80% of problems prevented before impacting customers
---
### 3. **MAKE PROFITABLE DECISIONS**
**Functional Sub-jobs:**
- See financial impact of daily operations (P&L snapshot)
- Identify waste and inefficiency (cost savings opportunities)
- Understand sales performance vs. targets (goals tracking)
- Forecast cash flow needs (working capital)
**Emotional Job:** Feel financially secure and savvy
**Social Job:** Demonstrate business acumen to partners/investors
**Current Gaps:**
- No financial dashboard view or daily P&L
- Sustainability savings shown but not tied to overall profitability
- No goal/target tracking visible
- Missing cost vs. revenue comparison
- Production costs not visible alongside sales
**Success Metric:** Owner knows daily profit/loss and can explain key drivers
---
### 4. **LEAD THE TEAM EFFECTIVELY**
**Functional Sub-jobs:**
- See team workload and capacity (resource planning)
- Monitor production efficiency (team performance)
- Identify training needs (skill gaps)
- Recognize great work (team morale)
**Social Job:** Be seen as a competent, caring leader by team
**Emotional Job:** Feel confident in team management abilities
**Current Gaps:**
- No team view on dashboard
- No performance recognition system
- Staff assignments buried in batch details (requires drill-down)
- No capacity planning visibility
**Success Metric:** Balanced workload, recognized top performers weekly
---
### 5. **ACHIEVE LONG-TERM GOALS**
**Functional Sub-jobs:**
- Track progress toward sustainability certifications (SDG compliance)
- Monitor business growth trends (month-over-month)
- Prepare for audits/reporting (compliance readiness)
- Build brand reputation (quality, sustainability)
**Emotional Job:** Feel proud and purposeful about their business
**Social Job:** Build reputation as sustainable, quality-focused bakery
**Current Gaps:**
- Sustainability widget is excellent but isolated from other goals
- No long-term trend visualization (only day-over-day)
- Missing quality score trends over time
- No certification readiness indicators
- Growth metrics not prominent
**Success Metric:** Progress visible toward 3-6 month goals, certification-ready data
---
## 🚧 FORCES OF PROGRESS
### Push Forces (Problems with Current Situation)
- "I spend 30 minutes every morning checking different screens to know what's happening"
- "I discover problems too late to fix them without customer impact"
- "I don't know if we're making money until month-end accounting"
- "My team doesn't know what's most important each day"
- "I can't explain our sustainability efforts to certification auditors"
- "I miss opportunities to celebrate team wins"
### Pull Forces (Attraction of New Solution)
- "One glance tells me everything I need to know to start my day"
- "I get early warnings with suggested actions before problems escalate"
- "I see profit impact in real-time and understand what drives it"
- "Clear priorities that everyone on the team can follow"
- "Sustainability progress tracked automatically for certifications"
- "System highlights achievements to share with the team"
### Anxiety Forces (Fears About Change)
- "Will it be overwhelming with too much information?"
- "Will I lose visibility into details I occasionally need?"
- "Will my team resist learning a new interface?"
- "Will setup and configuration take too long?"
- "What if the AI insights are wrong?"
### Habit Forces (What Keeps Them in Current State)
- "I'm used to my morning routine of checking multiple tabs"
- "I know where to find what I need in the current layout"
- "The team knows the current process and workflows"
- "It's working 'well enough' - why risk breaking it?"
- "I don't have time to learn something new right now"
---
## 🎯 DESIGN PRINCIPLES FOR REIMAGINED DASHBOARD
### 1. **Time-Contextualized Design** (vs. Static Metrics)
**Morning View (6-10 AM):**
- Yesterday's summary (what you missed overnight)
- TODAY's priorities (time-ordered, actionable)
- Quick wins available (morale boost, easy completions)
- Team arrival and readiness status
**Midday View (10 AM - 5 PM):**
- Real-time operations status
- Production vs. sales gap analysis
- Critical alerts only (P0/P1)
- Current profitability snapshot
**Evening View (5-8 PM):**
- Tomorrow's preparation checklist
- Today's achievements (celebrate!)
- Delegation status (what's covered for tomorrow)
- Unresolved items requiring attention
**Implementation:** Use `useTimeContext` hook to dynamically adjust widget visibility and content
---
### 2. **Narrative-Driven Metrics** (vs. Raw Numbers)
**Before:**
```
Sales Today: €1,247
↑ 15.2% vs yesterday
```
**After:**
```
€1,247 today — €200 above Tuesday average
On track for best week this month 🎯
Next milestone: €1,500 day (€253 to go)
```
**Implementation Approach:**
- Add context layer to all metrics
- Compare to meaningful benchmarks (not just yesterday)
- Show progress toward goals
- Use natural language, not just percentages
---
### 3. **Action Priority System** (vs. All Alerts Equal)
**Priority Levels:**
- **P0 (NOW - Red Zone):** Revenue-impacting, customer-facing, <2 hours to resolve
- Example: "Stockout on bestseller, 5 customer orders waiting"
- Auto-escalate to owner's phone if not acknowledged in 30 min
- **P1 (TODAY - Amber Zone):** Must be resolved before close of business
- Example: "PO #1847 approval needed for tomorrow's delivery"
- Show on morning briefing
- **P2 (THIS WEEK - Blue Zone):** Optimization opportunities
- Example: "Waste trending up 10% this week"
- Show in evening checklist
- **P3 (BACKLOG - Green Zone):** Nice-to-have improvements
- Example: "Consider alternative supplier for flour (5% cheaper)"
- Show in weekly review only
**Priority Calculation Algorithm:**
```typescript
priority = (financial_impact * 0.4) +
(time_urgency * 0.3) +
(customer_impact * 0.2) +
(compliance_risk * 0.1)
```
---
### 4. **Financial Context Always** (vs. Operational Metrics Only)
**Every widget shows business impact:**
- Inventory: "23 kg waste prevented → €187 saved this month"
- Production: "Batch 15% faster → 2.5 hours labor saved (€45)"
- Procurement: "3 urgent PO approvals → €1,340 in orders unlocked"
- Alerts: "Critical stockout → €450 in sales at risk"
- Sustainability: "CO₂ reduction → €230 potential grant value"
**Implementation:**
- Create `FinancialImpactBadge` component (reusable)
- Add `impact_euros` field to all data models
- Calculate impact server-side for consistency
---
### 5. **Celebration & Progress** (vs. Problem-Focused)
**Daily Wins Section:**
- ✅ All orders fulfilled on time
- ✅ Production target met (105%)
- ✅ Zero waste day!
- 🔥 3-day quality streak (score >9.0)
**Milestone Tracking:**
- Sustainability: 47% toward SDG 12.3 compliance
- Growth: €2,340 from monthly goal (78% complete)
- Quality: 28 consecutive days >9.0 score
**Visual Design:**
- Confetti animation on milestones
- Streak counters with fire emoji 🔥
- Progress bars with gradients
- Shareable achievement cards for social media
---
## 📋 PROPOSED WIDGET STRUCTURE
### **Hero Section** (Top - First 5 Seconds)
1. **Business Health Score** (0-100)
- Aggregates: Sales, Quality, On-Time, Profitability, Team Morale
- Color-coded: Red <60, Yellow 60-80, Green >80
- Trend: 7-day moving average
2. **Today's Story** (AI-Generated Summary)
- 2-sentence natural language summary
- Example: "Strong start to the week! Sales up 18% and all production on schedule. Watch ingredient costs - flour prices rising."
3. **Critical Actions** (Max 3)
- Sorted by: urgency × impact
- One-click actions inline
- Delegate button with team assignment
---
### **Context Sections** (Scrollable, Priority-Ordered)
#### 1. **Financial Snapshot** (Always Visible)
- **Today's P&L:**
- Revenue: €1,247 (sales completed)
- COGS: €530 (production materials)
- Labor: €280 (staff hours × rates)
- Waste: €18 (spoilage + mistakes)
- **Net Profit: €419** (34% margin) ✅
- **Weekly Trend:** Sparkline chart
- **Cash Flow:** Upcoming payments vs. receivables
#### 2. **Operations Flow** (Production → Inventory → Sales Cycle)
- Production status: 3 batches in progress, 2 completed, 1 pending
- Inventory health: 94% stocked, 2 items low, 0 stockouts
- Sales velocity: 87 units sold today, 13 pending orders
- **Bottleneck indicator:** Highlights slowest stage
#### 3. **Team & Capacity**
- Staff scheduled: 4/5 confirmed for today
- Current workload: Balanced (no one >110% capacity)
- Performance highlights: "María: 115% efficiency this week 🌟"
- Training needs: 2 staff need safety recertification
#### 4. **Quality & Sustainability** (Enhanced Existing Widget)
- Quality score: 9.2/10 (28-day streak)
- Sustainability: SDG 12.3 progress, CO₂ saved, waste reduction
- Certifications: Readiness indicators for audits
- **Grant opportunities:** 3 programs eligible (€12K potential)
#### 5. **Tomorrow's Briefing**
- Scheduled deliveries: Flour (50kg, 8 AM), Eggs (200, 10 AM)
- Production plan: 5 batches, 320 units total
- Staff: 5/5 confirmed, no gaps
- **Preparation checklist:**
- [ ] Review PO #1892 (arrives 8 AM)
- [ ] Assign quality check for batch #489
- [ ] Confirm catering order (pick-up 2 PM)
---
### **Smart Widgets** (Contextual, Time-Based)
These widgets appear/disappear based on context:
- **Morning Briefing** (6-10 AM only)
- **Midday Operations** (10 AM - 5 PM only)
- **Evening Checklist** (5-8 PM only)
- **Weekend Prep** (Friday PM only)
- **Weekly Review** (Monday AM only)
---
## 🚀 INCREMENTAL IMPLEMENTATION PHASES
### **PHASE 1: Quick Wins** (Week 1-2, ~10 hours)
**Goal:** Add context and impact to existing components without breaking changes
#### Deliverables:
1. **Enhanced StatsGrid with Financial Impact**
- File: `frontend/src/pages/app/DashboardPage.tsx` (modify lines 179-264)
- Add `impact` and `actionable` fields to stat objects
- Show financial context in subtitle
**Example Change:**
```typescript
{
title: t('dashboard:stats.critical_stock', 'Critical Stock'),
value: dashboardStats.criticalStock.toString(),
icon: AlertTriangle,
variant: dashboardStats.criticalStock > 0 ? 'error' : 'success',
impact: dashboardStats.criticalStock > 0
? `€${(dashboardStats.criticalStock * 80).toFixed(0)} in delayed orders`
: null, // NEW
actionable: dashboardStats.criticalStock > 0
? 'Review procurement queue'
: null, // NEW
subtitle: dashboardStats.criticalStock > 0
? t('dashboard:messages.action_required', 'Action required')
: t('dashboard:messages.stock_healthy', 'Stock levels healthy')
}
```
2. **Priority System for RealTimeAlerts**
- New hook: `frontend/src/hooks/business/useAlertPriority.ts`
- Modify: `frontend/src/components/domain/dashboard/RealTimeAlerts.tsx`
- Add priority calculation based on urgency + impact
- Group alerts by priority (P0, P1, P2, P3)
**Algorithm:**
```typescript
const calculatePriority = (alert: Notification): Priority => {
const urgency = calculateUrgency(alert.timestamp, alert.type);
const impact = estimateFinancialImpact(alert);
const score = (urgency * 0.6) + (impact * 0.4);
if (score > 80) return 'P0';
if (score > 60) return 'P1';
if (score > 40) return 'P2';
return 'P3';
};
```
3. **Daily Briefing Widget**
- New component: `frontend/src/components/domain/dashboard/DailyBriefing.tsx`
- Uses existing `useDashboardStats` hook
- Simple summary generation (no AI yet)
**Content Structure:**
```typescript
interface DailyBriefing {
headline: string; // "Strong Tuesday!"
summary: string[]; // ["Sales up 15%", "3 tasks need attention"]
sentiment: 'positive' | 'neutral' | 'concern';
topPriority: string; // Most urgent action
}
```
**Success Criteria:**
- [ ] All stats show financial impact where relevant
- [ ] Alerts sorted by priority, not just time
- [ ] Daily briefing loads in <500ms
- [ ] No breaking changes to existing functionality
**User Value:** Owners immediately see "why this matters" in money terms
---
### **PHASE 2: Financial Context Layer** (Week 3-4, ~12 hours)
**Goal:** Add daily profitability visibility and financial badges throughout
#### Deliverables:
1. **FinancialImpactBadge Component**
- New: `frontend/src/components/ui/Badge/FinancialImpactBadge.tsx`
- Reusable component showing € impact with color coding
- Variants: cost (red), savings (green), revenue (blue), neutral (gray)
**Props:**
```typescript
interface FinancialImpactBadgeProps {
amount: number;
type: 'cost' | 'savings' | 'revenue' | 'neutral';
label?: string;
showIcon?: boolean;
}
```
2. **Profit Snapshot Widget**
- New: `frontend/src/components/domain/dashboard/ProfitSnapshot.tsx`
- Shows TODAY's simple P&L
- Backend API needed: `GET /api/v1/tenants/{id}/dashboard/profit-snapshot`
**Data Model:**
```python
class ProfitSnapshot(BaseModel):
date: date
revenue: Decimal # from sales
cogs: Decimal # from production batches
labor_cost: Decimal # from staff hours
waste_cost: Decimal # from inventory
net_profit: Decimal
margin_percentage: float
trend_vs_yesterday: float
```
3. **Backend API Endpoint**
- New: `services/orders/app/api/dashboard.py` - `get_daily_profit_snapshot()`
- Aggregates data from: sales, production, inventory services
- Caches result for 15 minutes
**Implementation:**
```python
@router.get(
"/api/v1/tenants/{tenant_id}/dashboard/profit-snapshot",
response_model=ProfitSnapshot
)
async def get_daily_profit_snapshot(
tenant_id: UUID,
date: Optional[str] = None, # defaults to today
db: AsyncSession = Depends(get_db)
):
# Aggregate: sales.revenue - production.costs - inventory.waste
# Calculate labor from staff_assigned × hourly_rates
return ProfitSnapshot(...)
```
4. **Integrate Financial Badges**
- Add to: AlertCard, PendingPOApprovals, TodayProduction
- Show € impact prominently
- Link to profit snapshot when clicked
**Success Criteria:**
- [ ] Daily profit visible on dashboard
- [ ] All critical alerts show € impact
- [ ] Owner can explain profitability drivers
- [ ] Financial badges consistent across all widgets
**User Value:** Daily profitability visibility (currently hidden until month-end)
---
### **PHASE 3: Time-Based Smart Views** (Week 5-6, ~15 hours)
**Goal:** Dashboard adapts to time of day and workflow rhythms
#### Deliverables:
1. **Time Context Hook**
- New: `frontend/src/hooks/business/useTimeContext.ts`
- Detects time of day and suggests dashboard mode
**Implementation:**
```typescript
type DashboardMode = 'morning' | 'midday' | 'evening' | 'weekend';
const useTimeContext = () => {
const now = new Date();
const hour = now.getHours();
const day = now.getDay();
const mode: DashboardMode =
day === 0 || day === 6 ? 'weekend' :
hour < 10 ? 'morning' :
hour < 17 ? 'midday' : 'evening';
return {
mode,
isWorkingHours: hour >= 6 && hour <= 20,
shouldShowBriefing: hour >= 6 && hour <= 10
};
};
```
2. **Morning Briefing Component**
- New: `frontend/src/components/domain/dashboard/MorningBriefing.tsx`
- Shows 6-10 AM only
**Sections:**
```typescript
interface MorningBriefingData {
yesterday: {
sales: number;
target: number;
orders_completed: number;
issues: string[];
};
today: {
priorities: Array<{
time: string;
action: string;
urgency: Priority;
}>;
team_status: string;
};
quick_wins: Array<{
action: string;
impact: number; // euros
time_required: number; // minutes
}>;
}
```
3. **Evening Checklist Component**
- New: `frontend/src/components/domain/dashboard/EveningChecklist.tsx`
- Shows 5-8 PM only
**Sections:**
- Today's Achievements (wins to celebrate)
- Tomorrow's Prep (deliveries, production schedule)
- Open Items (unresolved alerts, pending approvals)
4. **Weekend View**
- Simplified dashboard for off-hours
- Shows only critical alerts (P0/P1)
- "All quiet" message when no urgent items
**Success Criteria:**
- [ ] Morning briefing shows yesterday recap + today priorities
- [ ] Evening checklist shows tomorrow prep
- [ ] Dashboard mode switches automatically
- [ ] Owner saves 15+ minutes in morning routine
**User Value:** Dashboard anticipates needs based on time of day
---
### **PHASE 4: Team & Capacity View** (Week 7-8, ~12 hours)
**Goal:** Visibility into team workload, performance, and capacity
#### Deliverables:
1. **TeamCapacity Widget**
- New: `frontend/src/components/domain/dashboard/TeamCapacity.tsx`
- Shows staff scheduled, workload, performance
**Data Model:**
```typescript
interface TeamCapacityData {
date: string;
staff_scheduled: Array<{
id: string;
name: string;
role: string;
shift_start: string;
shift_end: string;
workload_percentage: number; // 0-150%
batches_assigned: number;
efficiency_score: number; // vs. baseline
}>;
available_capacity: number; // hours
performance_highlights: Array<{
staff_name: string;
achievement: string;
}>;
}
```
2. **Backend API Endpoint**
- New: `services/production/app/api/dashboard.py` - `get_team_capacity()`
- Aggregates batches by `staff_assigned`
- Calculates workload based on planned_duration_minutes
**Implementation:**
```python
@router.get(
"/api/v1/tenants/{tenant_id}/dashboard/team-capacity",
response_model=TeamCapacityView
)
async def get_team_capacity(
tenant_id: UUID,
date: str,
db: AsyncSession = Depends(get_db)
):
# Query batches for date, group by staff_assigned
# Calculate: workload = sum(planned_duration) / (shift_hours * 60)
# Identify: efficiency = actual_duration / planned_duration
return TeamCapacityView(...)
```
3. **Performance Recognition**
- Automatic detection of:
- High efficiency (actual < planned time consistently)
- Quality scores >9.5
- Zero defects streaks
- Visual: Star icon, highlight in widget
- Action: One-click "Share with team" button
**Success Criteria:**
- [ ] Team workload visible at a glance
- [ ] Performance highlights shown for top performers
- [ ] Owner can identify overloaded staff
- [ ] Capacity planning data available
**User Value:** Resource planning and team recognition
---
### **PHASE 5: Narrative & Intelligence** (Week 9-10, ~16 hours)
**Goal:** AI-enhanced insights and celebration moments
#### Deliverables:
1. **Smart Insights Widget**
- New: `frontend/src/components/domain/dashboard/SmartInsights.tsx`
- Pattern-based suggestions
**Insight Types:**
- **Demand patterns:** "Sales spike Fridays (+30%) → Consider increasing Friday production"
- **Waste trends:** "Flour waste trending up 10% → Check batch sizes"
- **Supplier issues:** "3 late deliveries from SupplierX this month → Consider backup"
- **Opportunities:** "Sustainability metrics qualify for €5K grant → Review eligibility"
**Backend:**
```python
# services/alert_processor/analytics_rules.py (NEW)
class InsightRule:
def detect(self, data: TenantData) -> Optional[Insight]:
# Rule-based pattern detection
pass
rules = [
DemandPatternRule(),
WasteTrendRule(),
SupplierReliabilityRule(),
GrantEligibilityRule(),
]
```
2. **Win Streak Tracker**
- New: `frontend/src/components/domain/dashboard/WinStreak.tsx`
- Tracks consecutive days meeting goals
**Streaks Tracked:**
```typescript
interface WinStreak {
type: 'no_stockouts' | 'sales_target' | 'waste_reduction' | 'quality_score';
current_streak: number; // days
longest_streak: number;
last_broken: string; // date
next_milestone: number; // days
}
```
**Visual:**
- Fire emoji 🔥 for active streaks
- Confetti animation on new records
- Milestone badges (7, 14, 30, 90 days)
3. **AI Summary Enhancement** (Optional)
- Enhance DailyBriefing with OpenAI API
- Generate natural language summary
- Requires: OpenAI API key, backend service
**Example Prompt:**
```
Based on this bakery data:
- Sales: €1,247 (up 15% vs yesterday)
- Critical stock: 2 items
- Pending POs: 3 urgent
- Production: on schedule
Generate a 2-sentence briefing for the owner:
```
**Output:** "Strong sales day with €1,247 revenue, tracking 15% above yesterday. Focus on approving 3 urgent purchase orders to prevent stockouts."
4. **Celebration Moments**
- Auto-detect achievements:
- New sales record
- Longest quality streak
- Sustainability milestone (50% SDG target)
- Zero waste day
- Visual: Full-screen confetti animation
- Shareable: Generate achievement card with bakery branding
**Success Criteria:**
- [ ] At least 3 actionable insights per week
- [ ] Win streaks visible and tracked
- [ ] Owner reports "dashboard anticipates my questions"
- [ ] Achievements celebrated automatically
**User Value:** Proactive guidance and positive reinforcement
---
## 🗂️ FILE STRUCTURE
### New Files
```
frontend/src/
├── components/domain/dashboard/
│ ├── DailyBriefing.tsx # Phase 1 - Today's story summary
│ ├── MorningBriefing.tsx # Phase 3 - Yesterday + today priorities
│ ├── EveningChecklist.tsx # Phase 3 - Tomorrow prep + today wins
│ ├── ProfitSnapshot.tsx # Phase 2 - Daily P&L widget
│ ├── TeamCapacity.tsx # Phase 4 - Staff workload & performance
│ ├── SmartInsights.tsx # Phase 5 - AI-driven suggestions
│ ├── WinStreak.tsx # Phase 5 - Achievement tracking
│ └── FinancialImpactBadge.tsx # Phase 2 - Reusable € badge
├── hooks/business/
│ ├── useTimeContext.ts # Phase 3 - Time-based modes
│ ├── useAlertPriority.ts # Phase 1 - P0-P3 calculation
│ ├── useWinStreak.ts # Phase 5 - Streak tracking
│ └── useProfitSnapshot.ts # Phase 2 - Daily P&L data
└── utils/
├── alertPriority.ts # Phase 1 - Priority algorithms
├── financialCalculations.ts # Phase 2 - Impact calculations
└── insightRules.ts # Phase 5 - Pattern detection
backend/
├── services/orders/app/api/
│ └── dashboard.py # EXTEND - add profit-snapshot endpoint
├── services/production/app/api/
│ └── dashboard.py # EXTEND - add team-capacity endpoint
└── services/alert_processor/
└── analytics_rules.py # NEW - Phase 5 insights engine
```
### Modified Files
```
frontend/src/
├── pages/app/
│ └── DashboardPage.tsx # Orchestrate all new widgets
└── components/domain/dashboard/
├── RealTimeAlerts.tsx # Add priority grouping
└── (existing widgets) # Add financial badges
backend/
└── services/inventory/app/schemas/
└── dashboard.py # Add profit, team schemas
```
---
## 🔄 MIGRATION STRATEGY
### Gradual, Non-Breaking Rollout
#### Week 1-2: Shadow Mode
- Add new components alongside existing ones
- Feature flag: `ENABLE_ENHANCED_DASHBOARD` (environment variable)
- Default: `false` (opt-in testing only)
- No changes to production dashboard
**Implementation:**
```typescript
// DashboardPage.tsx
const useEnhancedDashboard =
import.meta.env.VITE_ENABLE_ENHANCED_DASHBOARD === 'true';
return (
<div>
{useEnhancedDashboard ? (
<>
<DailyBriefing />
<EnhancedStatsGrid />
</>
) : (
<StatsGrid stats={criticalStats} />
)}
{/* Rest of dashboard */}
</div>
);
```
#### Week 3-4: Opt-In Testing
- Add toggle in user settings: `Settings > Preferences > Beta Features`
- Invite bakery owner (you?) to test
- Collect feedback via in-app survey
- Track analytics: time on page, clicks, errors
**User Setting:**
```typescript
// services/auth/app/schemas/users.py
class UserPreferences(BaseModel):
use_enhanced_dashboard: bool = False # NEW
# ... existing preferences
```
#### Week 5-6: Hybrid Mode
- Show enhanced widgets during specific times:
- Morning briefing: 6-10 AM (auto-enabled for all)
- Evening checklist: 5-8 PM (auto-enabled for all)
- Keep existing widgets for midday
- A/B test with 50% of users
**Analytics to Track:**
- Morning briefing usage: % who interact
- Time saved: avg. time to complete daily review
- Errors prevented: P0 alerts resolved before escalation
- User satisfaction: weekly NPS survey
#### Week 7-8: Default On
- Enhanced dashboard becomes default for all users
- Old view available as "Classic Mode" toggle
- Deprecation notice: "Classic mode will be removed in 2 weeks"
#### Week 9-10: Full Migration
- Remove old components if new validated (>80% satisfaction)
- Cleanup feature flags
- Archive old code
- Update documentation
---
## ✅ SUCCESS METRICS
### Phase 1 Success Criteria
- [ ] Owner sees financial impact on all critical stats
- [ ] Alerts sorted by priority, not chronologically
- [ ] Daily briefing widget loads in <500ms
- [ ] 90% of users prefer enhanced stats over old
### Phase 2 Success Criteria
- [ ] Daily profit visible (Revenue - COGS - Waste)
- [ ] All P0/P1 alerts show € impact
- [ ] Owner can explain profitability to investor in <2 minutes
- [ ] Financial badges render in <100ms
### Phase 3 Success Criteria
- [ ] Morning briefing shows yesterday + today priorities
- [ ] Evening checklist shows tomorrow prep
- [ ] Owner saves 15+ minutes in morning routine (self-reported)
- [ ] 85% find time-based views helpful
### Phase 4 Success Criteria
- [ ] Team workload visible at a glance
- [ ] Performance highlights shown weekly
- [ ] Owner can balance assignments without manual calculation
- [ ] Team morale improves (quarterly survey)
### Phase 5 Success Criteria
- [ ] At least 3 actionable insights generated per week
- [ ] Win streaks visible and celebrated
- [ ] Owner reports "dashboard anticipates my questions" (interview)
- [ ] Reduction in reactive firefighting (tracked via alert resolution time)
### Overall Success (End of Phase 5)
- [ ] Dashboard is #1 most-visited page (analytics)
- [ ] Owner satisfaction >4.5/5 (quarterly survey)
- [ ] 30% reduction in time spent on morning review
- [ ] 20% improvement in problem prevention (P0 alerts avoided)
- [ ] 3 month retention: 95% of users still use enhanced dashboard
---
## 🚀 IMMEDIATE NEXT STEPS
### To Start Phase 1 (This Week):
1. **Create feature branch:**
```bash
git checkout -b feature/dashboard-enhancements-phase1
```
2. **Set up feature flag:**
```bash
# frontend/.env.local
VITE_ENABLE_ENHANCED_DASHBOARD=true
```
3. **Implement DailyBriefing component** (2-3 hours):
- Create `frontend/src/components/domain/dashboard/DailyBriefing.tsx`
- Reuse existing `useDashboardStats` hook
- Simple algorithm: compare today vs. yesterday
- Generate 2-3 bullet summary
4. **Add priority to alerts** (3-4 hours):
- Create `frontend/src/hooks/business/useAlertPriority.ts`
- Create `frontend/src/utils/alertPriority.ts` (calculation logic)
- Modify `RealTimeAlerts` to support priority grouping
- Add priority badge to `AlertCard`
5. **Add impact to StatsGrid** (1-2 hours):
- Extend `DashboardStats` type with optional `impact?: string`
- Modify stat card rendering to show impact subtitle
- Populate from existing data (no new API calls yet)
6. **Test and validate** (1-2 hours):
- Unit tests for priority calculation
- Integration tests for DailyBriefing
- Visual regression tests for modified components
- Accessibility audit (keyboard navigation, screen readers)
7. **Deploy to dev and gather feedback** (1 hour):
```bash
npm run build
kubectl apply -f infrastructure/kubernetes/overlays/dev/
```
**Total Phase 1 Effort:** ~10-12 hours (1.5-2 days)
---
## 📚 APPENDIX
### A. Technology Stack
**Frontend:**
- React 18 + TypeScript
- TanStack Query (React Query) for data fetching
- React Router for navigation
- i18next for translations
- Lucide React for icons
**Backend:**
- FastAPI (Python 3.11+)
- PostgreSQL for persistence
- Redis for caching
- SQLAlchemy ORM
**Infrastructure:**
- Kubernetes (local: k3d, prod: managed cluster)
- Nginx Ingress
- Prometheus + Grafana (monitoring)
### B. Existing Dashboard APIs
**Available Data Sources:**
- `GET /api/v1/tenants/{id}/dashboard/summary` - Inventory dashboard
- `GET /api/v1/tenants/{id}/alerts/analytics` - Alert analytics (7-30 days)
- `GET /api/v1/tenants/{id}/orders/dashboard-summary` - Orders metrics
- `GET /api/v1/tenants/{id}/sales/analytics` - Sales data
- `GET /api/v1/tenants/{id}/production/batches/active` - Production batches
- `GET /api/v1/tenants/{id}/sustainability/widget` - Sustainability metrics
**Aggregated via:**
- `useDashboardStats()` hook - Combines all above into single dashboard snapshot
### C. User Roles & Permissions
**Relevant Roles:**
- `owner` (tenant role) - Full access, primary user of dashboard
- `admin` (tenant role) - Full access
- `manager` (global role) - Can view but limited editing
- `member` (tenant role) - Limited view access
**Dashboard Visibility:**
- All roles can view dashboard
- Actions (approve PO, start batch) require `owner` or `admin` role
- Financial data visible to `owner`, `admin`, `manager` only
### D. Performance Considerations
**Current Dashboard Load Time:**
- Initial load: ~800ms (parallel API calls)
- Re-render: <100ms (React Query caching)
- SSE connection: Real-time alerts
**Target Performance (Enhanced):**
- Initial load: <1000ms (same or better)
- Daily briefing: <500ms (cached server-side)
- Financial snapshot: <300ms (15-min cache)
- Win streak: <50ms (localStorage)
**Optimization Strategies:**
- Server-side caching (Redis, 5-15 min TTL)
- Client-side caching (React Query, 30-60s stale time)
- Code splitting (lazy load evening/morning widgets)
- Incremental rendering (Suspense boundaries)
### E. Accessibility Requirements
**WCAG 2.1 AA Compliance:**
- [ ] Keyboard navigation (Tab, Enter, Esc)
- [ ] Screen reader support (ARIA labels)
- [ ] Color contrast >4.5:1
- [ ] Focus indicators visible
- [ ] No content flash <3 times/sec
- [ ] Text scalable to 200%
**Dashboard-Specific:**
- Alert priority communicated via text, not color only
- Financial impact readable by screen readers
- Time-based views announced on change
- All actions have keyboard shortcuts
### F. Internationalization
**Supported Languages:**
- Spanish (es)
- Basque (eu)
- English (en)
**Translation Keys to Add:**
```json
// frontend/src/locales/en/dashboard.json
{
"daily_briefing": {
"title": "Today's Briefing",
"yesterday_recap": "Yesterday's Performance",
"today_priorities": "Today's Priorities",
"quick_wins": "Quick Wins"
},
"financial": {
"profit_snapshot": "Daily Profit",
"revenue": "Revenue",
"costs": "Costs",
"net_profit": "Net Profit",
"margin": "Margin"
},
"priorities": {
"p0": "URGENT",
"p1": "Today",
"p2": "This Week",
"p3": "Backlog"
}
// ... etc
}
```
### G. References & Inspiration
**JTBD Resources:**
- Bob Moesta - "Demand-Side Sales 101"
- Clayton Christensen - "Competing Against Luck"
- Alan Klement - "When Coffee and Kale Compete"
**Dashboard Design Patterns:**
- Intercom Product Updates (narrative-driven)
- Shopify Home (financial context always)
- Linear Dashboard (time-based views)
- Notion Workspace (celebration moments)
**Bakery Domain Expertise:**
- UN SDG 12.3 Food Waste Guidelines
- EU Sustainability Reporting Standards
- Local bakery owner interviews (recommended)
---
## 📝 CONCLUSION
This JTBD analysis transforms the dashboard from a **data display tool** into a **decision support companion** that:
1. **Aligns with bakery workflows** (morning/midday/evening rhythms)
2. **Provides financial context** (every metric tied to profitability)
3. **Guides action** (prioritized by urgency × impact)
4. **Celebrates progress** (wins, streaks, milestones)
5. **Anticipates needs** (time-based smart views)
The incremental implementation approach ensures:
- No breaking changes to existing system
- Value delivered every 2 weeks
- User feedback incorporated continuously
- Low risk, high reward
**Recommendation:** Start with Phase 1 this week to validate core assumptions before committing to full redesign.
---
**Last Updated:** 2025-10-24
**Next Review:** After Phase 1 completion (Week 2)
**Owner:** Development Team + Bakery Owner (Product Validation)