< Summary

Information
Class: FAU.Logica.Services.ProcesadorBeneficiosService
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Services/ProcesadorBeneficiosService.cs
Line coverage
82%
Covered lines: 237
Uncovered lines: 50
Coverable lines: 287
Total lines: 539
Line coverage: 82.5%
Branch coverage
79%
Covered branches: 164
Total branches: 206
Branch coverage: 79.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ProcesarBeneficios(...)93.75%161693.1%
CalcularAsigFamiliar(...)85.71%534281.53%
CalcularHogar(...)62.5%371656.25%
CalcularPsf(...)77.77%181893.1%
CalcularPrimaNacimiento(...)68.75%171682.75%
CalcularPrimaMatrimonio(...)68.75%171686.2%
CalcularPrimaTraslado(...)81.81%222296.96%
CalcularPrimaNacimientoMatrimonioCombo(...)0%4260%
RegistrarRetroactividadSiCorresponde(...)100%44100%
BuscarCatalogo(...)100%11100%
DeterminarCategoria(...)90%505095.65%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Services/ProcesadorBeneficiosService.cs

#LineLine coverage
 1using FAU.Entidades;
 2using FAU.Logica.DTOs;
 3
 4namespace FAU.Logica.Services;
 5
 6public class ProcesadorBeneficiosService : IProcesadorBeneficiosService
 7{
 8    private enum CategoriaBeneficio
 9    {
 10        AsignacionFamiliar,
 11        HogarConstituido,
 12        PrimaSolidariaFamiliar,
 13        PrimaNacimiento,
 14        PrimaMatrimonio,
 15        PrimaNacimientoMatrimonioCombo,
 16        PrimaTraslado,
 17        Desconocido
 18    }
 19
 20    public ResultadoBeneficios ProcesarBeneficios(
 21        long personaId,
 22        IReadOnlyList<BeneficioSocial> beneficios,
 23        ParametroPeriodo parametros,
 24        IReadOnlyList<CatalogoItem> catalogo,
 25        IEnumerable<LiquidacionItem> itemsHistoricos,
 26        DateOnly primerDiaPeriodo,
 27        IReadOnlyDictionary<long, IReadOnlyList<BeneficioSocialBeneficiario>>? beneficiariosPorBeneficio = null,
 28        IReadOnlyDictionary<string, InstructivoAsigFamiliar>? instructivoAsigFamiliar = null,
 29        IReadOnlyDictionary<int, InstructivoPsf>? instructivoPsf = null,
 30        IReadOnlyList<TablaHogarConstituido>? tablaPorHogar = null,
 31        decimal? sueldoBaseParaTraslado = null)
 32    {
 5433        var resultado = new ResultadoBeneficios();
 5434        var historicos = itemsHistoricos.ToList();
 35
 19036        foreach (var beneficio in beneficios)
 37        {
 4138            if (beneficio.TipoBeneficio is null)
 39                continue;
 40
 4141            var categoria = DeterminarCategoria(beneficio.TipoBeneficio);
 42
 43            switch (categoria)
 44            {
 45                case CategoriaBeneficio.AsignacionFamiliar:
 1046                    var hijos = beneficiariosPorBeneficio is not null &&
 1047                                beneficiariosPorBeneficio.TryGetValue(beneficio.Id, out var lista)
 1048                        ? lista
 1049                        : null;
 1050                    CalcularAsigFamiliar(beneficio, catalogo, resultado, hijos,
 1051                        primerDiaPeriodo, instructivoAsigFamiliar);
 1052                    break;
 53                case CategoriaBeneficio.HogarConstituido:
 654                    CalcularHogar(beneficio, catalogo, resultado, tablaPorHogar);
 655                    break;
 56                case CategoriaBeneficio.PrimaSolidariaFamiliar:
 1057                    CalcularPsf(beneficio, catalogo, resultado, instructivoPsf);
 1058                    break;
 59                case CategoriaBeneficio.PrimaNacimiento:
 460                    CalcularPrimaNacimiento(beneficio, catalogo, historicos, resultado);
 461                    break;
 62                case CategoriaBeneficio.PrimaMatrimonio:
 463                    CalcularPrimaMatrimonio(beneficio, catalogo, historicos, resultado);
 464                    break;
 65                case CategoriaBeneficio.PrimaNacimientoMatrimonioCombo:
 066                    CalcularPrimaNacimientoMatrimonioCombo(beneficio, catalogo, historicos, resultado);
 067                    break;
 68                case CategoriaBeneficio.PrimaTraslado:
 669                    CalcularPrimaTraslado(beneficio, catalogo, historicos, resultado, sueldoBaseParaTraslado);
 670                    break;
 71                default:
 172                    resultado.Incidencias.Add(new IncidenciaBeneficio(
 173                        TipoIncidenciaCalculo.TipoBeneficioDesconocido,
 174                        $"Tipo de beneficio no reconocido: {beneficio.TipoBeneficio.Codigo} (id={beneficio.TipoBeneficio
 75                    break;
 76            }
 77
 4178            RegistrarRetroactividadSiCorresponde(beneficio, primerDiaPeriodo, resultado);
 79        }
 80
 5481        return resultado;
 82    }
 83
 84    // ── Asignación Familiar ───────────────────────────────────────────────────
 85
 86    private static void CalcularAsigFamiliar(
 87        BeneficioSocial beneficio,
 88        IReadOnlyList<CatalogoItem> catalogo,
 89        ResultadoBeneficios resultado,
 90        IReadOnlyList<BeneficioSocialBeneficiario>? hijos,
 91        DateOnly primerDiaPeriodo,
 92        IReadOnlyDictionary<string, InstructivoAsigFamiliar>? instructivo)
 93    {
 94        // Obtener importe franja 8% del instructivo
 95        decimal valorPorHijo;
 1096        if (instructivo is not null && instructivo.TryGetValue(TipoFranjaAsigFamiliar.Franja8, out var franja8))
 97        {
 498            valorPorHijo = franja8.Importe;
 99        }
 6100        else if (instructivo is not null)
 101        {
 0102            resultado.Incidencias.Add(new IncidenciaBeneficio(
 0103                TipoIncidenciaCalculo.InstructivoNoConfigurado,
 0104                "Instructivo AsigFamiliar no configurado para el período"));
 0105            return;
 106        }
 107        else
 108        {
 109            // Fallback a MontoReferencia cuando no hay instructivo disponible
 6110            valorPorHijo = beneficio.TipoBeneficio?.MontoReferencia ?? 0m;
 111        }
 112
 10113        if (hijos is { Count: > 0 })
 114        {
 4115            var fechaLimite18 = primerDiaPeriodo.ToDateTime(TimeOnly.MinValue);
 116
 4117            var hijosSinDiscapacidad = hijos
 6118                .Where(h => !h.Discapacidad && h.FechaNacimiento.AddYears(18) > fechaLimite18)
 4119                .ToList();
 10120            var hijosConDiscapacidad = hijos.Where(h => h.Discapacidad).ToList();
 121
 4122            if (hijosSinDiscapacidad.Count > 0 && valorPorHijo > 0m)
 123            {
 2124                var itemAsig = BuscarCatalogo(catalogo, 300);
 2125                if (itemAsig?.ClasificacionSiif is null)
 126                {
 0127                    resultado.Incidencias.Add(new IncidenciaBeneficio(
 0128                        TipoIncidenciaCalculo.CatalogoItemNoConfigurado,
 0129                        "Ítem de catálogo para Asignación Familiar (código 300) no configurado — verifique catálogo de í
 0130                    return;
 131                }
 2132                resultado.Items.Add(new ItemBeneficioCalculado(
 2133                    CodigoConcepto: 300,
 2134                    NombreConcepto: itemAsig.Nombre,
 2135                    Importe: hijosSinDiscapacidad.Count * valorPorHijo,
 2136                    ClasificacionSiif: "BenSocGrav",
 2137                    RubroContable: itemAsig.ClasificacionSiif,
 2138                    ExentoIrpf: true));
 139            }
 140
 4141            if (hijosConDiscapacidad.Count > 0)
 142            {
 143                decimal valorDiscapacidad;
 3144                if (instructivo is not null && instructivo.TryGetValue(TipoFranjaAsigFamiliar.Discapacidad, out var fran
 145                {
 2146                    valorDiscapacidad = franjaDisc.Importe;
 147                }
 148                else
 149                {
 1150                    resultado.Incidencias.Add(new IncidenciaBeneficio(
 1151                        TipoIncidenciaCalculo.InstructivoNoConfigurado,
 1152                        "Instructivo AsigFamiliar (discapacidad) no configurado para el período"));
 1153                    return;
 154                }
 155
 2156                if (valorDiscapacidad > 0m)
 157                {
 2158                    var itemDisc = BuscarCatalogo(catalogo, 360);
 2159                    if (itemDisc?.ClasificacionSiif is null)
 160                    {
 0161                        resultado.Incidencias.Add(new IncidenciaBeneficio(
 0162                            TipoIncidenciaCalculo.CatalogoItemNoConfigurado,
 0163                            "Ítem de catálogo para Asignación por Discapacidad (código 360) no configurado — verifique c
 0164                        return;
 165                    }
 2166                    resultado.Items.Add(new ItemBeneficioCalculado(
 2167                        CodigoConcepto: 360,
 2168                        NombreConcepto: itemDisc.Nombre,
 2169                        Importe: hijosConDiscapacidad.Count * valorDiscapacidad,
 2170                        ClasificacionSiif: "BenSocGrav",
 2171                        RubroContable: itemDisc.ClasificacionSiif,
 2172                        ExentoIrpf: true));
 173                }
 174            }
 175        }
 176        else
 177        {
 178            // Sin hijos registrados, usar beneficio.Cantidad
 6179            if (beneficio.Cantidad <= 0 || valorPorHijo == 0m)
 2180                return;
 181
 4182            var item = BuscarCatalogo(catalogo, 300);
 4183            if (item?.ClasificacionSiif is null)
 184            {
 2185                resultado.Incidencias.Add(new IncidenciaBeneficio(
 2186                    TipoIncidenciaCalculo.CatalogoItemNoConfigurado,
 2187                    "Ítem de catálogo para Asignación Familiar (código 300) no configurado — verifique catálogo de ítems
 2188                return;
 189            }
 2190            resultado.Items.Add(new ItemBeneficioCalculado(
 2191                CodigoConcepto: 300,
 2192                NombreConcepto: item.Nombre,
 2193                Importe: beneficio.Cantidad * valorPorHijo,
 2194                ClasificacionSiif: "BenSocGrav",
 2195                RubroContable: item.ClasificacionSiif,
 2196                ExentoIrpf: true));
 197        }
 3198    }
 199
 200    // ── Hogar Constituido ─────────────────────────────────────────────────────
 201
 202    private static void CalcularHogar(
 203        BeneficioSocial beneficio,
 204        IReadOnlyList<CatalogoItem> catalogo,
 205        ResultadoBeneficios resultado,
 206        IReadOnlyList<TablaHogarConstituido>? tablaPorHogar)
 207    {
 208        decimal monto;
 209
 6210        if (tablaPorHogar is not null && tablaPorHogar.Count > 0)
 211        {
 212            // Usar tramo residual (hasta_haberes = NULL) como fallback hasta que haya ingreso acumulado
 0213            var tramoResidual = tablaPorHogar.FirstOrDefault(t => t.HastaHaberes is null);
 0214            if (tramoResidual is null)
 215            {
 0216                resultado.Incidencias.Add(new IncidenciaBeneficio(
 0217                    TipoIncidenciaCalculo.InstructivoNoConfigurado,
 0218                    "Tabla Hogar Constituido no tiene tramo residual (sin tope)"));
 0219                return;
 220            }
 0221            monto = tramoResidual.Importe;
 0222            resultado.Incidencias.Add(new IncidenciaBeneficio(
 0223                TipoIncidenciaCalculo.CalculoSimplificado,
 0224                "Hogar Constituido calculado con tramo residual — el tramo real requiere ingreso acumulado del período")
 225        }
 6226        else if (tablaPorHogar is not null)
 227        {
 0228            resultado.Incidencias.Add(new IncidenciaBeneficio(
 0229                TipoIncidenciaCalculo.InstructivoNoConfigurado,
 0230                "Tabla Hogar Constituido no configurada para el período"));
 0231            return;
 232        }
 233        else
 234        {
 235            // Fallback a MontoReferencia cuando no hay tabla disponible
 6236            monto = beneficio.TipoBeneficio?.MontoReferencia ?? 0m;
 237        }
 238
 6239        if (monto == 0m)
 1240            return;
 241
 5242        var item = BuscarCatalogo(catalogo, 320);
 5243        if (item?.ClasificacionSiif is null)
 244        {
 1245            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1246                TipoIncidenciaCalculo.CatalogoItemNoConfigurado,
 1247                "Ítem de catálogo para Hogar Constituido (código 320) no configurado — verifique catálogo de ítems"));
 1248            return;
 249        }
 4250        resultado.Items.Add(new ItemBeneficioCalculado(
 4251            CodigoConcepto: 320,
 4252            NombreConcepto: item.Nombre,
 4253            Importe: monto,
 4254            ClasificacionSiif: "BenSocGrav",
 4255            RubroContable: item.ClasificacionSiif));
 4256    }
 257
 258    // ── Prima Solidaria Familiar ───────────────────────────────────────────────
 259
 260    private static void CalcularPsf(
 261        BeneficioSocial beneficio,
 262        IReadOnlyList<CatalogoItem> catalogo,
 263        ResultadoBeneficios resultado,
 264        IReadOnlyDictionary<int, InstructivoPsf>? instructivoPsf)
 265    {
 10266        var categoria = (int)beneficio.Cantidad;
 267
 10268        if (categoria < 1 || categoria > 5)
 269        {
 2270            resultado.Incidencias.Add(new IncidenciaBeneficio(
 2271                TipoIncidenciaCalculo.SubtipoPsfDesconocido,
 2272                $"Categoría PSF no reconocida: Cantidad={beneficio.Cantidad} (debe ser 1-5)"));
 2273            return;
 274        }
 275
 276        decimal monto;
 8277        if (instructivoPsf is not null && instructivoPsf.TryGetValue(categoria, out var registro))
 278        {
 7279            monto = registro.Importe;
 280        }
 1281        else if (instructivoPsf is not null)
 282        {
 1283            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1284                TipoIncidenciaCalculo.InstructivoNoConfigurado,
 1285                $"Instructivo PSF categoría {categoria} no configurado para el período"));
 1286            return;
 287        }
 288        else
 289        {
 290            // Fallback a MontoReferencia × Cantidad cuando no hay instructivo
 0291            monto = categoria * (beneficio.TipoBeneficio?.MontoReferencia ?? 0m);
 292        }
 293
 7294        if (monto == 0m)
 0295            return;
 296
 7297        var item = BuscarCatalogo(catalogo, 330);
 7298        if (item?.ClasificacionSiif is null)
 299        {
 1300            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1301                TipoIncidenciaCalculo.CatalogoItemNoConfigurado,
 1302                "Ítem de catálogo para Prima Solidaria Familiar (código 330) no configurado — verifique catálogo de ítem
 1303            return;
 304        }
 6305        resultado.Items.Add(new ItemBeneficioCalculado(
 6306            CodigoConcepto: 330,
 6307            NombreConcepto: item.Nombre,
 6308            Importe: monto,
 6309            ClasificacionSiif: "BenSocGrav",
 6310            RubroContable: item.ClasificacionSiif));
 6311    }
 312
 313    // ── Prima Nacimiento ──────────────────────────────────────────────────────
 314
 315    private static void CalcularPrimaNacimiento(
 316        BeneficioSocial beneficio,
 317        IReadOnlyList<CatalogoItem> catalogo,
 318        List<LiquidacionItem> historicos,
 319        ResultadoBeneficios resultado)
 320    {
 321        // Deduplicar por ClaveEvento (fecha de nacimiento) para permitir primas de hijos diferentes
 4322        var claveNacimiento = beneficio.ClaveEvento;
 4323        var nacimientoPagado = claveNacimiento is not null
 0324            ? historicos.Any(h => h.CodigoConcepto == "340" && h.ClaveEvento == claveNacimiento)
 5325            : historicos.Any(h => h.CodigoConcepto == "340");
 326
 4327        if (nacimientoPagado)
 328        {
 1329            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1330                TipoIncidenciaCalculo.BeneficioYaPagado,
 1331                $"Prima Nacimiento ya pagada{(claveNacimiento is not null ? $" (nacimiento {claveNacimiento})" : "")}"))
 1332            return;
 333        }
 334
 3335        var monto = beneficio.TipoBeneficio?.MontoReferencia ?? 0m;
 3336        if (monto == 0m)
 337        {
 0338            resultado.Incidencias.Add(new IncidenciaBeneficio(
 0339                TipoIncidenciaCalculo.InstructivoNoConfigurado,
 0340                "Monto de Prima Nacimiento no configurado en catálogo de tipos de beneficio"));
 0341            return;
 342        }
 343
 3344        var item = BuscarCatalogo(catalogo, 340);
 3345        if (item?.ClasificacionSiif is null)
 346        {
 1347            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1348                TipoIncidenciaCalculo.CatalogoItemNoConfigurado,
 1349                "Ítem de catálogo para Prima por Nacimiento (código 340) no configurado — verifique catálogo de ítems"))
 1350            return;
 351        }
 2352        resultado.Items.Add(new ItemBeneficioCalculado(
 2353            CodigoConcepto: 340,
 2354            NombreConcepto: item.Nombre,
 2355            Importe: monto,
 2356            ClasificacionSiif: "BenSocNoGrav",
 2357            RubroContable: item.ClasificacionSiif,
 2358            ClaveEvento: beneficio.ClaveEvento));
 2359    }
 360
 361    // ── Prima Matrimonio ──────────────────────────────────────────────────────
 362
 363    private static void CalcularPrimaMatrimonio(
 364        BeneficioSocial beneficio,
 365        IReadOnlyList<CatalogoItem> catalogo,
 366        List<LiquidacionItem> historicos,
 367        ResultadoBeneficios resultado)
 368    {
 4369        var claveEvento = beneficio.ClaveEvento;
 4370        var yaProcessada = claveEvento is not null
 1371            ? historicos.Any(h => h.CodigoConcepto == "350" && h.ClaveEvento == claveEvento)
 4372            : historicos.Any(h => h.CodigoConcepto == "350");
 373
 4374        if (yaProcessada)
 375        {
 1376            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1377                TipoIncidenciaCalculo.BeneficioYaPagado,
 1378                $"Prima Matrimonio ya pagada{(claveEvento is not null ? $" (evento {claveEvento})" : "")}"));
 1379            return;
 380        }
 381
 3382        var monto = beneficio.TipoBeneficio?.MontoReferencia ?? 0m;
 3383        if (monto == 0m)
 384        {
 0385            resultado.Incidencias.Add(new IncidenciaBeneficio(
 0386                TipoIncidenciaCalculo.InstructivoNoConfigurado,
 0387                "Monto de Prima Matrimonio no configurado en catálogo de tipos de beneficio"));
 0388            return;
 389        }
 390
 3391        var item = BuscarCatalogo(catalogo, 350);
 3392        if (item?.ClasificacionSiif is null)
 393        {
 1394            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1395                TipoIncidenciaCalculo.CatalogoItemNoConfigurado,
 1396                "Ítem de catálogo para Prima por Matrimonio (código 350) no configurado — verifique catálogo de ítems"))
 1397            return;
 398        }
 2399        resultado.Items.Add(new ItemBeneficioCalculado(
 2400            CodigoConcepto: 350,
 2401            NombreConcepto: item.Nombre,
 2402            Importe: monto,
 2403            ClasificacionSiif: "BenSocNoGrav",
 2404            RubroContable: item.ClasificacionSiif,
 2405            ClaveEvento: claveEvento));
 2406    }
 407
 408    // ── Prima Traslado ────────────────────────────────────────────────────────
 409
 410    private static void CalcularPrimaTraslado(
 411        BeneficioSocial beneficio,
 412        IReadOnlyList<CatalogoItem> catalogo,
 413        List<LiquidacionItem> historicos,
 414        ResultadoBeneficios resultado,
 415        decimal? sueldoBase)
 416    {
 417        // Deduplicar: prima de única vez por evento (ClaveEvento = fecha presentación "yyyy-MM-dd")
 6418        var claveEvento = beneficio.ClaveEvento;
 6419        var yaPagada = claveEvento is not null
 1420            ? historicos.Any(h => h.CodigoConcepto == "370" && h.ClaveEvento == claveEvento)
 6421            : historicos.Any(h => h.CodigoConcepto == "370");
 422
 6423        if (yaPagada)
 424        {
 1425            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1426                TipoIncidenciaCalculo.BeneficioYaPagado,
 1427                $"Prima Traslado ya pagada{(claveEvento is not null ? $" (evento {claveEvento})" : "")}"));
 1428            return;
 429        }
 430
 5431        if (sueldoBase is null || sueldoBase == 0m)
 432        {
 1433            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1434                TipoIncidenciaCalculo.InstructivoNoConfigurado,
 1435                "No se pudo calcular el sueldo base para Prima Traslado — verifique remuneraciones del grado en el perío
 1436            return;
 437        }
 438
 439        // Subtipo almacena la modalidad: "CON_FAMILIA" o "SIN_FAMILIA"
 4440        var modalidad = (beneficio.Subtipo ?? "").ToUpperInvariant().Trim();
 4441        decimal porcentaje = modalidad == "CON_FAMILIA" ? 0.40m : 0.20m;
 442
 4443        var monto = Math.Round(sueldoBase.Value * porcentaje, 2);
 4444        if (monto == 0m)
 0445            return;
 446
 4447        var item = BuscarCatalogo(catalogo, 370);
 4448        if (item?.ClasificacionSiif is null)
 449        {
 1450            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1451                TipoIncidenciaCalculo.CatalogoItemNoConfigurado,
 1452                "Ítem de catálogo para Prima por Traslado (código 370) no configurado — verifique catálogo de ítems"));
 1453            return;
 454        }
 3455        resultado.Items.Add(new ItemBeneficioCalculado(
 3456            CodigoConcepto: 370,
 3457            NombreConcepto: item.Nombre,
 3458            Importe: monto,
 3459            ClasificacionSiif: "066.000",
 3460            RubroContable: item.ClasificacionSiif,
 3461            ClaveEvento: claveEvento));
 3462    }
 463
 464    // ── Combo Nacimiento/Matrimonio ───────────────────────────────────────────
 465
 466    private static void CalcularPrimaNacimientoMatrimonioCombo(
 467        BeneficioSocial beneficio,
 468        IReadOnlyList<CatalogoItem> catalogo,
 469        List<LiquidacionItem> historicos,
 470        ResultadoBeneficios resultado)
 471    {
 0472        var subtipo = beneficio.Subtipo?.ToUpperInvariant().Trim();
 0473        if (subtipo == "NACIMIENTO")
 0474            CalcularPrimaNacimiento(beneficio, catalogo, historicos, resultado);
 0475        else if (subtipo == "MATRIMONIO")
 0476            CalcularPrimaMatrimonio(beneficio, catalogo, historicos, resultado);
 477        else
 0478            resultado.Incidencias.Add(new IncidenciaBeneficio(
 0479                TipoIncidenciaCalculo.TipoBeneficioDesconocido,
 0480                "Tipo PRIMA_NACIMIENTO_MATRIMONIO requiere campo Subtipo con valor 'NACIMIENTO' o 'MATRIMONIO'"));
 0481    }
 482
 483    // ── Helpers ───────────────────────────────────────────────────────────────
 484
 485    private static void RegistrarRetroactividadSiCorresponde(
 486        BeneficioSocial beneficio,
 487        DateOnly primerDiaPeriodo,
 488        ResultadoBeneficios resultado)
 489    {
 41490        if (!beneficio.RetroactividadPendiente)
 40491            return;
 492
 1493        var vigenteDesde = DateOnly.FromDateTime(beneficio.VigenteDesde);
 1494        if (vigenteDesde < primerDiaPeriodo)
 495        {
 1496            resultado.Incidencias.Add(new IncidenciaBeneficio(
 1497                TipoIncidenciaCalculo.BeneficioRetroactivoPendiente,
 1498                $"Beneficio retroactivo desde {vigenteDesde:yyyy-MM-dd} — requiere cálculo retro"));
 499        }
 1500    }
 501
 502    private static CatalogoItem? BuscarCatalogo(IReadOnlyList<CatalogoItem> catalogo, int codigo)
 109503        => catalogo.FirstOrDefault(c => c.Codigo == codigo);
 504
 505    private static CategoriaBeneficio DeterminarCategoria(TipoBeneficio tipo)
 506    {
 41507        var codigo = tipo.Codigo.ToUpperInvariant().Trim();
 41508        var nombre = tipo.Nombre.ToUpperInvariant().Trim();
 509
 41510        if (codigo is "ASIGNACION_FAMILIAR" || codigo.StartsWith("300")
 41511            || nombre.Contains("ASIGNACION FAMILIAR") || nombre.Contains("ASIGNACIÓN FAMILIAR"))
 10512            return CategoriaBeneficio.AsignacionFamiliar;
 513
 31514        if (codigo is "HOGAR_CONSTITUIDO" || codigo == "320"
 31515            || nombre.Contains("HOGAR CONSTITUIDO") || nombre.Contains("HOGAR"))
 6516            return CategoriaBeneficio.HogarConstituido;
 517
 25518        if (codigo is "PRIMA_SOLIDARIA_FAMILIAR" || codigo == "330"
 25519            || nombre.Contains("SOLIDARIA") || nombre.Contains("PSF"))
 10520            return CategoriaBeneficio.PrimaSolidariaFamiliar;
 521
 15522        if (codigo is "PRIMA_NACIMIENTO" || codigo == "340"
 15523            || (nombre.Contains("NACIMIENTO") && !nombre.Contains("MATRIMONIO")))
 4524            return CategoriaBeneficio.PrimaNacimiento;
 525
 11526        if (codigo is "PRIMA_MATRIMONIO" || codigo == "350"
 11527            || (nombre.Contains("MATRIMONIO") && !nombre.Contains("NACIMIENTO")))
 4528            return CategoriaBeneficio.PrimaMatrimonio;
 529
 7530        if (codigo is "PRIMA_NACIMIENTO_MATRIMONIO"
 7531            || (nombre.Contains("NACIMIENTO") && nombre.Contains("MATRIMONIO")))
 0532            return CategoriaBeneficio.PrimaNacimientoMatrimonioCombo;
 533
 7534        if (codigo is "PRIMA_TRASLADO" || nombre.Contains("TRASLADO"))
 6535            return CategoriaBeneficio.PrimaTraslado;
 536
 1537        return CategoriaBeneficio.Desconocido;
 538    }
 539}

Methods/Properties

ProcesarBeneficios(System.Int64,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.BeneficioSocial>,FAU.Entidades.ParametroPeriodo,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.CatalogoItem>,System.Collections.Generic.IEnumerable`1<FAU.Entidades.LiquidacionItem>,System.DateOnly,System.Collections.Generic.IReadOnlyDictionary`2<System.Int64,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.BeneficioSocialBeneficiario>>,System.Collections.Generic.IReadOnlyDictionary`2<System.String,FAU.Entidades.InstructivoAsigFamiliar>,System.Collections.Generic.IReadOnlyDictionary`2<System.Int32,FAU.Entidades.InstructivoPsf>,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.TablaHogarConstituido>,System.Nullable`1<System.Decimal>)
CalcularAsigFamiliar(FAU.Entidades.BeneficioSocial,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.CatalogoItem>,FAU.Logica.DTOs.ResultadoBeneficios,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.BeneficioSocialBeneficiario>,System.DateOnly,System.Collections.Generic.IReadOnlyDictionary`2<System.String,FAU.Entidades.InstructivoAsigFamiliar>)
CalcularHogar(FAU.Entidades.BeneficioSocial,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.CatalogoItem>,FAU.Logica.DTOs.ResultadoBeneficios,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.TablaHogarConstituido>)
CalcularPsf(FAU.Entidades.BeneficioSocial,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.CatalogoItem>,FAU.Logica.DTOs.ResultadoBeneficios,System.Collections.Generic.IReadOnlyDictionary`2<System.Int32,FAU.Entidades.InstructivoPsf>)
CalcularPrimaNacimiento(FAU.Entidades.BeneficioSocial,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.CatalogoItem>,System.Collections.Generic.List`1<FAU.Entidades.LiquidacionItem>,FAU.Logica.DTOs.ResultadoBeneficios)
CalcularPrimaMatrimonio(FAU.Entidades.BeneficioSocial,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.CatalogoItem>,System.Collections.Generic.List`1<FAU.Entidades.LiquidacionItem>,FAU.Logica.DTOs.ResultadoBeneficios)
CalcularPrimaTraslado(FAU.Entidades.BeneficioSocial,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.CatalogoItem>,System.Collections.Generic.List`1<FAU.Entidades.LiquidacionItem>,FAU.Logica.DTOs.ResultadoBeneficios,System.Nullable`1<System.Decimal>)
CalcularPrimaNacimientoMatrimonioCombo(FAU.Entidades.BeneficioSocial,System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.CatalogoItem>,System.Collections.Generic.List`1<FAU.Entidades.LiquidacionItem>,FAU.Logica.DTOs.ResultadoBeneficios)
RegistrarRetroactividadSiCorresponde(FAU.Entidades.BeneficioSocial,System.DateOnly,FAU.Logica.DTOs.ResultadoBeneficios)
BuscarCatalogo(System.Collections.Generic.IReadOnlyList`1<FAU.Entidades.CatalogoItem>,System.Int32)
DeterminarCategoria(FAU.Entidades.TipoBeneficio)