feat(planning): attribution et jet des restes + exclusion liste de courses / cuisine #49
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/leftovers-assign-discard"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Chantier « gestion des restes » (issue #34) — PR 2/4 : endpoints + exclusions. Toujours pas d'UI ; le panier arrive en PR 3.
Routes
POST /planning/items/leftoverassignLeftoverPlanningItem(201)sourcePlanningItemIdnon nul) sur(date, weekDay, meal), même recette que la source —recipeIdcopié depuissourceItemId, jamais dans le body.portionsrevérifié contrecomputeAvailableLeftovercôté serveur.PATCH /planning/items/:id/discard-leftoverdiscardLeftover(200)discardedPortions += pool disponible. Idempotent : rien à jeter → item renvoyé inchangé, aucun évènement.Erreurs : 409
LEFTOVER_QUANTITY_EXCEEDED(nouveau code4024, plage 4020-4029) siportionsdépasse le disponible ; 404PLANNING_ITEM_NOT_FOUNDsisourceItemIdinconnu, d'un autre foyer, ou lui-même un item « restes » (pas de restes-sur-restes) — et pourdiscard-leftover, même garde queremovePlanningItem.Exclusion
shopping-list.service.tsetcooking-session.service.tsajoutentitems: { where: { sourcePlanningItemId: null } }à leurincludePrisma — un créneau qui ne fait que resservir un plat déjà cuisiné n'a rien à acheter ni à cuisiner. Filtré à la requête, donc jamais atteint paraggregateShoppingList/toOptimizerRecipe.getPlanningForDatene filtre pas : la grille du planning doit afficher ces items (badge « restes » en PR 4).Divers
planning.leftover_assigned({ recipeId, portions, sourceItemId }) etplanning.leftover_discarded({ recipeId, portions }) viaanalytics.recordEvent.PlanningItem → PlanningItemViewest factorisé danstoPlanningItemView(4 chemins le partagent).assignLeftoverSchemadans@batch-cooking/shared; libelléerrors.LEFTOVER_QUANTITY_EXCEEDEDcôté web.Tests (Mocha, contre une vraie base)
assignLeftoverPlanningItem: succès +recipeIdcopié de la source ; 409 sur dépassement du pool ; 404 source d'un autre foyer / inconnue / elle-même « restes » ; suppression de la source → cascade sur les items « restes ».discardLeftover: jette le disponible, idempotent, ne jette que ce qui n'a pas déjà été servi, 404 sur id inconnu.GET /shopping-list(quantité inchangée malgré un item « restes ») etGET /cooking-session(le plan ne contient la recette qu'une fois).build+lintverts localement ; suite Mocha en CI (pas de base locale ici).🤖 Generated with Claude Code