feat(cliente): invertir el flujo web a jefe -> trabajo
Revisión con IA / ai-review (pull_request) Failing after 2m12s
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>
This commit is contained in:
@@ -24,6 +24,10 @@ function match(row: Row, where: Row): boolean {
|
||||
if (!(v as Row[]).every((w) => match(row, w))) return false;
|
||||
continue;
|
||||
}
|
||||
if (k === "OR") {
|
||||
if (!(v as Row[]).some((w) => match(row, w))) return false;
|
||||
continue;
|
||||
}
|
||||
const rv = row[k];
|
||||
if (v !== null && typeof v === "object" && !(v instanceof Date)) {
|
||||
if ("in" in v && !(v.in as any[]).includes(rv)) return false;
|
||||
@@ -143,6 +147,8 @@ jefes.push({ id: "j1", nombre: "Carlos", email: "j1@t.com", activo: true, slotsP
|
||||
jefes.push({ id: "j2", nombre: "Diego", email: "j2@t.com", activo: true, slotsParalelos: 1 });
|
||||
servicios.push({ id: "s1", nombre: "Cambio de aceite", duracionHoras: 1, activo: true, jefeMecanicoId: "j1" });
|
||||
servicios.push({ id: "s2", nombre: "Alineacion", duracionHoras: 2, activo: true, jefeMecanicoId: "j1" });
|
||||
// Trabajo global del taller (lo carga el admin): lo ofrece cualquier jefe.
|
||||
servicios.push({ id: "s3", nombre: "Revision general", duracionHoras: 1, activo: true, jefeMecanicoId: null });
|
||||
clientes.push({
|
||||
id: "c1",
|
||||
nombre: "Juan",
|
||||
@@ -187,6 +193,7 @@ async function main() {
|
||||
|
||||
r = await env(A, "j1");
|
||||
ok(/Cambio de aceite/i.test(flat(r)), "muestra trabajos del jefe elegido");
|
||||
ok(/Revision general/i.test(flat(r)), "incluye los trabajos globales del taller");
|
||||
ok(paso(A) === "ELEGIR_TRABAJO", "paso=ELEGIR_TRABAJO");
|
||||
|
||||
r = await env(A, "a");
|
||||
@@ -225,6 +232,26 @@ async function main() {
|
||||
ok(/cancel/i.test(flat(r)), "cancelar resetea");
|
||||
ok(paso(B) === "INICIO", "paso=INICIO tras cancelar");
|
||||
|
||||
console.log("\n── Escenario D: trabajos por jefe ──");
|
||||
const D = "5493518888888";
|
||||
await env(D, "hola");
|
||||
await env(D, "Ana");
|
||||
await env(D, "Lopez");
|
||||
r = await env(D, "ana@mail.com");
|
||||
ok(hayBotones(r), "alta rápida hasta elegir mecánico");
|
||||
r = await env(D, "j2");
|
||||
ok(/Revision general/i.test(flat(r)), "un jefe sin trabajos propios igual ofrece los globales");
|
||||
ok(!/Cambio de aceite/i.test(flat(r)), "NO ofrece los trabajos propios de otro jefe");
|
||||
|
||||
const { crearTurno } = await import("../src/lib/turnos");
|
||||
const cruzado = await crearTurno({
|
||||
clienteId: "c1",
|
||||
jefeMecanicoId: "j2",
|
||||
tipoServicioId: "s1", // trabajo propio de j1
|
||||
fechaInicio: new Date(Date.now() + 24 * 60 * 60 * 1000),
|
||||
});
|
||||
ok(!cruzado.ok && cruzado.status === 400, "crearTurno rechaza el trabajo de otro jefe (400)");
|
||||
|
||||
console.log(`\n${fallos === 0 ? "✅ TODO OK" : `❌ ${fallos} assert(s) fallaron`}\n`);
|
||||
process.exit(fallos === 0 ? 0 : 1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user