diff --git a/supabase/migrations/20260608120000_post_transaction_gl_vendor_relieves_ap.sql b/supabase/migrations/20260608120000_post_transaction_gl_vendor_relieves_ap.sql new file mode 100644 index 0000000..9523c92 --- /dev/null +++ b/supabase/migrations/20260608120000_post_transaction_gl_vendor_relieves_ap.sql @@ -0,0 +1,41 @@ +-- Fix: vendor (money-out) bank transactions were re-debiting the expense account +-- when coded to one, double-counting expense (the bill already recognized it) and +-- never relieving Accounts Payable — so checks showed as P&L debits. Make vendor +-- payments relieve A/P; the coded account is only used for non-vendor/non-customer +-- transactions. +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.vendor_id is not null then accounting.coa_ap(t.company_id) + when t.coa_account_id is not null then t.coa_account_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$; diff --git a/supabase/migrations/20260608121000_post_payment_gl_village_grove_direct_to_bank.sql b/supabase/migrations/20260608121000_post_payment_gl_village_grove_direct_to_bank.sql new file mode 100644 index 0000000..48adac4 --- /dev/null +++ b/supabase/migrations/20260608121000_post_payment_gl_village_grove_direct_to_bank.sql @@ -0,0 +1,31 @@ +-- Village Grove at La Cita: post owner payments directly to the operating +-- checking account (HOLII COGENT Checking XX2814) instead of Undeposited Funds. +-- Scoped to this one company per request; all others keep the Undeposited flow. +-- (Interim hardcoded routing until a per-company "operating/deposit account" +-- setting exists.) +create or replace function accounting.post_payment_gl(_payment_id uuid) + returns void + language plpgsql + security definer + set search_path to 'public', 'accounting' +as $function$ +declare p accounting.payments_received%rowtype; _ar uuid; _dest uuid; _je uuid; +begin + select * into p from accounting.payments_received where id=_payment_id; + if not found then return; end if; + perform accounting._gl_clear(p.company_id, 'acmacc_pay', p.id::text); + if not accounting.gl_managed(p.company_id) then return; end if; + if coalesce(p.amount,0) = 0 then return; end if; + if p.company_id = '3216c404-496f-4d98-b6fe-36d0f9b1278a' then + _dest := 'db656b9e-f27a-4c0f-be2a-dc1fa793be49'; -- HOLII COGENT Checking -- XX2814 + else + _dest := accounting.coa_undeposited(p.company_id); + end if; + _ar := accounting.coa_ar(p.company_id); + insert into accounting.journal_entries (company_id, date, description, reference, external_source, external_id) + values (p.company_id, p.payment_date, coalesce(nullif(p.memo,''), 'Payment received'), p.reference, 'acmacc_pay', p.id::text) + returning id into _je; + insert into accounting.journal_entry_lines (journal_entry_id, account_id, debit, credit, description) values + (_je, _dest, p.amount, 0, 'Payment received'), + (_je, _ar, 0, p.amount, 'Payment received'); +end$function$;