< Summary

Information
Class: FAU.Logica.Importadores.DescuentoPersonalTxtFila
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Importadores/DescuentoPersonalTxtLineParser.cs
Line coverage
100%
Covered lines: 1
Uncovered lines: 0
Coverable lines: 1
Total lines: 72
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_NumeroLinea()100%11100%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Importadores/DescuentoPersonalTxtLineParser.cs

#LineLine coverage
 1namespace FAU.Logica.Importadores;
 2
 3/// <summary>
 4/// Fila parseada de un archivo de ancho fijo (formato legacy FoxPro) de descuentos personales.
 5/// </summary>
 696public sealed record DescuentoPersonalTxtFila(int NumeroLinea, int CodigoConcepto, string CedulaSinDigito, decimal Impor
 7
 8/// <summary>
 9/// Parsea líneas de ancho fijo (25 caracteres) enviadas por los acreedores para la carga
 10/// masiva de descuentos personales. Layout: [0,2) indicador literal "01",
 11/// [2,6) código de descuento (4 dígitos), [6,13) cédula sin dígito verificador (7 dígitos),
 12/// [13,25) importe*100 zero-padded (los últimos 2 dígitos son los decimales).
 13/// </summary>
 14public static class DescuentoPersonalTxtLineParser
 15{
 16    private const int LargoLinea = 25;
 17    private const string IndicadorEsperado = "01";
 18
 19    public static bool TryParse(string linea, int numeroLinea, out DescuentoPersonalTxtFila? fila, out string? error)
 20    {
 21        fila = null;
 22        error = null;
 23
 24        var contenido = linea.TrimEnd('\r', '\n');
 25
 26        if (contenido.Length != LargoLinea)
 27        {
 28            error = $"Longitud de línea inválida (esperado {LargoLinea}, recibido {contenido.Length}).";
 29            return false;
 30        }
 31
 32        var indicador = contenido.Substring(0, 2);
 33        if (indicador != IndicadorEsperado)
 34        {
 35            error = $"Indicador de registro '{indicador}' no soportado (se esperaba '{IndicadorEsperado}').";
 36            return false;
 37        }
 38
 39        var codigoTexto = contenido.Substring(2, 4);
 40        if (!EsNumerico(codigoTexto))
 41        {
 42            error = $"El código de descuento '{codigoTexto}' no es numérico.";
 43            return false;
 44        }
 45
 46        var cedula = contenido.Substring(6, 7);
 47        if (!EsNumerico(cedula))
 48        {
 49            error = $"La cédula '{cedula}' no es numérica.";
 50            return false;
 51        }
 52
 53        var montoTexto = contenido.Substring(13, 12);
 54        if (!EsNumerico(montoTexto))
 55        {
 56            error = $"El importe '{montoTexto}' no es numérico.";
 57            return false;
 58        }
 59
 60        var importe = long.Parse(montoTexto) / 100m;
 61        if (importe <= 0)
 62        {
 63            error = "El importe debe ser mayor a cero.";
 64            return false;
 65        }
 66
 67        fila = new DescuentoPersonalTxtFila(numeroLinea, int.Parse(codigoTexto), cedula, importe);
 68        return true;
 69    }
 70
 71    private static bool EsNumerico(string texto) => texto.Length > 0 && texto.All(char.IsDigit);
 72}

Methods/Properties

get_NumeroLinea()