feat: otimização de performance e ajustes finais
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
-- =====================================================
|
||||
-- ARQUITETURA COMPLETA DE TESOURO - NOVAS TABELAS
|
||||
-- Similar à arquitetura de Elaboração e Aprovação do Orçamento
|
||||
-- =====================================================
|
||||
|
||||
-- Contas de Caixa/Bancárias
|
||||
CREATE TABLE IF NOT EXISTS public.cash_account (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
code VARCHAR(50) UNIQUE NOT NULL,
|
||||
name VARCHAR(200) NOT NULL,
|
||||
type VARCHAR(20) NOT NULL, -- CASH, BANK_ACCOUNT
|
||||
bank_id UUID,
|
||||
account_number VARCHAR(50),
|
||||
branch_code VARCHAR(20),
|
||||
currency VARCHAR(3) DEFAULT 'XOF',
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
current_balance NUMERIC(19,2) DEFAULT 0,
|
||||
available_balance NUMERIC(19,2) DEFAULT 0,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
version BIGINT DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE INDEX idx_cash_account_code ON public.cash_account(code);
|
||||
CREATE INDEX idx_cash_account_type ON public.cash_account(type);
|
||||
CREATE INDEX idx_cash_account_active ON public.cash_account(is_active);
|
||||
|
||||
-- Entradas de Tesouraria (Similar a budget_entry)
|
||||
CREATE TABLE IF NOT EXISTS public.treasury_entry (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
cash_account_id UUID NOT NULL REFERENCES public.cash_account(id),
|
||||
type VARCHAR(50) NOT NULL,
|
||||
amount NUMERIC(19,2) NOT NULL,
|
||||
transaction_date DATE NOT NULL,
|
||||
document_reference VARCHAR(100),
|
||||
description TEXT,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'DRAFT', -- DRAFT, PENDING_APPROVAL, APPROVED, REJECTED, EXECUTED
|
||||
approval_level INTEGER,
|
||||
approved_by UUID,
|
||||
approved_at TIMESTAMP,
|
||||
payment_order_id UUID,
|
||||
payment_batch_id UUID,
|
||||
budget_line_id UUID,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
version BIGINT DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE INDEX idx_treasury_entry_cash_account ON public.treasury_entry(cash_account_id);
|
||||
CREATE INDEX idx_treasury_entry_type ON public.treasury_entry(type);
|
||||
CREATE INDEX idx_treasury_entry_status ON public.treasury_entry(status);
|
||||
CREATE INDEX idx_treasury_entry_date ON public.treasury_entry(transaction_date);
|
||||
CREATE INDEX idx_treasury_entry_payment_order ON public.treasury_entry(payment_order_id);
|
||||
|
||||
-- Autorizações de Pagamento
|
||||
CREATE TABLE IF NOT EXISTS public.payment_authorization (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
payment_order_id UUID,
|
||||
payment_batch_id UUID,
|
||||
requested_by UUID NOT NULL,
|
||||
requested_at TIMESTAMP NOT NULL,
|
||||
required_approval_level INTEGER NOT NULL,
|
||||
current_approval_level INTEGER DEFAULT 1,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING', -- PENDING, PARTIALLY_APPROVED, APPROVED, REJECTED
|
||||
rejection_reason TEXT,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
version BIGINT DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE INDEX idx_auth_payment_order ON public.payment_authorization(payment_order_id);
|
||||
CREATE INDEX idx_auth_payment_batch ON public.payment_authorization(payment_batch_id);
|
||||
CREATE INDEX idx_auth_status ON public.payment_authorization(status);
|
||||
CREATE INDEX idx_auth_requested_by ON public.payment_authorization(requested_by);
|
||||
|
||||
-- Aprovações (Histórico)
|
||||
CREATE TABLE IF NOT EXISTS public.approval (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
authorization_id UUID NOT NULL REFERENCES public.payment_authorization(id),
|
||||
level INTEGER NOT NULL,
|
||||
approved_by UUID NOT NULL,
|
||||
approved_at TIMESTAMP NOT NULL,
|
||||
comments TEXT,
|
||||
signature_hash VARCHAR(255)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_approval_authorization ON public.approval(authorization_id);
|
||||
CREATE INDEX idx_approval_approver ON public.approval(approved_by);
|
||||
CREATE INDEX idx_approval_level ON public.approval(level);
|
||||
|
||||
-- Fluxo de Caixa
|
||||
CREATE TABLE IF NOT EXISTS public.cash_flow (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
cash_account_id UUID NOT NULL REFERENCES public.cash_account(id),
|
||||
transaction_date DATE NOT NULL,
|
||||
type VARCHAR(20) NOT NULL, -- INFLOW, OUTFLOW
|
||||
amount NUMERIC(19,2) NOT NULL,
|
||||
description TEXT,
|
||||
reference_id UUID,
|
||||
reference_type VARCHAR(50),
|
||||
balance_after NUMERIC(19,2) NOT NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
version BIGINT DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE INDEX idx_cash_flow_account ON public.cash_flow(cash_account_id);
|
||||
CREATE INDEX idx_cash_flow_date ON public.cash_flow(transaction_date);
|
||||
CREATE INDEX idx_cash_flow_type ON public.cash_flow(type);
|
||||
CREATE INDEX idx_cash_flow_reference ON public.cash_flow(reference_type, reference_id);
|
||||
|
||||
-- Conciliação Bancária
|
||||
CREATE TABLE IF NOT EXISTS public.bank_reconciliation (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
cash_account_id UUID NOT NULL REFERENCES public.cash_account(id),
|
||||
reconciliation_date DATE NOT NULL,
|
||||
statement_balance NUMERIC(19,2) NOT NULL,
|
||||
system_balance NUMERIC(19,2) NOT NULL,
|
||||
difference NUMERIC(19,2),
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING', -- PENDING, RECONCILED, DISCREPANCY
|
||||
reconciled_by UUID,
|
||||
reconciled_at TIMESTAMP,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
version BIGINT DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE INDEX idx_reconciliation_cash_account ON public.bank_reconciliation(cash_account_id);
|
||||
CREATE INDEX idx_reconciliation_date ON public.bank_reconciliation(reconciliation_date);
|
||||
CREATE INDEX idx_reconciliation_status ON public.bank_reconciliation(status);
|
||||
|
||||
-- Itens de Conciliação
|
||||
CREATE TABLE IF NOT EXISTS public.reconciliation_item (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
reconciliation_id UUID NOT NULL REFERENCES public.bank_reconciliation(id),
|
||||
transaction_date DATE NOT NULL,
|
||||
description TEXT,
|
||||
statement_amount NUMERIC(19,2),
|
||||
system_amount NUMERIC(19,2),
|
||||
match_status VARCHAR(20) NOT NULL DEFAULT 'PENDING', -- MATCHED, UNMATCHED, PENDING
|
||||
matched_transaction_id UUID,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE INDEX idx_reconciliation_item_reconciliation ON public.reconciliation_item(reconciliation_id);
|
||||
CREATE INDEX idx_reconciliation_item_status ON public.reconciliation_item(match_status);
|
||||
CREATE INDEX idx_reconciliation_item_date ON public.reconciliation_item(transaction_date);
|
||||
|
||||
-- Comentários
|
||||
COMMENT ON TABLE public.cash_account IS 'Contas de caixa e bancárias do Tesouro';
|
||||
COMMENT ON TABLE public.treasury_entry IS 'Entradas de tesouraria - rastreamento completo do ciclo de vida';
|
||||
COMMENT ON TABLE public.payment_authorization IS 'Workflow de aprovação hierárquica de pagamentos';
|
||||
COMMENT ON TABLE public.approval IS 'Histórico de aprovações individuais';
|
||||
COMMENT ON TABLE public.cash_flow IS 'Fluxo de caixa - entradas e saídas';
|
||||
COMMENT ON TABLE public.bank_reconciliation IS 'Conciliação bancária';
|
||||
COMMENT ON TABLE public.reconciliation_item IS 'Itens de conciliação bancária';
|
||||
|
||||
Reference in New Issue
Block a user