From c2b0e39b067421dca03d2cdbc5c9fc6748d7a5d4 Mon Sep 17 00:00:00 2001 From: Beldor Date: Mon, 22 Jun 2026 21:57:27 -0300 Subject: [PATCH] feat: comentario al completar turno, Google Sheets corregido, scheduling 8:30-17 5 slots, mejoras responsive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Agrega campo comentario opcional al marcar turno COMPLETADO (textarea en UI, guardado en DB, escrito en col N del sheet) - Corrige mapeo Google Sheets: email→I, telefono→J, vacíos en K-M, comentario→N - Actualiza scheduling: inicio 8:30, fin 17:00, máx 5 turnos simultáneos - entrypoint.sh: migrate deploy → db push para aplicar cambios de schema automáticamente - Historial cliente: tarjetas visuales con header, fecha y observaciones destacadas - Dashboard/turnos cliente: mejoras responsive mobile - Fix display duración: 0.5 hs → "30 min" Co-Authored-By: Claude Sonnet 4.6 --- entrypoint.sh | 2 +- prisma/schema.prisma | 1 + src/app/admin/dashboard/page.tsx | 54 ++++++++++++++++--- src/app/api/admin/turnos/[id]/route.ts | 6 +-- src/app/cliente/dashboard/page.tsx | 10 ++-- src/app/cliente/historial/page.tsx | 72 +++++++++++++++----------- src/app/cliente/turnos/page.tsx | 11 +++- src/lib/google-sheets.ts | 16 +++--- src/lib/scheduling.ts | 47 ++++++++++------- 9 files changed, 146 insertions(+), 73 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index 2f8402e..76a388f 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,6 +1,6 @@ #!/bin/sh set -e echo "Corriendo migraciones..." -node node_modules/prisma/build/index.js migrate deploy +node node_modules/prisma/build/index.js db push --accept-data-loss echo "Migraciones OK. Iniciando app..." exec node_modules/.bin/next start diff --git a/prisma/schema.prisma b/prisma/schema.prisma index efa27a0..719b433 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -53,6 +53,7 @@ model Turno { fechaFin DateTime kilometros Int estado EstadoTurno @default(PENDIENTE) + comentario String? createdAt DateTime @default(now()) cliente Cliente @relation(fields: [clienteId], references: [id]) diff --git a/src/app/admin/dashboard/page.tsx b/src/app/admin/dashboard/page.tsx index 3b7ec31..6890220 100644 --- a/src/app/admin/dashboard/page.tsx +++ b/src/app/admin/dashboard/page.tsx @@ -18,6 +18,8 @@ export default function AdminDashboard() { const [fecha, setFecha] = useState(() => new Date().toISOString().slice(0, 10)); const [turnos, setTurnos] = useState([]); const [loading, setLoading] = useState(true); + const [completando, setCompletando] = useState>(new Set()); + const [comentarios, setComentarios] = useState>({}); useEffect(() => { cargar(); }, [fecha]); @@ -29,15 +31,26 @@ export default function AdminDashboard() { setLoading(false); } - async function cambiarEstado(id: string, estado: string) { + async function cambiarEstado(id: string, estado: string, comentario?: string) { await fetch(`/api/admin/turnos/${id}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ estado }), + body: JSON.stringify({ estado, comentario }), }); + setCompletando((prev) => { const s = new Set(prev); s.delete(id); return s; }); + setComentarios((prev) => { const c = { ...prev }; delete c[id]; return c; }); cargar(); } + function iniciarCompletado(id: string) { + setCompletando((prev) => new Set(prev).add(id)); + } + + function cancelarCompletado(id: string) { + setCompletando((prev) => { const s = new Set(prev); s.delete(id); return s; }); + setComentarios((prev) => { const c = { ...prev }; delete c[id]; return c; }); + } + function formatHora(iso: string) { return new Date(iso).toLocaleTimeString("es-AR", { hour: "2-digit", minute: "2-digit" }); } @@ -45,12 +58,12 @@ export default function AdminDashboard() { return (
-

Turnos del día

+

Turnos del día

setFecha(e.target.value)} - className="border border-gray-300 rounded-lg px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-blue-500" + className="border border-gray-300 rounded-lg px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-blue-500 w-full sm:w-auto" />
@@ -96,11 +109,40 @@ export default function AdminDashboard() {
)} - {t.estado === "CONFIRMADO" && ( - )} + + {t.estado === "CONFIRMADO" && completando.has(t.id) && ( +
+