814 lines
27 KiB
Markdown
814 lines
27 KiB
Markdown
|
|
# 🔍 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
|
||
|
|
|