diff --git a/src/web/src/components/layout/AppSidebar.tsx b/src/web/src/components/layout/AppSidebar.tsx
index 5516319..2b77f2e 100644
--- a/src/web/src/components/layout/AppSidebar.tsx
+++ b/src/web/src/components/layout/AppSidebar.tsx
@@ -14,6 +14,7 @@ import {
PanelLeftOpen,
Newspaper,
Columns3,
+ Store,
} from 'lucide-react'
import { cn } from '@/lib/utils'
import { Badge } from '@/components/ui/badge'
@@ -61,6 +62,12 @@ const adminItems: NavItem[] = [
icon: Columns3,
requiredPermission: 'administracion:secciones:gestionar',
},
+ {
+ label: 'Puntos de Venta',
+ href: '/admin/puntos-de-venta',
+ icon: Store,
+ requiredPermission: 'administracion:puntos_de_venta:gestionar',
+ },
]
interface SidebarNavProps {
diff --git a/src/web/src/features/puntos-de-venta/components/MedioInactivoBanner.tsx b/src/web/src/features/puntos-de-venta/components/MedioInactivoBanner.tsx
new file mode 100644
index 0000000..ff84afc
--- /dev/null
+++ b/src/web/src/features/puntos-de-venta/components/MedioInactivoBanner.tsx
@@ -0,0 +1,19 @@
+import { AlertTriangle } from 'lucide-react'
+import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
+
+interface MedioInactivoBannerProps {
+ medioNombre: string
+}
+
+export function MedioInactivoBanner({ medioNombre }: MedioInactivoBannerProps) {
+ return (
+
+
+ Medio desactivado
+
+ El medio "{medioNombre}" está desactivado. Las operaciones de edición, activación y
+ desactivación de sus puntos de venta están bloqueadas hasta que se reactive el medio.
+
+
+ )
+}
diff --git a/src/web/src/features/puntos-de-venta/components/PdvInactivoBanner.tsx b/src/web/src/features/puntos-de-venta/components/PdvInactivoBanner.tsx
new file mode 100644
index 0000000..1db71eb
--- /dev/null
+++ b/src/web/src/features/puntos-de-venta/components/PdvInactivoBanner.tsx
@@ -0,0 +1,19 @@
+import { AlertTriangle } from 'lucide-react'
+import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
+
+interface PdvInactivoBannerProps {
+ puntoDeVentaNombre: string
+}
+
+export function PdvInactivoBanner({ puntoDeVentaNombre }: PdvInactivoBannerProps) {
+ return (
+
+
+ Punto de venta desactivado
+
+ El punto de venta "{puntoDeVentaNombre}" está desactivado. Reactivalo para habilitar
+ nuevamente sus operaciones.
+
+
+ )
+}
diff --git a/src/web/src/router.tsx b/src/web/src/router.tsx
index 8290b0c..6394d0f 100644
--- a/src/web/src/router.tsx
+++ b/src/web/src/router.tsx
@@ -21,6 +21,10 @@ import { SeccionesListPage } from './features/secciones/pages/SeccionesListPage'
import { CreateSeccionPage } from './features/secciones/pages/CreateSeccionPage'
import { EditSeccionPage } from './features/secciones/pages/EditSeccionPage'
import { SeccionDetailPage } from './features/secciones/pages/SeccionDetailPage'
+import { PuntosDeVentaListPage } from './features/puntos-de-venta/pages/PuntosDeVentaListPage'
+import { CreatePuntoDeVentaPage } from './features/puntos-de-venta/pages/CreatePuntoDeVentaPage'
+import { PuntoDeVentaDetailPage } from './features/puntos-de-venta/pages/PuntoDeVentaDetailPage'
+import { EditPuntoDeVentaPage } from './features/puntos-de-venta/pages/EditPuntoDeVentaPage'
import { HomePage } from './pages/HomePage'
import { PublicLayout } from './layouts/PublicLayout'
import { ProtectedLayout } from './layouts/ProtectedLayout'
@@ -240,6 +244,40 @@ export function AppRoutes() {
}
/>
+ {/* Puntos de Venta routes */}
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
} />
)