c53e5bb5aa
FASE 1 — schema:
- Cliente.email opcional; nuevo telefonoNorm (E.164, único) para matchear por WhatsApp
- TipoServicio.jefeMecanicoId opcional (trabajos per-jefe; globales legacy quedan null)
- Turno.autoId/kilometros opcionales (reservas por WhatsApp sin auto/km)
- Nuevo modelo ConversacionWhatsapp (estado del bot por teléfono)
- admin/turnos/[id]: no permite COMPLETADO sin auto+km; Sheets tolera email nulo
FASE 3 — panel de trabajos del jefe:
- API jefe/servicios (GET/POST) y jefe/servicios/[id] (PATCH/DELETE), scoped al jefe
- DELETE desactiva si el trabajo ya tiene turnos asociados
- Página /jefe/servicios (alta/listado/activar/editar/eliminar) + nav Turnos|Trabajos
- Dashboard del jefe resiliente a turnos sin auto/km ("a completar")
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
57 lines
2.0 KiB
TypeScript
57 lines
2.0 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { verificarSesion } from "@/lib/auth-admin";
|
|
import { agregarFilaSheet } from "@/lib/google-sheets";
|
|
|
|
export async function PATCH(req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
|
|
const sesion = await verificarSesion("admin_session");
|
|
if (!sesion) return NextResponse.json({ error: "No autorizado" }, { status: 401 });
|
|
|
|
const { id } = await params;
|
|
const { estado, comentario } = await req.json();
|
|
|
|
// Regla: no se puede cerrar (COMPLETADO) un turno sin auto y kilometraje cargados.
|
|
// Las reservas por WhatsApp los dejan vacíos; el jefe mecánico debe completarlos antes de cerrar.
|
|
if (estado === "COMPLETADO") {
|
|
const actual = await prisma.turno.findUnique({
|
|
where: { id },
|
|
select: { autoId: true, kilometros: true },
|
|
});
|
|
if (!actual) return NextResponse.json({ error: "Turno no encontrado" }, { status: 404 });
|
|
if (!actual.autoId || actual.kilometros == null)
|
|
return NextResponse.json(
|
|
{ error: "Cargá el auto y el kilometraje antes de cerrar el turno" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
const turno = await prisma.turno.update({
|
|
where: { id },
|
|
data: { estado, ...(comentario !== undefined && { comentario }) },
|
|
include: { auto: true, tipoServicio: true, cliente: true },
|
|
});
|
|
|
|
if (estado === "COMPLETADO" && turno.auto && turno.kilometros != null) {
|
|
try {
|
|
await agregarFilaSheet({
|
|
patente: turno.auto.patente,
|
|
kilometros: turno.kilometros,
|
|
marca: turno.auto.marca,
|
|
modelo: turno.auto.modelo,
|
|
anio: turno.auto.anio,
|
|
nombre: turno.cliente.nombre,
|
|
apellido: turno.cliente.apellido,
|
|
email: turno.cliente.email ?? "",
|
|
telefono: turno.cliente.telefono,
|
|
fecha: turno.fechaInicio,
|
|
trabajo: turno.tipoServicio.nombre,
|
|
comentario: turno.comentario,
|
|
});
|
|
} catch (err) {
|
|
console.error("Error escribiendo en Google Sheet:", err);
|
|
}
|
|
}
|
|
|
|
return NextResponse.json(turno);
|
|
}
|