# Phase 8 — Meal Planning & Waste Reduction **Goal**: Enable weekly meal planning with automatic nutrition tracking vs targets. The core feature is a **suggestion engine** that recommends recipes prioritizing ingredients already in the pantry (especially those expiring soon), reducing food waste while maintaining nutritional balance. **Depends on**: Phase 5 (products), Phase 6 (recipes), Phase 7 (pantry) --- ## Implementation Workflow (Vertical Slice) Following the project's standard workflow, Phase 8 will be implemented in the following order: ### 8.1 — Shared Layer: Types & Validation - **Types**: Define `MealPlan` and `NutritionTarget` in `packages/shared/src/types/`. - **Enums**: Define `MealType` and `MealPlanStatus` in `packages/shared/src/enums/`. - **Validation**: Create Zod schemas in `packages/shared/src/validation/`: - `CreateMealPlanSchema`: Ensures 7 days, valid `weekStartDate`. - `UpdateMealPlanSchema`: Supports granular updates (add/move/remove meal). - `NutritionTargetSchema`: Validates daily macros and calorie goals. - **Unit Tests**: Test Zod schemas for all edge cases (e.g., negative calories, overlapping weeks). ### 8.2 — Database Layer: Repositories - **MealPlanRepository**: - `findByHousehold(householdId, weekStartDate)`: Unique constraint per household per week. - `findCurrent(householdId)`: Returns the plan for the current calendar week. - `updateMeal(id, dayIndex, mealId, data)`: Granular update for a specific meal slot. - **NutritionTargetRepository**: - `findByUser(userId, householdId)`: Get active targets for a specific user. - `upsert(userId, householdId, data)`: Update or create targets. - **Integration Tests**: Verify MongoDB unique indexes and household scoping. ### 8.3 — Service Layer: Suggestion Engine & Planning - **MealPlanService**: - Manage CRUD operations and status transitions (Draft -> Active). - Compute `dailyNutritionTotal` dynamically using the `NutritionCalculatorService` from Phase 6. - **NutritionTargetService**: - Manage user-specific nutritional goals and presets (Maintenance, Loss, Gain). - **SuggestionEngineService** (Core Algorithm): - **Scoring Algorithm**: - `IngredientCoverage` (40%): Matches recipe ingredients vs current pantry items. - `FreshnessUrgency` (30%): Bonus for using items with `urgency: urgent` or `expiringSoon`. - `NutritionBalance` (20%): Complements existing meals in the day vs user targets. - `Variety` (10%): Penalizes recipes used in the last 14 days. - Uses `RecipesService` to fetch catalog and `PantryService` to fetch current inventory. - **ShoppingGapService**: - Analyze meal plans vs pantry to identify missing ingredients for Phase 9 integration. - **Unit Tests**: Test scoring weights and ingredient matching logic (100% coverage required). ### 8.4 — Route Layer: API Endpoints - **MealPlanRoutes**: - `GET /api/v1/households/:householdId/meal-plans`: List plans. - `GET /api/v1/households/:householdId/meal-plans/current`: Get current week. - `POST /api/v1/households/:householdId/meal-plans`: Create plan. - `PATCH /api/v1/households/:householdId/meal-plans/:id`: Update structure. - `GET /api/v1/households/:householdId/meal-plans/suggestions`: Get algorithmic suggestions. - **NutritionTargetRoutes**: - `GET /api/v1/households/:householdId/nutrition-targets`: Get user targets. - `POST /api/v1/households/:householdId/nutrition-targets`: Set targets. - **Integration Tests**: Verify all endpoints return correctly shaped responses (using `toProductResponse` style mappers). ### 8.5 — Web Layer: API Client & Components - **API Client**: Implement `meal-plans.ts` and `nutrition-targets.ts` in `packages/web/src/services/`. - **Hooks**: Create `useMealPlan` and `useSuggestions` hooks for state management. - **Components**: - `CalendarGrid`: Weekly view using CSS Grid and drag-and-drop. - `NutritionProgress`: Daily progress bars vs targets. - `SuggestionPanel`: Sidebar showing ranked recipes with "reasoning" tooltips. - `ShoppingGapView`: Breakdown of missing items. - **Component Tests**: Use React Testing Library to verify drag-and-drop and progress bar calculations. ### 8.6 — Verification Gate - `npm run build` - `npm run test:cov` (100% API/Shared, 90% Web thresholds) - `npm run lint` --- ## Technical Details ### Scoring Algorithm Constants ```typescript const WEIGHTS = { COVERAGE: 0.4, // Do I have the items? URGENCY: 0.3, // Should I use these items now? NUTRITION: 0.2, // Does it fit my macros? VARIETY: 0.1 // Have I eaten this too much? }; ``` ### Integration Points - **PantryService**: Fetch items where `status` is `sealed` or `opened`. - **RecipesService**: Fetch recipes and their computed nutrition/ingredients. - **NutritionCalculator**: Reuse for summing daily plan totals. --- ## Acceptance Criteria - [ ] Weekly meal plans can be created and managed via a calendar UI. - [ ] Drag-and-drop allows moving recipes between days and meal types. - [ ] The suggestion engine prioritizes recipes using urgent pantry items. - [ ] Daily nutrition bars reflect progress against user-defined macro targets. - [ ] Shopping gap analysis identifies missing ingredients for the planned week. - [ ] Full unit and integration test coverage as per project standards. - [ ] Build, Lint, and Coverage checks all pass.