Overlay 3 said what not to install and gave no shape for what to build instead, so
the staging script was being written from scratch each time against models nobody
had the field list for.
reference/buildease_demo_data.md carries the QTO -> sale order -> project ->
progress statement -> invoice graph: required fields per model, creation order,
which transitions are button methods rather than writes, and the seven guards that
stop the chain mid-build (missing product blocks conversion; the SO will not confirm
while the QTO is in QTO state; no statement until the QTO is Confirmed; statement
periods may not overlap; a QTO-linked order cannot be copied at all).
All of it read from callista-tools/mev @ 43c2e19 and Odoo 19 core, nothing inferred.
The config block is labelled illustrative because build_demo.py cannot execute it —
it is a per-engagement template that silently ignores keys it does not implement,
which is now an error upstream in callista-odoo-demo.
Two purge corrections fall out of the source, both loosening rules that were stricter
than reality:
- Deleting the take-off already deletes its sale order; unlink() cascades.
- A take-off with no sale order cancels and deletes normally. cancel() writes the
state directly and no-ops on the empty order, since Odoo 19's action_cancel has no
ensure_one(). The convert-to-quotation-first workaround was unnecessary.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>