HomeInicio

Logistics API & Integration

API de Logística e Integración

Comprehensive guide to consume the logistics system services

Guía completa para consumir los servicios del sistema logístico

📋 CRM API Docs 📋 Docs API CRM

Quick Reference

Referencia Rápida

Welcome to the Logistics API. This system allows you to manage orders, products, and geographic data using standard HTTP requests.

Bienvenido a la API de Logística. Este sistema te permite gestionar pedidos, productos y datos geográficos usando peticiones HTTP estándar.

✨ Key Concepts

✨ Conceptos Clave

  • Base URL: /api (relative to your installation)
  • Auth: JWT Bearer Token required for write operations.
  • Response Format: All responses are JSON wrapped in a standard envelope.
  • Dates: Format YYYY-MM-DD HH:MM:SS unless otherwise specified.
  • URL Base: /api (relativo a tu instalación)
  • Auth: Token Bearer JWT requerido para operaciones de escritura.
  • Formato Respuesta: Todas las respuestas son JSON envueltas en un sobre estándar.
  • Fechas: Formato YYYY-MM-DD HH:MM:SS a menos que se especifique lo contrario.

Standard Response Envelope

Sobre de Respuesta Estándar

Every API response follows this consistent JSON structure:

Toda respuesta de la API sigue esta estructura JSON consistente:

{
    "success": true,           // boolean: did the request succeed?
    "message": "Operation...", // string: human-readable message
    "data": { ... }            // object/array: the requested payload
}

Error Response Example

Ejemplo de Respuesta de Error

{
    "success": false,
    "message": "Invalid credentials",
    "error_code": 401          // optional: numeric error code
}

Pagination

Paginación

Endpoints that return lists (Orders, Products) support pagination via query parameters.

Los endpoints que retornan listas (Pedidos, Productos) soportan paginación vía parámetros GET.

ParameterTypeDefaultDescription
pageinteger1Current page number
limitinteger20Items per page
ParámetroTipoDefectoDescripción
pageentero1Número de página actual
limitentero20Elementos por página

Paginated Response

Respuesta Paginada

{
    "success": true,
    "data": [ ... ],
    "pagination": {
        "total": 150,
        "page": 1,
        "limit": 20,
        "total_pages": 8
    }
}

Order Status Reference

Referencia de Estados

Use these IDs when filtering or updating order statuses.

Usa estos IDs al filtrar o actualizar estados de pedidos.

ID Status NameNombre Estado DescriptionDescripción
1En bodegaInitial status, order received at warehouse.Estado inicial, pedido recibido en bodega.
2En ruta o procesoOrder is being delivered.El pedido está en camino.
3EntregadoOrder successfully delivered.Pedido entregado exitosamente.
4ReprogramadoDelivery rescheduled for another day/time.Entrega reprogramada para otro día/hora.
5Domicilio cerradoDelivery failed: location closed.Falló entrega: lugar cerrado.
6No hay quien recibaDelivery failed: no recipient available.Falló entrega: nadie para recibir.
7DevueltoOrder returned to warehouse.Pedido devuelto a bodega.
8Domicilio no encontradoAddress could not be located.No se encontró la dirección.
9RechazadoCustomer rejected the order.Cliente rechazó el pedido.
10No puede pagar recaudoCustomer unable to pay on delivery.Cliente no pudo pagar al recibir.

Authentication

Autenticación

To perform write operations (create orders, products, etc.), you must obtain a JWT token.

Para realizar operaciones de escritura (crear pedidos, productos, etc.), debes obtener un token JWT.

1. Get Token

1. Obtener Token

POST /api/auth/login
Request Body
Cuerpo de la Petición
FieldTypeRequiredDescription
emailstring✅ YesRegistered user email
passwordstring✅ YesUser password
CampoTipoReq.Descripción
emailstring✅ SíEmail del usuario registrado
passwordstring✅ SíContraseña del usuario
Example Request
Ejemplo de Petición
curl -X POST "http://localhost/paqueteriacz/api/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@example.com", "password":"secure_password"}'
Response 200 OK
Respuesta 200 OK
{
    "success": true,
    "message": "Login exitoso",
    "data": {
        "token": "eyJ0e... (your_token_here) ... "
    }
}

2. Use Token

2. Usar el Token

Include the token in the Authorization header for subsequent requests.

Incluye el token en el encabezado Authorization para las siguientes peticiones.

Authorization: Bearer <YOUR_TOKEN>

List & View

Listar y Ver

List Orders

Listar Pedidos

GET /api/pedidos/listar?page=1&limit=20

Returns paginated list of orders.

Get Single Order

Ver Pedido

GET /api/pedidos/ver?id=100

Returns full details of a specific order by Internal ID.

Create Order

Crear Pedido

Create a new delivery order. The system automatically validates stock, calculates pricing, and enforces security rules based on user role.

Crea un nuevo pedido de entrega. El sistema valida automáticamente el stock, calcula precios y aplica reglas de seguridad según el rol del usuario.

POST /api/pedidos/crear

🔑 Required Fields

🔑 Campos Obligatorios

FieldTypeValidationDescription
numero_ordenintegerUnique, positiveUnique external order ID
destinatariostringNot emptyRecipient's full name
producto_id or productosint/arrayMust exist in DBSingle product ID or array of products
CampoTipoValidaciónDescripción
numero_ordenenteroÚnico, positivoID externo único del pedido
destinatariostringNo vacíoNombre completo del destinatario
producto_id o productosint/arrayDebe existir en BDID de producto único o array de productos

📋 Optional Fields - Contact & Delivery

📋 Campos Opcionales - Contacto y Entrega

FieldTypeDefaultDescription
telefonostring''Contact phone number
direccionstring''Full delivery address
comentariostringnullAdditional delivery notes
coordenadasstringnullGPS format: "lat,long" (e.g. "14.6349,-90.5069")
latitudfloatnullLatitude (alternative to coordenadas)
longitudfloatnullLongitude (alternative to coordenadas)
CampoTipoDefectoDescripción
telefonostring''Teléfono de contacto
direccionstring''Dirección completa de entrega
comentariostringnullNotas adicionales de entrega
coordenadasstringnullFormato GPS: "lat,long" (ej. "14.6349,-90.5069")
latitudfloatnullLatitud (alternativa a coordenadas)
longitudfloatnullLongitud (alternativa a coordenadas)

🌍 Optional Fields - Geographic

🌍 Campos Opcionales - Geográficos

FieldTypeDescription
id_pais or paisintegerCountry ID
id_departamento or departamentointegerState/Department ID
id_municipio or municipiointegerCity/Municipality ID
id_barrio or barriointegerNeighborhood/District ID
zonastringZone name
CampoTipoDescripción
id_pais o paisenteroID del país
id_departamento o departamentoenteroID del departamento/estado
id_municipio o municipioenteroID del municipio/ciudad
id_barrio o barrioenteroID del barrio/zona
zonastringNombre de la zona

👥 Optional Fields - Assignments

👥 Campos Opcionales - Asignaciones

FieldTypeDefaultDescription
id_estadointeger1Order status (see Status Reference)
id_vendedorintegernullAssigned delivery person
id_proveedorintegernullProvider ID (auto-set for Provider role)
id_clienteintegernullClient ID
id_monedaintegernullCurrency ID (auto-detected from provider's country if not provided)
CampoTipoDefectoDescripción
id_estadoentero1Estado del pedido (ver Referencia de Estados)
id_vendedorenteronullRepartidor asignado
id_proveedorenteronullID del proveedor (auto-asignado para rol Proveedor)
id_clienteenteronullID del cliente
id_monedaenteronullID de la moneda (auto-detectada del país del proveedor si no se envía)

💰 Optional Fields - Pricing

💰 Campos Opcionales - Precios

FieldTypeAuto-calculatedDescription
precio_total_localdecimalNoTotal price in local currency
precio_total_usddecimalYes*Total price in USD (auto-calc if local + currency provided)
tasa_conversion_usddecimalYes*Exchange rate used (auto-fetched from currency)
es_combobooleanYes*Whether it's a combo (auto-detected from product)
CampoTipoAuto-calculadoDescripción
precio_total_localdecimalNoPrecio total en moneda local
precio_total_usddecimalSí*Precio total en USD (auto-calc si local + moneda)
tasa_conversion_usddecimalSí*Tasa de cambio usada (auto desde moneda)
es_combobooleanSí*Si es combo (auto-detectado desde producto)

✅ Automatic Validations

✅ Validaciones Automáticas

  • Stock validation: Ensures sufficient inventory before creating order
  • Unique order number: Prevents duplicate numero_orden
  • Coordinate format: Validates "lat,long" format
  • Valid products: Verifies product IDs exist in database
  • Positive quantities: All quantities must be > 0
  • Foreign key validation: Checks vendor, provider, client, currency exist
  • Validación de stock: Asegura inventario suficiente antes de crear
  • Número único: Previene numero_orden duplicados
  • Formato coordenadas: Valida formato "lat,long"
  • Productos válidos: Verifica que IDs de productos existan en BD
  • Cantidades positivas: Todas las cantidades deben ser > 0
  • Validación FK: Verifica que vendedor, proveedor, cliente, moneda existan

🔐 Security Rules

🔐 Reglas de Seguridad

Provider Role: If authenticated user is a Provider (role 4), the system automatically sets id_proveedor to their user ID, ignoring any value sent in the request.

Rol Proveedor: Si el usuario autenticado es Proveedor (rol 4), el sistema automáticamente asigna id_proveedor a su ID de usuario, ignorando cualquier valor enviado en la petición.

📝 Example: Minimal Order

📝 Ejemplo: Pedido Mínimo

{
    "numero_orden": 12345,
    "destinatario": "Juan Pérez",
    "producto_id": 10,
    "cantidad": 2
}

📝 Example: Complete Order with Combo Pricing

📝 Ejemplo: Pedido Completo con Precio Combo

{
    "numero_orden": 12346,
    "destinatario": "María García",
    "telefono": "50212345678",
    "direccion": "Calle Principal #123",
    "coordenadas": "14.6349,-90.5069",
    "comentario": "Entregar en horario de oficina",
    "id_pais": 1,
    "id_departamento": 5,
    "id_municipio": 25,
    "id_proveedor": 8,
    "id_cliente": 15,
    "id_moneda": 2,
    "es_combo": 1,
    "precio_total_local": 150.00,
    "productos": [
        { "producto_id": 10, "cantidad": 2 },
        { "producto_id": 15, "cantidad": 1 }
    ]
}

📝 Example: Multi-Product Standard Order

📝 Ejemplo: Pedido Estándar Multi-Producto

{
    "numero_orden": 10050,
    "destinatario": "Maria Gonzalez",
    "telefono": "8888-8888",
    "direccion": "Bello Horizonte C-4",
    "es_combo": 0,
    "coordenadas": "12.1345,-86.2456",
    "productos": [
        { "producto_id": 1, "cantidad": 2 },
        { "producto_id": 5, "cantidad": 1 }
    ]
}

Standard vs. Combo Orders

Pedidos Estándar vs. Combos

🛒 Standard Order

🛒 Pedido Estándar

When to use: Regular sales where items are sold at their list price.
Logic: The system automatically sums up (product_price × quantity).
Don't send: precio_total (it will be ignored/overwritten).

{
    "numero_orden": "STD-101",
    "es_combo": 0,
    "productos": [
        { "producto_id": 1, "cantidad": 2 }
    ]
    // Total calculated by system:
    // (Price of ID 1 × 2)
}

🎁 Combo / Promo

🎁 Combo / Promoción

When to use: Special offers, bundles, or fixed-price packages.
Logic: You MUST define the precio_total_local explicitly.
Important: Set es_combo: 1 so the system respects your total.

{
    "numero_orden": "PROMO-500",
    "es_combo": 1,
    "precio_total_local": 999.00,
    "productos": [
        { "producto_id": 1, "cantidad": 1 },
        { "producto_id": 5, "cantidad": 1 }
    ]
    // System accepts 999.00
    // ignoring individual prices.
}

Bulk Import (Async)

Importación Masiva (Async)

Import multiple orders efficiently. Use auto_enqueue=true to process in background.

Importa múltiples pedidos eficientemente. Usa auto_enqueue=true para procesar en segundo plano.

POST /api/pedidos/multiple?auto_enqueue=true

Success Response (202 Accepted)

Respuesta Exitosa (202 Accepted)

{
    "success": true,
    "message": "Proceso iniciado",
    "results": [
        { "numero_orden": 10050, "success": true, "job_queued": true },
        { "numero_orden": 10051, "success": true, "job_queued": true }
    ]
}

Advanced Example: Multiple Products & Combo

Ejemplo Avanzado: Múltiples Productos y Combos

{
    "pedidos": [
        {
            // Pedido multiproducto estándar
            "numero_orden": 20001,
            "destinatario": "Juan Perez",
            "telefono": "5555-5555",
            "direccion": "Calle Principal #123",
            "coordenadas": "12.1234,-86.1234",
            "productos": [
                { "producto_id": 1, "cantidad": 2 },
                { "producto_id": 5, "cantidad": 1 }
            ]
        },
        {
            // Pedido tipo COMBO (Precio fijo total)
            "numero_orden": 20002,
            "destinatario": "Ana Lopez",
            "telefono": "7777-7777",
            "direccion": "Residencial Los Arcos, Casa 5",
            "coordenadas": "12.1255,-86.1255",
            "es_combo": 1, 
            "precio_total_local": 1500.00,  // Precio fijo total
            "precio_total_usd": 40.50,      // Opcional si se calcula, pero recomendado en combos
            "productos": [
                { "producto_id": 10, "cantidad": 1 },
                { "producto_id": 11, "cantidad": 1 },
                { "producto_id": 12, "cantidad": 1 }
            ]
        }
    ]
}

Product Management

Gestión de Productos

GET /api/productos/listar

List all available products with current stock.

Listar todos los productos disponibles con stock actual.

POST /api/productos/crear

Crear un nuevo producto.

Product Object Model

Modelo de Objeto Producto

{
    "id": 1,
    "nombre": "Protein Shake",
    "precio_usd": "45.00",
    "stock_total": 150,
    "descripcion": "High quality whey protein"
}

Update & Delete

Actualizar y Eliminar

Update Product

Actualizar Producto

POST /api/productos/actualizar
Note: Use POST with id param or check PHP config for PUT support.
{
    "id": 1,
    "nombre": "Protein Shake V2",
    "precio_usd": 48.00,
    "descripcion": "New formula"
}

Get Single Product

Ver Producto Individual

GET /api/productos/ver?id=1

Geographic Data

Datos Geográficos

Retrieve reference data for dropdowns (Countries, Departments, Municipalities).

Obtener datos de referencia para listas desplegables (Países, Departamentos, Municipios).

GET /api/geoinfo/listar

Response Structure

Estructura de Respuesta

{
    "success": true,
    "data": {
        "paises": [ ... ],
        "departamentos": [ ... ],
        "municipios": [ ... ],
        "barrios": [ ... ]
    }
}

Geo CRUD Operations

Operaciones CRUD Geo

Endpoints to manage reference data. All accept POST for creation/update.

Endpoints para gestionar datos de referencia. Todos aceptan POST para crear/actualizar.

Resource Method Endpoint Params (JSON)
Countries POST /api/geoinfo/paises { "nombre": "...", "codigo_iso": "..." }
Departments POST /api/geoinfo/departamentos { "nombre": "...", "id_pais": 1 }
Municipalities POST /api/geoinfo/municipios { "nombre": "...", "id_departamento": 1 }
Neighborhoods POST /api/geoinfo/barrios { "nombre": "...", "id_municipio": 1 }
To Update or Delete, pass the action parameter: Para Actualizar o Eliminar, pasa el parámetro action:
{ "action": "update", "id": 1, "nombre": "New Name" }
{ "action": "delete", "id": 1 }

Client Application API

API App Cliente

Specialized endpoints for the end-customer mobile/web app.

Endpoints especializados para la app móvil/web del cliente final.

My Orders

Mis Pedidos

Get list of orders belonging to the authenticated client.

Obtener lista de pedidos pertenecientes al cliente autenticado.

GET /api/cliente/pedidos
{
    "success": true,
    "data": [
        {
            "id": 100,
            "numero_orden": "ORD-2025-001",
            "estado": "En ruta",
            "productos": "Producto A (x2)"
        }
    ]
}

Change Order Status

Cambiar Estado de Pedido

Allows clients to mark orders as delivered or returned (if permitted).

Permite a los clientes marcar pedidos como entregados o devueltos (si está permitido).

POST /api/cliente/cambiar_estado
FieldRequiredDescription
id_pedidoYesInternal Order ID
estadoYesNew Status ID (e.g., 3 for Delivered)
motivoNoReason/Comment
{
    "id_pedido": 100,
    "estado": 3,
    "motivo": "Recibido conforme"
}