feat: otimização de performance e ajustes finais

This commit is contained in:
Idrissa Banora
2026-05-18 10:49:32 +00:00
commit 52a7c4f9cf
579 changed files with 156489 additions and 0 deletions
@@ -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';