feat: drill-down en pestaña nueva, rol Vendedor y scripts demo

This commit is contained in:
Horux Dev
2026-06-22 20:45:42 +00:00
parent 7df27ce66d
commit 3c7758a599
10 changed files with 705 additions and 16 deletions

View File

@@ -12,7 +12,7 @@ const ROLE_META: Record<PlatformRole, { label: string; desc: string; icon: any;
platform_admin: { label: 'Admin', desc: 'Todo: gestión staff, precios, clientes, facturas', icon: ShieldCheck, color: 'bg-red-100 text-red-700 border-red-200' },
platform_ti: { label: 'TI', desc: 'Equipo de TI. Mismos permisos que Admin (diferencia solo en trazabilidad)', icon: Cpu, color: 'bg-slate-100 text-slate-700 border-slate-200' },
platform_support: { label: 'Support', desc: 'Ver tenants, resolver tickets', icon: HeadphonesIcon, color: 'bg-blue-100 text-blue-700 border-blue-200' },
platform_sales: { label: 'Sales', desc: 'Crear/editar clientes, ver suscripciones', icon: TrendingUp, color: 'bg-green-100 text-green-700 border-green-200' },
platform_sales: { label: 'Vendedor', desc: 'Enviar invitaciones a nuevos despachos', icon: TrendingUp, color: 'bg-green-100 text-green-700 border-green-200' },
platform_finance: { label: 'Finance', desc: 'Pagos, facturas manuales, editar precios', icon: DollarSign, color: 'bg-amber-100 text-amber-700 border-amber-200' },
};

View File

@@ -232,6 +232,8 @@ export default function DashboardPage() {
: 'Sin datos del periodo anterior'
}
href={drillUrl('Ingresos del Mes - CFDIs', { bucket: 'ingresos' })}
target="_blank"
rel="noopener noreferrer"
/>
<KpiCard
title={regimenSeleccionado ? `NCs Emitidas (${regimenSeleccionado})` : 'NCs Emitidas'}
@@ -251,6 +253,8 @@ export default function DashboardPage() {
: 'Sin datos del periodo anterior'
}
href={drillUrl('Gastos del Mes - CFDIs', { bucket: 'gastos' })}
target="_blank"
rel="noopener noreferrer"
/>
<KpiCard
title={regimenSeleccionado ? `NCs Recibidas (${regimenSeleccionado})` : 'NCs Recibidas'}
@@ -278,6 +282,8 @@ export default function DashboardPage() {
: undefined
}
href={drillUrl('Balance IVA - CFDIs', {})}
target="_blank"
rel="noopener noreferrer"
/>
</div>

View File

@@ -186,6 +186,8 @@ export default function ImpuestosPage() {
icon={<TrendingUp className="h-4 w-4" />}
subtitle="Cobrado a clientes"
href={drillUrl('IVA Trasladado - CFDIs Emitidos', { bucket: 'causado' })}
target="_blank"
rel="noopener noreferrer"
/>
<KpiCard
title={regimenSeleccionado ? `IVA Acreditable (${regimenSeleccionado})` : 'IVA Acreditable'}
@@ -197,6 +199,8 @@ export default function ImpuestosPage() {
icon={<TrendingDown className="h-4 w-4" />}
subtitle="Pagado a proveedores"
href={drillUrl('IVA Acreditable - CFDIs Recibidos', { bucket: 'acreditable' })}
target="_blank"
rel="noopener noreferrer"
/>
{(() => {
const val = regimenSeleccionado
@@ -405,24 +409,32 @@ export default function ImpuestosPage() {
value={ingSel}
icon={<TrendingUp className="h-4 w-4" />}
href={drillUrl('Ingresos ISR - CFDIs Emitidos', { bucket: 'ingresos' })}
target="_blank"
rel="noopener noreferrer"
/>
<KpiCard
title={regimenSeleccionado ? `NCs Emitidas (${regimenSeleccionado})` : 'NCs Emitidas'}
value={ncsEmSel}
icon={<TrendingDown className="h-4 w-4" />}
href={drillUrl('NCs Emitidas - CFDIs', { bucket: 'ncs_emitidas' })}
target="_blank"
rel="noopener noreferrer"
/>
<KpiCard
title={regimenSeleccionado ? `Deducciones (${regimenSeleccionado})` : 'Deducciones'}
value={dedSel}
icon={<TrendingDown className="h-4 w-4" />}
href={drillUrl('Deducciones - CFDIs Recibidos', { bucket: 'gastos' })}
target="_blank"
rel="noopener noreferrer"
/>
<KpiCard
title={regimenSeleccionado ? `NCs Recibidas (${regimenSeleccionado})` : 'NCs Recibidas'}
value={ncsRecSel}
icon={<TrendingUp className="h-4 w-4" />}
href={drillUrl('NCs Recibidas - CFDIs', { bucket: 'ncs_recibidas' })}
target="_blank"
rel="noopener noreferrer"
/>
<KpiCard
title={regimenSeleccionado ? `Base Gravable (${regimenSeleccionado})` : 'Base Gravable'}
@@ -459,6 +471,8 @@ export default function ImpuestosPage() {
icon={<TrendingDown className="h-4 w-4" />}
subtitle="Efectivo > $2,000"
href={drillUrl('No Deducibles - Efectivo > $2,000', { bucket: 'no_deducibles_efectivo' })}
target="_blank"
rel="noopener noreferrer"
/>
</div>
);

View File

@@ -72,6 +72,11 @@ const adminNavigation: NavItem[] = [
{ name: 'Audit Log', href: '/admin/audit-log', icon: FileWarning },
];
const vendedorNavigation: NavItem[] = [
{ name: 'Invitar cliente', href: '/admin/invitar-cliente', icon: Send },
{ name: 'Configuracion', href: '/configuracion', icon: Settings },
];
export function Sidebar() {
const pathname = usePathname();
const router = useRouter();
@@ -103,12 +108,15 @@ export function Sidebar() {
const { data: contribuyentes } = useContribuyentes();
const isGlobalAdmin = isGlobalAdminRfc(user?.tenantRfc, role, user?.platformRoles);
const isVendedor = user?.platformRoles?.includes('platform_sales') && !isGlobalAdmin;
// El admin global NO necesita "Configuración inicial" — su tenant raíz
// (Horux 360) no tiene contribuyentes propios y nunca los tendrá.
const showOnboarding = (!contribuyentes || contribuyentes.length === 0) && role !== 'cliente' && !isGlobalAdmin;
const showOnboarding = (!contribuyentes || contribuyentes.length === 0) && role !== 'cliente' && !isGlobalAdmin && !isVendedor;
const allNavigation = isGlobalAdmin
? [...filteredNav.slice(0, -1), ...adminNavigation, filteredNav[filteredNav.length - 1]]
: filteredNav;
: isVendedor
? vendedorNavigation
: filteredNav;
return (
<aside className="fixed left-0 top-0 z-40 h-screen w-64 border-r bg-card">