feat(whatsapp): schema del bot de reservas + panel de trabajos por jefe (F1+F3)
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>
This commit is contained in:
@@ -10,13 +10,28 @@ export async function PATCH(req: NextRequest, { params }: { params: Promise<{ id
|
||||
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") {
|
||||
if (estado === "COMPLETADO" && turno.auto && turno.kilometros != null) {
|
||||
try {
|
||||
await agregarFilaSheet({
|
||||
patente: turno.auto.patente,
|
||||
@@ -26,7 +41,7 @@ export async function PATCH(req: NextRequest, { params }: { params: Promise<{ id
|
||||
anio: turno.auto.anio,
|
||||
nombre: turno.cliente.nombre,
|
||||
apellido: turno.cliente.apellido,
|
||||
email: turno.cliente.email,
|
||||
email: turno.cliente.email ?? "",
|
||||
telefono: turno.cliente.telefono,
|
||||
fecha: turno.fechaInicio,
|
||||
trabajo: turno.tipoServicio.nombre,
|
||||
|
||||
Reference in New Issue
Block a user