Rezepturen flach entwickeln statt im Graphen #2

Open
odoo wants to merge 29 commits from odoo/19.0-recipe_wizard into 19.0 AGit
Owner

Zwei Verschiebungen aus der Umsetzung, und warum der Kalibriertest trotz
Treffer auf Anhieb geprüft wurde.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

Zwei Verschiebungen aus der Umsetzung, und warum der Kalibriertest trotz Treffer auf Anhieb geprüft wurde. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ein zweiter Weg zum selben Ergebnis, neben dem Bearbeiten des Stücklisten-
graphen. Der Unterschied ist, wo gearbeitet wird.

Im Graphen kostet jeder Versuch Produkte und Stücklisten: einen Sauerteig mit
35 statt 30 Prozent auszuprobieren legt Datensätze an, die man hinterher
aufräumt, und eine halbfertige Idee ist von einem echten Rezept nicht zu
unterscheiden. Entwickeln ist eine andere Tätigkeit als Pflegen. Ein Bäcker
entwickelt in einer TABELLE: ein flaches Blatt, alle Zutaten aller Stufen,
jeder Prozentwert gegen dasselbe Gesamtmehl -- die Gesamtformel, wie sie auf
Papier steht.

Deshalb ein Assistent als Kladde und der Graph als Ergebnis.

Jeder Prozentwert steht gegen das Gesamtmehl des ganzen Rezepts, nicht gegen
das Mehl seiner Stufe. Genau das hält das Blatt flach -- keine Stufe braucht
eine eigene Basis. Beim Anwenden wird auf die Stufe umgerechnet, und weil die
letzte Stufe den Anteil 100 hat, trägt derselbe Codeweg beide Fälle.

Die Mehlbilanz zählt auch Zeilen mit, die auf eine vorhandene Zubereitung
zeigen: deren Prozentwert ist das Mehl, das über sie hereinkommt. Das ist die
Zeile, die man vergisst, und ohne sie stimmt die 100 nie.

Die Ausbeute einer Stufe ist die Summe dessen, was hineingeht. Ein Blatt sagt
nichts über Gärverlust, und einen zu erfinden hieße, eine Zahl in die Struktur
zu schreiben, die niemand eingegeben hat.

Der Rückweg gehört dazu: eine bestehende Rezeptur lässt sich wieder flach
laden. Das ist nicht Bequemlichkeit, sondern was einen TransientModel
vertretbar macht -- der dauerhafte Speicher bleibt der Graph, das Blatt ist
eine Sicht darauf. Dabei werden nur die Vorstufen des Teigs zu Stufen; was
tiefer liegt, bleibt eine Zeile auf die Zubereitung, die sie ist.

PLAN-wizard.md hält den Entwurf und die ohne Rückfrage getroffenen
Entscheidungen fest.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Eine Bäckerei will keinen vierten "Roggensauerteig (Berliner)", der sich von
den anderen dreien in nichts unterscheidet. Bevor eine Zubereitung angelegt
wird, sucht das Anwenden deshalb nach einer, deren ZUTATENVERHÄLTNISSE
übereinstimmen.

Verhältnis, nicht Menge: eine Stufe aus 30 : 30 : 1 ist dieselbe Zubereitung
wie eine aus 45 : 45 : 1,5, nur anders skaliert. Jeder Kandidat wird auf
Anteile an seiner eigenen Gesamtmasse normiert und bestandteilweise verglichen,
mit einer Toleranz von einem halben Prozent. Die Toleranz ist keine Zierde: die
Anteile entstehen über Prozentwerte und eine gerundete Menge, exakte Gleichheit
würde nie etwas finden -- und sie ist eng genug, dass 30 : 30 : 1 und
30 : 30 : 2 verschiedene Zubereitungen bleiben.

Verglichen wird die fertig gebaute Stufe, nicht eine vorab berechnete. Die
Massen ein zweites Mal aufzulösen hieße, dieselbe Rechnung doppelt zu führen,
und die beiden Kopien würden irgendwann auseinanderlaufen. Der Preis ist ein
Datensatz, der einen Moment lang innerhalb der Transaktion lebt.

Geprüft von beiden Seiten, weil hier ein Fehler niemandem auffiele: ein Treffer
über einen Maßstabswechsel hinweg, und ein Beinahe-Treffer, der NICHT
wiederverwendet werden darf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Zwei Verschiebungen aus der Umsetzung, und warum der Kalibriertest trotz
Treffer auf Anhieb geprüft wurde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Der Assistent ersetzt den Baum-Editor, also fliegt der hier raus: 811 Zeilen
JavaScript, die in diesem Ansatz keinen Aufrufer haben. Gemessen, nicht
vermutet -- nichts unter wizard/ verweist auf irgendetwas unter static/.

Damit wird der Vergleich zwischen den beiden Wegen erst sauber: geteilt ist die
Modellschicht -- Rollen, Prozente, die Rekursion über die Stufen, die Sperre
geteilter Zubereitungen. Das ist die Grundlage, nicht der Ansatz.

Mit raus gehen die Baumansicht samt Reiter, die Hoot-Tests, das Datenverfahren
bakery_recipe_tree und der Assets-Block. Die Übersetzungsdatei ist neu
erzeugt: 68 Terme statt 58, weil die des Assistenten dazukommen und die des
Editors wegfallen.

Dazu der Einstieg, den die Persistenzfrage verlangt: ein Knopf an der Rezeptur
öffnet sie flach. Das Blatt ist Kladde über dem Rezept, kein zweiter Speicher
-- eine unfertige Entwicklung wird schlicht fertig gemacht, und nichts
Dauerhaftes lebt nur im Assistenten.

Dabei ist ein echter Fehler aufgefallen: Das Zurücklesen setzte die Teigzeilen
VOR die Vorstufen, weil die Stückliste sie in dieser Reihenfolge hält. Da die
letzte Stufe per Definition der Teig ist, baute ein erneutes Anwenden die
Struktur auf den Kopf -- der Sauerteig wurde zum Teig und der Teig zu dessen
Vorstufe. Mein Rundwegtest hat es nicht gefangen, weil er eine SORTIERTE Liste
verglich; er prüft jetzt die Reihenfolge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
niels changed target branch from 19.0-recipe_editor to 19.0 2026-09-22 16:42:26 +00:00
odoo force-pushed odoo/19.0-recipe_wizard from 1f2ae7cefe to 4c1f990c5e 2026-09-22 16:48:08 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from 4c1f990c5e to 61e094d5b3 2026-09-22 17:51:02 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from 61e094d5b3 to 7aa984f06a 2026-09-22 17:56:49 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from 7aa984f06a to 78e27e65c1 2026-09-22 18:21:49 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from 78e27e65c1 to 36c85a3b3c 2026-09-22 18:31:36 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from 36c85a3b3c to ad44189070 2026-09-22 18:47:44 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from ad44189070 to de079e5fc5 2026-09-22 19:02:18 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from de079e5fc5 to c5bda1b0da 2026-09-22 19:04:20 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from c5bda1b0da to c28296eeff 2026-09-22 19:40:33 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from c28296eeff to d9e85c12ac 2026-09-22 19:43:56 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from d9e85c12ac to 56f999d574 2026-09-22 19:46:23 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from 56f999d574 to e3915707f3 2026-09-22 20:54:31 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from e3915707f3 to 77e8fab501 2026-09-23 16:53:57 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from 77e8fab501 to f55438e55a 2026-09-23 17:04:29 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from f55438e55a to 25ab463767 2026-09-23 18:08:16 +00:00 Compare
odoo force-pushed odoo/19.0-recipe_wizard from 25ab463767 to cee2ee6533 2026-09-23 19:19:31 +00:00 Compare
Beide sind Zubereitungen, und sie werden verschieden gebraucht: ein
Anstellgut wird geführt und geht als Zutat in eine Stufe ein, eine Vorstufe
wird für ein Rezept angesetzt und ist eine eigene Stufe. Ohne diesen
Unterschied kann das Formelblatt nicht entscheiden, was beim Einlesen zur
Stufe wird und was Zutat bleibt.

Mit der Sauerkeit hat das nichts zu tun: die trägt das Anstellgut, und ein
Sauerteig wird daran erkannt. Ein Hefevorteig ist eine Vorstufe ohne Säure,
ein Weizenanstellgut ein Anstellgut mit.

Die fünf Presets und das Demo-Anstellgut sind entsprechend markiert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin +refs/pull/2/head:odoo/19.0-recipe_wizard
git switch odoo/19.0-recipe_wizard

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch 19.0
git merge --no-ff odoo/19.0-recipe_wizard
git switch odoo/19.0-recipe_wizard
git rebase 19.0
git switch 19.0
git merge --ff-only odoo/19.0-recipe_wizard
git switch odoo/19.0-recipe_wizard
git rebase 19.0
git switch 19.0
git merge --no-ff odoo/19.0-recipe_wizard
git switch 19.0
git merge --squash odoo/19.0-recipe_wizard
git switch 19.0
git merge --ff-only odoo/19.0-recipe_wizard
git switch 19.0
git merge odoo/19.0-recipe_wizard
git push origin 19.0
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
odoo/odooapps!2
No description provided.