27 KiB
🔍 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
- Resumo Executivo
- Análise de Conformidade
- Análise de Arquitetura e Estrutura
- Análise de Lógica de Negócio
- Análise de Integrações
- Análise de Validações e Regras
- Problemas Identificados
- Recomendações e Melhorias
- 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
- Validação de Promoções Implementada: Método
validatePromotion()existe e valida avaliações conforme Decreto 12-A/94 - Integração com Orçamento Funcionando: COMMITMENT e LIQUIDATION criados automaticamente
- Cálculo de Folha Robusto: Suporta proventos, descontos, impostos progressivos
- Rastreabilidade Completa: Histórico de mudanças e eventos de carreira
⚠️ Pontos de Atenção
- Integração RH → Tesouro: Método
generateOrdersFromPayrollRun()existe, mas não é chamado automaticamente - Cálculo de Faltas: Assume 30 dias fixos (impreciso em alguns meses)
- Abono de Família: Valor hardcoded (1000 XOF) não configurável
- 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
-
Estrutura de Carreira Hierárquica
- ✅ Regimes de Carreira (CareerRegime)
- ✅ Categorias Salariais (SalaryCategory)
- ✅ Escalões (SalaryGrade)
- ✅ Níveis (SalaryStep)
- ✅ Tabela Salarial com Vigência (SalaryGrid)
-
Tipos de Nomeação
- ✅ PROVISORIA, DEFINITIVA, CONTRATO_PROVIMENTO, CONTRATO_TERMO
- ✅ Mapeamento correto entre tipos de contrato e nomeação
-
Situação Funcional
- ✅ ATIVIDADE_NO_QUADRO, ATIVIDADE_FORA_DO_QUADRO
- ✅ Histórico de mudanças de status (AgentStatusHistory)
-
Rastreabilidade de Atos Administrativos
- ✅ Referência a atos legais (legalActReference)
- ✅ Histórico de eventos de carreira (CareerEvent)
⚠️ Pontos de Atenção
-
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
-
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
-
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
-
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
-
Rastreabilidade Orçamentária
- ✅ Cada PayrollItem tem referência a BudgetLine
- ✅ Integração automática com módulo Orçamento
⚠️ Pontos de Atenção
- 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,salaryStepsã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
-
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)
-
Cálculo de Impostos
- ✅ Base tributável = Bruto - INPS
- ✅ Aplicação de escalões progressivos
- ✅ Suporte a valor fixo e percentual
-
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
-
Cálculo de Faltas
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
-
Abono de Família
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
-
Busca de Linha Orçamentária
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
-
Validação de Agentes para Folha
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
-
Validações de Unicidade
- ✅ Matrícula única
- ✅ NIF único
- ✅ BI único
-
Histórico de Mudanças
- ✅ AgentStatusHistory para mudanças de status
- ✅ CareerEvent para eventos de carreira
- ✅ Rastreabilidade completa
-
Sincronização com Contratos
- ✅ Dados de carreira sincronizados automaticamente
- ✅ Ativação automática se data de início válida
⚠️ Pontos de Atenção
-
Validação de Promoção
if (careerEventType == CareerEventType.PROMOCAO) { validatePromotion(agent); }- ⚠️ Problema: Método
validatePromotionnã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
- ⚠️ Problema: Método
-
Validação de Datas
- ⚠️ Falta validação:
posseDate>=hireDate - ⚠️ Falta validação:
terminationDate>=hireDate - ⚠️ Falta validação:
birthDate<hireDate(idade mínima)
- ⚠️ Falta validação:
-
Validação de Status
- ⚠️ Falta validação: Agente com
terminationDatedeve ter status TERMINATED - ⚠️ Falta validação: Agente TERMINATED não pode ter contrato ativo
- ⚠️ Falta validação: Agente com
4.3 Gestão de Ausências
✅ Pontos Positivos
- 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
-
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
- ⚠️ Falta validação:
-
Rastreabilidade
- ⚠️ Campo
deductedInPayrollRunIdexiste, mas não é preenchido - Impacto: Não é possível rastrear em qual folha a falta foi descontada
- Recomendação: Preencher ao processar folha
- ⚠️ Campo
5. Análise de Integrações
5.1 Integração RH → Orçamento
✅ Pontos Positivos
-
Fluxo Completo
PayrollRun (COMPLETED) → processPayrollRun() → BudgetIntegrationService.createCommitmentFromPayrollItem() → BudgetExecution (COMMITMENT) -
Validações
- ✅ Valida que todos os itens têm linha orçamentária
- ✅ Valida saldo disponível (no módulo Orçamento)
-
Liquidação
PayrollRun (CLOSED) → closePayrollRun() → BudgetIntegrationService.createLiquidationFromPayrollItem() → BudgetExecution (LIQUIDATION)
⚠️ Pontos de Atenção
-
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ósprocessPayrollRun()
-
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:
// 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
-
PayrollPeriod
- ✅ Mês entre 1 e 12
- ✅ Não duplicar (fiscalYear, month)
-
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
-
Agent
- ✅ Matrícula, NIF, BI únicos
- ✅ OrgUnit e Position existem
❌ Validações Faltantes
-
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
- ✅ Avaliação de desempenho para promoção (implementado em
-
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.)
-
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
-
Cálculo de Salário
- ✅ Base da tabela vigente
- ✅ Subsídio (se houver)
- ✅ Abono de família (por dependentes)
-
Cálculo de Descontos
- ✅ INPS: 7% do bruto
- ✅ Selo: 0.3% do bruto
- ✅ IRPS: Escalões progressivos
- ✅ Faltas injustificadas: Proporcional
-
Integração Orçamentária
- ✅ COMMITMENT ao processar
- ✅ LIQUIDATION ao encerrar
⚠️ Regras Parcialmente Implementadas
-
Progressão de Carreira
- ⚠️ Existe evento de carreira, mas não há validação de requisitos
- Recomendação: Implementar validação completa
-
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
-
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()
-
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ósprocessPayrollRun() - Nota: ✅ Método existe no Tesouro, mas não é chamado automaticamente
-
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
-
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
-
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
-
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
-
Falta de Validação de Datas
- Severidade: 🟢 BAIXO
- Impacto: Dados inconsistentes
- Solução: Adicionar validações de coerência de datas
-
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:
// 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:
// 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:
// 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:
@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:
// 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:
// 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:
// 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:
// 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
- RH → Orçamento (COMMITMENT)
- RH → Orçamento (LIQUIDATION)
- RH → Tesouro (PaymentOrder) ⚠️ FALTA
- Validação de período dentro do exercício fiscal
9.4 Validações
- Unicidade de matrícula, NIF, BI
- 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
- Cálculo de salário base
- Cálculo de subsídio
- Cálculo de abono de família
- Cálculo de descontos (INPS, Selo)
- 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 ✅
- Arquitetura sólida com entidades bem definidas
- Integração com Orçamento funcionando
- Rastreabilidade completa de mudanças
- Cálculo de folha robusto (com ressalvas)
- Estrutura salarial flexível e temporal
Pontos Fracos ⚠️
- Falta integração automática com Tesouro (CRÍTICO) - Método existe, falta chamada
- Validação de promoções parcial (MÉDIO) - Valida avaliações, mas falta tempo mínimo
- Cálculo de faltas impreciso (MÉDIO) - Assume 30 dias fixos
- Abono de família hardcoded (MÉDIO) - Valor fixo não configurável
- Falta algumas validações de conformidade legal (MÉDIO) - Idade mínima, habilitação literária
Prioridades de Ação
- URGENTE: Implementar chamada automática a
PaymentOrderService.generateOrdersFromPayrollRun()após processar folha - IMPORTANTE: Adicionar validação de tempo mínimo em escalão para promoção
- IMPORTANTE: Corrigir cálculo de faltas (usar dias do mês específico)
- IMPORTANTE: Criar tabela configurável de abono de família
- 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