Files
acmcc/supabase/migrations/20260315232014_67b8581c-0728-4ada-9003-3dd439434031.sql
T
2026-06-01 20:19:26 -04:00

222 lines
9.8 KiB
SQL

-- Add columns to chart_of_accounts
ALTER TABLE chart_of_accounts ADD COLUMN IF NOT EXISTS parent_account_id uuid REFERENCES chart_of_accounts(id);
ALTER TABLE chart_of_accounts ADD COLUMN IF NOT EXISTS is_active boolean NOT NULL DEFAULT true;
ALTER TABLE chart_of_accounts ADD COLUMN IF NOT EXISTS description text;
-- Add account_category to bank_accounts
ALTER TABLE bank_accounts ADD COLUMN IF NOT EXISTS account_category text NOT NULL DEFAULT 'operating';
-- Create vendors table
CREATE TABLE IF NOT EXISTS vendors (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
association_id uuid NOT NULL REFERENCES associations(id) ON DELETE CASCADE,
name text NOT NULL,
contact_name text,
email text,
phone text,
address text,
tax_id text,
payment_terms text DEFAULT '30',
default_expense_account_id uuid REFERENCES chart_of_accounts(id),
is_active boolean NOT NULL DEFAULT true,
notes text,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
-- Create bank_transactions table (unified register)
CREATE TABLE IF NOT EXISTS bank_transactions (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
bank_account_id uuid NOT NULL REFERENCES bank_accounts(id) ON DELETE CASCADE,
association_id uuid NOT NULL REFERENCES associations(id) ON DELETE CASCADE,
date date NOT NULL DEFAULT CURRENT_DATE,
transaction_type text NOT NULL DEFAULT 'payment',
description text,
reference_number text,
debit numeric NOT NULL DEFAULT 0,
credit numeric NOT NULL DEFAULT 0,
is_cleared boolean NOT NULL DEFAULT false,
cleared_date date,
reconciliation_id uuid,
related_entity_type text,
related_entity_id uuid,
created_by uuid,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
-- Create owner_ledger_entries
CREATE TABLE IF NOT EXISTS owner_ledger_entries (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
association_id uuid NOT NULL REFERENCES associations(id) ON DELETE CASCADE,
owner_id uuid NOT NULL REFERENCES owners(id) ON DELETE CASCADE,
unit_id uuid REFERENCES units(id),
date date NOT NULL DEFAULT CURRENT_DATE,
transaction_type text NOT NULL,
description text,
debit numeric NOT NULL DEFAULT 0,
credit numeric NOT NULL DEFAULT 0,
reference_id uuid,
reference_type text,
created_by uuid,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
-- Create bills table (proper AP)
CREATE TABLE IF NOT EXISTS bills (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
association_id uuid NOT NULL REFERENCES associations(id) ON DELETE CASCADE,
vendor_id uuid REFERENCES vendors(id),
invoice_number text,
bill_date date NOT NULL DEFAULT CURRENT_DATE,
due_date date,
amount numeric NOT NULL DEFAULT 0,
amount_paid numeric NOT NULL DEFAULT 0,
expense_account_id uuid REFERENCES chart_of_accounts(id),
description text,
status text NOT NULL DEFAULT 'draft',
approved_by uuid,
approved_date date,
paid_date date,
payment_method text,
check_id uuid REFERENCES checks(id),
attachment_url text,
notes text,
created_by uuid,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
-- Create deposit_batches
CREATE TABLE IF NOT EXISTS deposit_batches (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
association_id uuid NOT NULL REFERENCES associations(id) ON DELETE CASCADE,
bank_account_id uuid NOT NULL REFERENCES bank_accounts(id),
deposit_date date NOT NULL DEFAULT CURRENT_DATE,
total_amount numeric NOT NULL DEFAULT 0,
status text NOT NULL DEFAULT 'open',
memo text,
bank_transaction_id uuid,
created_by uuid,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
-- Create deposit_batch_items
CREATE TABLE IF NOT EXISTS deposit_batch_items (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
deposit_batch_id uuid NOT NULL REFERENCES deposit_batches(id) ON DELETE CASCADE,
owner_ledger_entry_id uuid REFERENCES owner_ledger_entries(id),
description text,
amount numeric NOT NULL DEFAULT 0,
created_at timestamptz NOT NULL DEFAULT now()
);
-- Create bank_transfers
CREATE TABLE IF NOT EXISTS bank_transfers (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
association_id uuid NOT NULL REFERENCES associations(id) ON DELETE CASCADE,
from_bank_account_id uuid NOT NULL REFERENCES bank_accounts(id),
to_bank_account_id uuid NOT NULL REFERENCES bank_accounts(id),
amount numeric NOT NULL,
transfer_date date NOT NULL DEFAULT CURRENT_DATE,
description text,
from_transaction_id uuid,
to_transaction_id uuid,
created_by uuid,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
-- Create bank_reconciliations
CREATE TABLE IF NOT EXISTS bank_reconciliations (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
bank_account_id uuid NOT NULL REFERENCES bank_accounts(id),
association_id uuid NOT NULL REFERENCES associations(id) ON DELETE CASCADE,
statement_date date NOT NULL,
opening_balance numeric NOT NULL DEFAULT 0,
closing_balance numeric NOT NULL DEFAULT 0,
cleared_balance numeric NOT NULL DEFAULT 0,
difference numeric NOT NULL DEFAULT 0,
status text NOT NULL DEFAULT 'in_progress',
reconciled_by uuid,
reconciled_at timestamptz,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
-- Add FK for bank_transactions reconciliation_id
ALTER TABLE bank_transactions
ADD CONSTRAINT bank_transactions_reconciliation_id_fkey
FOREIGN KEY (reconciliation_id) REFERENCES bank_reconciliations(id);
-- Add FK for bank_transfers transaction ids
ALTER TABLE bank_transfers
ADD CONSTRAINT bank_transfers_from_transaction_id_fkey
FOREIGN KEY (from_transaction_id) REFERENCES bank_transactions(id);
ALTER TABLE bank_transfers
ADD CONSTRAINT bank_transfers_to_transaction_id_fkey
FOREIGN KEY (to_transaction_id) REFERENCES bank_transactions(id);
-- Add FK for deposit_batches bank_transaction_id
ALTER TABLE deposit_batches
ADD CONSTRAINT deposit_batches_bank_transaction_id_fkey
FOREIGN KEY (bank_transaction_id) REFERENCES bank_transactions(id);
-- RLS for all new tables
ALTER TABLE vendors ENABLE ROW LEVEL SECURITY;
ALTER TABLE bank_transactions ENABLE ROW LEVEL SECURITY;
ALTER TABLE owner_ledger_entries ENABLE ROW LEVEL SECURITY;
ALTER TABLE bills ENABLE ROW LEVEL SECURITY;
ALTER TABLE deposit_batches ENABLE ROW LEVEL SECURITY;
ALTER TABLE deposit_batch_items ENABLE ROW LEVEL SECURITY;
ALTER TABLE bank_transfers ENABLE ROW LEVEL SECURITY;
ALTER TABLE bank_reconciliations ENABLE ROW LEVEL SECURITY;
-- Staff access policies
CREATE POLICY "Staff full access on vendors" ON vendors FOR ALL TO authenticated
USING (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'))
WITH CHECK (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'));
CREATE POLICY "Staff full access on bank_transactions" ON bank_transactions FOR ALL TO authenticated
USING (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'))
WITH CHECK (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'));
CREATE POLICY "Staff full access on owner_ledger_entries" ON owner_ledger_entries FOR ALL TO authenticated
USING (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'))
WITH CHECK (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'));
CREATE POLICY "Owners can view own ledger" ON owner_ledger_entries FOR SELECT TO authenticated
USING (EXISTS (SELECT 1 FROM owners WHERE owners.id = owner_ledger_entries.owner_id AND owners.user_id = auth.uid()));
CREATE POLICY "Staff full access on bills" ON bills FOR ALL TO authenticated
USING (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'))
WITH CHECK (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'));
CREATE POLICY "Staff full access on deposit_batches" ON deposit_batches FOR ALL TO authenticated
USING (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'))
WITH CHECK (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'));
CREATE POLICY "Staff full access on deposit_batch_items" ON deposit_batch_items FOR ALL TO authenticated
USING (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'))
WITH CHECK (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'));
CREATE POLICY "Staff full access on bank_transfers" ON bank_transfers FOR ALL TO authenticated
USING (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'))
WITH CHECK (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'));
CREATE POLICY "Staff full access on bank_reconciliations" ON bank_reconciliations FOR ALL TO authenticated
USING (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'))
WITH CHECK (has_role(auth.uid(), 'admin') OR has_role(auth.uid(), 'manager'));
-- Updated_at triggers for new tables
CREATE TRIGGER update_vendors_updated_at BEFORE UPDATE ON vendors FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_bank_transactions_updated_at BEFORE UPDATE ON bank_transactions FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_owner_ledger_entries_updated_at BEFORE UPDATE ON owner_ledger_entries FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_bills_updated_at BEFORE UPDATE ON bills FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_deposit_batches_updated_at BEFORE UPDATE ON deposit_batches FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_bank_transfers_updated_at BEFORE UPDATE ON bank_transfers FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_bank_reconciliations_updated_at BEFORE UPDATE ON bank_reconciliations FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();