44aeb58e77
Revisión con IA / ai-review (pull_request) Failing after 2m12s
Los trabajos ahora son por jefe mecanico, asi que el cliente elige primero el mecanico y despues el trabajo, igual que en el bot de WhatsApp. Antes listaba todos los servicios del taller y recien despues pedia el jefe. - src/lib/servicios.ts: regla unica de que trabajos ofrece un jefe = los suyos + los globales del taller (jefeMecanicoId null, los carga el admin). Asi no se rompe lo que ya existe en produccion, donde todos los servicios son globales. - /api/cliente/servicios ahora exige jefeMecanicoId y aplica esa regla. - /api/cliente/slots y crearTurno rechazan un trabajo propio de OTRO jefe (400): antes se podia reservar con el jefe A la duracion del trabajo del B. - whatsapp-bot: usa la misma regla, asi la web y el bot ofrecen lo mismo. - cliente/turnos: pasos invertidos, cabeceras y back acordes, y estado vacio propio cuando el jefe no tiene trabajos. - test-whatsapp-bot: soporte de OR en el Prisma en memoria, trabajo global en el seed y escenario D (globales visibles, trabajo ajeno rechazado). 31 asserts. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
28 lines
1.3 KiB
TypeScript
28 lines
1.3 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { verificarSesion } from "@/lib/auth-admin";
|
|
import { obtenerSlotsDisponibles } from "@/lib/scheduling";
|
|
import { trabajoEsDeJefe } from "@/lib/servicios";
|
|
|
|
export async function GET(req: NextRequest) {
|
|
const sesion = await verificarSesion("cliente_session");
|
|
if (!sesion) return NextResponse.json({ error: "No autorizado" }, { status: 401 });
|
|
|
|
const { searchParams } = new URL(req.url);
|
|
const tipoServicioId = searchParams.get("tipoServicioId");
|
|
const jefeMecanicoId = searchParams.get("jefeMecanicoId");
|
|
if (!tipoServicioId)
|
|
return NextResponse.json({ error: "tipoServicioId requerido" }, { status: 400 });
|
|
if (!jefeMecanicoId)
|
|
return NextResponse.json({ error: "jefeMecanicoId requerido" }, { status: 400 });
|
|
|
|
const servicio = await prisma.tipoServicio.findUnique({ where: { id: tipoServicioId } });
|
|
if (!servicio || !servicio.activo)
|
|
return NextResponse.json({ error: "Servicio no encontrado" }, { status: 404 });
|
|
if (!trabajoEsDeJefe(servicio, jefeMecanicoId))
|
|
return NextResponse.json({ error: "Ese trabajo no lo hace este mecánico" }, { status: 400 });
|
|
|
|
const slots = await obtenerSlotsDisponibles(jefeMecanicoId, servicio.duracionHoras, 60, 500);
|
|
return NextResponse.json(slots);
|
|
}
|