| | | 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 | | { |
| | 44 | 11 | | var resultado = new ResultadoCalculo(); |
| | | 12 | | try |
| | | 13 | | { |
| | 44 | 14 | | var (wpara53, wPara10) = CalcularItemsBase(funcionario, insumos, acumuladores, resultado); |
| | 42 | 15 | | AgregarItemsDecreto(funcionario, insumos, acumuladores, resultado); |
| | | 16 | | |
| | 42 | 17 | | if (wPara10 > 0) |
| | 39 | 18 | | CalcularDedicacionIntegral(wPara10, insumos, acumuladores, resultado); |
| | | 19 | | |
| | 42 | 20 | | if (!funcionario.Regimen.EsLeyVieja) |
| | 16 | 21 | | CalcularModAportes19695(acumuladores, insumos, resultado); |
| | | 22 | | |
| | 42 | 23 | | if (!funcionario.Situacion.AfectaCobro) |
| | 10 | 24 | | foreach (var item in resultado.Items) |
| | 4 | 25 | | item.EsReferencia = true; |
| | | 26 | | |
| | 42 | 27 | | resultado.Estado = resultado.Incidencias.Count > 0 |
| | 42 | 28 | | ? EstadoCalculo.Revisar |
| | 42 | 29 | | : EstadoCalculo.Calculado; |
| | 42 | 30 | | } |
| | 2 | 31 | | catch (Exception ex) |
| | | 32 | | { |
| | 2 | 33 | | resultado.Estado = EstadoCalculo.Error; |
| | 2 | 34 | | resultado.MensajeError = ex.Message; |
| | 2 | 35 | | } |
| | | 36 | | |
| | 44 | 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 | | { |
| | | 46 | | // Confirmados: 48038 (Dec.180/985 Esc.K), 48040 (Ley 19.355) |
| | | 47 | | // TODO: confirmar OG para 39, 154, 225 con DFC antes de remapear |
| | 39 | 48 | | int[] codigosDecreto = [48038, 39, 48040, 154, 225]; |
| | 468 | 49 | | foreach (var cod in codigosDecreto) |
| | | 50 | | { |
| | 195 | 51 | | var rem = insumos.ObtenerRemuneracion(funcionario.GradoId, cod); |
| | 195 | 52 | | if (rem is not null) |
| | 3 | 53 | | AgregarItem(cod, rem.Monto, insumos, acumuladores, resultado); |
| | | 54 | | } |
| | 39 | 55 | | } |
| | | 56 | | |
| | | 57 | | private static void CalcularDedicacionIntegral( |
| | | 58 | | decimal wPara10, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado) |
| | | 59 | | { |
| | | 60 | | // 043.004 — Compensación por Dedicación Integral (10% base) |
| | 39 | 61 | | AgregarItem(43004, wPara10 * 0.10m, insumos, acumuladores, resultado); |
| | 39 | 62 | | } |
| | | 63 | | |
| | | 64 | | /// <summary> |
| | | 65 | | /// Modificación de aportes Ley 19.695 (solo régimen ley nueva). |
| | | 66 | | /// Fórmula: (WNominal − monto_048042 − monto_042403) × 2.35% |
| | | 67 | | /// Emite el ítem 042.413 (código catálogo 42413) si la base es positiva. |
| | | 68 | | /// </summary> |
| | | 69 | | private static void CalcularModAportes19695( |
| | | 70 | | Acumuladores acumuladores, InsumosPeriodo insumos, ResultadoCalculo resultado) |
| | | 71 | | { |
| | | 72 | | // Códigos catálogo: 048.042 = 48042, 042.403 = 42403, 042.413 = 42413 |
| | 89 | 73 | | var monto048042 = resultado.Items.Where(i => i.CodigoConcepto == 48042).Sum(i => i.Importe); |
| | 88 | 74 | | var monto042403 = resultado.Items.Where(i => i.CodigoConcepto == 42403).Sum(i => i.Importe); |
| | 16 | 75 | | var baseCalculo = acumuladores.WNominal - monto048042 - monto042403; |
| | | 76 | | |
| | 17 | 77 | | if (baseCalculo <= 0) return; |
| | | 78 | | |
| | 15 | 79 | | var monto = Math.Round(baseCalculo * 0.0235m, 2); |
| | 15 | 80 | | AgregarItem(42413, monto, insumos, acumuladores, resultado); |
| | 15 | 81 | | } |
| | | 82 | | |
| | | 83 | | protected static void AgregarItem( |
| | | 84 | | int codigo, decimal monto, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado) |
| | | 85 | | { |
| | 1181 | 86 | | var catalogoItem = insumos.CatalogoItems.FirstOrDefault(c => c.Codigo == codigo); |
| | 190 | 87 | | resultado.Items.Add(new ItemCalculado |
| | 190 | 88 | | { |
| | 190 | 89 | | CodigoConcepto = codigo, |
| | 190 | 90 | | NombreConcepto = catalogoItem?.Nombre ?? $"Concepto {codigo}", |
| | 190 | 91 | | Importe = monto |
| | 190 | 92 | | }); |
| | 190 | 93 | | if (catalogoItem is not null) |
| | 176 | 94 | | acumuladores.AgregarItem(monto, catalogoItem); |
| | 190 | 95 | | } |
| | | 96 | | |
| | | 97 | | protected static int CalcularAniosServicio(RelacionLaboral funcionario, InsumosPeriodo insumos) |
| | | 98 | | { |
| | 39 | 99 | | var fechaPeriodo = new DateTime(insumos.ParametroPeriodo.Anio, insumos.ParametroPeriodo.Mes, 1); |
| | 39 | 100 | | return Math.Max(0, (int)((fechaPeriodo - funcionario.FechaInicio).TotalDays / 365.25)); |
| | | 101 | | } |
| | | 102 | | } |