Files

814 lines
27 KiB
Markdown
Raw Permalink Normal View History

# 🔍 Análise Profunda: Módulo RH & Folha de Pagamento
## Sistema de Gestão de Função Pública (SIGEFP)
**Data:** 2025-01-27
**Objetivo:** Verificar conformidade, coerência lógica e adequação para sistema governamental de gestão de função pública
---
## 📋 Índice
1. [Resumo Executivo](#1-resumo-executivo)
2. [Análise de Conformidade](#2-análise-de-conformidade)
3. [Análise de Arquitetura e Estrutura](#3-análise-de-arquitetura-e-estrutura)
4. [Análise de Lógica de Negócio](#4-análise-de-lógica-de-negócio)
5. [Análise de Integrações](#5-análise-de-integrações)
6. [Análise de Validações e Regras](#6-análise-de-validações-e-regras)
7. [Problemas Identificados](#7-problemas-identificados)
8. [Recomendações e Melhorias](#8-recomendações-e-melhorias)
9. [Checklist de Conformidade](#9-checklist-de-conformidade)
---
## 1. Resumo Executivo
### 1.1 Visão Geral
O módulo RH & Folha de Pagamento do SIGEFP é responsável por:
- Gestão de agentes/funcionários públicos
- Gestão de carreiras e estruturas salariais
- Processamento de folha de pagamento
- Integração com Orçamento e Tesouro
- Gestão de ausências e avaliações de desempenho
### 1.2 Status Geral
| Aspecto | Status | Nota | Observações |
|---------|--------|------|-------------|
| **Arquitetura** | ✅ Boa | 8/10 | Entidades bem definidas, relacionamentos corretos |
| **Lógica de Negócio** | ⚠️ Parcial | 7/10 | Cálculo de folha robusto, mas com algumas imprecisões |
| **Conformidade Legal** | ⚠️ Parcial | 6/10 | Validação de promoções existe, mas falta tempo mínimo |
| **Integrações** | ⚠️ Parcial | 7/10 | RH→Orçamento OK, RH→Tesouro falta chamada automática |
| **Validações** | ⚠️ Parcial | 6/10 | Validações básicas OK, falta validações de conformidade |
| **Rastreabilidade** | ✅ Boa | 8/10 | Histórico completo de mudanças e eventos |
**Nota Geral:** 7.0/10
### 1.3 Principais Descobertas
#### ✅ Pontos Fortes
1. **Validação de Promoções Implementada:** Método `validatePromotion()` existe e valida avaliações conforme Decreto 12-A/94
2. **Integração com Orçamento Funcionando:** COMMITMENT e LIQUIDATION criados automaticamente
3. **Cálculo de Folha Robusto:** Suporta proventos, descontos, impostos progressivos
4. **Rastreabilidade Completa:** Histórico de mudanças e eventos de carreira
#### ⚠️ Pontos de Atenção
1. **Integração RH → Tesouro:** Método `generateOrdersFromPayrollRun()` existe, mas não é chamado automaticamente
2. **Cálculo de Faltas:** Assume 30 dias fixos (impreciso em alguns meses)
3. **Abono de Família:** Valor hardcoded (1000 XOF) não configurável
4. **Validação de Promoções:** Falta validação de tempo mínimo no escalão
---
## 2. Análise de Conformidade
### 2.1 Conformidade com Padrões de Gestão Pública
#### ✅ Pontos Positivos
1. **Estrutura de Carreira Hierárquica**
- ✅ Regimes de Carreira (CareerRegime)
- ✅ Categorias Salariais (SalaryCategory)
- ✅ Escalões (SalaryGrade)
- ✅ Níveis (SalaryStep)
- ✅ Tabela Salarial com Vigência (SalaryGrid)
2. **Tipos de Nomeação**
- ✅ PROVISORIA, DEFINITIVA, CONTRATO_PROVIMENTO, CONTRATO_TERMO
- ✅ Mapeamento correto entre tipos de contrato e nomeação
3. **Situação Funcional**
- ✅ ATIVIDADE_NO_QUADRO, ATIVIDADE_FORA_DO_QUADRO
- ✅ Histórico de mudanças de status (AgentStatusHistory)
4. **Rastreabilidade de Atos Administrativos**
- ✅ Referência a atos legais (legalActReference)
- ✅ Histórico de eventos de carreira (CareerEvent)
#### ⚠️ Pontos de Atenção
1. **Falta de Validação de Conformidade Legal**
- ❌ Não há validação explícita de conformidade com Decreto 12-A/94
- ❌ Não há validação de requisitos para promoções
- ❌ Não há validação de tempo mínimo em escalão para progressão
2. **Falta de Regras de Estatuto**
- ❌ Não há validação de tempo de serviço para progressão
- ❌ Não há validação de avaliação de desempenho para promoção
- ❌ Não há validação de requisitos de habilitação literária
3. **Falta de Controle de Conformidade Orçamentária**
- ⚠️ Validação de linha orçamentária existe, mas não valida se está correta
- ⚠️ Não valida se o agente pertence à unidade orgânica da linha orçamentária
---
### 2.2 Conformidade com Normas Contábeis
#### ✅ Pontos Positivos
1. **Classificação Econômica**
- ✅ Códigos econômicos para proventos (311100, 311102, 312101)
- ✅ Códigos econômicos para descontos (312100)
- ✅ Integração com linhas orçamentárias por código econômico
2. **Rastreabilidade Orçamentária**
- ✅ Cada PayrollItem tem referência a BudgetLine
- ✅ Integração automática com módulo Orçamento
#### ⚠️ Pontos de Atenção
1. **Falta de Validação de Classificação**
- ❌ Não valida se código econômico está correto para o tipo de provento/desconto
- ❌ Não valida se código econômico existe na estrutura orçamentária
---
## 3. Análise de Arquitetura e Estrutura
### 3.1 Entidades Principais
#### ✅ Agent (Agente/Funcionário)
**Pontos Positivos:**
- ✅ Campos essenciais: matricula, nif, biNumber (únicos)
- ✅ Datas importantes: birthDate, hireDate, posseDate, terminationDate
- ✅ Relacionamentos: contracts, bankAccounts, deductionRules
- ✅ Status e situação funcional bem definidos
**Pontos de Atenção:**
- ⚠️ `salaryCategory`, `salaryGrade`, `salaryStep` são UUIDs (não objetos)
- **Impacto:** Dificulta validações e consultas
- **Recomendação:** Considerar relacionamentos ManyToOne para facilitar validações
- ⚠️ Falta campo `careerRegime` (regime de carreira)
- **Impacto:** Não é possível filtrar agentes por regime
- **Recomendação:** Adicionar campo `careerRegimeId`
#### ✅ AgentContract (Contrato)
**Pontos Positivos:**
- ✅ Sincronização automática com Agent
- ✅ Desativação automática de contratos anteriores
- ✅ Referência a ato legal (legalActReference)
- ✅ Histórico de eventos de carreira
**Pontos de Atenção:**
- ⚠️ Falta validação de sobreposição de contratos
- **Impacto:** Pode haver múltiplos contratos ativos simultaneamente
- **Recomendação:** Adicionar validação no `saveContract`
#### ✅ PayrollRun (Execução de Folha)
**Pontos Positivos:**
- ✅ Estados bem definidos: PENDING → GENERATED → PROCESSING → COMPLETED → CLOSED
- ✅ Integração com PayrollPeriod
- ✅ Rastreabilidade (createdBy, createdAt)
**Pontos de Atenção:**
- ⚠️ Falta estado FAILED (existe no código, mas não é usado consistentemente)
- ⚠️ Falta validação de período já processado
- **Impacto:** Pode processar o mesmo período múltiplas vezes
- **Recomendação:** Validar se já existe folha COMPLETED para o período
#### ✅ PayrollItem (Item de Folha)
**Pontos Positivos:**
- ✅ Separação clara: EARNING vs DEDUCTION
- ✅ Referência a BudgetLine
- ✅ Quantidade e valor unitário (flexibilidade)
**Pontos de Atenção:**
- ⚠️ Falta validação de consistência
- **Impacto:** Pode haver itens sem agente, sem tipo, etc.
- **Recomendação:** Adicionar validações obrigatórias
---
### 3.2 Estrutura Salarial
#### ✅ SalaryGrid (Tabela Salarial)
**Pontos Positivos:**
- ✅ Vigência temporal (validFrom, validTo)
- ✅ Separação: baseAmount, subsidyAmount, grossAmount
- ✅ Relacionamento com SalaryStep
**Pontos de Atenção:**
- ⚠️ Falta validação de sobreposição de vigências
- **Impacto:** Pode haver múltiplas tabelas válidas para o mesmo step
- **Recomendação:** Validar ao criar/atualizar
- ⚠️ Falta cálculo automático de grossAmount
- **Impacto:** Pode haver inconsistência (grossAmount ≠ baseAmount + subsidyAmount)
- **Recomendação:** Calcular automaticamente ou validar
---
### 3.3 Regras Tributárias
#### ✅ GlobalDeductionRule (Regras Globais)
**Pontos Positivos:**
- ✅ Suporte a percentual e valor fixo
- ✅ Vigência temporal
- ✅ Ativo/Inativo
**Pontos de Atenção:**
- ⚠️ Comentário no código: "Futuro: Adicionar validações de sobreposição de datas"
- **Impacto:** Pode haver múltiplas regras ativas simultaneamente
- **Recomendação:** Implementar validação
#### ✅ TaxBracket (Escalões de Imposto)
**Pontos Positivos:**
- ✅ Suporte a imposto progressivo (ratePercentage + excessDeduction)
- ✅ Suporte a valor fixo (fixedAmount)
- ✅ Vigência temporal
**Pontos de Atenção:**
- ⚠️ Falta validação de continuidade de escalões
- **Impacto:** Pode haver "buracos" na tabela de escalões
- **Recomendação:** Validar que lowerLimit do próximo = upperLimit do anterior + 1
---
## 4. Análise de Lógica de Negócio
### 4.1 Processamento de Folha de Pagamento
#### ✅ Pontos Positivos
1. **Geração Automática de Itens**
- ✅ Busca agentes ativos
- ✅ Valida posse e escalão salarial
- ✅ Calcula salário base da tabela vigente
- ✅ Calcula subsídio (se houver)
- ✅ Calcula abono de família (baseado em dependentes)
- ✅ Calcula descontos por faltas injustificadas
- ✅ Aplica regras globais (INPS, Selo)
- ✅ Calcula impostos progressivos (IRPS, Imposto Democracia)
2. **Cálculo de Impostos**
- ✅ Base tributável = Bruto - INPS
- ✅ Aplicação de escalões progressivos
- ✅ Suporte a valor fixo e percentual
3. **Integração com Orçamento**
- ✅ Busca linha orçamentária por código econômico
- ✅ Associa cada item à linha orçamentária
- ✅ Validação antes de processar
#### ⚠️ Pontos de Atenção
1. **Cálculo de Faltas**
```java
BigDecimal dailySalary = baseAmount.divide(new BigDecimal("30"), 2, ...);
```
- ⚠️ **Problema:** Assume 30 dias por mês (não considera meses com 28/29/31 dias)
- **Impacto:** Cálculo impreciso em alguns meses
- **Recomendação:** Usar dias úteis do período ou dias do mês específico
2. **Abono de Família**
```java
BigDecimal familyAmount = new BigDecimal("1000").multiply(...);
```
- ⚠️ **Problema:** Valor fixo hardcoded (1000 XOF)
- **Impacto:** Não é configurável, não segue legislação
- **Recomendação:** Criar tabela de valores por número de dependentes
3. **Busca de Linha Orçamentária**
```java
findBudgetLine(agent, econCode, fiscalYearId)
```
- ⚠️ **Problema:** Busca apenas por OrgUnit e código econômico
- **Impacto:** Pode não encontrar linha se houver múltiplas linhas com mesmo código
- **Recomendação:** Adicionar critério de prioridade ou validação mais específica
4. **Validação de Agentes para Folha**
```java
if (agent.getSalaryStep() == null || agent.getPosseDate() == null) {
continue; // Silenciosamente ignora
}
```
- ⚠️ **Problema:** Ignora agentes sem escalão/posse sem avisar
- **Impacto:** Agente pode não receber salário sem saber o motivo
- **Recomendação:** Registrar warning/log ou criar item com status "PENDENTE_VALIDACAO"
---
### 4.2 Gestão de Agentes
#### ✅ Pontos Positivos
1. **Validações de Unicidade**
- ✅ Matrícula única
- ✅ NIF único
- ✅ BI único
2. **Histórico de Mudanças**
- ✅ AgentStatusHistory para mudanças de status
- ✅ CareerEvent para eventos de carreira
- ✅ Rastreabilidade completa
3. **Sincronização com Contratos**
- ✅ Dados de carreira sincronizados automaticamente
- ✅ Ativação automática se data de início válida
#### ⚠️ Pontos de Atenção
1. **Validação de Promoção**
```java
if (careerEventType == CareerEventType.PROMOCAO) {
validatePromotion(agent);
}
```
- ⚠️ **Problema:** Método `validatePromotion` não encontrado no código analisado
- **Impacto:** Promoções podem ser feitas sem validação
- **Recomendação:** Implementar validação de:
- Tempo mínimo no escalão atual
- Avaliação de desempenho (mínimo "BOM")
- Requisitos de habilitação literária
2. **Validação de Datas**
- ⚠️ Falta validação: `posseDate` >= `hireDate`
- ⚠️ Falta validação: `terminationDate` >= `hireDate`
- ⚠️ Falta validação: `birthDate` < `hireDate` (idade mínima)
3. **Validação de Status**
- ⚠️ Falta validação: Agente com `terminationDate` deve ter status TERMINATED
- ⚠️ Falta validação: Agente TERMINATED não pode ter contrato ativo
---
### 4.3 Gestão de Ausências
#### ✅ Pontos Positivos
1. **Cálculo de Faltas Injustificadas**
- ✅ Busca ausências no período
- ✅ Filtra apenas não justificadas
- ✅ Calcula dias dentro do período
#### ⚠️ Pontos de Atenção
1. **Validação de Ausências**
- ⚠️ Falta validação: `endDate` >= `startDate`
- ⚠️ Falta validação: Ausência não pode ser futura
- ⚠️ Falta validação: Ausência não pode sobrepor outras ausências justificadas
2. **Rastreabilidade**
- ⚠️ Campo `deductedInPayrollRunId` existe, mas não é preenchido
- **Impacto:** Não é possível rastrear em qual folha a falta foi descontada
- **Recomendação:** Preencher ao processar folha
---
## 5. Análise de Integrações
### 5.1 Integração RH → Orçamento
#### ✅ Pontos Positivos
1. **Fluxo Completo**
```
PayrollRun (COMPLETED)
→ processPayrollRun()
→ BudgetIntegrationService.createCommitmentFromPayrollItem()
→ BudgetExecution (COMMITMENT)
```
2. **Validações**
- ✅ Valida que todos os itens têm linha orçamentária
- ✅ Valida saldo disponível (no módulo Orçamento)
3. **Liquidação**
```
PayrollRun (CLOSED)
→ closePayrollRun()
→ BudgetIntegrationService.createLiquidationFromPayrollItem()
→ BudgetExecution (LIQUIDATION)
```
#### ⚠️ Pontos de Atenção
1. **Falta de Integração com Tesouro**
- ❌ **CRÍTICO:** Não há criação automática de PaymentOrder após processar folha
- **Impacto:** Folha processada não gera ordem de pagamento automaticamente
- **Recomendação:** Adicionar chamada a `PaymentOrderService.generateOrdersFromPayrollRun()` após `processPayrollRun()`
2. **Validação de Período**
- ⚠️ Não valida se período está dentro do exercício fiscal aberto
- **Recomendação:** Validar antes de processar
---
### 5.2 Integração RH → Tesouro
#### ❌ Problema Crítico
**Status:** ❌ **NÃO IMPLEMENTADO**
**Análise:**
- O código de `PaymentOrderService.generateOrdersFromPayrollRun()` existe no módulo Tesouro
- Mas não é chamado automaticamente após processar folha
- A integração deve ser feita manualmente ou via job agendado
**Recomendação:**
```java
// Em PayrollService.processPayrollRun(), após criar COMMITMENTs:
if (paymentOrderService != null) {
paymentOrderService.generateOrdersFromPayrollRun(payrollRunId, null);
}
```
---
## 6. Análise de Validações e Regras
### 6.1 Validações Implementadas
#### ✅ Validações Existentes
1. **PayrollPeriod**
- ✅ Mês entre 1 e 12
- ✅ Não duplicar (fiscalYear, month)
2. **PayrollRun**
- ✅ Apenas PENDING pode gerar itens
- ✅ Apenas GENERATED pode ser processado
- ✅ Apenas COMPLETED pode ser encerrado
- ✅ Todos os itens devem ter linha orçamentária
3. **Agent**
- ✅ Matrícula, NIF, BI únicos
- ✅ OrgUnit e Position existem
#### ❌ Validações Faltantes
1. **Validações de Conformidade Legal**
- ✅ Avaliação de desempenho para promoção (implementado em `validatePromotion()`)
- ❌ Tempo mínimo em escalão para progressão (parcial - valida avaliações, mas não tempo)
- ❌ Requisitos de habilitação literária
- ❌ Idade mínima para admissão
2. **Validações de Consistência**
- ❌ Sobreposição de contratos
- ❌ Sobreposição de vigências de tabela salarial
- ❌ Continuidade de escalões de imposto
- ❌ Datas coerentes (posse >= admissão, etc.)
3. **Validações de Integridade**
- ❌ Agente TERMINATED não pode ter contrato ativo
- ❌ Agente sem posse não pode receber salário
- ❌ Período já processado não pode ser reprocessado
---
### 6.2 Regras de Negócio
#### ✅ Regras Implementadas
1. **Cálculo de Salário**
- ✅ Base da tabela vigente
- ✅ Subsídio (se houver)
- ✅ Abono de família (por dependentes)
2. **Cálculo de Descontos**
- ✅ INPS: 7% do bruto
- ✅ Selo: 0.3% do bruto
- ✅ IRPS: Escalões progressivos
- ✅ Faltas injustificadas: Proporcional
3. **Integração Orçamentária**
- ✅ COMMITMENT ao processar
- ✅ LIQUIDATION ao encerrar
#### ⚠️ Regras Parcialmente Implementadas
1. **Progressão de Carreira**
- ⚠️ Existe evento de carreira, mas não há validação de requisitos
- **Recomendação:** Implementar validação completa
2. **Avaliação de Despenho**
- ⚠️ Entidade existe, mas não é validada para promoções
- **Recomendação:** Validar avaliação mínima "BOM" para promoção
---
## 7. Problemas Identificados
### 7.1 🔴 Críticos
1. **Falta de Integração Automática RH → Tesouro**
- **Severidade:** 🔴 CRÍTICO
- **Impacto:** Folha processada não gera ordem de pagamento automaticamente
- **Solução:** Adicionar chamada a `PaymentOrderService.generateOrdersFromPayrollRun()`
2. **Falta de Integração Automática RH → Tesouro**
- **Severidade:** 🔴 CRÍTICO
- **Impacto:** Folha processada não gera ordem de pagamento automaticamente
- **Solução:** Adicionar chamada a `PaymentOrderService.generateOrdersFromPayrollRun()` após `processPayrollRun()`
- **Nota:** ✅ Método existe no Tesouro, mas não é chamado automaticamente
3. **Cálculo de Faltas Assume 30 Dias**
- **Severidade:** 🟡 MÉDIO
- **Impacto:** Cálculo impreciso em alguns meses
- **Solução:** Usar dias do mês específico ou dias úteis
### 7.2 🟡 Médios
1. **Abono de Família Hardcoded**
- **Severidade:** 🟡 MÉDIO
- **Impacto:** Não é configurável, não segue legislação
- **Solução:** Criar tabela de valores configurável
2. **Falta de Validação de Sobreposição**
- **Severidade:** 🟡 MÉDIO
- **Impacto:** Múltiplas regras/tabelas ativas simultaneamente
- **Solução:** Adicionar validações de sobreposição
3. **Agentes Ignorados Silenciosamente**
- **Severidade:** 🟡 MÉDIO
- **Impacto:** Agente pode não receber sem saber o motivo
- **Solução:** Registrar warning ou criar item pendente
### 7.3 🟢 Baixos
1. **Falta de Validação de Datas**
- **Severidade:** 🟢 BAIXO
- **Impacto:** Dados inconsistentes
- **Solução:** Adicionar validações de coerência de datas
2. **Campo deductedInPayrollRunId Não Preenchido**
- **Severidade:** 🟢 BAIXO
- **Impacto:** Perda de rastreabilidade
- **Solução:** Preencher ao processar folha
---
## 8. Recomendações e Melhorias
### 8.1 Melhorias Críticas (Prioridade Alta)
#### 1. Implementar Integração Automática RH → Tesouro
**Status:** ✅ Método `generateOrdersFromPayrollRun()` existe no `PaymentOrderService`, mas não é chamado automaticamente
**Código Sugerido:**
```java
// Em PayrollService.processPayrollRun(), após criar COMMITMENTs e antes de marcar como COMPLETED:
// 1. Injetar PaymentOrderService no PayrollService
// private final PaymentOrderService paymentOrderService; // Adicionar dependência
// 2. Após processar COMMITMENTs, criar ordens de pagamento
try {
// Nota: paymentBatchId pode ser null - ordens podem ser adicionadas a lote depois
paymentOrderService.generateOrdersFromPayrollRun(payrollRunId, null);
log.info("Ordens de pagamento criadas automaticamente para folha: runId={}", payrollRunId);
} catch (Exception e) {
log.error("Erro ao criar ordens de pagamento automaticamente: {}", e.getMessage(), e);
// Decisão de design: Falhar processamento ou apenas registrar erro?
// Recomendação: Registrar erro mas não falhar (ordens podem ser criadas manualmente depois)
}
```
#### 2. Melhorar Validação de Promoções
**Status:** ✅ Método `validatePromotion()` já implementado e valida:
- ✅ Pelo menos 3 anos de avaliações
- ✅ Mínimo de 14 pontos (BOM) nos últimos 3 anos
- ✅ Conformidade com Decreto 12-A/94
**Melhorias Sugeridas:**
```java
// Adicionar validação de tempo mínimo no escalão atual
private void validatePromotion(Agent agent, AgentDTO newData) {
// Validação existente (avaliações) - já implementada
// Adicionar: Validar tempo mínimo no escalão atual
if (agent.getSalaryStep() != null) {
LocalDate stepStartDate = getStepStartDate(agent); // Implementar método
long monthsInStep = ChronoUnit.MONTHS.between(stepStartDate, LocalDate.now());
if (monthsInStep < 12) { // Mínimo 12 meses (ajustar conforme legislação)
throw new BusinessException(
"Tempo insuficiente no escalão atual para promoção. Mínimo: 12 meses",
"INSUFFICIENT_TIME",
HttpStatus.PRECONDITION_FAILED
);
}
}
}
```
#### 3. Corrigir Cálculo de Faltas
**Código Sugerido:**
```java
// Em vez de:
BigDecimal dailySalary = baseAmount.divide(new BigDecimal("30"), 2, ...);
// Usar:
int daysInPeriod = (int) ChronoUnit.DAYS.between(
payrollRun.getPeriod().getStartDate(),
payrollRun.getPeriod().getEndDate()
) + 1;
BigDecimal dailySalary = baseAmount.divide(
new BigDecimal(daysInPeriod),
2,
RoundingMode.HALF_UP
);
```
---
### 8.2 Melhorias de Média Prioridade
#### 1. Criar Tabela de Abono de Família
**Nova Entidade:**
```java
@Entity
@Table(name = "family_allowance_table")
public class FamilyAllowanceTable extends AuditableEntity {
@Column(nullable = false)
private Integer dependentsCount;
@Column(nullable = false, precision = 19, scale = 2)
private BigDecimal amount;
@Column(nullable = false)
private LocalDate validFrom;
@Column
private LocalDate validTo;
}
```
#### 2. Adicionar Validações de Sobreposição
**Código Sugerido:**
```java
// Em GlobalDeductionRuleService.saveRule():
List<GlobalDeductionRule> overlapping = repository.findOverlappingRules(
rule.getDeductionType().getId(),
rule.getValidFrom(),
rule.getValidTo()
);
if (!overlapping.isEmpty()) {
throw new BusinessException(
"Já existe regra ativa para este período",
"OVERLAPPING_RULE",
HttpStatus.CONFLICT
);
}
```
#### 3. Melhorar Tratamento de Agentes Sem Dados Completos
**Código Sugerido:**
```java
// Em generatePayrollItems():
if (agent.getSalaryStep() == null || agent.getPosseDate() == null) {
// Criar item com status PENDENTE_VALIDACAO
PayrollItem pendingItem = PayrollItem.builder()
.payrollRun(payrollRun)
.agent(agent.getId())
.lineType("EARNING")
.description("PENDENTE: Agente sem escalão ou posse")
.totalAmount(BigDecimal.ZERO)
.status("PENDING_VALIDATION")
.build();
payrollItemRepository.save(pendingItem);
log.warn("Agente {} sem escalão ou posse - item criado como pendente",
agent.getMatricula());
continue;
}
```
---
### 8.3 Melhorias de Baixa Prioridade
#### 1. Adicionar Validações de Datas
**Código Sugerido:**
```java
// Em AgentService.create():
if (dto.getPosseDate() != null && dto.getHireDate() != null) {
if (dto.getPosseDate().isBefore(dto.getHireDate())) {
throw new IllegalArgumentException(
"Data de posse não pode ser anterior à data de admissão"
);
}
}
if (dto.getBirthDate() != null && dto.getHireDate() != null) {
long age = ChronoUnit.YEARS.between(dto.getBirthDate(), dto.getHireDate());
if (age < 18) {
throw new IllegalArgumentException(
"Idade mínima para admissão: 18 anos"
);
}
}
```
#### 2. Preencher Campo deductedInPayrollRunId
**Código Sugerido:**
```java
// Em generatePayrollItems(), ao criar item de falta:
PayrollItem absenceItem = PayrollItem.builder()
// ... outros campos
.build();
payrollItemRepository.save(absenceItem);
// Atualizar ausência
absence.setDeductedInPayrollRunId(payrollRunId);
absenceRepository.save(absence);
```
---
## 9. Checklist de Conformidade
### 9.1 Conformidade Legal
- [ ] Validação de tempo mínimo em escalão para progressão
- [ ] Validação de avaliação de desempenho para promoção
- [ ] Validação de requisitos de habilitação literária
- [ ] Validação de idade mínima para admissão
- [ ] Rastreabilidade completa de atos administrativos
- [ ] Conformidade com Decreto 12-A/94 (se aplicável)
### 9.2 Conformidade Contábil
- [ ] Códigos econômicos corretos
- [ ] Integração completa com Orçamento
- [ ] Rastreabilidade orçamentária
- [ ] Validação de classificação econômica
### 9.3 Integrações
- [x] RH → Orçamento (COMMITMENT)
- [x] RH → Orçamento (LIQUIDATION)
- [ ] RH → Tesouro (PaymentOrder) ⚠️ **FALTA**
- [ ] Validação de período dentro do exercício fiscal
### 9.4 Validações
- [x] Unicidade de matrícula, NIF, BI
- [x] Estados de folha (PENDING → GENERATED → COMPLETED)
- [ ] Validação de promoções
- [ ] Validação de sobreposição de contratos
- [ ] Validação de sobreposição de vigências
- [ ] Validação de coerência de datas
- [ ] Validação de consistência de dados
### 9.5 Lógica de Negócio
- [x] Cálculo de salário base
- [x] Cálculo de subsídio
- [x] Cálculo de abono de família
- [x] Cálculo de descontos (INPS, Selo)
- [x] Cálculo de impostos progressivos (IRPS)
- [ ] Cálculo de faltas (corrigir para usar dias do mês)
- [ ] Tabela configurável de abono de família
---
## 📊 Resumo Final
### Pontos Fortes ✅
1. **Arquitetura sólida** com entidades bem definidas
2. **Integração com Orçamento** funcionando
3. **Rastreabilidade** completa de mudanças
4. **Cálculo de folha** robusto (com ressalvas)
5. **Estrutura salarial** flexível e temporal
### Pontos Fracos ⚠️
1. **Falta integração automática com Tesouro** (CRÍTICO) - Método existe, falta chamada
2. **Validação de promoções parcial** (MÉDIO) - Valida avaliações, mas falta tempo mínimo
3. **Cálculo de faltas impreciso** (MÉDIO) - Assume 30 dias fixos
4. **Abono de família hardcoded** (MÉDIO) - Valor fixo não configurável
5. **Falta algumas validações de conformidade legal** (MÉDIO) - Idade mínima, habilitação literária
### Prioridades de Ação
1. **URGENTE:** Implementar chamada automática a `PaymentOrderService.generateOrdersFromPayrollRun()` após processar folha
2. **IMPORTANTE:** Adicionar validação de tempo mínimo em escalão para promoção
3. **IMPORTANTE:** Corrigir cálculo de faltas (usar dias do mês específico)
4. **IMPORTANTE:** Criar tabela configurável de abono de família
5. **DESEJÁVEL:** Adicionar validações de idade mínima e habilitação literária
---
**Análise realizada por:** Cursor AI
**Data:** 2025-01-27
**Versão:** 1.0