| | | 1 | | using FAU.Entidades; |
| | | 2 | | using FAU.Logica.DTOs; |
| | | 3 | | |
| | | 4 | | namespace FAU.Logica.Calculadores; |
| | | 5 | | |
| | | 6 | | public abstract class CalculadorHaberesBase : ICalculadorHaberes |
| | | 7 | | { |
| | | 8 | | public Task<ResultadoCalculo> CalcularAsync( |
| | | 9 | | RelacionLaboral funcionario, InsumosPeriodo insumos, Acumuladores acumuladores) |
| | | 10 | | { |
| | 29 | 11 | | var resultado = new ResultadoCalculo(); |
| | | 12 | | try |
| | | 13 | | { |
| | 29 | 14 | | var (wpara53, wPara10) = CalcularItemsBase(funcionario, insumos, acumuladores, resultado); |
| | 27 | 15 | | AgregarItemsDecreto(funcionario, insumos, acumuladores, resultado); |
| | | 16 | | |
| | 27 | 17 | | if (wPara10 > 0) |
| | 24 | 18 | | CalcularDedicacionIntegral(wPara10, insumos, acumuladores, resultado); |
| | | 19 | | |
| | 27 | 20 | | if (!funcionario.Regimen.EsLeyVieja) |
| | 2 | 21 | | CalcularModAportes19695(acumuladores, insumos, resultado); |
| | | 22 | | |
| | 27 | 23 | | if (!funcionario.Situacion.AfectaCobro) |
| | 10 | 24 | | foreach (var item in resultado.Items) |
| | 4 | 25 | | item.EsReferencia = true; |
| | | 26 | | |
| | 27 | 27 | | resultado.Estado = resultado.Incidencias.Count > 0 |
| | 27 | 28 | | ? EstadoCalculo.Revisar |
| | 27 | 29 | | : EstadoCalculo.Calculado; |
| | 27 | 30 | | } |
| | 2 | 31 | | catch (Exception ex) |
| | | 32 | | { |
| | 2 | 33 | | resultado.Estado = EstadoCalculo.Error; |
| | 2 | 34 | | resultado.MensajeError = ex.Message; |
| | 2 | 35 | | } |
| | | 36 | | |
| | 29 | 37 | | return Task.FromResult(resultado); |
| | | 38 | | } |
| | | 39 | | |
| | | 40 | | protected abstract (decimal WPara53, decimal WPara10) CalcularItemsBase( |
| | | 41 | | RelacionLaboral funcionario, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado); |
| | | 42 | | |
| | | 43 | | protected virtual void AgregarItemsDecreto( |
| | | 44 | | RelacionLaboral funcionario, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado) |
| | | 45 | | { |
| | 24 | 46 | | int[] codigosDecreto = [38, 39, 41, 154, 225]; |
| | 288 | 47 | | foreach (var cod in codigosDecreto) |
| | | 48 | | { |
| | 120 | 49 | | var rem = insumos.ObtenerRemuneracion(funcionario.GradoId, cod); |
| | 120 | 50 | | if (rem is not null) |
| | 3 | 51 | | AgregarItem(cod, rem.Monto, insumos, acumuladores, resultado); |
| | | 52 | | } |
| | 24 | 53 | | } |
| | | 54 | | |
| | | 55 | | private static void CalcularDedicacionIntegral( |
| | | 56 | | decimal wPara10, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado) |
| | | 57 | | { |
| | 24 | 58 | | AgregarItem(17, wPara10 * 0.10m, insumos, acumuladores, resultado); |
| | 24 | 59 | | } |
| | | 60 | | |
| | | 61 | | /// <summary> |
| | | 62 | | /// Modificación de aportes Ley 19.695 (solo régimen ley nueva). |
| | | 63 | | /// Fórmula: (WNominal − monto_048042 − monto_042403) × 2.35% |
| | | 64 | | /// Emite el ítem 042.413 (código catálogo 42413) si la base es positiva. |
| | | 65 | | /// </summary> |
| | | 66 | | private static void CalcularModAportes19695( |
| | | 67 | | Acumuladores acumuladores, InsumosPeriodo insumos, ResultadoCalculo resultado) |
| | | 68 | | { |
| | | 69 | | // Códigos catálogo: 048.042 = 48042, 042.403 = 42403, 042.413 = 42413 |
| | 15 | 70 | | var monto048042 = resultado.Items.Where(i => i.CodigoConcepto == 48042).Sum(i => i.Importe); |
| | 14 | 71 | | var monto042403 = resultado.Items.Where(i => i.CodigoConcepto == 42403).Sum(i => i.Importe); |
| | 2 | 72 | | var baseCalculo = acumuladores.WNominal - monto048042 - monto042403; |
| | | 73 | | |
| | 3 | 74 | | if (baseCalculo <= 0) return; |
| | | 75 | | |
| | 1 | 76 | | var monto = Math.Round(baseCalculo * 0.0235m, 2); |
| | 1 | 77 | | AgregarItem(42413, monto, insumos, acumuladores, resultado); |
| | 1 | 78 | | } |
| | | 79 | | |
| | | 80 | | protected static void AgregarItem( |
| | | 81 | | int codigo, decimal monto, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado) |
| | | 82 | | { |
| | 716 | 83 | | var catalogoItem = insumos.CatalogoItems.FirstOrDefault(c => c.Codigo == codigo); |
| | 112 | 84 | | resultado.Items.Add(new ItemCalculado |
| | 112 | 85 | | { |
| | 112 | 86 | | CodigoConcepto = codigo, |
| | 112 | 87 | | NombreConcepto = catalogoItem?.Nombre ?? $"Concepto {codigo}", |
| | 112 | 88 | | Importe = monto |
| | 112 | 89 | | }); |
| | 112 | 90 | | if (catalogoItem is not null) |
| | 112 | 91 | | acumuladores.AgregarItem(monto, catalogoItem); |
| | 112 | 92 | | } |
| | | 93 | | |
| | | 94 | | protected static int CalcularAniosServicio(RelacionLaboral funcionario, InsumosPeriodo insumos) |
| | | 95 | | { |
| | 24 | 96 | | var fechaPeriodo = new DateTime(insumos.ParametroPeriodo.Anio, insumos.ParametroPeriodo.Mes, 1); |
| | 24 | 97 | | return Math.Max(0, (int)((fechaPeriodo - funcionario.FechaInicio).TotalDays / 365.25)); |
| | | 98 | | } |
| | | 99 | | } |