diff --git a/src/api/SIGCM2.Infrastructure/Persistence/IngresosBrutosRepository.cs b/src/api/SIGCM2.Infrastructure/Persistence/IngresosBrutosRepository.cs index f516f21..742dd20 100644 --- a/src/api/SIGCM2.Infrastructure/Persistence/IngresosBrutosRepository.cs +++ b/src/api/SIGCM2.Infrastructure/Persistence/IngresosBrutosRepository.cs @@ -12,9 +12,11 @@ namespace SIGCM2.Infrastructure.Persistence; /// /// Dapper implementation of . /// Provincia is persisted as the enum member name (PascalCase, e.g. "BuenosAires") via ToString(). -/// On read, it is parsed back via Enum.Parse<ProvinciaArgentina>. +/// On read, it is parsed back via Enum.Parse<ProvinciaArgentina> (strict PascalCase only). /// Alicuota and Provincia are NEVER updated by cosmetic methods. /// GetHistorialAsync uses a recursive CTE to walk the PredecesorId chain. +/// Note: As of V014 T700 cleanup, seed values are stored in PascalCase — legacy UPPER_SNAKE_CASE +/// support (LegacySeedMap / NormalizeUpperSnakeToPascal) has been removed. /// public sealed class IngresosBrutosRepository : IIngresosBrutosRepository { @@ -254,60 +256,19 @@ public sealed class IngresosBrutosRepository : IIngresosBrutosRepository /// /// Parses a Provincia string from DB to ProvinciaArgentina enum. - /// Handles both PascalCase (e.g. "BuenosAires" — written by this repo) and - /// UPPER_SNAKE_CASE legacy seed values (e.g. "BUENOS_AIRES" — written by V014 seed). - /// Strategy: try direct Enum.Parse first, then normalize UPPER_SNAKE_CASE → PascalCase. + /// Since T700 cleanup, the seed stores PascalCase values matching enum.ToString(). + /// All values written by this repo are also PascalCase. /// private static ProvinciaArgentina ParseProvincia(string value) { - // Fast path: PascalCase written by this repo (e.g. "BuenosAires") if (Enum.TryParse(value, ignoreCase: false, out var result)) return result; - // Slow path: UPPER_SNAKE_CASE from V014 seed (e.g. "BUENOS_AIRES" → "BuenosAires") - // Also handles CABA → CiudadAutonomaDeBuenosAires via explicit mapping - var normalized = NormalizeUpperSnakeToPascal(value); - if (Enum.TryParse(normalized, ignoreCase: false, out result)) - return result; - throw new ArgumentException( $"Cannot parse '{value}' as ProvinciaArgentina. " + - $"Expected PascalCase enum name (e.g. 'BuenosAires') or UPPER_SNAKE_CASE seed name (e.g. 'BUENOS_AIRES')."); + $"Expected PascalCase enum name (e.g. 'BuenosAires', 'CiudadAutonomaDeBuenosAires')."); } - // Maps UPPER_SNAKE_CASE seed values to PascalCase enum names. - // Explicit mappings for non-trivial conversions (CABA, multi-word with articles). - private static readonly Dictionary LegacySeedMap = new(StringComparer.Ordinal) - { - ["BUENOS_AIRES"] = nameof(ProvinciaArgentina.BuenosAires), - ["CABA"] = nameof(ProvinciaArgentina.CiudadAutonomaDeBuenosAires), - ["CATAMARCA"] = nameof(ProvinciaArgentina.Catamarca), - ["CHACO"] = nameof(ProvinciaArgentina.Chaco), - ["CHUBUT"] = nameof(ProvinciaArgentina.Chubut), - ["CORDOBA"] = nameof(ProvinciaArgentina.Cordoba), - ["CORRIENTES"] = nameof(ProvinciaArgentina.Corrientes), - ["ENTRE_RIOS"] = nameof(ProvinciaArgentina.EntreRios), - ["FORMOSA"] = nameof(ProvinciaArgentina.Formosa), - ["JUJUY"] = nameof(ProvinciaArgentina.Jujuy), - ["LA_PAMPA"] = nameof(ProvinciaArgentina.LaPampa), - ["LA_RIOJA"] = nameof(ProvinciaArgentina.LaRioja), - ["MENDOZA"] = nameof(ProvinciaArgentina.Mendoza), - ["MISIONES"] = nameof(ProvinciaArgentina.Misiones), - ["NEUQUEN"] = nameof(ProvinciaArgentina.Neuquen), - ["RIO_NEGRO"] = nameof(ProvinciaArgentina.RioNegro), - ["SALTA"] = nameof(ProvinciaArgentina.Salta), - ["SAN_JUAN"] = nameof(ProvinciaArgentina.SanJuan), - ["SAN_LUIS"] = nameof(ProvinciaArgentina.SanLuis), - ["SANTA_CRUZ"] = nameof(ProvinciaArgentina.SantaCruz), - ["SANTA_FE"] = nameof(ProvinciaArgentina.SantaFe), - ["SANTIAGO_DEL_ESTERO"] = nameof(ProvinciaArgentina.SantiagoDelEstero), - ["TIERRA_DEL_FUEGO"] = nameof(ProvinciaArgentina.TierraDelFuego), - ["TUCUMAN"] = nameof(ProvinciaArgentina.Tucuman), - }; - - private static string NormalizeUpperSnakeToPascal(string value) - => LegacySeedMap.TryGetValue(value, out var pascal) ? pascal : value; - private static bool IsUniqueViolation(SqlException ex) => ex.Number is 2627 or 2601;