Fas 3 steg 3b: minimala efterfrågor + hushållsantagandeprofiler per ingrediens

This commit is contained in:
Sven (AAMOS AI)
2026-08-07 03:56:41 +07:00
parent 44f6385dce
commit e46281b9b5
24 changed files with 10130 additions and 5 deletions
+31
View File
@@ -213,6 +213,7 @@ export const cookingSessions = pgTable(
actualPortionsEaten: integer("actual_portions_eaten"),
/** Förberedda rester efter sessionen (steg 3d). */
leftoverEstimatePortions: integer("leftover_estimate_portions"),
leftoverNote: text("leftover_note"),
/** Ursprungligt FEFO-förslag, sparas för ev. undo/omräkning. */
plannedDeductions: jsonb("planned_deductions").$type<
Array<{ itemId: string; quantity: number; unit: string; name: string }>
@@ -256,6 +257,36 @@ export const recipeCooks = pgTable(
],
);
/** Antagandeprofiler per hushåll och ingrediens (Fas 3 §6.2).
* Lär sig över tid hur stor andel av ett recept som brukar ätas resp. bli rester.
*/
export const cookingAssumptionProfiles = pgTable(
"cooking_assumption_profiles",
{
householdId: uuid("household_id")
.notNull()
.references(() => households.id, { onDelete: "cascade" }),
canonicalIngredientId: text("canonical_ingredient_id")
.notNull()
.references(() => canonicalIngredients.id, { onDelete: "cascade" }),
/** Medelförbrukning i portioner per tillfälle (null tills vi har data). */
averageEatenPortions: doublePrecision("average_eaten_portions"),
/** Medelantal restportioner per tillfälle. */
averageLeftoverPortions: doublePrecision("average_leftover_portions"),
/** Hur många observationer profilen bygger på. */
observationCount: integer("observation_count").notNull().default(0),
/** Senaste rådata för felsökning/återspelning. */
lastSessionAnswers: jsonb("last_session_answers").$type<
Array<{ sessionId: string; eaten: number; leftovers: number; date: string }>
>(),
updatedAt: updatedAt(),
},
(t) => [
primaryKey({ columns: [t.householdId, t.canonicalIngredientId] }),
index("cooking_assumption_profiles_household_idx").on(t.householdId),
],
);
/** Dubblett-/variantklassning mellan recept (spec §36). */
export const recipeSimilarities = pgTable(
"recipe_similarities",