Files
accounted/supabase/migrations/20240101000019_period_closing.sql
T
2026-02-19 09:48:02 +01:00

59 lines
2.8 KiB
PL/PgSQL

-- Migration 19: Fiscal Period Closing Metadata
-- Adds columns for year-end closing workflow and opening balance tracking
-- =============================================================================
-- 1. Add closing_entry_id — tracks which journal entry closed this period
-- =============================================================================
ALTER TABLE public.fiscal_periods
ADD COLUMN IF NOT EXISTS closing_entry_id uuid REFERENCES public.journal_entries(id);
-- =============================================================================
-- 2. Add opening_balance_entry_id — tracks which entry set opening balances
-- =============================================================================
ALTER TABLE public.fiscal_periods
ADD COLUMN IF NOT EXISTS opening_balance_entry_id uuid REFERENCES public.journal_entries(id);
-- =============================================================================
-- 3. Add previous_period_id — chain validation link
-- =============================================================================
ALTER TABLE public.fiscal_periods
ADD COLUMN IF NOT EXISTS previous_period_id uuid REFERENCES public.fiscal_periods(id);
-- =============================================================================
-- 4. Trigger: block modification of opening balance entries
-- Once a fiscal period has opening_balance_entry_id set and the entry is posted,
-- the opening_balance_entry_id cannot be changed.
-- =============================================================================
CREATE OR REPLACE FUNCTION public.enforce_opening_balance_immutability()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
-- Only check if opening_balance_entry_id is being changed
IF OLD.opening_balance_entry_id IS NOT NULL
AND OLD.opening_balances_set = true
AND NEW.opening_balance_entry_id IS DISTINCT FROM OLD.opening_balance_entry_id THEN
RAISE EXCEPTION 'Cannot modify opening_balance_entry_id on period "%" — opening balances are immutable once set',
OLD.name;
END IF;
-- Also block changing closing_entry_id once set
IF OLD.closing_entry_id IS NOT NULL
AND NEW.closing_entry_id IS DISTINCT FROM OLD.closing_entry_id THEN
RAISE EXCEPTION 'Cannot modify closing_entry_id on period "%" — year-end closing is immutable',
OLD.name;
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER enforce_opening_balance_immutability
BEFORE UPDATE ON public.fiscal_periods
FOR EACH ROW EXECUTE FUNCTION public.enforce_opening_balance_immutability();
-- Indexes for the new FK columns
CREATE INDEX IF NOT EXISTS idx_fiscal_periods_closing_entry ON public.fiscal_periods (closing_entry_id);
CREATE INDEX IF NOT EXISTS idx_fiscal_periods_opening_balance_entry ON public.fiscal_periods (opening_balance_entry_id);
CREATE INDEX IF NOT EXISTS idx_fiscal_periods_previous_period ON public.fiscal_periods (previous_period_id);