Commit Graph

217 Commits

Author SHA1 Message Date
a5fd3e90fb Merge branch 'main' into feature/UDT-011 2026-04-18 10:56:09 -03:00
b5ec0c25a9 fix(web/tests): alinear updateUserPermisosOverrides mock con UsuarioPermisos shape (TS2339) 2026-04-18 10:54:44 -03:00
a39427865f fix(web/tests): eliminar imports no usados en tests (TS6133) 2026-04-18 10:54:40 -03:00
202d267e16 fix(web): migrar SeccionForm a sintaxis Zod v4 (errorMap → error, coerce.number<number>()) 2026-04-18 10:54:28 -03:00
8b369b69ee fix(web): migrar MedioForm a sintaxis Zod v4 (TS2322 — coerce.number<number>()) 2026-04-18 10:54:23 -03:00
d16da502f4 fix(web): corregir import type-only de ButtonProps en pagination.tsx (TS1484) 2026-04-18 10:54:19 -03:00
ef4b02be3b fix(web/udt-011): AuditFilters datetime-local usa parseArgentinaDateTimeToUtc (fix BUG-FE-05) 2026-04-18 10:26:56 -03:00
03a02c63d5 refactor(web/udt-011): eliminar 4 funciones formatDate duplicadas y formatOccurredAt, usar dateFormat utility (fix BUG-FE-01, BUG-FE-02) 2026-04-18 10:26:29 -03:00
71d0928389 fix(web/udt-011): NuevaVigenciaModal preview usa prevCivilDate+formatCivilDate sin Date() (fix BUG-FE-04) 2026-04-18 10:24:15 -03:00
20b5863908 fix(web/udt-011): IngresosBrutosFormModal default vigenciaDesde usa todayArgentina 2026-04-18 10:22:47 -03:00
7e23a16062 fix(web/udt-011): TipoDeIvaFormModal default vigenciaDesde usa todayArgentina (fix BUG-FE-03) 2026-04-18 10:22:43 -03:00
2ea7678129 feat(web/udt-011): dateFormat.ts utility (formatInstant, formatCivilDate, todayArgentina, etc.) 2026-04-18 10:17:47 -03:00
bc3e5d99a1 test(web/udt-011): dateFormat.ts utility tests (Red — 6 funciones + edge cases) 2026-04-18 10:17:43 -03:00
a9838427a4 feat(udt-011): T400.30 — inject TimeProvider into Infrastructure critical services
AuditLogger, SecurityEventLogger: inject TimeProvider and use
_timeProvider.GetUtcNow().UtcDateTime for occurredAt timestamps.
JwtService: inject TimeProvider; use GetUtcNow() for token IssuedAt/Expires.
DI: update JwtService factory to pass sp.GetRequiredService<TimeProvider>().
Repositories: remove ?? DateTime.UtcNow fallback in UpdateAsync since callers
always provide FechaModificacion via domain mutators.
2026-04-18 10:12:24 -03:00
d69da5ff4c feat(udt-011): T400.10 — inject TimeProvider into all Application handlers
All command handlers that call domain mutators now inject TimeProvider
via constructor and use _timeProvider.GetUtcNow().UtcDateTime as the
explicit 'now' argument. Replaces previous direct DateTime.UtcNow usage.
2026-04-18 10:12:17 -03:00
4e1d8f69ab feat(udt-011): T400.20 — domain mutators accept explicit DateTime now param
Remove DateTime.UtcNow calls from all With*/Deactivate/Reactivate/
CerrarVigencia/NuevaVersion domain methods. Caller (Application layer)
is now responsible for passing the UTC timestamp obtained via
_timeProvider.GetUtcNow().UtcDateTime.
2026-04-18 10:12:03 -03:00
3c264aa7a1 chore(udt-011): register DateOnlyJsonConverter in Program.cs AddJsonOptions 2026-04-18 09:47:19 -03:00
a75d2f75a0 feat(udt-011): DateOnlyJsonConverter as yyyy-MM-dd 2026-04-18 09:47:16 -03:00
54d2340bb9 feat(udt-011): register TimeProvider.System in AddApplication DI 2026-04-18 09:44:21 -03:00
4e70b0f847 feat(udt-011): TimeProviderArgentinaExtensions.GetArgentinaToday cross-platform 2026-04-18 09:43:35 -03:00
0863ed8682 fix(web/adm-008): migrar PuntoDeVentaForm a sintaxis Zod v4 (closes #21) 2026-04-18 08:47:20 -03:00
30b55e60ea fix(web/adm-009): migrar componentes fiscales a sintaxis Zod v4 2026-04-18 08:37:10 -03:00
600ff52dd2 refactor(infra): eliminar LegacySeedMap/NormalizeUpperSnakeToPascal de IngresosBrutosRepository 2026-04-17 19:11:51 -03:00
4739e5cd46 chore(web): routes /admin/fiscal/iva y /admin/fiscal/iibb con permiso
Ambas rutas protegidas con requiredPermissions=['administracion:fiscal:gestionar'].
Integradas en ProtectedPage con MustChangePasswordGate y ProtectedLayout.
2026-04-17 18:56:02 -03:00
a3a15a4118 test+feat(web/adm-009): iibb subfeature mirror de iva
Types (ProvinciaArgentina 24 valores + PROVINCIA_DISPLAY), iibbApi.ts,
useIngresosBrutos hooks, tabla con columna Provincia, FormModal sin Alicuota
en edit [REQ-UI-007], NuevaVigenciaIibbModal con preview, TiposDeIibbPage con
banner. 8 tests RTL pasan (iibb). Total fiscal: 47/47 tests.
2026-04-17 18:55:57 -03:00
fcd34081d2 test+feat(web/adm-009): TiposDeIvaPage con banner + tabla + modales
Banner advertencia visible al mount con tokens warning-bg/warning-border [REQ-UI-005].
Filtros por codigo y activo. Paginacion server-side. Modales create/edit/nueva-version
controlados por estado local. 12 tests RTL pasan.
2026-04-17 18:55:49 -03:00
88274a9f10 test+feat(web/adm-009): NuevaVigenciaModal con preview de fechas
Preview en tiempo real: nuevo porcentaje, fecha cierre = vigenciaDesde-1d.
Banner warning con tokens DS. Boton disabled si form invalido [REQ-UI-004].
7 tests RTL pasan incluyendo verificacion de fecha cierre correcta.
2026-04-17 18:55:44 -03:00
038a2ade70 test+feat(web/adm-009): TipoDeIvaFormModal sin campo Porcentaje
Modal de edicion solo cosmeticos (Codigo, Descripcion, AplicaIVA, Activo).
Campo Porcentaje ausente en modo edit — verificado con queryByLabelText null [REQ-UI-003].
Modo create incluye Porcentaje inicial + VigenciaDesde. 10 tests RTL pasan.
2026-04-17 18:55:38 -03:00
8ffee0dbe4 test+feat(web/adm-009): TipoDeIvaTable con acciones y paginacion
Columnas: Codigo, Descripcion, Porcentaje%, Vigencia (abierta si null),
Estado (badge), Version con HistorialCadenaTooltip lazy. Acciones: editar,
nueva vigencia, deactivate/reactivate toggle. 10 tests RTL pasan.
2026-04-17 18:55:33 -03:00
95432e843f feat(web/adm-009): hooks TanStack Query para fiscal IVA
useTiposDeIvaList, useTipoDeIva, useHistorialTipoDeIva (lazy enable),
mutations con invalidateQueries. staleTime: 15_000 en todas las queries.
Query keys estables: ['fiscal', 'iva', ...].
2026-04-17 18:55:25 -03:00
ea16d57646 feat(web/adm-009): types y api client para fiscal IVA
TipoDeIva types (UpdateRequest sin Porcentaje), ivaApi.ts con 8 endpoints,
ApiError contract { error, message } alineado con backend ADM-009.
2026-04-17 18:55:21 -03:00
9c05167788 chore(web): agregar tokens warning-bg y warning-border al Design System
Tokens usados en banner de advertencia fiscal (ADM-009). Incluye variante
light (amber claro) y dark (amber oscuro), mapeados en @theme inline de Tailwind.
2026-04-17 18:55:16 -03:00
3eda59f5aa feat(adm-009): ExceptionFilter mapping for fiscal exceptions ({error, message} unified) 2026-04-17 18:40:05 -03:00
b1a461b6cb feat(adm-009): FiscalController with raw-body Porcentaje/Alicuota defense 2026-04-17 18:40:02 -03:00
25407583eb feat(adm-009): Fiscal API DTOs (requests + responses + mapper) 2026-04-17 18:39:58 -03:00
83dd680fa3 feat(adm-009): TipoDeIvaRepository + IngresosBrutosRepository Dapper implementations + DI registration 2026-04-17 18:23:10 -03:00
bd0c4deea7 feat(adm-009): TipoDeIva + IngresosBrutos handlers, DTOs, DI registration 2026-04-17 18:09:52 -03:00
eead0a35cd feat(adm-009): ITipoDeIvaRepository + IIngresosBrutosRepository abstractions 2026-04-17 18:09:36 -03:00
1d051c93d6 feat(adm-009): Permiso.AdministracionFiscalGestionar constant 2026-04-17 17:53:17 -03:00
f267e4f427 feat(adm-009): domain exceptions for fiscal entities 2026-04-17 17:52:57 -03:00
088f2303c1 feat(adm-009): IngresosBrutos sealed entity mirror of TipoDeIva 2026-04-17 17:51:52 -03:00
f307306f91 feat(adm-009): TipoDeIva sealed entity with factories 2026-04-17 17:49:07 -03:00
98a4fea7c4 feat(adm-009): ProvinciaArgentina enum with display mapping 2026-04-17 17:47:22 -03:00
6be637b4cf revert(web): eliminar feature de reserva de numero en UI ADM-008
Eliminar secuencias.api.ts, useReservarNumero.ts, SecuenciasPanel.tsx,
TipoComprobante enum y tipos ReservarNumeroResponse/ProximoNumeroResponse.
Quitar SecuenciasPanel del PuntoDeVentaDetailPage.
2026-04-17 14:16:14 -03:00
7d432a949a revert(backend): eliminar handlers/endpoints/excepciones de reserva de numero ADM-008
Eliminar SecuenciaComprobante entity, TipoComprobante enum, DeadlockTransientException,
PuntoDeVentaInactivoException, carpetas Reservar/ y ProximoNumero/ de Application,
métodos ReservarNumeroAsync/GetUltimoNumeroAsync del repositorio, endpoints
POST /secuencias/.../reservar y GET /secuencias/.../proximo del controller,
y mapping PuntoDeVentaInactivoException del ExceptionFilter.
2026-04-17 14:16:09 -03:00
9263d9a178 feat(web): panel de reserva de numeros en PdV detail (ADM-008)
Gap detectado durante smoke: la DetailPage tenia los hooks
useReservarNumero/useProximoNumero creados en Batch 6 pero faltaba
el componente que los consume.

SecuenciasPanel.tsx: tabla con los 6 tipos AFIP (FacturaA/B/C, NC A/B/C),
proximo numero por tipo, boton Reservar. Toast con el numero reservado.
Deshabilitado si PdV o Medio padre estan inactivos.

Integrado en PuntoDeVentaDetailPage bajo guard de permiso.
2026-04-17 13:38:21 -03:00
65787db272 fix(adm-008): correcciones del verify loop
Seis ajustes post-verify detectados durante la corrida full de tests:

1. PuntoDeVentaRepository: UQ_PuntoDeVenta_Medio_AFIP (no _MedioId_NumeroAFIP)
   — el catch de unique violation no disparaba → 500 en race duplicado.

2. Application.DependencyInjection: registro de 8 handlers PuntosDeVenta
   — sin esto, dispatcher arrojaba "No service registered" → 500.

3. ReservarNumeroCommandHandler: backoff ampliado a 5 retries
   [25, 75, 200, 500, 1200]ms para soportar 50 threads concurrentes.

4. SecuenciaComprobante: SYSTEM_VERSIONING = OFF (AD8 revisitado).
   Under UPDATE concurrente sobre misma fila, el engine arroja
   "transaction time earlier than period start time" — limitación
   conocida de Temporal Tables con alta contención de UPDATEs.
   Decisión: secuencia es operacional, no configuración → sin history.
   V013 y SqlTestFixture actualizados para ser idempotentes.

5. SqlTestFixture: EnsureV013SchemaAsync idempotente + PuntoDeVenta_History
   en TablesToIgnore + permiso administracion:puntos_de_venta:gestionar
   en seed canónico + asignación a rol admin.

6. Tests: conteos 22→23 permisos (V013 agrega uno); repository fixtures
   ignoran PuntoDeVenta_History; test UpdatePdv_WhenPdvInactive eliminado
   (over-specified — spec no bloquea update en PdV inactivo, solo en Medio
   padre inactivo; alineado con frontend que permite editar PdV inactivo).

Resultado: 190/190 Api.Tests y tests específicos ADM-008 verdes
(Domain 13, Application 42, Api 21 = 76 tests nuevos). El único failure
residual (AuditEventRepositoryTests.QueryAsync_Limit_EmitsCursor) es
pre-existente y no relacionado a ADM-008.

Covers: verify report CRITICAL (UQ name mismatch) + WARNINGs descubiertos
durante la ejecución (DI registro, temporal tables concurrency, permiso
fixture, counts de tests pre-existentes).
2026-04-17 13:02:35 -03:00
4720f6772f test(web): component tests puntos-de-venta 2026-04-17 12:36:53 -03:00
056045232c feat(web): banners y routing puntos-de-venta 2026-04-17 12:36:48 -03:00
4b96cdefcc feat(web): tabla y form PuntosDeVenta 2026-04-17 12:36:44 -03:00