+ {/* Banner de advertencia global — visible al montar [REQ-UI-005] */}
+
+
+
+ Los cambios de alícuota afectan presupuestos en curso. Usá{' '}
+ Nueva vigencia para versionar cambios de porcentaje.
+
+
+
+ {/* Header con título y botón crear */}
+
+
Tipos de IVA
+
+
+
+ {/* Filtros */}
+
+
{
+ setCodigoFilter(e.target.value)
+ setPage(1)
+ }}
+ className="max-w-xs"
+ aria-label="Filtrar por código"
+ />
+
+
+ Estado:
+
+
+
+
+
+
+ {/* Tabla */}
+ {isLoading ? (
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+ ) : (
+
+ )}
+
+ {/* Paginación */}
+
+
+ {data ? `${data.total} tipo${data.total !== 1 ? 's' : ''} de IVA` : ''}
+
+
+ setPage((p) => p - 1)}
+ aria-label="Anterior"
+ >
+ Anterior
+
+
+ {page} / {totalPages}
+
+ setPage((p) => p + 1)}
+ aria-label="Siguiente"
+ >
+ Siguiente
+
+
+
+
+ {/* Modal Crear/Editar */}
+
setEditOpen(false)}
+ onSuccess={() => setEditOpen(false)}
+ />
+
+ {/* Modal Nueva Vigencia */}
+ setNuevaVigenciaOpen(false)}
+ onSuccess={() => setNuevaVigenciaOpen(false)}
+ />
+
+ )
+}
diff --git a/src/web/src/features/fiscal/iva/types/tipoDeIva.types.ts b/src/web/src/features/fiscal/iva/types/tipoDeIva.types.ts
new file mode 100644
index 0000000..d73175f
--- /dev/null
+++ b/src/web/src/features/fiscal/iva/types/tipoDeIva.types.ts
@@ -0,0 +1,74 @@
+// ADM-009 — Tipos TS para feature fiscal/iva
+// Alineados con TipoDeIvaDto / FiscalContracts.cs del backend
+
+export interface TipoDeIva {
+ id: number
+ codigo: string
+ descripcion: string
+ porcentaje: number
+ vigenciaDesde: string // ISO date "yyyy-MM-dd"
+ vigenciaHasta: string | null
+ activo: boolean
+ aplicaIVA: boolean
+ predecesorId: number | null
+}
+
+export interface CreateTipoDeIvaRequest {
+ codigo: string
+ descripcion: string
+ porcentaje: number
+ vigenciaDesde: string
+ aplicaIVA: boolean
+}
+
+// UpdateTipoDeIvaRequest — SIN porcentaje (inmutable, usar NuevaVersion para cambiar)
+export interface UpdateTipoDeIvaRequest {
+ codigo: string
+ descripcion: string
+ aplicaIVA: boolean
+ activo: boolean
+}
+
+export interface NuevaVersionTipoDeIvaRequest {
+ porcentaje: number
+ vigenciaDesde: string // "yyyy-MM-dd"
+}
+
+export interface NuevaVersionResponse {
+ predecesorId: number
+ nuevaId: number
+ nuevoPorcentaje: number
+ vigenciaDesde: string
+ predecesorVigenciaHasta: string
+}
+
+export interface HistorialCadenaEntry {
+ id: number
+ codigo: string
+ porcentaje: number
+ vigenciaDesde: string
+ vigenciaHasta: string | null
+ activo: boolean
+ predecesorId: number | null
+ depth: number
+}
+
+export interface TipoDeIvaFilter {
+ page?: number
+ pageSize?: number
+ codigo?: string
+ activo?: boolean
+}
+
+export interface PagedResponse