| Capa | Detalle |
|---|---|
| Stack | Vanilla JS + Airtable API + Vercel (static + serverless) |
| CSS | 3 archivos: variables.css (107 tokens) + main.css (componentes globales) + app.css (layout shell) + landing.css + inline por página |
| JS | 8 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 |
| Iconos | FontAwesome 6.5.1 (CDN) |
| Mapas | Leaflet 1.9.4 (solo en client) |
| jsPDF 2.5.1 (CDN cdnjs — NO 2.5.2) | |
| Charts | Chart.js 4.4.7 (solo en admin) |
| Emails | Resend (serverless function api/send-email.js) |
| Deploy | Vercel: voy-app-2 (Guillermo) → build.js genera /public/ con config.js inyectado |
| Fusión | voy-app-3 descarga HTML de voy-app-1 (Sergio) + voy-app-2 y fusiona con tema morado |
| Sección | Contenido |
|---|---|
| Navbar | Logo VOY + links (Cómo funciona, Servicios, Especialistas) + btn "Buscar servicio" + hamburger mobile |
| Hero | Barra búsqueda (servicio + ubicación) + card worker flotante + pills categorías populares + stats bar |
| Cómo funciona | Tabs cliente/trabajador + 3 pasos con iconos + flechas |
| Categorías | Grid 8 categorías con iconos FA + hover animado |
| Especialistas | 3 worker cards + link "Ver todos" |
| Footer | Links + copyright |
| Componente | Detalle |
|---|---|
| Auth card | Max-width 440px, radius-2xl, shadow 32px |
| Tabs | "Ingresar" | "Registrarse" con border-bottom active |
| Login form | Email + password + botón "Ingresar" + error visible |
| Register form | Nombre + email + password + confirmar + selector de rol (🏠 Cliente / 🔧 Profesional) + ciudad select + categoría (si profesional) |
| Demo accounts | Cuentas de prueba clickeables (cliente, especialista, admin) |
| ID | Vista | Funcionalidades |
|---|---|---|
| view-buscar | Explorar | Layout 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-activos | Servicios activos | Cards de bookings en curso con estado, worker info, botón cancelar, botón chat. Badges de cotización (pending/accepted/rejected). |
| view-historial | Historial | data-table con todos los servicios pasados, columnas: servicio, worker, fecha, precio, estado, calificar. |
| view-perfil | Mi perfil | Tabs (datos, seguridad). Avatar upload. Campos: nombre, email, teléfono, ciudad, dirección. Cambiar contraseña (actual + nueva + confirmar). |
| view-pagos | Pagos | Métodos de pago (placeholder). |
| view-favoritos | Favoritos | Grid de workers favoritos (localStorage). Corazón toggle. |
| view-notifs | Notificaciones | Lista de notificaciones. |
| Modal/Panel | Contenido |
|---|---|
| bookingModal | Info worker, servicio select, modalidad (inmediato/agendar), fecha, hora, dirección, descripción, resumen precio. |
| ratingModal | 5 estrellas clickeables (setRating), textarea comentario. |
| notifModal | Lista de notificaciones. |
| quotationViewModal | Ver cotización completa: desglose + aceptar/rechazar + descargar PDF. |
| worker-detail | Panel slide-in 420px: avatar, bio, skills, galería 3-col, reseñas, btn Mensaje + Agendar. |
| chat-panel | Panel lateral: header con avatar, messages con polling, input + send. |
| ID | Vista | Funcionalidades |
|---|---|---|
| view-dashboard | Dashboard | Greeting 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-solicitudes | Solicitudes | Request cards con .new (borde + label "NUEVA"). Botones: Aceptar, Rechazar, Cotizar. Info cliente con avatar. |
| view-agenda | Agenda | Grid 2-col: calendario 7 cols (.today, .has-job dot, .busy, .other-month, selectDay()) + detalle día con timeline de trabajos. |
| view-ganancias | Ganancias | Stats cards + gráfico + comparativa mensual + detalle transacciones. |
| view-perfil | Mi perfil | Avatar upload, nombre, bio, skills, galería, teléfono, ciudad. Cambiar contraseña. |
| view-verificacion | Verificación | Steps con iconos (done/pending/missing). Upload documentos por categoría. Preview archivos subidos. |
| view-resenas | Reseñas | Lista de reseñas recibidas: stars + texto + fecha + cliente. |
| Modal | Contenido |
|---|---|
| quotationModal | CREAR cotización: info cliente, tarifa/hora + horas, tabla materiales (agregar/eliminar), resumen (subtotal + comisión 15% + TOTAL), notas. Badge NUEVO pulsante. |
| workerChatModal | Chat con polling: header, messages scrolleable, input. |
| notifModal | Notificaciones. |
| ID | Vista | Funcionalidades |
|---|---|---|
| view-overview | Dashboard | 6 stats + Chart.js gráfico + breakdown por categoría + verificaciones preview + transacciones recientes. |
| view-verificaciones | Verificaciones | Lista de pendientes con botones aprobar/rechazar/ver docs. |
| view-usuarios | Usuarios | Tabla paginada + filtros (todos/clientes/workers) + sort + buscar + suspender/activar/eliminar. |
| view-transacciones | Transacciones | Tabla con sort + paginación + filtros. |
| view-categorias | Categorías | Editar categorías existentes. |
| view-configuracion | Config | Configuraciones del sistema (toggles). |
| Tabla | Mappers | Funciones CRUD |
|---|---|---|
| Workers | mapWorker (18 campos) | getWorkers, getWorkerByEmail, getWorkerByRecordId, updateWorker, updateWorkerAvailability, saveWorkerProfile, createWorkerAccount |
| Clients | mapClient (12 campos) | getClients, getClientByEmail, saveClientProfile, createClientAccount |
| Bookings | mapBooking (12 campos) | getBookings, createBooking, updateBookingStatus, addBookingReview |
| Requests | mapRequest (13 campos) | getRequests, createRequest, updateRequest, updateRequestStatus |
| Quotations | mapQuotation (18 campos) | createQuotation, getQuotationsByWorker, getQuotationsByClient, getQuotationByBooking, updateQuotationStatus |
| Messages | mapMessage (4 campos) | getMessages, sendMessage |
| Verifications | mapVerification (9 campos) | getVerifications, updateVerification, getVerificationByWorker, createVerification, uploadVerificationDoc, updateVerificationDocs |
| Transactions | mapTransaction (7 campos) | getTransactions, createTransaction |
| # | Efecto | CSS |
|---|---|---|
| 1 | Card hover elevación | translateY(-2px) + shadow-lg |
| 2 | Btn primary hover | translateY(-1px) + shadow-blue-lg |
| 3 | Input focus ring | border-color primary + box-shadow 3px primary-light |
| 4 | Sidebar link hover | bg gray-50 + icon color primary |
| 5 | Status dot pulse | @keyframes statusPulse box-shadow |
| 6 | Badge NUEVO pulse | @keyframes pulseNew opacity 1→0.7 |
| 7 | Chart bar transition | height 0.5s ease + hover bg primary |
| 8 | Worker detail slide-in | translateX(100%) → translateX(0) |
| 9 | Modal overlay fade | rgba(0,0,0,0.4) backdrop |
| 10 | Toast slide-in | @keyframes toastIn translateX(100%)→0 |
| 11 | Request card .new | border primary + bg primary-50 + ::before "NUEVA" |
| 12 | Calendar today | bg primary, color white, font-weight 700 |
| 13 | Calendar has-job | ::after dot 4px green |
| 14 | Topbar search focus | :focus-within border + box-shadow ring |
| 15 | Navbar scroll | .scrolled bg white + blur + shadow |
| 16 | Hero blobs | Animated gradient blobs en landing |
| Pantalla/Feature | En código v2 | En maqueta v3 | Gap |
|---|---|---|---|
| Landing completa | Hero + search + blobs + cómo funciona + categorías + workers + stats bar + footer | No incluida | FALTA |
| Cliente mobile | @media 768px: 1 col, sidebar slide-in, worker detail 100% | No hay versión mobile de ninguna pantalla | FALTA |
| Mapa Leaflet mobile | Responsive, se pone debajo de la lista | No existe | FALTA |
| Servicios activos (vista) | Vista dedicada con cards + badges cotización + cancelar | No maquetada | FALTA |
| Historial (tabla) | data-table completa con columnas | No maquetada | FALTA |
| Perfil cliente editable | Tabs datos/seguridad, avatar upload, cambiar password | No maquetada | FALTA |
| Favoritos | Grid con corazón toggle + localStorage | No maquetada | FALTA |
| Pagos | Vista placeholder | No maquetada | FALTA |
| Quotation view modal (cliente) | Modal con desglose + aceptar/rechazar + PDF download | No maquetada | FALTA |
| Worker perfil editable | Bio, skills, galería, teléfono, avatar, password | No maquetada | FALTA |
| Worker reseñas vista | Lista completa de reseñas recibidas | No maquetada | FALTA |
| Admin categorías | Editar nombre/icono de categorías | No maquetada | FALTA |
| Admin configuración | Toggles del sistema | No maquetada | FALTA |
| Pantalla | Qué falta en la maqueta |
|---|---|
| Worker dashboard | Trend arrows en stats, comparativa mensual 3 cols debajo del gráfico |
| Agenda | Días .busy (amarillo), .other-month (gris), selectDay() click |
| Admin dashboard | Chart.js real, breakdown por categoría, transacciones recientes |
| Admin usuarios | Paginación, sort, suspender/activar/eliminar acciones |
| Login | Demo accounts clickeables, error visible state, loading spinner en botón |
| Cotización crear | Tabla materiales más detallada (material input + qty + unit price + total por fila) |
Como cliente, quiero reportar un problema con un servicio, para resolver disputas y obtener reembolso.
Como cliente, quiero marcar una solicitud como urgente, para conseguir ayuda rápidamente.
Como profesional, quiero guardar materiales que uso frecuentemente, para cotizar más rápido.
Como profesional, quiero ver mi nivel y progreso, para motivarme a completar más trabajos.
Como profesional, quiero configurar mi horario por día + radio de cobertura + modo vacaciones.
Como usuario, quiero ver todas mis notificaciones organizadas, para no perderme nada.
Como cliente, quiero comparar cotizaciones lado a lado, para elegir la mejor opción.
Como cliente, quiero ver el progreso de mi reserva visualmente.
| Tabla | Campos | Vista por defecto |
|---|---|---|
| Claims | ClaimId (auto), BookingRecordId, ClientRecordId, WorkerRecordId, Type (singleSelect), Description, Photos (attachment), Status (singleSelect: open/reviewing/resolved), AdminNotes, RefundAmount, RefundType (singleSelect), CreatedAt, ResolvedAt | Grid filtrado por Status = open |
| Notifications | NotifId (auto), UserRecordId, UserType (singleSelect: client/worker), Type (singleSelect), Title, Body, Read (checkbox), RelatedRecordId, CreatedAt | Grid filtrado por Read = false |
| SavedMaterials | MatId (auto), WorkerRecordId, Name, UnitPrice (currency), Unit (singleSelect: unidad/metro/kg) | Grid agrupado por WorkerRecordId |
| WorkerSchedule | ScheduleId (auto), WorkerRecordId, DayOfWeek (number 0-6), StartTime, EndTime, IsActive (checkbox) | Grid agrupado por WorkerRecordId |
| Tabla | Campo | Tipo |
|---|---|---|
| Workers | CoverageRadius | Number (default 15) |
| Workers | VacationMode | Checkbox |
| Workers | Level | Formula: IF(CompletedJobs>=50,"oro",IF(CompletedJobs>=20,"plata","bronce")) |
| Bookings | IsUrgent | Checkbox |
| Bookings | TimelineStatus | SingleSelect: confirmed/paid/on_way/in_progress/completed |
| Requests | IsUrgent | Checkbox |
| Requests | Photos | Attachment |
| Messages | ImageUrl | Attachment |
| Archivo | Funciones a AGREGAR |
|---|---|
| js/airtable.js | mapClaim, mapNotification, mapSavedMaterial, mapSchedule, getClaims, createClaim, updateClaimStatus, getNotifications, createNotification, markNotifRead, getSavedMaterials, createSavedMaterial, deleteSavedMaterial, getWorkerSchedule, saveWorkerSchedule |
| js/client.js | openClaimModal, submitClaim, loadClaimStatus, renderComparator, renderTimeline, loadNotificationsFromDB, markNotifAsRead |
| js/worker.js | loadSavedMaterials, addSavedMaterial, useSavedMaterial, loadSchedule, saveSchedule, toggleVacation, updateCoverageRadius, advanceTimeline |
| js/admin.js | loadClaims, takeClaim, resolveClaim (con reembolso) |
| Archivo | Cambios |
|---|---|
| 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. |
| # | Tarea | Archivo | Esfuerzo |
|---|---|---|---|
| 1.1 | Crear tablas Claims, Notifications, SavedMaterials, WorkerSchedule en Airtable | Manual en Airtable UI | Manual |
| 1.2 | Agregar campos nuevos a Workers, Bookings, Requests, Messages | Manual en Airtable UI | Manual |
| 1.3 | Mappers + CRUD en airtable.js para Claims, Notifications, SavedMaterials, WorkerSchedule | js/airtable.js | Alto |
| 1.4 | Notificaciones desde DB (reemplazar hardcoded) | js/client.js + js/worker.js | Medio |
| # | Tarea | Archivo | Esfuerzo |
|---|---|---|---|
| 2.1 | Modal de reclamo: form + tipos + upload fotos + submit | client/index.html + js/client.js | Alto |
| 2.2 | Toggle urgente en bookingModal + campo IsUrgent | client/index.html + js/client.js | Bajo |
| 2.3 | Comparador cotizaciones (vista o modal en view-activos) | js/client.js | Medio |
| 2.4 | Timeline visual en detalle booking (5 pasos) | js/client.js | Medio |
| # | Tarea | Archivo | Esfuerzo |
|---|---|---|---|
| 3.1 | Materiales guardados: CRUD en perfil + selector en quotationModal | worker/index.html + js/worker.js | Medio |
| 3.2 | Sistema de niveles: badge + progress bar + rendimiento | js/worker.js | Bajo |
| 3.3 | Horario semanal configurable + radio cobertura + modo vacaciones | worker/index.html + js/worker.js | Medio |
| 3.4 | Solicitudes urgentes: card roja + badge + sort primero | js/worker.js | Bajo |
| # | Tarea | Archivo | Esfuerzo |
|---|---|---|---|
| 4.1 | Admin: vista reclamos con take case + resolver + reembolso | admin/index.html + js/admin.js | Medio |
| 4.2 | Chat con fotos (ImageUrl attachment en Messages) | client + worker JS | Medio |
| 4.3 | Perfil público mejorado: nivel badge, galería, bio | js/client.js (worker detail) | Bajo |
| 4.4 | Estados UI mejorados: skeleton shimmer para loading states | Todos los JS | Bajo |
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.