fase 3.2: compras y proveedores (modulo skeen_compras: proveedores, ordenes de compra con recepcion total/parcial, costo promedio ponderado con lote y caducidad, pagos a proveedor, cuentas por pagar con antiguedad, reportes de compras y margen por articulo); apagado por defecto

This commit is contained in:
2026-10-11 12:17:23 +00:00
parent ee8a844d96
commit a916753ebe
38 changed files with 4201 additions and 30 deletions

View File

@@ -146,17 +146,23 @@ export const ClasicoLayout: FC<LayoutProps> = ({ children, title: _title, subtit
const location = useLocation();
const navigate = useNavigate();
const { user, canSee, hasRole, logout, brand } = useAuth();
const { membresias: membresiasCfg } = useClinicSettings();
const { membresias: membresiasCfg, compras: comprasCfg } = useClinicSettings();
const [sidebarOpen, setSidebarOpen] = useState(false);
const chatUnread = useChatUnread();
// Membresías solo cuando la clínica enciende `membresias.activo`.
const menuTreeT = useMemo<MenuEntry[]>(
() => (membresiasCfg.activo
? [...menuTree, { label: 'Membresías', icon: Repeat, href: '/membresias' }]
: menuTree),
[membresiasCfg.activo]
);
// Membresías y Compras solo cuando la clínica enciende su bandera.
const menuTreeT = useMemo<MenuEntry[]>(() => {
let tree = menuTree;
if (comprasCfg.activo) {
tree = tree.map((e) => (e.label === 'Consumibles' && e.children
? { ...e, children: [...e.children, { label: 'Órdenes de compra', href: '/compras' }] }
: e));
}
if (membresiasCfg.activo) {
tree = [...tree, { label: 'Membresías', icon: Repeat, href: '/membresias' }];
}
return tree;
}, [membresiasCfg.activo, comprasCfg.activo]);
const menuLeavesT = useMemo(
() => menuTreeT.flatMap((e) =>
e.children