| | | 1 | | using FAU.Entidades; |
| | | 2 | | using FAU.Logica.DTOs; |
| | | 3 | | |
| | | 4 | | namespace FAU.Logica.Calculadores; |
| | | 5 | | |
| | | 6 | | /// <summary> |
| | | 7 | | /// Calculador de aguinaldo (SAC) para bajas del mes (SIT14/SIT15/SIT18/SIT20). |
| | | 8 | | /// Emite el ítem 059.000 con monto = total_haberes_gravados_semestre / 12. |
| | | 9 | | /// </summary> |
| | | 10 | | public class AguinaldoCalculator : ICalculadorHaberes |
| | | 11 | | { |
| | | 12 | | // Código de catálogo del ítem SAC (059.000) |
| | | 13 | | private const int CodigoSac = 59000; |
| | | 14 | | |
| | | 15 | | public Task<ResultadoCalculo> CalcularAsync( |
| | | 16 | | RelacionLaboral funcionario, InsumosPeriodo insumos, Acumuladores acumuladores) |
| | | 17 | | { |
| | 4 | 18 | | var resultado = new ResultadoCalculo(); |
| | | 19 | | try |
| | | 20 | | { |
| | 4 | 21 | | var semestre = insumos.ParametroPeriodo.Mes <= 6 ? (short)1 : (short)2; |
| | 4 | 22 | | var aguinaldo = insumos.AguinaldosPorPersona.TryGetValue(funcionario.PersonaId, out var ag) |
| | 3 | 23 | | ? ag.FirstOrDefault(a => a.Anio == insumos.ParametroPeriodo.Anio && a.Semestre == semestre) |
| | 4 | 24 | | : null; |
| | | 25 | | |
| | 4 | 26 | | if (aguinaldo == null) |
| | | 27 | | { |
| | 1 | 28 | | resultado.Incidencias.Add( |
| | 1 | 29 | | $"Sin registro de aguinaldo para {insumos.ParametroPeriodo.Anio} semestre {semestre}. Ítem 059.000 n |
| | 1 | 30 | | resultado.Estado = EstadoCalculo.Revisar; |
| | 1 | 31 | | return Task.FromResult(resultado); |
| | | 32 | | } |
| | | 33 | | |
| | 3 | 34 | | var monto = Math.Round(aguinaldo.TotalHaberesGravadosSemestre / 12m, 2); |
| | 3 | 35 | | if (monto > 0) |
| | | 36 | | { |
| | 6 | 37 | | var catalogoItem = insumos.CatalogoItems.FirstOrDefault(c => c.Codigo == CodigoSac); |
| | 3 | 38 | | resultado.Items.Add(new ItemCalculado |
| | 3 | 39 | | { |
| | 3 | 40 | | CodigoConcepto = CodigoSac, |
| | 3 | 41 | | NombreConcepto = catalogoItem?.Nombre ?? "Sueldo Anual Complementario (059.000)", |
| | 3 | 42 | | Importe = monto |
| | 3 | 43 | | }); |
| | 3 | 44 | | if (catalogoItem is not null) |
| | 3 | 45 | | acumuladores.AgregarItem(monto, catalogoItem); |
| | | 46 | | } |
| | | 47 | | |
| | 3 | 48 | | resultado.Estado = resultado.Incidencias.Count > 0 |
| | 3 | 49 | | ? EstadoCalculo.Revisar |
| | 3 | 50 | | : EstadoCalculo.Calculado; |
| | 3 | 51 | | } |
| | 0 | 52 | | catch (Exception ex) |
| | | 53 | | { |
| | 0 | 54 | | resultado.Estado = EstadoCalculo.Error; |
| | 0 | 55 | | resultado.MensajeError = ex.Message; |
| | 0 | 56 | | } |
| | | 57 | | |
| | 3 | 58 | | return Task.FromResult(resultado); |
| | 1 | 59 | | } |
| | | 60 | | } |