Sistema de Gestión de Obras de Construcción completo con: - Dashboard con KPIs y gráficos - Módulo de obras con fases y tareas - Control financiero (gastos, presupuestos) - Gestión de recursos (personal, subcontratistas) - Inventario de materiales con alertas de stock - Reportes con exportación CSV - Autenticación con roles (NextAuth.js v5) - API REST completa - Documentación de API y base de datos - Configuración Docker para despliegue Stack: Next.js 14+, TypeScript, Tailwind CSS, Prisma, PostgreSQL Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
43 lines
1.0 KiB
TypeScript
43 lines
1.0 KiB
TypeScript
import { auth } from "@/lib/auth";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { MaterialesClient } from "./materiales-client";
|
|
|
|
async function getMateriales(empresaId: string) {
|
|
const materiales = await prisma.material.findMany({
|
|
where: { empresaId },
|
|
include: {
|
|
movimientos: {
|
|
orderBy: { createdAt: "desc" },
|
|
take: 5,
|
|
include: {
|
|
obra: { select: { nombre: true } },
|
|
},
|
|
},
|
|
},
|
|
orderBy: { nombre: "asc" },
|
|
});
|
|
|
|
const obras = await prisma.obra.findMany({
|
|
where: { empresaId },
|
|
select: { id: true, nombre: true },
|
|
});
|
|
|
|
const alertas = materiales.filter(
|
|
(m) => m.activo && m.stockActual <= m.stockMinimo
|
|
);
|
|
|
|
return { materiales, obras, alertas };
|
|
}
|
|
|
|
export default async function MaterialesPage() {
|
|
const session = await auth();
|
|
|
|
if (!session?.user?.empresaId) {
|
|
return <div>Error: No se encontro la empresa</div>;
|
|
}
|
|
|
|
const data = await getMateriales(session.user.empresaId);
|
|
|
|
return <MaterialesClient data={data} />;
|
|
}
|