Files
accounted/supabase/migrations/20260223150836_invoice_inbox.sql
T
Jakob WennbergandClaude Opus 4.6 b0de46790a fix: align local migrations with deployed Supabase state
Rename migration files (039-052) from sequential to real deployed
timestamps, add 11 missing migration files that were applied directly
to production, apply invoice_delivery_note_sequences migration, and
rename placeholder files for clarity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:16:22 +01:00

99 lines
3.8 KiB
SQL

-- Invoice Inbox: table for incoming documents (supplier invoices, receipts, etc.)
-- Supports AI extraction, supplier matching, transaction matching, and confirm-to-create workflow
CREATE TABLE public.invoice_inbox_items (
id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
user_id uuid NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
status text NOT NULL DEFAULT 'pending'
CHECK (status IN ('pending','processing','ready','confirmed','rejected','error')),
source text NOT NULL DEFAULT 'upload'
CHECK (source IN ('email','upload')),
-- Email metadata
email_from text,
email_subject text,
email_received_at timestamptz,
-- Document link
document_id uuid REFERENCES public.document_attachments(id) ON DELETE SET NULL,
-- AI extraction
extracted_data jsonb,
confidence numeric,
-- Supplier matching
matched_supplier_id uuid REFERENCES public.suppliers(id) ON DELETE SET NULL,
created_supplier_invoice_id uuid REFERENCES public.supplier_invoices(id) ON DELETE SET NULL,
-- Error tracking
error_message text,
-- Timestamps
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now(),
-- Document type classification (supplier_invoice, receipt, government_letter, unknown)
document_type text NOT NULL DEFAULT 'supplier_invoice'
CHECK (document_type IN ('supplier_invoice','receipt','government_letter','unknown')),
-- Receipt linking (when document_type = 'receipt')
linked_receipt_id uuid REFERENCES public.receipts(id) ON DELETE SET NULL,
-- Raw email payload for reprocessing
raw_email_payload jsonb,
-- AI booking template suggestion
suggested_template_id text,
suggested_template_confidence numeric,
-- Transaction matching
matched_transaction_id uuid REFERENCES public.transactions(id) ON DELETE SET NULL,
match_confidence numeric,
match_method text CHECK (match_method IN ('payment_reference','amount_date','amount_merchant','receipt_match'))
);
-- RLS
ALTER TABLE public.invoice_inbox_items ENABLE ROW LEVEL SECURITY;
CREATE POLICY "invoice_inbox_items_select"
ON public.invoice_inbox_items FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "invoice_inbox_items_insert"
ON public.invoice_inbox_items FOR INSERT
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "invoice_inbox_items_update"
ON public.invoice_inbox_items FOR UPDATE
USING (auth.uid() = user_id);
CREATE POLICY "invoice_inbox_items_delete"
ON public.invoice_inbox_items FOR DELETE
USING (auth.uid() = user_id);
-- Indexes
CREATE INDEX idx_invoice_inbox_items_user_id
ON public.invoice_inbox_items(user_id);
CREATE INDEX idx_invoice_inbox_items_user_status
ON public.invoice_inbox_items(user_id, status);
CREATE INDEX idx_invoice_inbox_items_user_created
ON public.invoice_inbox_items(user_id, created_at DESC);
CREATE INDEX idx_inbox_items_document_type
ON public.invoice_inbox_items(user_id, document_type, status);
CREATE INDEX idx_inbox_items_matched_transaction
ON public.invoice_inbox_items(user_id, matched_transaction_id)
WHERE matched_transaction_id IS NOT NULL;
CREATE INDEX idx_inbox_items_unmatched_ready
ON public.invoice_inbox_items(user_id, status)
WHERE matched_transaction_id IS NULL AND status IN ('ready', 'processing');
-- updated_at trigger
CREATE TRIGGER invoice_inbox_items_updated_at
BEFORE UPDATE ON public.invoice_inbox_items
FOR EACH ROW EXECUTE FUNCTION public.update_updated_at_column();