Files
accounted/supabase/migrations/20240101000039_invoice_inbox.sql
T
Jakob WennbergandClaude Opus 4.6 0c422fcd25 chore: clean up migration files and update CLAUDE.md documentation
- Consolidate migration numbering (move full_bas_2026 to slot 044)
- Remove dead/superseded migrations (document_matching, reversal columns)
- Update CLAUDE.md with placeholder migration notes and corrected descriptions
- Fix migration SQL for invoice_inbox, extension_data, supplier_invoices

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 20:53:57 +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();