* fix(whatsapp): app-side unmute, close silent intake paths, health visibility - add POST /link/unmute and a Reactivate control on the Pausad state - company resolution: transient query errors release the row for sweep retry; genuine zero-options sends M19 instead of parking silently - media from unlinked senders bypasses the hourly greeting throttle (10 min burst window, daily cap kept) - GET /link returns 7-day failed-delivery and parked-inbound counts; sweep summary logs outboundFailed24h Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(documents): real HEIC/HEIF magic-byte validation, bilingual upload errors - detect ISO-BMFF ftyp brands (heic/heix/heim/heis/hevc/hevx/hevm/hevs, mif1/msf1) instead of exempting image/heic from validation; declared heic/heif accepts either family member (iOS labels vary) - new INBOX_UPLOAD_* structured error codes replace raw English strings on the inbox upload and attach-document routes - registry doc corrected to the real 10 MB cap Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(inbox): staged upload with instant ack and deferred AI extraction - web uploads insert the inbox item as status processing and respond immediately; Bedrock extraction and supplier match run via after() with a CAS flip to received (email and WhatsApp channels keep the synchronous path) - widen invoice_inbox_items.status CHECK to include processing (migration 20260813180000, pg-real test included) - crash-recovery sweep cron (*/2) flips stale processing rows; bulk-book skips extraction_in_progress items - workspace: processing chip, in-flight rows disable actions, realtime flip, retry-extraction button for empty extractions - picker accept list drops HEIC/HEIF so iOS transcodes library photos to JPEG; server allowlists unchanged (supersedes 2026-08-01 HEIC decision, see DECISIONS.md) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(migrations): bump inbox processing-status migration past main's latest Main merged 20260813210000 while this PR was in flight; an inserted version older than the latest applied aborts the prod db push at merge. Renamed 20260813180000 to 20260813213000 and updated references. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(decisions): log preview-tracker orphan repair after migration rename Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
26 lines
1.2 KiB
SQL
26 lines
1.2 KiB
SQL
-- Re-admit 'processing' to the invoice_inbox_items.status CHECK.
|
|
--
|
|
-- Staged upload needs an in-flight state: the web upload route now inserts
|
|
-- the inbox row BEFORE AI extraction runs (status 'processing',
|
|
-- extracted_data NULL), answers the request immediately, and a deferred
|
|
-- worker flips the row to 'received' once extraction lands (or the sweep
|
|
-- cron does, after a crashed worker).
|
|
--
|
|
-- Supersedes the 20260504180000 tightening that removed 'processing': that
|
|
-- removal assumed extraction always completes synchronously before the row
|
|
-- exists, which stops being true with the staged upload. Email and WhatsApp
|
|
-- ingestion keep the synchronous path and never write 'processing'.
|
|
ALTER TABLE public.invoice_inbox_items
|
|
DROP CONSTRAINT IF EXISTS invoice_inbox_items_status_check;
|
|
|
|
ALTER TABLE public.invoice_inbox_items
|
|
ADD CONSTRAINT invoice_inbox_items_status_check
|
|
CHECK (status IN ('received', 'processing', 'error'));
|
|
|
|
-- Unchanged, restated so the default survives the constraint swap verbatim:
|
|
-- rows still land as 'received' unless the writer says otherwise.
|
|
ALTER TABLE public.invoice_inbox_items
|
|
ALTER COLUMN status SET DEFAULT 'received';
|
|
|
|
NOTIFY pgrst, 'reload schema';
|