Esta guía explica cómo funcionan las órdenes en SYNTIcat y SYNTIfood, desde la creación hasta la entrega.
Sistema de Códigos de Orden
SYNTIweb usa códigos únicos para identificar pedidos:
- SC-XXXX → Shopping Cart (SYNTIcat)
- FO-XXXX → Food Order (SYNTIfood, en desarrollo)
Ejemplos: SC-A3F9, SC-B7K2, FO-M5N8
Generación del Código
El código se genera en el momento del checkout:
// CheckoutController.php
$orderCode = 'SC-' . strtoupper(substr(uniqid(), -4));
Características:
- Único por timestamp + random
- Corto para comunicación por WhatsApp
- Alfanumérico (letras y números)
- Memorable (4 caracteres)
Flujo de Checkout (SYNTIcat)
Fase 1: Carrito del Cliente
Cliente navega el catálogo
URL: https://{subdomain}.syntiweb.comVe productos con:
- Imagen principal
- Nombre y descripción
- Precio en REF (y/o Bs según configuración)
- Badges (hot/new/promo)
Agrega productos al carrito
Al hacer clic en “Agregar al carrito”:
- Si tiene variantes → modal de selección
- Si tiene extras (Plan Anual) → checkboxes opcionales
- Cantidad (selector numérico)
- Se guarda en localStorage:
const cart = {
items: [
{
productId: 12,
name: "Camisa polo azul",
price: 27,
quantity: 1,
variant: { id: "v3", name: "Talla L" },
extras: []
}
],
total: 27
};
localStorage.setItem('synticat_cart', JSON.stringify(cart));
Drawer lateral se abre
Muestra resumen en tiempo real:
- Lista de productos
- Cantidades editables
- Subtotales
- Total general
- Botones: “Continuar comprando” / “Finalizar pedido”
Cliente hace clic en 'Finalizar pedido'
Se abre formulario:<form action="/{subdomain}/checkout" method="POST">
<input name="customer_name" required />
<input name="customer_phone" />
<textarea name="delivery_address"></textarea>
<textarea name="notes"></textarea>
<input type="hidden" name="cart_data" />
</form>
Completa datos de entrega
Ejemplo:Nombre: María Rodríguez
Teléfono: 0412-1234567
Dirección: Torre A, Piso 12, Apto 12-C, Altamira, Caracas
Notas: Llamar al llegar, interfón no funciona
El campo cart_data contiene el JSON del carrito serializado. Envía el formulario
Endpoint:POST /{subdomain}/checkout
Validaciones (CheckoutController.php):$validated = $request->validate([
'customer_name' => 'required|string|max:255',
'customer_phone' => 'nullable|string|max:20',
'delivery_address' => 'nullable|string|max:500',
'notes' => 'nullable|string|max:1000',
'cart_data' => 'required|json',
]);
Fase 3: Creación de Orden en Base de Datos
Sistema procesa el checkout
Controlador CheckoutController::store() ejecuta:
- Valida tenant activo:
$tenant = Tenant::where('subdomain', $subdomain)
->where('status', 'active')
->firstOrFail();
- Decodifica carrito:
$cart = json_decode($validated['cart_data'], true);
- Calcula totales:
$totalREF = array_sum(array_map(fn($item) =>
$item['price'] * $item['quantity'],
$cart['items']
));
$exchangeRate = $dollarRateService->getCurrentRate();
$totalBs = round($totalREF * $exchangeRate, 2);
- Genera código SC:
$orderCode = 'SC-' . strtoupper(substr(uniqid(), -4));
- Crea registro:
$order = Order::create([
'tenant_id' => $tenant->id,
'order_code' => $orderCode,
'customer_name' => $validated['customer_name'],
'customer_phone' => $validated['customer_phone'],
'delivery_address' => $validated['delivery_address'],
'notes' => $validated['notes'],
'items' => $cart['items'], // JSON
'total_ref' => $totalREF,
'total_bs' => $totalBs,
'exchange_rate_used' => $exchangeRate,
'status' => 'pending',
'created_at' => now(),
]);
Fase 4: Generación de Mensaje para WhatsApp
Sistema construye mensaje formateado
Ejemplo de output:🛒 *Pedido desde Tu Tienda*
Código: *SC-H8K3*
📦 *Productos:*
1x Camisa polo azul (Talla L) - REF 27.00
2x Gorra deportiva - REF 20.00
1x Medias deportivas x3 pares - REF 8.00
💰 *Total: REF 55.00*
(Aprox. Bs. 1,980.00 según tasa BCV 36.00)
📍 *Entrega:*
Torre A, Piso 12, Apto 12-C
Altamira, Caracas
📝 *Notas:*
Llamar al llegar, interfón no funciona
👤 *Cliente:*
María Rodríguez
Teléfono: 0412-1234567
──────────────────
Pedido realizado el 08/03/2026 a las 14:32
Codifica para URL
$whatsappMessage = urlencode($message);
$whatsappNumber = $tenant->whatsapp_sales; // Ej: 584121234567
$whatsappURL = "https://wa.me/{$whatsappNumber}?text={$whatsappMessage}";
Redirige al cliente
Respuesta del servidor:{
"success": true,
"order_code": "SC-H8K3",
"whatsapp_url": "https://wa.me/584121234567?text=...",
"message": "Pedido creado exitosamente"
}
El frontend abre la URL de WhatsApp automáticamente:window.location.href = response.whatsapp_url;
Gestión de Órdenes desde el Dashboard
Visualizar Órdenes
Accede al panel de órdenes
Dashboard → Pestaña ÓrdenesSolo disponible para Plan Semestral y Anual de SYNTIcat.
Lista de pedidos
Endpoint:GET /tenant/{tenantId}/orders
Tabla con columnas:
- Código (SC-XXXX)
- Cliente
- Total (REF y Bs)
- Estado
- Fecha/hora
- Acciones
Filtros disponibles
- Por estado: Todos / Pendiente / Procesando / Completado / Cancelado
- Por fecha: Hoy / Esta semana / Este mes / Personalizado
- Buscar por código o nombre de cliente
Actualizar Estado de Orden
Haz clic en una orden
Se abre modal con detalle completo.
Cambia el estado
Selector con opciones:
- Pendiente → Recién recibido, sin confirmar
- Procesando → Confirmado, en preparación
- Completado → Entregado al cliente
- Cancelado → No procesado (cliente canceló o stock agotado)
Cambiar el estado NO envía notificación automática. Debes confirmar por WhatsApp.
Guarda el cambio
Endpoint:PATCH /tenant/{tenantId}/orders/{orderId}/status
Body: { "status": "procesando" }
Se registra en tabla order_status_history:OrderStatusHistory::create([
'order_id' => $orderId,
'old_status' => 'pending',
'new_status' => 'procesando',
'changed_by' => auth()->id(),
'changed_at' => now(),
]);
Detalle de Orden
El modal de detalle muestra:
Datos del cliente:
- Nombre completo
- Teléfono (clickable para llamar)
- Dirección de entrega
- Notas especiales
Productos ordenados:
- Nombre del producto
- Variante seleccionada
- Extras agregados
- Cantidad
- Precio unitario
- Subtotal
Totales:
- Subtotal en REF
- Total en REF
- Total en Bs (con tasa usada al momento de la orden)
Metadata:
- Código de orden
- Fecha y hora de creación
- Estado actual
- Histórico de cambios de estado
Flujo de Pedido Rápido (SYNTIfood)
Solo disponible en Plan Anual de SYNTIfood.
Cliente acumula ítems
En el menú público, hace clic en “Agregar” sobre cada plato.Se acumulan en carrito temporal (localStorage):const cart = [
{ itemId: "item-AB34", name: "Pizza Margarita", price: 12, qty: 1 },
{ itemId: "item-CD56", name: "Refresco", price: 2, qty: 2 }
];
Toca 'Enviar pedido'
No hay formulario extenso, solo nombre opcional.El sistema construye mensaje:🍕 *Pedido desde Pizzería Demo*
1x Pizza Margarita - REF 12.00
2x Refresco - REF 4.00
💰 *Total: REF 16.00*
(Aprox. Bs. 576.00)
¡Espero tu confirmación!
Abre WhatsApp directo
URL:https://wa.me/584121234567?text={mensaje}
El cliente presiona “Enviar” y listo.Este flujo es más rápido que SYNTIcat porque no requiere formulario de entrega. Ideal para pedidos telefónicos.
Configuración de WhatsApp
El número de WhatsApp debe estar en formato internacional sin símbolos:
Correcto:
Incorrecto:
+58 412-123-4567
(0412) 123-4567
58-412-1234567
Configurar desde Dashboard
Ve a Config → Contacto
Campo: WhatsApp Ventas
Ingresa el número limpio
Ejemplo: 584121234567El sistema valida con regex:'whatsapp_sales' => 'nullable|string|max:20|regex:/^[0-9]+$/'
Prueba el enlace
Desde la página pública, haz clic en cualquier botón de WhatsApp.Debe abrir la conversación correcta.
Dos WhatsApp (Plan Anual Food/Cat)
Puedes configurar dos números:
- WhatsApp Ventas → Para pedidos y consultas de productos
- WhatsApp Soporte → Para reclamos, seguimiento, devoluciones
En la página pública aparecen ambos botones:
<a href="https://wa.me/584121234567">💬 Hacer pedido</a>
<a href="https://wa.me/584129876543">🛠️ Soporte</a>
Reportes y Métricas
Estadísticas de Órdenes
Desde Dashboard → Analytics → Órdenes:
- Total de órdenes (hoy, semana, mes)
- Ingresos totales (REF y Bs)
- Ticket promedio
- Productos más vendidos
- Horarios de mayor demanda
Exportar Órdenes
Haz clic en 'Exportar'
Desde la lista de órdenes.
Selecciona formato
- CSV (para Excel)
- PDF (para impresión)
Descarga el archivo
Incluye:
- Código de orden
- Cliente
- Productos
- Totales
- Fecha y estado
Mejores Prácticas
Para maximizar conversiones:
- Responde rápido por WhatsApp — Confirma pedidos en menos de 5 minutos
- Actualiza estados — Mantén informado al cliente (“Tu pedido está en camino”)
- Fotos de productos — Imágenes de calidad aumentan ventas 40%
- Descripciones claras — Incluye tallas, materiales, ingredientes
- Tasa BCV actualizada — Evita confusiones con precios en Bs
Errores comunes a evitar:
- No verificar stock antes de confirmar
- Cambiar precios después de generar código SC
- No guardar el número del cliente para seguimiento
- Ignorar órdenes en estado “pendiente” más de 24h
API Endpoints de Referencia
| Acción | Método | Endpoint |
|---|
| Crear orden (Cat) | POST | /{subdomain}/checkout |
| Crear pedido (Food) | POST | /{subdomain}/food-checkout |
| Listar órdenes | GET | /tenant/{tenantId}/orders |
| Ver detalle | GET | /tenant/{tenantId}/orders/{orderId} |
| Actualizar estado | PATCH | /tenant/{tenantId}/orders/{orderId}/status |
| Exportar CSV | GET | /tenant/{tenantId}/orders/export?format=csv |
Todos los endpoints de gestión requieren autenticación. Los endpoints de checkout son públicos.