UDT-011: Localización Temporal Argentina (infra transversal) #25
Reference in New Issue
Block a user
Delete Branch "feature/UDT-011"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
UDT-011: Localización Temporal Argentina
Resumen
Fix transversal cross-layer del manejo de fechas y zonas horarias en SIG-CM2.0. Introduce el estándar Cat1/Cat2 (instantes UTC vs fechas civiles argentinas), el patrón
TimeProviderinyectado en backend, la utilitydateFormat.tsen frontend, las vistas SQLv_*_Localpara queries admin, y la regla automática prescriptiva (4 artefactos). Cierra 5 bugs de frontend con impacto fiscal/legal.Bugs fixeados
AuditPage.tsxusabaformatOccurredAtlocal sintimeZone— display incorrecto en UTC+xformatInstant()de@/lib/dateFormatUsersTable,MedioDetailPage,SeccionDetailPage,PuntoDeVentaDetailPage— 4 funcionesformatDate()locales duplicadas sin TZformatInstantOrDash()TipoDeIvaFormModal+IngresosBrutosFormModal—vigenciaDesdedefaulteaba a string vacío en vez de hoy AR → vigencia incorrecta si se cargaba a las 22:30 ARTtodayArgentina()endefaultValuesyresetcreateNuevaVigenciaModal+NuevaVigenciaIibbModal—fechaCierre()usabanew Date().toISOString().slice(0,10)→ UTC creep, mostraba día anteriorprevCivilDate()+formatCivilDate()sinnew Date()AuditFilters—datetime-localinput convertía a UTC contoISOString()→ filtro con offset incorrectoparseArgentinaDateTimeToUtc()entoApiFilterDecisiones arquitectónicas clave
TimeProvider inyectado —
TimeProvider(built-in .NET 8+) registrado como singleton en DI. Todos los handlers/infra/domain recibenTimeProviderpor constructor.DateTime.UtcNowinline eliminado. Tests usanFakeTimeProvider(NuGetMicrosoft.Extensions.TimeProvider.Testing).DateOnly Cat1/Cat2 — Backend:
DateTimeKind=Utc para Cat1,DateOnlypara Cat2.DateOnlyJsonConverterregistrado globalmente (yyyy-MM-dd). Frontend sabe que fechas sinZson Cat2 y NO deben pasar pornew Date().dateFormat.tsutility — Único lugar del proyecto que formatea/parsea fechas en frontend. Exports:AR_TZ,formatInstant,formatInstantOrDash,formatCivilDate,formatCivilDateRange,todayArgentina,parseCivilDate,prevCivilDate,parseArgentinaDateTimeToUtc.Vistas V015 —
dbo.v_AuditEvent_Localydbo.v_SecurityEvent_LocalenSIGCM2_Test. Aditivas (no rompen schema). Para queries admin en SSMS sin conversión manual.Regla automática 4 artefactos —
2.17 ⏰ Localización Temporal Argentina.md+ sección⏰ REGLA DE FECHAS Y ZONAS HORARIASenINSTRUCCIONES_IA.md+sig-cm2/conventions/fechas-timezonesen engram + sección### Fechas y zonas horariasen skill-registry compact rules.Scope
IN:
OUT (explícitamente fuera de scope):
Tests
Baseline final: 1237/1237 (298 FE + 709 App + 230 Api)
Tests nuevos escritos en UDT-011:
V015MigrationTests.cs— 5 tests (vistas timezone)TimeProviderArgentinaExtensionsTests.cs— 4 testsDateOnlyJsonConverterTests.cs— 4 unit + 1 integrationdateFormat.test.ts— 21 tests (14 originales + 7 nuevos funciones extra)TipoDeIvaFormModal.test.tsx— BUG-FE-03 regressionIngresosBrutosFormModal.test.tsx— BUG-FE-03 regressionAcción requerida del reviewer
dbo.v_AuditEvent_Localodbo.v_SecurityEvent_Localen SSMS local, debés aplicar V015 manualmente:Follow-ups
followup):NestedJobSchedulerService,AuditMaintenanceJob, ySecurityEventMaintenanceJobaún usanDateTime.UtcNowinline. UDT-011 NO cierra el #24. Requiere análisis adicional (QuartzIJobExecutionContextno inyectaTimeProviderdirectamente).Artefactos SDD (engram, project: sig-cm2)
sdd/udt-011-localizacion-temporal-argentina/exploresdd/udt-011-localizacion-temporal-argentina/proposalsdd/udt-011-localizacion-temporal-argentina/specsdd/udt-011-localizacion-temporal-argentina/designsdd/udt-011-localizacion-temporal-argentina/taskssdd/udt-011-localizacion-temporal-argentina/apply-progresssdd/udt-011-localizacion-temporal-argentina/pr-bodysig-cm2/conventions/fechas-timezonesMétricas
d4b2183)Smoke E2E ejecutado
Smoke corrido el 2026-04-18 contra
http://localhost:5212(SIGCM2 local) con credenciales admin válidas.POST /api/v1/auth/loginGET /api/v1/admin/fiscal/ivavigenciaDesde: "2026-04-18"✅ Cat2 sin sufijoPOST /api/v1/admin/fiscal/iva(IVA_135, 13.5%)vigenciaDesde: "2026-04-18"✅POST /api/v1/admin/fiscal/iva/7/nueva-version(14%, 2026-05-02)GET /api/v1/admin/fiscal/iva/8/historialGET /api/v1/audit/events?limit=10tipo_iva.create(id=22) +tipo_iva.nueva_version(id=23) ✅GET http://localhost:5173/Verificación crítica DateOnlyJsonConverter (BUG-FE-03):
Formato
yyyy-MM-ddsinT, sinZ, sin offset. DateOnlyJsonConverter activo y funcionando.AuditEvent ejemplo (id=23):
v_AuditEvent_Local: No aplicada en SIGCM2 productivo local (solo en SIGCM2_Test). Ver instrucciones en sección "Acción requerida del reviewer".Build frontend (
npm run build): 25 errores TS preexistentes enmain(MedioForm, SeccionForm, pagination — deuda técnica anterior a UDT-011). UDT-011 no introduce ningún error TS nuevo. Diff de errores feature vs main: idénticos.