diff --git a/supabase/migrations/20260608130000_revert_post_transaction_gl_vendor_relieves_ap.sql b/supabase/migrations/20260608130000_revert_post_transaction_gl_vendor_relieves_ap.sql new file mode 100644 index 0000000..1837609 --- /dev/null +++ b/supabase/migrations/20260608130000_revert_post_transaction_gl_vendor_relieves_ap.sql @@ -0,0 +1,40 @@ +-- Revert 20260608120000: the blanket "vendor -> A/P" rule stripped expense from +-- legitimate direct-expense checks (no bill), collapsing the P&L. Restore the +-- original precedence (coded account before vendor). The bill/check double-count +-- needs a surgical, bill-linkage fix instead — handled separately. +create or replace function accounting.post_transaction_gl(_txn_id uuid) + returns void + language plpgsql + security definer + set search_path to 'public', 'accounting' +as $function$ +declare t accounting.transactions%rowtype; _counter uuid; _je uuid; _amt numeric; +begin + select * into t from accounting.transactions where id=_txn_id; + if not found then return; end if; + perform accounting._gl_clear(t.company_id, 'acmacc_txn', t.id::text); + if not accounting.gl_managed(t.company_id) then return; end if; + if t.transfer_id is not null or t.deposit_id is not null then return; end if; + if t.account_id is null then return; end if; + _amt := coalesce(t.amount,0); + if _amt = 0 then return; end if; + _counter := case + when t.customer_id is not null then accounting.coa_ar(t.company_id) + when t.coa_account_id is not null then t.coa_account_id + when t.vendor_id is not null then accounting.coa_ap(t.company_id) + else null end; + if _counter is null then return; end if; + + insert into accounting.journal_entries (company_id, date, description, reference, external_source, external_id) + values (t.company_id, t.date, coalesce(nullif(t.description,''), 'Bank transaction'), t.reference, 'acmacc_txn', t.id::text) + returning id into _je; + if t.type = 'credit' then + insert into accounting.journal_entry_lines (journal_entry_id, account_id, debit, credit, description) values + (_je, t.account_id, _amt, 0, t.description), + (_je, _counter, 0, _amt, t.description); + else + insert into accounting.journal_entry_lines (journal_entry_id, account_id, debit, credit, description) values + (_je, _counter, _amt, 0, t.description), + (_je, t.account_id, 0, _amt, t.description); + end if; +end$function$;