# 🏛️ Arquitetura Completa de Tesouro para GFP/SIGFIP

**Data:** 2025-01-XX  
**Objetivo:** Implementar arquitetura completa de Tesouro similar à arquitetura de Elaboração e Aprovação do Orçamento

---

## 📋 Entendimento do Problema

### Situação Atual

**Módulo Tesouro Atual (Básico):**
- ✅ `PaymentBatch` - Lotes de pagamento simples
- ✅ `PaymentOrder` - Ordens de pagamento básicas
- ✅ `TreasuryPayment` - Confirmações simples
- ✅ Integração básica com RH e Orçamento

**O que está faltando:**
- ❌ Workflow de aprovação/autorização hierárquica
- ❌ Controles de disponibilidade de caixa
- ❌ Gestão de disponibilidades (caixa, bancos)
- ❌ Conciliação bancária
- ❌ Fluxo de autorização por níveis
- ❌ Rastreamento completo do ciclo de vida
- ❌ Controles de fluxo de caixa
- ❌ Gestão de compromissos de pagamento
- ❌ Programação de pagamentos

---

## 🎯 Arquitetura Completa Proposta

### Comparação: Orçamento vs Tesouro

#### **Orçamento (Implementado pelo Antigravity):**

```
BudgetEntry (Entrada Orçamentária)
├── BudgetEntryType (Tipos: INITIAL_ALLOCATION, SUPPLEMENTARY_CREDIT, etc.)
├── BudgetEntryService (Gestão completa de entradas)
├── BudgetEntryController (API REST)
└── Workflow: Elaboração → Aprovação → Execução
```

**Funcionalidades:**
- ✅ Rastreamento de todas as entradas orçamentárias
- ✅ Tipos de entrada (dotação inicial, créditos, anulações, transferências)
- ✅ Histórico completo de alterações
- ✅ Integração com BudgetAllocation

#### **Tesouro (A Implementar - Arquitetura Completa):**

```
TreasuryEntry (Entrada de Tesouraria) - NOVO
├── TreasuryEntryType (Tipos: PAYMENT_AUTHORIZATION, CASH_AVAILABILITY, etc.)
├── TreasuryEntryService (Gestão completa de entradas)
├── TreasuryEntryController (API REST)
└── Workflow: Solicitação → Autorização → Programação → Execução → Conciliação
```

---

## 🏗️ Componentes da Arquitetura Completa

### 1. **TreasuryEntry** (Similar a BudgetEntry)

**Propósito:** Rastrear todas as entradas e movimentações de tesouraria com histórico completo.

**Campos:**
- `id` (UUID)
- `type` (TreasuryEntryType enum)
- `amount` (BigDecimal)
- `transactionDate` (LocalDate)
- `documentReference` (String) - Ex: "Decreto de Autorização", "Portaria de Pagamento"
- `description` (String)
- `status` (String) - DRAFT, PENDING_APPROVAL, APPROVED, REJECTED, EXECUTED
- `approvalLevel` (Integer) - Nível de aprovação necessário
- `approvedBy` (UUID) - Usuário que aprovou
- `approvedAt` (LocalDateTime)
- `cashAccountId` (UUID) - Conta de caixa/banco afetada
- `paymentOrderId` (UUID) - Referência à ordem de pagamento (se aplicável)
- `budgetLineId` (UUID) - Linha orçamentária relacionada

### 2. **TreasuryEntryType** (Enum)

```java
public enum TreasuryEntryType {
    // Autorizações
    PAYMENT_AUTHORIZATION,        // Autorização de Pagamento
    BATCH_AUTHORIZATION,          // Autorização de Lote
    
    // Disponibilidades
    CASH_AVAILABILITY,            // Disponibilidade de Caixa
    BANK_AVAILABILITY,            // Disponibilidade Bancária
    CASH_DEPOSIT,                 // Depósito em Caixa
    CASH_WITHDRAWAL,              // Saque de Caixa
    
    // Programação
    PAYMENT_SCHEDULING,           // Programação de Pagamento
    BATCH_SCHEDULING,             // Programação de Lote
    
    // Execução
    PAYMENT_EXECUTION,            // Execução de Pagamento
    BATCH_EXECUTION,              // Execução de Lote
    
    // Conciliação
    BANK_RECONCILIATION,          // Conciliação Bancária
    CASH_RECONCILIATION,          // Conciliação de Caixa
    
    // Ajustes
    PAYMENT_CANCELLATION,         // Cancelamento de Pagamento
    PAYMENT_ADJUSTMENT,           // Ajuste de Pagamento
    CASH_ADJUSTMENT               // Ajuste de Caixa
}
```

### 3. **CashAccount** (Nova Entidade)

**Propósito:** Gerenciar contas de caixa e bancárias do Tesouro.

**Campos:**
- `id` (UUID)
- `code` (String, único) - Ex: "CAIXA-001", "BANCO-BCEAO-001"
- `name` (String) - Ex: "Caixa Principal", "Conta BCEAO - Tesouro"
- `type` (String) - CASH, BANK_ACCOUNT
- `bankId` (UUID) - Se tipo = BANK_ACCOUNT
- `accountNumber` (String)
- `branchCode` (String)
- `currency` (String) - XOF
- `isActive` (Boolean)
- `currentBalance` (BigDecimal) - Saldo atual
- `availableBalance` (BigDecimal) - Saldo disponível (após compromissos)

### 4. **PaymentAuthorization** (Nova Entidade)

**Propósito:** Workflow de aprovação hierárquica de pagamentos.

**Campos:**
- `id` (UUID)
- `paymentOrderId` (UUID) ou `paymentBatchId` (UUID)
- `requestedBy` (UUID) - Usuário que solicitou
- `requestedAt` (LocalDateTime)
- `requiredApprovalLevel` (Integer) - Nível necessário (1, 2, 3...)
- `currentApprovalLevel` (Integer) - Nível atual
- `status` (String) - PENDING, PARTIALLY_APPROVED, APPROVED, REJECTED
- `approvals` (List<Approval>) - Histórico de aprovações
- `rejectionReason` (String)

### 5. **Approval** (Embeddable/Value Object)

**Campos:**
- `level` (Integer)
- `approvedBy` (UUID)
- `approvedAt` (LocalDateTime)
- `comments` (String)
- `signature` (String) - Hash da assinatura digital (futuro)

### 6. **CashFlow** (Nova Entidade)

**Propósito:** Rastrear fluxo de caixa (entradas e saídas).

**Campos:**
- `id` (UUID)
- `cashAccountId` (UUID)
- `transactionDate` (LocalDate)
- `type` (String) - INFLOW, OUTFLOW
- `amount` (BigDecimal)
- `description` (String)
- `referenceId` (UUID) - ID da entidade relacionada
- `referenceType` (String) - PAYMENT_ORDER, TREASURY_ENTRY, etc.
- `balanceAfter` (BigDecimal) - Saldo após a transação

### 7. **BankReconciliation** (Nova Entidade)

**Propósito:** Conciliação bancária.

**Campos:**
- `id` (UUID)
- `cashAccountId` (UUID)
- `reconciliationDate` (LocalDate)
- `statementBalance` (BigDecimal) - Saldo do extrato bancário
- `systemBalance` (BigDecimal) - Saldo do sistema
- `difference` (BigDecimal) - Diferença
- `status` (String) - PENDING, RECONCILED, DISCREPANCY
- `reconciledBy` (UUID)
- `reconciledAt` (LocalDateTime)
- `reconciliationItems` (List<ReconciliationItem>)

### 8. **ReconciliationItem** (Embeddable/Value Object)

**Campos:**
- `transactionDate` (LocalDate)
- `description` (String)
- `statementAmount` (BigDecimal)
- `systemAmount` (BigDecimal)
- `matchStatus` (String) - MATCHED, UNMATCHED, PENDING

---

## 🔄 Workflow Completo de Tesouraria

### Fluxo 1: Autorização de Pagamento

```
1. Solicitação de Pagamento
   └─> TreasuryEntry (PAYMENT_AUTHORIZATION, status: DRAFT)
   
2. Submissão para Aprovação
   └─> PaymentAuthorization criado
   └─> status: PENDING
   └─> currentApprovalLevel: 1
   
3. Aprovação Nível 1
   └─> Approval registrado
   └─> currentApprovalLevel: 2 (se necessário)
   
4. Aprovação Nível 2 (se necessário)
   └─> Approval registrado
   └─> status: APPROVED
   
5. Autorização Aprovada
   └─> TreasuryEntry atualizado (status: APPROVED)
   └─> PaymentOrder pode ser criado
```

### Fluxo 2: Programação de Pagamento

```
1. Ordem de Pagamento Criada
   └─> PaymentOrder (status: CREATED)
   
2. Verificação de Disponibilidade
   └─> CashAccount.availableBalance verificado
   └─> Se insuficiente: erro
   
3. Programação
   └─> TreasuryEntry (PAYMENT_SCHEDULING)
   └─> CashAccount.availableBalance reduzido (comprometido)
   └─> PaymentOrder (status: SCHEDULED)
   
4. Agendamento
   └─> PaymentOrder.scheduledDate definido
```

### Fluxo 3: Execução de Pagamento

```
1. Execução do Lote
   └─> PaymentBatch (status: SENT_TO_BANK)
   └─> TreasuryEntry (BATCH_EXECUTION)
   
2. Confirmação Individual
   └─> TreasuryPayment (status: PAID)
   └─> TreasuryEntry (PAYMENT_EXECUTION)
   └─> CashAccount.currentBalance reduzido
   └─> CashFlow registrado (OUTFLOW)
   
3. Atualização Orçamentária
   └─> BudgetExecution (PAYMENT) criado
```

### Fluxo 4: Conciliação Bancária

```
1. Importação de Extrato
   └─> BankReconciliation criado
   └─> ReconciliationItems importados
   
2. Conciliação Automática
   └─> Matching de transações
   └─> Identificação de diferenças
   
3. Conciliação Manual
   └─> Ajustes manuais
   └─> TreasuryEntry (BANK_RECONCILIATION)
   
4. Finalização
   └─> BankReconciliation (status: RECONCILED)
   └─> CashAccount.currentBalance atualizado
```

---

## 📊 Serviços a Implementar

### 1. **TreasuryEntryService**

**Responsabilidades:**
- Criar entradas de tesouraria
- Validar disponibilidade de caixa
- Atualizar saldos de contas
- Rastrear histórico completo
- Integrar com orçamento

**Métodos:**
```java
TreasuryEntryDTO create(CreateTreasuryEntryDTO dto)
Page<TreasuryEntryDTO> findByCashAccount(UUID cashAccountId, Pageable pageable)
Page<TreasuryEntryDTO> findByType(TreasuryEntryType type, Pageable pageable)
BigDecimal calculateAvailableBalance(UUID cashAccountId)
void updateCashAccountBalance(UUID cashAccountId, BigDecimal amount, TreasuryEntryType type)
```

### 2. **PaymentAuthorizationService**

**Responsabilidades:**
- Gerenciar workflow de aprovação
- Validar níveis de aprovação
- Registrar aprovações
- Notificar próximos aprovadores

**Métodos:**
```java
PaymentAuthorizationDTO requestAuthorization(UUID paymentOrderId, Integer requiredLevel)
PaymentAuthorizationDTO approve(UUID authorizationId, UUID approverId, String comments)
PaymentAuthorizationDTO reject(UUID authorizationId, UUID approverId, String reason)
List<PaymentAuthorizationDTO> findPendingApprovals(UUID approverId)
```

### 3. **CashAccountService**

**Responsabilidades:**
- Gerenciar contas de caixa/bancárias
- Calcular saldos disponíveis
- Validar operações
- Histórico de movimentações

**Métodos:**
```java
CashAccountDTO create(CreateCashAccountDTO dto)
CashAccountDTO update(UUID id, UpdateCashAccountDTO dto)
CashAccountDTO findById(UUID id)
BigDecimal getAvailableBalance(UUID cashAccountId)
BigDecimal getCurrentBalance(UUID cashAccountId)
void updateBalance(UUID cashAccountId, BigDecimal amount, String operation)
List<CashAccountDTO> findAll()
```

### 4. **CashFlowService**

**Responsabilidades:**
- Registrar fluxo de caixa
- Calcular projeções
- Relatórios de fluxo
- Análise de tendências

**Métodos:**
```java
CashFlowDTO registerFlow(CreateCashFlowDTO dto)
Page<CashFlowDTO> findByCashAccount(UUID cashAccountId, LocalDate startDate, LocalDate endDate, Pageable pageable)
BigDecimal calculateProjectedBalance(UUID cashAccountId, LocalDate targetDate)
Map<String, BigDecimal> getFlowSummary(UUID cashAccountId, LocalDate startDate, LocalDate endDate)
```

### 5. **BankReconciliationService**

**Responsabilidades:**
- Importar extratos bancários
- Conciliação automática
- Identificar diferenças
- Ajustes e correções

**Métodos:**
```java
BankReconciliationDTO importStatement(UUID cashAccountId, List<StatementItem> items)
BankReconciliationDTO reconcile(UUID reconciliationId)
List<ReconciliationItemDTO> findUnmatchedItems(UUID reconciliationId)
void matchItem(UUID reconciliationId, UUID itemId, UUID systemTransactionId)
BankReconciliationDTO finalize(UUID reconciliationId)
```

### 6. **TreasuryIntegrationService** (Similar a BudgetIntegrationService)

**Responsabilidades:**
- Integração com módulo RH
- Integração com módulo Orçamento
- Validações cruzadas
- Sincronização de dados

**Métodos:**
```java
void validatePaymentOrder(UUID paymentOrderId)
void registerPaymentExecution(UUID paymentOrderId, BigDecimal amount)
void updateBudgetExecution(UUID paymentOrderId)
void validateCashAvailability(UUID cashAccountId, BigDecimal amount)
```

---

## 🗄️ Estrutura de Banco de Dados

### Tabelas Novas

```sql
-- Contas de Caixa/Bancárias
CREATE TABLE cash_account (
    id UUID PRIMARY KEY,
    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,
    updated_at TIMESTAMP NOT NULL
);

-- Entradas de Tesouraria (Similar a BudgetEntry)
CREATE TABLE treasury_entry (
    id UUID PRIMARY KEY,
    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, -- DRAFT, PENDING_APPROVAL, APPROVED, REJECTED, EXECUTED
    approval_level INTEGER,
    approved_by UUID,
    approved_at TIMESTAMP,
    cash_account_id UUID REFERENCES cash_account(id),
    payment_order_id UUID,
    payment_batch_id UUID,
    budget_line_id UUID,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL
);

-- Autorizações de Pagamento
CREATE TABLE payment_authorization (
    id UUID PRIMARY KEY,
    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, -- PENDING, PARTIALLY_APPROVED, APPROVED, REJECTED
    rejection_reason TEXT,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL
);

-- Aprovações (Histórico)
CREATE TABLE approval (
    id UUID PRIMARY KEY,
    authorization_id UUID REFERENCES payment_authorization(id) NOT NULL,
    level INTEGER NOT NULL,
    approved_by UUID NOT NULL,
    approved_at TIMESTAMP NOT NULL,
    comments TEXT,
    signature_hash VARCHAR(255)
);

-- Fluxo de Caixa
CREATE TABLE cash_flow (
    id UUID PRIMARY KEY,
    cash_account_id UUID REFERENCES cash_account(id) NOT NULL,
    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
);

-- Conciliação Bancária
CREATE TABLE bank_reconciliation (
    id UUID PRIMARY KEY,
    cash_account_id UUID REFERENCES cash_account(id) NOT NULL,
    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, -- PENDING, RECONCILED, DISCREPANCY
    reconciled_by UUID,
    reconciled_at TIMESTAMP,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL
);

-- Itens de Conciliação
CREATE TABLE reconciliation_item (
    id UUID PRIMARY KEY,
    reconciliation_id UUID REFERENCES bank_reconciliation(id) NOT NULL,
    transaction_date DATE NOT NULL,
    description TEXT,
    statement_amount NUMERIC(19,2),
    system_amount NUMERIC(19,2),
    match_status VARCHAR(20) NOT NULL, -- MATCHED, UNMATCHED, PENDING
    matched_transaction_id UUID,
    created_at TIMESTAMP NOT NULL
);
```

---

## 🔐 Regras de Negócio

### 1. **Validação de Disponibilidade de Caixa**

```java
// Antes de criar ordem de pagamento
BigDecimal available = cashAccountService.getAvailableBalance(cashAccountId);
if (paymentAmount.compareTo(available) > 0) {
    throw new InsufficientCashException("Saldo disponível insuficiente");
}
```

### 2. **Workflow de Aprovação Hierárquica**

```java
// Valores até 100.000 XOF: 1 nível
// Valores 100.001 - 500.000 XOF: 2 níveis
// Valores acima de 500.000 XOF: 3 níveis
Integer requiredLevel = calculateRequiredLevel(paymentAmount);
```

### 3. **Comprometimento de Caixa**

```java
// Ao programar pagamento
cashAccount.availableBalance -= paymentAmount;
// Ao executar pagamento
cashAccount.currentBalance -= paymentAmount;
```

### 4. **Conciliação Obrigatória**

```java
// Mensalmente, todas as contas bancárias devem ser conciliadas
// Sistema deve alertar se não houver conciliação nos últimos 30 dias
```

---

## 📱 Frontend - Páginas a Criar

### 1. **CashAccountsPage** (`/treasury/cash-accounts`)
- Listar contas de caixa/bancárias
- Criar/editar contas
- Visualizar saldos
- Histórico de movimentações

### 2. **TreasuryEntriesPage** (`/treasury/entries`)
- Listar entradas de tesouraria
- Filtrar por tipo, status, conta
- Visualizar histórico completo
- Criar novas entradas

### 3. **PaymentAuthorizationsPage** (`/treasury/authorizations`)
- Listar autorizações pendentes
- Aprovar/rejeitar pagamentos
- Histórico de aprovações
- Filtros por nível, status

### 4. **CashFlowPage** (`/treasury/cash-flow`)
- Visualizar fluxo de caixa
- Projeções futuras
- Gráficos de entradas/saídas
- Análise de tendências

### 5. **BankReconciliationPage** (`/treasury/reconciliation`)
- Importar extratos
- Conciliação automática
- Ajustes manuais
- Relatórios de conciliação

### 6. **TreasuryDashboardPage** (`/treasury/dashboard`)
- Saldos de todas as contas
- Pagamentos pendentes de aprovação
- Conciliações pendentes
- Alertas e notificações

---

## ✅ Checklist de Implementação

### Fase 1: Entidades e Repositories
- [ ] Criar `CashAccount` entity
- [ ] Criar `TreasuryEntry` entity
- [ ] Criar `PaymentAuthorization` entity
- [ ] Criar `Approval` embeddable
- [ ] Criar `CashFlow` entity
- [ ] Criar `BankReconciliation` entity
- [ ] Criar `ReconciliationItem` entity
- [ ] Criar todos os repositories

### Fase 2: Services
- [ ] Implementar `TreasuryEntryService`
- [ ] Implementar `PaymentAuthorizationService`
- [ ] Implementar `CashAccountService`
- [ ] Implementar `CashFlowService`
- [ ] Implementar `BankReconciliationService`
- [ ] Implementar `TreasuryIntegrationService`

### Fase 3: Controllers e DTOs
- [ ] Criar DTOs para todas as entidades
- [ ] Implementar `TreasuryEntryController`
- [ ] Implementar `PaymentAuthorizationController`
- [ ] Implementar `CashAccountController`
- [ ] Implementar `CashFlowController`
- [ ] Implementar `BankReconciliationController`

### Fase 4: Frontend
- [ ] Criar `CashAccountsPage`
- [ ] Criar `TreasuryEntriesPage`
- [ ] Criar `PaymentAuthorizationsPage`
- [ ] Criar `CashFlowPage`
- [ ] Criar `BankReconciliationPage`
- [ ] Criar `TreasuryDashboardPage`
- [ ] Atualizar navegação

### Fase 5: Integração
- [ ] Integrar com módulo RH
- [ ] Integrar com módulo Orçamento
- [ ] Atualizar `PaymentOrderService` para usar nova arquitetura
- [ ] Atualizar `PaymentBatchService` para usar nova arquitetura
- [ ] Testes de integração

---

## 🎯 Resultado Esperado

Após a implementação, o módulo Tesouro terá:

✅ **Arquitetura completa** similar ao módulo Orçamento  
✅ **Workflow de aprovação** hierárquica  
✅ **Controles de caixa** rigorosos  
✅ **Conciliação bancária** automatizada  
✅ **Rastreamento completo** do ciclo de vida  
✅ **Integração robusta** com outros módulos  
✅ **Conformidade** com padrões GFP/SIGFIP  

---

**Documento gerado em:** 2025-01-XX  
**Versão:** 1.0

