v2.19.0
v2.19.0 — the three rescued items, the two orphans, orders that survive the tab
Six sprints, two additive migrations, every one PO-smoked before merge.
Six sprints, two additive migrations, every one PO-smoked before merge.
Shipped
BREAKDOWN-FIX-01 (#212): a case breakdown that adds nothing now says nothing — 1 Pcs (1 PCS) is gone from all four surfaces. Mixed and whole-case outputs unchanged. LEDGER-TYPE-01 (#211): a removal is not a return. New movement type CHANNEL_INBOUND for marketplace removals; RETURN and TRANSFER keep their meaning; existing removal rows backfilled per company. The enum value is permanent in PostgreSQL — documented in the migration itself. SO-DRAFT-GUARD-01 (#161) + HF1: the sales-order line search stops offering what cannot sell — DRAFT products visible but not selectable, DISCONTINUED selectable with a sell-down notice showing the real remaining ATP. HF1 fixed a chip that was rendered but clipped. HF-SWEEP-02 (#160): a successful Test Connection now unlatches AUTH_DEAD (resets webhook verification to NEVER; Connect remains the only writer of OK). PDA inbound receive uses the shared scan matcher — FNSKU aliases select the PO line, prefixes are refused. SO-DRAFT-AUTOSAVE-01 (#162) + HF1/HF2: sales-order drafts survive a closed tab. Server-side autosave per user and form; on return, a Restore/Discard banner — never silent either way; the draft is deleted on create. The Sales Orders list shows an amber AUTOSAVED DRAFT row with Resume/Discard — never a real order, never a consumed number. Committed lines keep their catalog status across autosave and restore.
Migrations (additive)
20260902180000_ledger_type_01_channel_inbound — enum value added 20260902180100_ledger_type_01_channel_inbound_backfill — company-scoped UPDATE 20260903140000_so_draft_autosave_01_form_drafts — new table form_drafts
Ritual: backup drill 2026-09-03 PASS (1.5M; 4 / 296 / 148 / 680 / 21) · Railway green first, Vercel confirmed · production smokes 3/3 (channel inbound ledger row, autosave row, PDA alias scan).