Skip to main content
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

1

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)
2

Agrega productos al carrito

Al hacer clic en “Agregar al carrito”:
  1. Si tiene variantes → modal de selección
  2. Si tiene extras (Plan Anual) → checkboxes opcionales
  3. Cantidad (selector numérico)
  4. 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));
3

Drawer lateral se abre

Muestra resumen en tiempo real:
  • Lista de productos
  • Cantidades editables
  • Subtotales
  • Total general
  • Botones: “Continuar comprando” / “Finalizar pedido”

Fase 2: Formulario de Checkout

1

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>
2

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.
3

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

1

Sistema procesa el checkout

Controlador CheckoutController::store() ejecuta:
  1. Valida tenant activo:
$tenant = Tenant::where('subdomain', $subdomain)
    ->where('status', 'active')
    ->firstOrFail();
  1. Decodifica carrito:
$cart = json_decode($validated['cart_data'], true);
  1. Calcula totales:
$totalREF = array_sum(array_map(fn($item) => 
    $item['price'] * $item['quantity'], 
    $cart['items']
));

$exchangeRate = $dollarRateService->getCurrentRate();
$totalBs = round($totalREF * $exchangeRate, 2);
  1. Genera código SC:
$orderCode = 'SC-' . strtoupper(substr(uniqid(), -4));
  1. 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

1

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
2

Codifica para URL

$whatsappMessage = urlencode($message);
$whatsappNumber = $tenant->whatsapp_sales; // Ej: 584121234567
$whatsappURL = "https://wa.me/{$whatsappNumber}?text={$whatsappMessage}";
3

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

1

Accede al panel de órdenes

Dashboard → Pestaña Órdenes
Solo disponible para Plan Semestral y Anual de SYNTIcat.
2

Lista de pedidos

Endpoint:
GET /tenant/{tenantId}/orders
Tabla con columnas:
  • Código (SC-XXXX)
  • Cliente
  • Total (REF y Bs)
  • Estado
  • Fecha/hora
  • Acciones
3

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

1

Haz clic en una orden

Se abre modal con detalle completo.
2

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.
3

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.
1

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 }
];
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!
3

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

Formato del Número

El número de WhatsApp debe estar en formato internacional sin símbolos: Correcto:
584121234567
Incorrecto:
+58 412-123-4567
(0412) 123-4567
58-412-1234567

Configurar desde Dashboard

1

Ve a Config → Contacto

Campo: WhatsApp Ventas
2

Ingresa el número limpio

Ejemplo: 584121234567El sistema valida con regex:
'whatsapp_sales' => 'nullable|string|max:20|regex:/^[0-9]+$/'
3

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

1

Haz clic en 'Exportar'

Desde la lista de órdenes.
2

Selecciona formato

  • CSV (para Excel)
  • PDF (para impresión)
3

Descarga el archivo

Incluye:
  • Código de orden
  • Cliente
  • Productos
  • Totales
  • Fecha y estado

Mejores Prácticas

Para maximizar conversiones:
  1. Responde rápido por WhatsApp — Confirma pedidos en menos de 5 minutos
  2. Actualiza estados — Mantén informado al cliente (“Tu pedido está en camino”)
  3. Fotos de productos — Imágenes de calidad aumentan ventas 40%
  4. Descripciones claras — Incluye tallas, materiales, ingredientes
  5. 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ónMétodoEndpoint
Crear orden (Cat)POST/{subdomain}/checkout
Crear pedido (Food)POST/{subdomain}/food-checkout
Listar órdenesGET/tenant/{tenantId}/orders
Ver detalleGET/tenant/{tenantId}/orders/{orderId}
Actualizar estadoPATCH/tenant/{tenantId}/orders/{orderId}/status
Exportar CSVGET/tenant/{tenantId}/orders/export?format=csv
Todos los endpoints de gestión requieren autenticación. Los endpoints de checkout son públicos.

Build docs developers (and LLMs) love