1166 lines
36 KiB
Markdown
1166 lines
36 KiB
Markdown
|
|
# 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)
|