Mapa completo de flujo de datos de la plataforma
Sabores de Origen es una plataforma de comercio electronico movil especializada en productos artesanales mexicanos del Rancho Cuatro Granas. Los clientes navegan un catalogo de productos, los agregan al carrito, eligen fecha y horario de entrega, pagan con tarjeta (Stripe) o en efectivo (OXXO), y reciben sus productos a domicilio con seguimiento en tiempo real.
El sistema tiene tres tipos de usuario:
| Operacion | Metodo | Endpoint | Descripcion |
|---|---|---|---|
| Guardar | POST | /api/cart/save | Sincroniza carrito con backend (debounce 500ms) |
| Cargar | POST | /api/cart/get | Recupera carrito al iniciar sesion |
| Limpiar | POST | /api/cart/clear | Vacia el carrito tras compra exitosa |
| Migrar | POST | /api/cart/migrate | Fusiona carrito de invitado a usuario registrado |
| Actividad | POST | /api/cart-activity | Registra actividad para expiracion 24h |
| Concepto | Formula |
|---|---|
| Subtotal bruto | Suma (precio x cantidad) por cada producto |
| Descuento por producto | Suma (descuento x cantidad) — descuentos individuales |
| Subtotal neto | Subtotal bruto - descuentos de producto |
| Descuento promocional | Subtotal neto x (promotional_discount / 100) |
| Cupon (si aplica) | Porcentaje o monto fijo sobre total o envio |
| Costo de envio | Gratis si subtotal >= umbral, o tarifa fija |
| Total final | Subtotal - promos - cupon + envio |
El proceso de compra sigue estos pasos en orden:
POST /api/stripe/webhook → ControllsController@handle valida la firma y actualiza el payment_status del pedido a "paid".| Validacion Backend | Descripcion |
|---|---|
| Cupon | Re-valida en el servidor (previene manipulacion desde frontend) |
| Precios | Recalcula totales con precios del catalogo actual |
| Stock | Verifica disponibilidad |
| Duplicados | Previene incremento doble de uso de cupon por webhook |
GET /api/shipping-motivation/{subtotal} devuelve cuanto falta para envio gratis (ej: "Agrega $50 mas para envio gratis").| Accion | Metodo | Endpoint | Datos |
|---|---|---|---|
| Ver perfil | GET | /api/userdetails/{userId} | nombre, email, telefono, direccion, cumpleanos |
| Actualizar perfil | POST | /api/updateuserprofile | {userid, first_name, last_name, phone, dob} |
| Cambiar contrasena | POST | /api/updateusepassword | {userid, current_password, new_password} |
| Eliminar cuenta | POST | /api/deleteuser | {userid} — marca user_was_deleted, conserva historial |
| Verificar email | POST | /api/check-email-exists | {email} — verifica si ya existe |
| Accion | Metodo | Endpoint (Registrados) | Endpoint (Invitados) |
|---|---|---|---|
| Listar | GET | /api/user/{userId}/addresses | /api/guest/address/{email} |
| Crear | POST | /api/user/addresses | /api/guest/address |
| Editar | PUT | /api/user/addresses/{id} | /api/guest/address (sobreescribe) |
| Eliminar | DELETE | /api/user/addresses/{id} | N/A |
| Marcar principal | POST | /api/user/addresses/{id}/primary | N/A |
| Tipo | Aplica a | Condicion |
|---|---|---|
| Global | Todos los usuarios | Dentro de fechas vigentes |
| Individual | Usuario especifico | Asignado por admin |
| Birthday | Usuario en mes de cumpleanos | DOB coincide con mes actual |
| Guest | Solo invitados | Usuario no registrado |
| Usuarios de Google OAuth | provider = "google" | |
| Apple | Usuarios de Apple Sign-In | provider = "apple" |
| Normal | Usuarios sin OAuth | Registro directo con email |
| Evento | Titulo | Mensaje | Trigger |
|---|---|---|---|
| Pago confirmado | 🎉 ¡Pedido Confirmado! | Tu pedido #N esta listo. Pago de $X recibido. | Stripe webhook: payment_intent.succeeded |
| Pago fallido | 💳 Problema con el pago | El pago de tu pedido #N no pudo procesarse. Intenta de nuevo. | Stripe webhook: payment_intent.payment_failed |
| Pago OXXO pendiente | 📋 ¡Pedido confirmado! Pago pendiente | Tu pedido #N ha sido confirmado. Ve a OXXO a completar tu pago. | Stripe webhook: requires_action |
| Pedido gratuito | 🎉 ¡Pedido Confirmado! | Tu pedido #N ha sido confirmado. ¡Disfruta tu compra gratuita! | Admin crea pedido gratuito |
| Preparando pedido | 👨🍳 Preparando tu Pedido | Estamos preparando tu pedido #N con mucho carino. | Admin cambia status a "preparing" |
| Pedido listo | 📦 Pedido Listo | Tu pedido #N esta listo y esperando al repartidor. | Admin cambia status a "ready" |
| Repartidor asignado | 🛵 Repartidor Asignado | {nombre} llevara tu pedido #N. | Repartidor inicia ruta |
| En camino | 🚗 ¡En Camino! | ¡Tu pedido esta en camino! {nombre} lo esta llevando. Total: $X 🚚 | Repartidor envia primera ubicacion |
| Llegando | 📍 ¡Tu pedido esta llegando! | Tu repartidor esta a solo {X} metros de tu ubicacion. ¡Preparate! | Repartidor a menos de 500m |
| Entregado | 🎉 ¡Entregado! | ¡Pedido entregado exitosamente! Total: $X - ¡Esperamos que lo disfrutes! 🎉 | Repartidor marca como entregado |
| Problema con pedido | ⚠️ Problema con tu pedido | El repartidor tuvo un problema y no pudo completar la entrega. | Repartidor cancela/rechaza entrega |
| Mensaje de chat | 💬 Mensaje del Repartidor | {nombre}: {mensaje} (primeros 60 caracteres) | Repartidor envia mensaje en chat |
| Evento | Titulo | Mensaje | Trigger |
|---|---|---|---|
| Nuevo pedido asignado | 📦 Nuevo Pedido | ¡Tienes un nuevo pedido! #N. Revisa los detalles. | Admin asigna repartidor al pedido |
| Pedido cancelado por cliente | ❌ Pedido cancelado | El cliente ha cancelado el pedido #N. | Cliente cancela pedido activo |
| Mensaje de chat | 💬 Nuevo Mensaje | {nombre}: {mensaje} (primeros 60 caracteres) | Cliente envia mensaje en chat |
| Evento | Titulo | Mensaje | Trigger |
|---|---|---|---|
| Repartidor rechaza pedido | ⚠️ Pedido #N Rechazado | {nombre} rechazo el pedido. Razon: {razon} | Repartidor rechaza pedido asignado |
| Template | Evento | Parametros | Destinatario |
|---|---|---|---|
admin_nuevo_pedido | Nuevo pedido creado | Numero de orden, nombre cliente, total, fecha y hora de entrega, direccion, RFC/factura | Admin |
_admin_pedido_cancelado | Pedido cancelado | Numero de orden, nombre cliente, cancelado por, razon, total | Admin |
admin_nuevo_feedback | Cliente envia feedback | Nombre del cliente, email, mensaje (max 100 chars) | Admin |
otp_verification | Verificacion de telefono | Codigo OTP de 6 digitos | Cliente |
| Texto plano | Repartidor rechaza pedido | Numero de orden, nombre repartidor, razon del rechazo | Admin |
notifications.admin.whatsapp. El sistema verifica credenciales de la API antes de enviar. Si WhatsApp no esta disponible, se usan canales alternativos (email + SMS).| Trigger | Destinatario | |
|---|---|---|
| Bienvenida | Nuevo registro | Usuario |
| Confirmacion de pedido | Pedido creado | Usuario |
| Nuevo pedido (admin) | Pedido creado | Admin |
| Pedido entregado | Status = Delivered | Usuario |
| Pedido cancelado | Status = Cancelled | Usuario |
| Reset de contrasena | Solicitud de reset | Usuario |
| OTP verificacion | Registro / verificacion | Usuario |
| Endpoint | Metodo | Servicio | Descripcion |
|---|---|---|---|
| /api/otp/send | POST | Envia codigo OTP por correo | |
| /api/otp/verify | POST | Verifica codigo OTP | |
| /api/sms/send | POST | AWS SNS / WhatsApp | Envia OTP por SMS o WhatsApp segun config |
| /api/sms/verify | POST | AWS SNS / WhatsApp | Verifica codigo SMS o WhatsApp |
| /api/guest/email/send-otp | POST | OTP para verificar email de invitado |
| Canal | Evento | Datos | Uso |
|---|---|---|---|
order.{orderId} | status | Nuevo estado del pedido | Actualizar badge y lista de pedidos |
order.{orderId} | location | {driver_lat, driver_long} | Mover pin del repartidor en mapa |
order.{orderId} | chat | {sender, message, timestamp} | Mensajes entre cliente y repartidor |
user.{userId}.orders | update | Lista de pedidos actualizada | Refrescar automaticamente lista de pedidos |
guest.{emailHash}.orders | update | Lista de pedidos del invitado | Refrescar pedidos del invitado |
user.{userId} | account_deleted | Senal de cuenta eliminada | Forzar logout en todos los dispositivos |
| Servicio | Proposito | Conexion | Datos que fluyen |
|---|---|---|---|
| 💳 Stripe | Procesamiento de pagos | API REST + Webhook | Montos en MXN, payment intents, confirmaciones. Soporta tarjeta y OXXO. |
| 🔥 Firebase (FCM) | Push notifications | Firebase Admin SDK | Tokens FCM, titulos, cuerpos de notificacion, datos extras |
| 📡 Pusher | WebSockets en tiempo real | Pusher SDK | Eventos de estado, ubicacion de driver, mensajes de chat |
| ☁️ AWS Lambda | Hosting serverless del backend | Serverless Framework | Toda la API Laravel corre como funcion Lambda |
| 📦 AWS S3 | Almacenamiento de archivos | AWS SDK | Imagenes de productos, fotos de perfil, facturas |
| 🌐 AWS CloudFront | CDN para archivos estaticos | Distribucion CDN | URLs de imagenes transformadas a CDN |
| 📱 AWS SNS | SMS / OTP | AWS SNS API | Codigos OTP a numeros de telefono (formato E.164) |
| 🔵 Google OAuth | Autenticacion social | OAuth 2.0 | Credenciales, email, nombre del usuario |
| 🍎 Apple Sign-In | Autenticacion social (iOS) | Apple JWT | Identity token, user ID, email (puede ser relay) |
| 📧 Hostinger SMTP | Envio de emails | SMTP | Correos transaccionales (confirmaciones, OTP, resets) |
| 🗺️ Google Maps | Geocodificacion | Geocoding API | Direccion texto a coordenadas lat/long |
| Modulo | Metodo | Endpoint | Controlador | Descripcion |
|---|---|---|---|---|
| Auth | POST | /api/login | AuthenticatedSessionController | Iniciar sesion |
| Auth | POST | /api/register | RegisteredUserController | Registro de usuario |
| Auth | POST | /api/auth/google | WebSiteController | Login con Google |
| Auth | POST | /api/auth/apple | WebSiteController | Login con Apple |
| Auth | POST | /api/forgetpasswordlink | PasswordResetLinkController | Enviar link de reset |
| Catalogo | GET | /api/products/{category?} | ControllsController | Productos por categoria |
| Catalogo | GET | /api/productscats | ControllsController | Listar categorias |
| Carrito | POST | /api/cart/save | CartController | Guardar carrito |
| Carrito | POST | /api/cart/get | CartController | Recuperar carrito |
| Carrito | POST | /api/cart/clear | CartController | Limpiar carrito |
| Carrito | POST | /api/cart/migrate | CartController | Migrar carrito invitado a usuario |
| Carrito | POST | /api/cart-activity | ControllsController | Registrar actividad del carrito |
| Pedidos | POST | /api/ordersubmit | RegisteredUserController | Crear pedido |
| Pedidos | GET | /api/orderhistory/{userid} | RegisteredUserController | Historial de pedidos |
| Pedidos | GET | /api/orderdetails/{orderid} | RegisteredUserController | Detalle de pedido |
| Pedidos | POST | /api/orderdel | RegisteredUserController | Marcar como entregado |
| Pedidos | POST | /api/orders/cancel | ControllsController | Cancelar pedido |
| Pedidos | POST | /api/migrateorders | RegisteredUserController | Migrar pedidos de invitado |
| Invitados | GET | /api/guest/orders/{email} | RegisteredUserController | Pedidos de invitado |
| Invitados | POST | /api/guest/address | RegisteredUserController | Guardar direccion invitado |
| Invitados | GET | /api/guest/address/{email} | RegisteredUserController | Obtener direccion invitado |
| Pagos | POST | /api/create-payment-intent | ControllsController | Crear intento de pago Stripe |
| Direcciones | GET | /api/user/{userId}/addresses | RegisteredUserController | Listar direcciones |
| Direcciones | POST | /api/user/addresses | RegisteredUserController | Agregar direccion (max 3) |
| Direcciones | PUT | /api/user/addresses/{id} | RegisteredUserController | Editar direccion |
| Direcciones | DELETE | /api/user/addresses/{id} | RegisteredUserController | Eliminar direccion |
| Direcciones | POST | /api/user/addresses/{id}/primary | RegisteredUserController | Marcar como principal |
| Direcciones | POST | /api/addaddress | RegisteredUserController | Agregar direccion (legacy) |
| Direcciones | GET | /api/fetch_address/{id} | RegisteredUserController | Obtener direcciones (legacy) |
| Direcciones | GET | /api/fetch_address_single_edit/{id} | RegisteredUserController | Obtener direccion para editar (legacy) |
| Direcciones | POST | /api/updateaddress | RegisteredUserController | Actualizar direccion (legacy) |
| Direcciones | POST | /api/deleteaddress | RegisteredUserController | Eliminar direccion (legacy) |
| Entregas | GET | /api/delivery-days | ControllsController | Dias de entrega disponibles |
| Entregas | GET | /api/fetch_ddates/{ddate} | ControllsController | Horarios disponibles por fecha |
| Entregas | GET | /api/shipping-config | ControllsController | Configuracion de envio |
| Entregas | GET | /api/shipping-motivation/{subtotal} | ControllsController | Monto para envio gratis |
| Entregas | POST | /api/delivery-info/save | RegisteredUserController | Guardar info de entrega |
| Entregas | POST | /api/delivery-info/get | RegisteredUserController | Obtener info de entrega |
| Promos | POST | /api/validate-coupon | ControllsController | Validar cupon |
| Promos | POST | /api/get-automatic-promotions | ControllsController | Promociones automaticas |
| Perfil | GET | /api/userdetails/{userid} | RegisteredUserController | Datos del usuario |
| Perfil | POST | /api/updateuserprofile | RegisteredUserController | Actualizar perfil |
| Perfil | POST | /api/updateusepassword | PasswordController | Cambiar contrasena |
| Perfil | POST | /api/deleteuser | RegisteredUserController | Eliminar cuenta |
| Perfil | POST | /api/check-email-exists | RegisteredUserController | Verificar email existente |
| OTP | POST | /api/otp/send | OTPController | Enviar OTP por email |
| OTP | POST | /api/otp/verify | OTPController | Verificar OTP |
| OTP | POST | /api/guest/email/send-otp | OTPController | OTP para invitado |
| OTP | POST | /api/guest/email/verify-otp | OTPController | Verificar OTP invitado |
| SMS | POST | /api/sms/send | SMSVerificationController | Enviar OTP por SMS |
| SMS | POST | /api/sms/verify | SMSVerificationController | Verificar SMS OTP |
| SMS | POST | /api/sms/resend | SMSVerificationController | Reenviar SMS OTP |
| SMS | GET | /api/sms/status | SMSVerificationController | Estado de verificacion SMS |
| Notif. | POST | /api/update-fcm-token | RegisteredUserController | Actualizar token FCM |
| Notif. | POST | /api/remove-fcm-token | ControllsController | Remover token FCM |
| Driver | POST | /api/driverlocsubmit | RegisteredUserController | Enviar ubicacion del repartidor |
| Driver | GET | /api/driverlocationsagainstorder/{id} | RegisteredUserController | Ubicaciones del repartidor |
| Driver | GET | /api/orderhistorydriver/{userid} | RegisteredUserController | Pedidos del repartidor |
| Driver | POST | /api/driver/reject-order | RegisteredUserController | Rechazar pedido |
| Chat | POST | /api/msgsubmit | RegisteredUserController | Enviar mensaje |
| Chat | GET | /api/msgfetch/{orderid} | RegisteredUserController | Obtener mensajes |
| Feedback | POST | /api/compsubmit | RegisteredUserController | Enviar comentario/queja |
| App | GET | /api/app-version | AppController | Verificar version de la app |
| GET | /api/instagram-feed | InstagramController | Feed de Instagram |
Estos endpoints NO son llamados por la app movil. Son usados internamente por el servidor, servicios externos, o el panel de administracion web.
| Tipo | Endpoint | Descripcion |
|---|---|---|
| WEBHOOK | POST /api/stripe/webhook | Stripe envia confirmacion de pago (server-to-server) |
| WEBHOOK | POST /api/webhooks/apple | Apple envia eventos de cuenta (server-to-server) |
| CRON | POST /api/cart-cleanup | Limpia carritos expirados (cada 30 min) |
| CRON | POST /api/cleanup-temp-orders | Elimina pedidos abandonados >2h (cada 30 min) |
| ADMIN | POST /api/orders/mark-as-free | Marcar pedido como gratis (100% cupon) |
| ADMIN | GET /api/settings/otp-status | Ver si OTP esta habilitado |
| ADMIN | POST /api/settings/toggle-otp | Activar/desactivar OTP |
| ADMIN | POST /api/instagram/* | CRUD de posts de Instagram (admin panel) |