From a8503fd574395005c7cfd89bf22e7f200f4b9610 Mon Sep 17 00:00:00 2001 From: Horux Dev Date: Sat, 16 May 2026 15:53:17 +0000 Subject: [PATCH] fix(fiel/csd): usa contribuyente seleccionado sin depender de isDespachoTenant Problema: isDespachoTenant(user?.tenantRfc) compara contra prefijo 'DESPACHO_' que ningun tenant real usa. Esto hacia que sat/page.tsx siempre usara el endpoint legacy a nivel tenant, ignorando el contribuyente seleccionado y mostrando datos del tenant en lugar del contribuyente. Cambios: - sat/page.tsx: elimina isDespachoTenant, usa selectedContribuyenteId directamente para determinar contribId. Muestra banner cuando no hay contribuyente seleccionado. - csd/page.tsx: agrega banner de contribuyente seleccionado y oculta la UI de CSD cuando no hay contribuyente seleccionado. - tenant-selector.tsx: limpia selectedContribuyenteId al cambiar de tenant para evitar stale state. --- .../(dashboard)/configuracion/csd/page.tsx | 40 ++++++++++++++----- .../(dashboard)/configuracion/sat/page.tsx | 18 ++++----- apps/web/components/tenant-selector.tsx | 6 +++ 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/apps/web/app/(dashboard)/configuracion/csd/page.tsx b/apps/web/app/(dashboard)/configuracion/csd/page.tsx index 50f07a2..dc6c6e7 100644 --- a/apps/web/app/(dashboard)/configuracion/csd/page.tsx +++ b/apps/web/app/(dashboard)/configuracion/csd/page.tsx @@ -7,7 +7,7 @@ import { useTimbres } from '@/lib/hooks/use-facturacion'; import { apiClient } from '@/lib/api/client'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { useContribuyenteStore } from '@/stores/contribuyente-store'; -import { Shield, Upload, Check, AlertCircle, Receipt, Palette, Image } from 'lucide-react'; +import { Shield, Upload, Check, AlertCircle, Receipt, Palette, Image, Building2 } from 'lucide-react'; function CustomizationSection() { const queryClient = useQueryClient(); @@ -147,7 +147,7 @@ function CustomizationSection() { } export default function CsdConfigPage() { - const { selectedContribuyenteId } = useContribuyenteStore(); + const { selectedContribuyenteId, selectedContribuyenteRfc, selectedContribuyenteNombre } = useContribuyenteStore(); const { data: orgStatus, isLoading } = useQuery({ queryKey: ['facturapi-org-contrib', selectedContribuyenteId], queryFn: () => selectedContribuyenteId @@ -228,8 +228,28 @@ export default function CsdConfigPage() { <>
+ {/* Show which contribuyente or prompt to select */} + {!selectedContribuyenteId && ( + + + +

Selecciona un contribuyente en el header para ver y configurar su CSD.

+
+
+ )} + + {selectedContribuyenteId && ( + + + + CSD de: {selectedContribuyenteNombre} + {selectedContribuyenteRfc} + + + )} + {/* Estado de la organización */} - + {selectedContribuyenteId && @@ -262,10 +282,10 @@ export default function CsdConfigPage() { )} - + } {/* Subir CSD */} - {orgStatus?.configured && !orgStatus.hasCsd && ( + {selectedContribuyenteId && orgStatus?.configured && !orgStatus.hasCsd && ( @@ -299,7 +319,7 @@ export default function CsdConfigPage() { )} {/* CSD ya configurado */} - {orgStatus?.configured && orgStatus.hasCsd && ( + {selectedContribuyenteId && orgStatus?.configured && orgStatus.hasCsd && (
@@ -314,10 +334,10 @@ export default function CsdConfigPage() { )} {/* Personalización de factura */} - {orgStatus?.configured && } + {selectedContribuyenteId && orgStatus?.configured && } {/* Timbres */} - + {selectedContribuyenteId && @@ -356,10 +376,10 @@ export default function CsdConfigPage() {

)} -
+
} {/* Mensajes */} - {message && ( + {selectedContribuyenteId && message && (
s.user); - const isDespacho = isDespachoTenant(user?.tenantRfc); - // For despachos, use per-contribuyente FIEL; for Horux360, use tenant-level - const contribId = isDespacho ? selectedContribuyenteId : null; + // Per-contribuyente FIEL when a contribuyente is selected; otherwise tenant-level legacy + const contribId = selectedContribuyenteId || null; const fetchFielStatus = async () => { setLoading(true); @@ -81,8 +79,8 @@ export default function SatConfigPage() {
- {/* Despacho: show which contribuyente or prompt to select */} - {isDespacho && !selectedContribuyenteId && ( + {/* Show which contribuyente or prompt to select */} + {!selectedContribuyenteId && ( @@ -91,7 +89,7 @@ export default function SatConfigPage() { )} - {isDespacho && selectedContribuyenteId && ( + {selectedContribuyenteId && ( @@ -101,8 +99,8 @@ export default function SatConfigPage() { )} - {/* For despachos without RFC selected, hide everything below the banner */} - {isDespacho && !selectedContribuyenteId ? null : ( + {/* Hide FIEL UI when no contribuyente is selected */} + {!selectedContribuyenteId ? null : ( <> {/* Estado de la FIEL */} diff --git a/apps/web/components/tenant-selector.tsx b/apps/web/components/tenant-selector.tsx index 34083fb..943fd9a 100644 --- a/apps/web/components/tenant-selector.tsx +++ b/apps/web/components/tenant-selector.tsx @@ -4,6 +4,7 @@ import { useState, useEffect } from 'react'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { getTenants, type Tenant } from '@/lib/api/tenants'; import { useTenantViewStore } from '@/stores/tenant-view-store'; +import { useContribuyenteStore } from '@/stores/contribuyente-store'; import { useAuthStore } from '@/stores/auth-store'; import { Building, ChevronDown, Check, X } from 'lucide-react'; import { cn } from '@horux/shared-ui'; @@ -14,6 +15,7 @@ export function TenantSelector() { const { user } = useAuthStore(); const queryClient = useQueryClient(); const { viewingTenantId, viewingTenantName, setViewingTenant, clearViewingTenant } = useTenantViewStore(); + const { clearSelectedContribuyente } = useContribuyenteStore(); const isGlobalAdmin = isGlobalAdminRfc(user?.tenantRfc, user?.role, user?.platformRoles); const { data: tenants, isLoading } = useQuery({ @@ -66,12 +68,14 @@ export function TenantSelector() { onClick={(e) => { e.stopPropagation(); clearViewingTenant(); + clearSelectedContribuyente(); queryClient.invalidateQueries(); }} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); clearViewingTenant(); + clearSelectedContribuyente(); queryClient.invalidateQueries(); } }} @@ -98,6 +102,7 @@ export function TenantSelector() {