+ {/* Header */}
+
+
Rubros
+
+
+
+
+
+
+
+
+
+
+
+ {/* Content */}
+ {isLoading ? (
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+ ) : isError ? (
+
+
+
+ Error al cargar los rubros. Intentá de nuevo.
+
+
+ ) : (
+
+ {}}
+ onDelete={() => {}}
+ onAddChild={() => {}}
+ onMove={() => {}}
+ canEdit={false}
+ />
+ }
+ >
+ setMoveTarget(rubro)}
+ canEdit={true}
+ />
+
+
+ )}
+
+ {/* Form dialog */}
+
+
+ {/* Delete dialog */}
+ {deletingRubro && (
+
+ )}
+
+ {/* Move dialog */}
+
!o && setMoveTarget(null)}
+ rubro={moveTarget}
+ tree={tree ?? []}
+ />
+
+ )
+}
diff --git a/src/web/src/features/rubros/types.ts b/src/web/src/features/rubros/types.ts
new file mode 100644
index 0000000..d726135
--- /dev/null
+++ b/src/web/src/features/rubros/types.ts
@@ -0,0 +1,38 @@
+// CAT-001 — shared types for rubros feature
+
+export interface RubroTreeNode {
+ id: number
+ nombre: string
+ orden: number
+ activo: boolean
+ parentId: number | null
+ tarifarioBaseId: number | null
+ hijos: RubroTreeNode[]
+}
+
+export interface Rubro {
+ id: number
+ nombre: string
+ orden: number
+ activo: boolean
+ parentId: number | null
+ tarifarioBaseId: number | null
+ fechaCreacion: string
+ fechaModificacion: string | null
+}
+
+export interface CreateRubroRequest {
+ nombre: string
+ parentId: number | null
+ tarifarioBaseId: number | null
+}
+
+export interface UpdateRubroRequest {
+ nombre: string
+ tarifarioBaseId: number | null
+}
+
+export interface MoveRubroRequest {
+ nuevoParentId: number | null
+ nuevoOrden: number
+}
diff --git a/src/web/src/router.tsx b/src/web/src/router.tsx
index c4c98dc..94559d9 100644
--- a/src/web/src/router.tsx
+++ b/src/web/src/router.tsx
@@ -27,6 +27,7 @@ import { PuntoDeVentaDetailPage } from './features/puntos-de-venta/pages/PuntoDe
import { EditPuntoDeVentaPage } from './features/puntos-de-venta/pages/EditPuntoDeVentaPage'
import { TiposDeIvaPage } from './features/fiscal/iva/pages/TiposDeIvaPage'
import { TiposDeIibbPage } from './features/fiscal/iibb/pages/TiposDeIibbPage'
+import { RubrosPage } from './features/rubros/pages/RubrosPage'
import { HomePage } from './pages/HomePage'
import { PublicLayout } from './layouts/PublicLayout'
import { ProtectedLayout } from './layouts/ProtectedLayout'
@@ -298,6 +299,16 @@ export function AppRoutes() {
}
/>
+ {/* Rubros routes — CAT-001 */}
+