ADM-009: Tablas Fiscales (IVA + IIBB) — append-only versioned ref data #22
Reference in New Issue
Block a user
Delete Branch "feature/ADM-009"
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?
Resumen
ADM-009 provee los maestros fiscales (
TipoDeIva,IngresosBrutos) que alimentan toda la cadena de facturación. Implementado con pattern append-only versioned ref data para garantizar trazabilidad fiscal correcta en NC/ND sobre facturas históricas.Scope (in)
BD — Migración V014
TipoDeIva+IngresosBrutoscon Temporal Tables (SYSTEM_VERSIONING + retention 10 años).PredecesorId INT NULLcon FK self para cadena de versiones.administracion:fiscal:gestionar+ asignación a roladmin.Backend — Clean Architecture
NuevaVersion()retorna tupla(predecesora cerrada, nueva).Porcentaje/AlicuotaINMUTABLES (no hayWithPorcentaje).TransactionScope(ReadCommitted, AsyncFlow)+IAuditLoggerfail-closed.OUTPUT INSERTED.Id, CTE recursivo conOPTION (MAXRECURSION 100)para historial, guard optimisticWHERE VigenciaHasta IS NULLen cierre de vigencia.FiscalControllercon 16 endpoints (/api/v1/admin/fiscal/{iva,iibb}/*), defensa raw-body en PATCH contraPorcentaje/Alicuota, ExceptionFilter con contrato unificado{ error, message }.Frontend — Feature-sliced
src/web/src/features/fiscal/{iva,iibb}/con TanStack Query (staleTime: 15_000) + react-hook-form + zod v4.--warning-bg+--warning-borderagregados al Design System (v2.5).Scope (out — explícito)
Porcentajeen Presupuesto/Aviso → trabajo de FAC-/VTA-. Este PR deja contrato establecido: FAC-* debe guardarTipoDeIvaIdcomo FK estable +Porcentajecomo snapshot defensivo.TipoDeIva→ se agrega cuando INT-001 lo consuma.Decisión arquitectónica clave — append-only
TipoDeIva.PorcentajeeIngresosBrutos.Alicuotason INMUTABLES una vez creados. Cambiar el valor numérico NO es unPATCH— es unPOST /{iva|iibb}/{id}/nueva-versionque:PredecesorId = {id}.VigenciaHasta = nuevaVigencia - 1 día.tipo_iva.nueva_version/ingresos_brutos.nueva_version.TransactionScopeatómico — fail-closed si audit throws.Razón: una NC/ND en 2028 contra factura 2025 debe recalcular con la alícuota de 2025, no la vigente hoy. Append-only convierte
TipoDeIvaIden token fiscal permanente que FAC-*/INT-001 pueden consumir ciegamente.Tests
TDD estricto: Red → Green → Refactor en cada capa. Incluye test de reflection que verifica que
WithPorcentaje/WithAlicuotaNO existen en las entidades (defensa en profundidad contra regresiones de mutabilidad).Smoke E2E realizado
[5, 6]conPredecesorIdcorrecto ✅PATCHconporcentajeen body → 409inmutable_usar_nueva_version✅tipo_iva.create+tipo_iva.nueva_version) con actor + metadata ✅⚠️ Acción requerida del reviewer
Antes de mergear — aplicar V014 en tu entorno local:
La base de tests
SIGCM2_Testse aplica automáticamente víaSqlTestFixture.EnsureV014SchemaAsync().Follow-ups abiertos (NO cerrar con este PR)
[ADM-009] OQ-008: definir si recargo RNI 50% vive en Configuracion o constante de dominio. Bloquea FAC-* hasta confirmación contable/legal.[ADM-008] Migrar PuntoDeVentaForm a sintaxis Zod v4 (bug preexistente). Bug latente enmaindesde ADM-008. Este PR solo migra los 4 componentes fiscales de ADM-009.Artefactos SDD (engram — project:
sig-cm2)sdd/adm-009-tablas-fiscales/exploresdd/adm-009-tablas-fiscales/proposalsdd/adm-009-tablas-fiscales/specsdd/adm-009-tablas-fiscales/designsdd/adm-009-tablas-fiscales/taskssdd/adm-009-tablas-fiscales/apply-progresssdd/adm-009-tablas-fiscales/decisionssdd/adm-009-tablas-fiscales/tech-debtMétricas
TipoDeIva types (UpdateRequest sin Porcentaje), ivaApi.ts con 8 endpoints, ApiError contract { error, message } alineado con backend ADM-009.