3c: partial consumption + undo for cooking sessions
- Append-only undo via correction transactions tied to cookingSessionId. - POST /v1/cooking-sessions/:id/undo with 24h UTC window (409 + i18n after expiry). - Complete undo scope: meals removed, meal boxes discarded, recipe_cooks deleted, cookCount decremented; activation milestones left intact. - Deterministic assumption-profile rollback via lastSessionAnswers.sessionId; profile deleted when observationCount reaches 0. - New status 'undone' as TEXT validated against COOKING_SESSION_STATUSES. - Analytics event cooking_session_undone + domain events MEAL_BOX_DISCARDED, MEAL_REMOVED, COOKING_SESSION_UNDONE. - Partial consumption uses actualPortionsEaten/plannedPortions factor. - i18n coverage for cooked.undoWindowExpired across all 12 locales + server. - Invariant tests: computeBalance(transactions) === item.quantity after complete, undo, and undo + new complete; transaction count increases on undo. - Migration 0014_expand_event_types.sql adds new enum values. - Updated FAS3-COOKING-SESSIONS-AUDIT.md with chosen semantics.
This commit is contained in:
@@ -53,6 +53,7 @@ export const ANALYTICS_COOKING_EVENT_NAMES = [
|
||||
"cooking_session_started",
|
||||
"cooking_session_completed",
|
||||
"cooking_session_cancelled",
|
||||
"cooking_session_undone",
|
||||
"leftovers_created",
|
||||
"substitution_confirmed",
|
||||
] as const;
|
||||
|
||||
@@ -413,6 +413,9 @@ export const EVENT_TYPES = [
|
||||
"WEEK_PLAN_UPDATED",
|
||||
"MEAL_BOX_CREATED",
|
||||
"MEAL_BOX_CONSUMED",
|
||||
"MEAL_BOX_DISCARDED",
|
||||
"MEAL_REMOVED",
|
||||
"COOKING_SESSION_UNDONE",
|
||||
] as const;
|
||||
export type EventType = (typeof EVENT_TYPES)[number];
|
||||
|
||||
@@ -433,6 +436,20 @@ export const MEAL_LOG_SOURCES = [
|
||||
] as const;
|
||||
export type MealLogSource = (typeof MEAL_LOG_SOURCES)[number];
|
||||
|
||||
/** Cooking session lifecycle (Fas 3 §6). TEXT i databasen, valideras mot denna const. */
|
||||
export const COOKING_SESSION_STATUSES = [
|
||||
"planned",
|
||||
"started",
|
||||
"completed",
|
||||
"cancelled",
|
||||
"undone",
|
||||
] as const;
|
||||
export type CookingSessionStatus = (typeof COOKING_SESSION_STATUSES)[number];
|
||||
|
||||
/** Matlådestatuser (spec §24). TEXT i databasen, valideras mot denna const. */
|
||||
export const MEAL_BOX_STATUSES = ["available", "consumed", "discarded"] as const;
|
||||
export type MealBoxStatus = (typeof MEAL_BOX_STATUSES)[number];
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Smakprofil & feedback (spec §30)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user