🐕 Panchita — Scan + Especificación VOY v3

Scan tecnológico de v2 + v3 + maqueta · Especificación funcional y técnica para Hoku
7
Vistas Cliente
7
Vistas Worker
6
Vistas Admin
7
Modales
13
Gaps Maqueta
8
Features nuevas
Scan Tecnológico — VOY v2 actual
Inventario exhaustivo de cada página, vista, función, modal y efecto del código fuente

Arquitectura

CapaDetalle
StackVanilla JS + Airtable API + Vercel (static + serverless)
CSS3 archivos: variables.css (107 tokens) + main.css (componentes globales) + app.css (layout shell) + landing.css + inline por página
JS8 archivos: client.js (1292 líneas) + worker.js (1227) + admin.js (839) + airtable.js (673) + auth.js + data.js + dev-panel.js + build-info.js
Color primario#059669 (verde) — NO azul
IconosFontAwesome 6.5.1 (CDN)
MapasLeaflet 1.9.4 (solo en client)
PDFjsPDF 2.5.1 (CDN cdnjs — NO 2.5.2)
ChartsChart.js 4.4.7 (solo en admin)
EmailsResend (serverless function api/send-email.js)
DeployVercel: voy-app-2 (Guillermo) → build.js genera /public/ con config.js inyectado
Fusiónvoy-app-3 descarga HTML de voy-app-1 (Sergio) + voy-app-2 y fusiona con tema morado

Páginas y Vistas — Inventario completo

🏠 Landing (index.html)

SecciónContenido
NavbarLogo VOY + links (Cómo funciona, Servicios, Especialistas) + btn "Buscar servicio" + hamburger mobile
HeroBarra búsqueda (servicio + ubicación) + card worker flotante + pills categorías populares + stats bar
Cómo funcionaTabs cliente/trabajador + 3 pasos con iconos + flechas
CategoríasGrid 8 categorías con iconos FA + hover animado
Especialistas3 worker cards + link "Ver todos"
FooterLinks + copyright

🔑 Login (login/index.html)

ComponenteDetalle
Auth cardMax-width 440px, radius-2xl, shadow 32px
Tabs"Ingresar" | "Registrarse" con border-bottom active
Login formEmail + password + botón "Ingresar" + error visible
Register formNombre + email + password + confirmar + selector de rol (🏠 Cliente / 🔧 Profesional) + ciudad select + categoría (si profesional)
Demo accountsCuentas de prueba clickeables (cliente, especialista, admin)

👤 Cliente (client/index.html) — 7 vistas + 4 modales + 2 paneles

IDVistaFuncionalidades
view-buscarExplorarLayout 2 cols (380px lista + mapa Leaflet). Filtros: category chips, radio slider, ordenar select, checkboxes (disponible, verificado). Toggle lista/grid. Worker cards con avatar, rating, skills, precio, status dot. Mapa con markers + popups.
view-activosServicios activosCards de bookings en curso con estado, worker info, botón cancelar, botón chat. Badges de cotización (pending/accepted/rejected).
view-historialHistorialdata-table con todos los servicios pasados, columnas: servicio, worker, fecha, precio, estado, calificar.
view-perfilMi perfilTabs (datos, seguridad). Avatar upload. Campos: nombre, email, teléfono, ciudad, dirección. Cambiar contraseña (actual + nueva + confirmar).
view-pagosPagosMétodos de pago (placeholder).
view-favoritosFavoritosGrid de workers favoritos (localStorage). Corazón toggle.
view-notifsNotificacionesLista de notificaciones.
Modal/PanelContenido
bookingModalInfo worker, servicio select, modalidad (inmediato/agendar), fecha, hora, dirección, descripción, resumen precio.
ratingModal5 estrellas clickeables (setRating), textarea comentario.
notifModalLista de notificaciones.
quotationViewModalVer cotización completa: desglose + aceptar/rechazar + descargar PDF.
worker-detailPanel slide-in 420px: avatar, bio, skills, galería 3-col, reseñas, btn Mensaje + Agendar.
chat-panelPanel lateral: header con avatar, messages con polling, input + send.

🔧 Worker (worker/index.html) — 7 vistas + 3 modales

IDVistaFuncionalidades
view-dashboardDashboardGreeting dinámico, 4 stat cards (ganancias, trabajos, rating, solicitudes) con trends. Grid 2-col: trabajo activo (completar) + gráfico barras 6 meses con hover. Solicitudes preview.
view-solicitudesSolicitudesRequest cards con .new (borde + label "NUEVA"). Botones: Aceptar, Rechazar, Cotizar. Info cliente con avatar.
view-agendaAgendaGrid 2-col: calendario 7 cols (.today, .has-job dot, .busy, .other-month, selectDay()) + detalle día con timeline de trabajos.
view-gananciasGananciasStats cards + gráfico + comparativa mensual + detalle transacciones.
view-perfilMi perfilAvatar upload, nombre, bio, skills, galería, teléfono, ciudad. Cambiar contraseña.
view-verificacionVerificaciónSteps con iconos (done/pending/missing). Upload documentos por categoría. Preview archivos subidos.
view-resenasReseñasLista de reseñas recibidas: stars + texto + fecha + cliente.
ModalContenido
quotationModalCREAR cotización: info cliente, tarifa/hora + horas, tabla materiales (agregar/eliminar), resumen (subtotal + comisión 15% + TOTAL), notas. Badge NUEVO pulsante.
workerChatModalChat con polling: header, messages scrolleable, input.
notifModalNotificaciones.

⚙️ Admin (admin/index.html) — 6 vistas

IDVistaFuncionalidades
view-overviewDashboard6 stats + Chart.js gráfico + breakdown por categoría + verificaciones preview + transacciones recientes.
view-verificacionesVerificacionesLista de pendientes con botones aprobar/rechazar/ver docs.
view-usuariosUsuariosTabla paginada + filtros (todos/clientes/workers) + sort + buscar + suspender/activar/eliminar.
view-transaccionesTransaccionesTabla con sort + paginación + filtros.
view-categoriasCategoríasEditar categorías existentes.
view-configuracionConfigConfiguraciones del sistema (toggles).

🗄️ Airtable — 8 tablas + 36 funciones CRUD

TablaMappersFunciones CRUD
WorkersmapWorker (18 campos)getWorkers, getWorkerByEmail, getWorkerByRecordId, updateWorker, updateWorkerAvailability, saveWorkerProfile, createWorkerAccount
ClientsmapClient (12 campos)getClients, getClientByEmail, saveClientProfile, createClientAccount
BookingsmapBooking (12 campos)getBookings, createBooking, updateBookingStatus, addBookingReview
RequestsmapRequest (13 campos)getRequests, createRequest, updateRequest, updateRequestStatus
QuotationsmapQuotation (18 campos)createQuotation, getQuotationsByWorker, getQuotationsByClient, getQuotationByBooking, updateQuotationStatus
MessagesmapMessage (4 campos)getMessages, sendMessage
VerificationsmapVerification (9 campos)getVerifications, updateVerification, getVerificationByWorker, createVerification, uploadVerificationDoc, updateVerificationDocs
TransactionsmapTransaction (7 campos)getTransactions, createTransaction

Efectos CSS — 16 detectados

#EfectoCSS
1Card hover elevacióntranslateY(-2px) + shadow-lg
2Btn primary hovertranslateY(-1px) + shadow-blue-lg
3Input focus ringborder-color primary + box-shadow 3px primary-light
4Sidebar link hoverbg gray-50 + icon color primary
5Status dot pulse@keyframes statusPulse box-shadow
6Badge NUEVO pulse@keyframes pulseNew opacity 1→0.7
7Chart bar transitionheight 0.5s ease + hover bg primary
8Worker detail slide-intranslateX(100%) → translateX(0)
9Modal overlay fadergba(0,0,0,0.4) backdrop
10Toast slide-in@keyframes toastIn translateX(100%)→0
11Request card .newborder primary + bg primary-50 + ::before "NUEVA"
12Calendar todaybg primary, color white, font-weight 700
13Calendar has-job::after dot 4px green
14Topbar search focus:focus-within border + box-shadow ring
15Navbar scroll.scrolled bg white + blur + shadow
16Hero blobsAnimated gradient blobs en landing
Gaps: Código v2 vs Maqueta v3
Todo lo que existe en el código pero falta o está incompleto en la maqueta HTML

Gaps críticos

Pantalla/FeatureEn código v2En maqueta v3Gap
Landing completaHero + search + blobs + cómo funciona + categorías + workers + stats bar + footerNo incluidaFALTA
Cliente mobile@media 768px: 1 col, sidebar slide-in, worker detail 100%No hay versión mobile de ninguna pantallaFALTA
Mapa Leaflet mobileResponsive, se pone debajo de la listaNo existeFALTA
Servicios activos (vista)Vista dedicada con cards + badges cotización + cancelarNo maquetadaFALTA
Historial (tabla)data-table completa con columnasNo maquetadaFALTA
Perfil cliente editableTabs datos/seguridad, avatar upload, cambiar passwordNo maquetadaFALTA
FavoritosGrid con corazón toggle + localStorageNo maquetadaFALTA
PagosVista placeholderNo maquetadaFALTA
Quotation view modal (cliente)Modal con desglose + aceptar/rechazar + PDF downloadNo maquetadaFALTA
Worker perfil editableBio, skills, galería, teléfono, avatar, passwordNo maquetadaFALTA
Worker reseñas vistaLista completa de reseñas recibidasNo maquetadaFALTA
Admin categoríasEditar nombre/icono de categoríasNo maquetadaFALTA
Admin configuraciónToggles del sistemaNo maquetadaFALTA

Parcialmente cubiertos

PantallaQué falta en la maqueta
Worker dashboardTrend arrows en stats, comparativa mensual 3 cols debajo del gráfico
AgendaDías .busy (amarillo), .other-month (gris), selectDay() click
Admin dashboardChart.js real, breakdown por categoría, transacciones recientes
Admin usuariosPaginación, sort, suspender/activar/eliminar acciones
LoginDemo accounts clickeables, error visible state, loading spinner en botón
Cotización crearTabla materiales más detallada (material input + qty + unit price + total por fila)
Especificación Funcional
User stories con criterios de aceptación — features NUEVAS que no existen en v2

US-01: Sistema de reclamos

Como cliente, quiero reportar un problema con un servicio, para resolver disputas y obtener reembolso.

Criterios de aceptación

  • Botón "Reportar problema" visible en booking completado o en curso
  • 4 tipos de reclamo: mala calidad, no se presentó, trabajo incompleto, daños
  • Campo de descripción obligatorio (min 20 caracteres)
  • Upload de fotos como evidencia (Airtable attachments, max 5 fotos)
  • Estado del reclamo visible para el cliente: abierto → en revisión → resuelto
  • Admin puede: tomar caso, agregar nota interna, resolver con reembolso total/parcial/sin reembolso
  • Email de notificación al cliente cuando se resuelve

Tabla Airtable: Claims

  • ClaimId (autonumber), BookingRecordId (link), ClientRecordId, WorkerRecordId
  • Type (singleSelect: mala_calidad, no_show, incompleto, daños)
  • Description (long text), Photos (attachment)
  • Status (singleSelect: open, reviewing, resolved)
  • AdminNotes (long text), RefundAmount (number), RefundType (singleSelect: full, partial, none)
  • CreatedAt, ResolvedAt (datetime)

US-02: Solicitud urgente

Como cliente, quiero marcar una solicitud como urgente, para conseguir ayuda rápidamente.

Criterios de aceptación

  • Toggle "Solicitud urgente" en el formulario de nueva solicitud (dentro de bookingModal)
  • Card urgente tiene borde rojo + badge "⚡ URGENTE" en la lista de solicitudes del worker
  • Solicitudes urgentes aparecen primero en la lista del worker
  • Campo IsUrgent (checkbox) en tabla Requests

US-03: Materiales guardados

Como profesional, quiero guardar materiales que uso frecuentemente, para cotizar más rápido.

Criterios de aceptación

  • Botón "📦 Mis materiales" en el modal de cotización
  • Lista desplegable de materiales guardados con nombre + precio unitario
  • Click en material lo agrega a la tabla de materiales de la cotización
  • CRUD de materiales guardados en perfil del worker (agregar, editar, eliminar)
  • Tabla SavedMaterials: MatId, WorkerRecordId, Name, UnitPrice, Unit

US-04: Sistema de niveles

Como profesional, quiero ver mi nivel y progreso, para motivarme a completar más trabajos.

Criterios de aceptación

  • 3 niveles: 🥉 Bronce (0-19 trabajos), 🥈 Plata (20-49), 🥇 Oro (50+)
  • Badge de nivel visible en: dashboard worker, perfil público, worker cards
  • Progress bar hacia el siguiente nivel
  • Campo Level (formula basada en CompletedJobs) en tabla Workers
  • Vista "Ganancias" muestra nivel + rendimiento (tasa aceptación, precio promedio, mejor día, racha)

US-05: Horario semanal + disponibilidad mejorada

Como profesional, quiero configurar mi horario por día + radio de cobertura + modo vacaciones.

Criterios de aceptación

  • 7 filas (Lun-Dom) con toggle activo/inactivo + hora inicio + hora fin
  • Slider de radio de cobertura (1-50 km)
  • Toggle "Modo vacaciones" que pausa todas las solicitudes
  • Tabla WorkerSchedule: ScheduleId, WorkerRecordId, DayOfWeek (0-6), StartTime, EndTime, IsActive
  • Campos adicionales en Workers: CoverageRadius (number), VacationMode (checkbox)

US-06: Centro de notificaciones mejorado

Como usuario, quiero ver todas mis notificaciones organizadas, para no perderme nada.

Criterios de aceptación

  • Tabla Notifications en Airtable (reemplaza notificaciones hardcoded)
  • Tipos: quotation_received, quotation_accepted, booking_confirmed, worker_on_way, job_completed, claim_resolved
  • Dot de "no leída" en cada notificación + counter en bell de topbar
  • Marcar como leída al abrir
  • Filtros: todas, sin leer, cotizaciones, sistema

US-07: Comparador de cotizaciones

Como cliente, quiero comparar cotizaciones lado a lado, para elegir la mejor opción.

Criterios de aceptación

  • Cuando un booking tiene 2+ cotizaciones, mostrar vista comparador
  • Highlight "🏆 Mejor precio" en la cotización más barata
  • Mostrar: worker name, rating, verificación, precio, desglose, tiempo respuesta
  • Botón "Aceptar" en cada cotización
  • Se implementa dentro de view-activos o como modal

US-08: Timeline de booking

Como cliente, quiero ver el progreso de mi reserva visualmente.

Criterios de aceptación

  • 5 pasos: Confirmada → Pagada → En camino → En curso → Completada
  • Cada paso con icono (done ✓ / active ● / pending ○)
  • Campo TimelineStatus en tabla Bookings (singleSelect)
  • Worker puede avanzar el estado ("En camino", "Completar")
Especificación Técnica
Archivos a modificar, tablas a crear, funciones a agregar

Cambios en Airtable

Tablas NUEVAS a crear

TablaCamposVista por defecto
ClaimsClaimId (auto), BookingRecordId, ClientRecordId, WorkerRecordId, Type (singleSelect), Description, Photos (attachment), Status (singleSelect: open/reviewing/resolved), AdminNotes, RefundAmount, RefundType (singleSelect), CreatedAt, ResolvedAtGrid filtrado por Status = open
NotificationsNotifId (auto), UserRecordId, UserType (singleSelect: client/worker), Type (singleSelect), Title, Body, Read (checkbox), RelatedRecordId, CreatedAtGrid filtrado por Read = false
SavedMaterialsMatId (auto), WorkerRecordId, Name, UnitPrice (currency), Unit (singleSelect: unidad/metro/kg)Grid agrupado por WorkerRecordId
WorkerScheduleScheduleId (auto), WorkerRecordId, DayOfWeek (number 0-6), StartTime, EndTime, IsActive (checkbox)Grid agrupado por WorkerRecordId

Campos NUEVOS en tablas existentes

TablaCampoTipo
WorkersCoverageRadiusNumber (default 15)
WorkersVacationModeCheckbox
WorkersLevelFormula: IF(CompletedJobs>=50,"oro",IF(CompletedJobs>=20,"plata","bronce"))
BookingsIsUrgentCheckbox
BookingsTimelineStatusSingleSelect: confirmed/paid/on_way/in_progress/completed
RequestsIsUrgentCheckbox
RequestsPhotosAttachment
MessagesImageUrlAttachment

Archivos JS a modificar

ArchivoFunciones a AGREGAR
js/airtable.jsmapClaim, mapNotification, mapSavedMaterial, mapSchedule, getClaims, createClaim, updateClaimStatus, getNotifications, createNotification, markNotifRead, getSavedMaterials, createSavedMaterial, deleteSavedMaterial, getWorkerSchedule, saveWorkerSchedule
js/client.jsopenClaimModal, submitClaim, loadClaimStatus, renderComparator, renderTimeline, loadNotificationsFromDB, markNotifAsRead
js/worker.jsloadSavedMaterials, addSavedMaterial, useSavedMaterial, loadSchedule, saveSchedule, toggleVacation, updateCoverageRadius, advanceTimeline
js/admin.jsloadClaims, takeClaim, resolveClaim (con reembolso)

Archivos HTML a modificar

ArchivoCambios
client/index.html+ Modal claim (form con tipo + descripción + foto upload). + Toggle urgente en bookingModal. + Comparador cotizaciones (en view-activos o nuevo modal). + Timeline visual en detalle booking.
worker/index.html+ Sección materiales guardados en view-perfil. + Botón "Mis materiales" en quotationModal. + Vista disponibilidad (horario + radio + vacaciones) en view-perfil o nueva vista. + Nivel badge en dashboard.
admin/index.html+ Vista reclamos (nuevo view-reclamos) con lista + acciones reembolso.

CSS — NO cambiar

  • Mantener variables.css, main.css, app.css tal como están
  • Nuevos estilos van inline en cada página (patrón existente)
  • Color primario: #059669 (verde) — no cambiar
  • Los 16 efectos CSS deben mantenerse sin modificación
  • Nuevos componentes (claim card, timeline, comparator) siguen el design system existente
Fases de Implementación para Hoku
Orden de implementación con dependencias — 4 fases incrementales

🔴 Fase 1 — Fundación (prerequisitos para todo lo demás)

#TareaArchivoEsfuerzo
1.1Crear tablas Claims, Notifications, SavedMaterials, WorkerSchedule en AirtableManual en Airtable UIManual
1.2Agregar campos nuevos a Workers, Bookings, Requests, MessagesManual en Airtable UIManual
1.3Mappers + CRUD en airtable.js para Claims, Notifications, SavedMaterials, WorkerSchedulejs/airtable.jsAlto
1.4Notificaciones desde DB (reemplazar hardcoded)js/client.js + js/worker.jsMedio

🔴 Fase 2 — Features de cliente

#TareaArchivoEsfuerzo
2.1Modal de reclamo: form + tipos + upload fotos + submitclient/index.html + js/client.jsAlto
2.2Toggle urgente en bookingModal + campo IsUrgentclient/index.html + js/client.jsBajo
2.3Comparador cotizaciones (vista o modal en view-activos)js/client.jsMedio
2.4Timeline visual en detalle booking (5 pasos)js/client.jsMedio

🟡 Fase 3 — Features de worker

#TareaArchivoEsfuerzo
3.1Materiales guardados: CRUD en perfil + selector en quotationModalworker/index.html + js/worker.jsMedio
3.2Sistema de niveles: badge + progress bar + rendimientojs/worker.jsBajo
3.3Horario semanal configurable + radio cobertura + modo vacacionesworker/index.html + js/worker.jsMedio
3.4Solicitudes urgentes: card roja + badge + sort primerojs/worker.jsBajo

🟢 Fase 4 — Admin + pulido

#TareaArchivoEsfuerzo
4.1Admin: vista reclamos con take case + resolver + reembolsoadmin/index.html + js/admin.jsMedio
4.2Chat con fotos (ImageUrl attachment en Messages)client + worker JSMedio
4.3Perfil público mejorado: nivel badge, galería, biojs/client.js (worker detail)Bajo
4.4Estados UI mejorados: skeleton shimmer para loading statesTodos los JSBajo

📋 Resumen para Hoku

Stack: Vanilla JS + Airtable — NO migrar.
Color: Verde #059669.
Iconos: FontAwesome 6.5.
Comisión: 15%.
Layout: Desktop-first con sidebar, responsive mobile.
Patrón de código: funciones globales en archivos separados, showView() para toggle vistas, VOY.openModal() para modales, VoyDB.* para CRUD.
Despliegue: git push → Vercel auto-deploy voy-app-2, luego manual voy-app-3.
Testing: Probar en voy-app-2 primero (voy-app-2.vercel.app), luego fusionar a voy-app-3.
Orden: Fase 1 → 2 → 3 → 4. NO saltar fases. Cada fase debe funcionar antes de empezar la siguiente.
jsPDF: versión 2.5.1 (NO 2.5.2 que da 404).
Dev panel: no tocar, se inyecta automáticamente en voy-app-3.