mirror of
https://github.com/renee-png/acmcc.git
synced 2026-06-21 09:50:01 +00:00
Add ACMCC app source, Supabase backend, and project config
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,221 @@
|
||||
|
||||
-- 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();
|
||||
Reference in New Issue
Block a user