Order


Representa una orden o pedido de un cliente dentro de una company.

Una orden puede ser de productos (asociada a un comercio vía branch_id) o de envío directo / servicio (sin branch_id). El ciclo de vida se controla con el bitmask status; los flags booleanos derivados (is_status_confirmed, is_payment_confirmed, is_provider_assigned, is_status_being_prepared, is_status_prepared, is_provider_collected, is_status_arrived, is_status_completed, is_status_completed_ok, is_status_canceled, is_status_expired, …) se definen en onInitializeBitMaskBags().

Ciclo de vida

Hitos con timestamp (se registran para estadísticas de tiempos de entrega): paid_at → being_prepared_at → prepared_at → collected_at → arrived_at → completed_at.

Duraciones autocalculadas en segundos (OrderHandler::onSaving()):

  • preparation_time: prepared_at − being_prepared_at.
  • total_preparation_time: prepared_at − paid_at en órdenes inmediatas; prepared_at − being_prepared_at en programadas.
  • collection_time: collected_at − prepared_at.
  • arrival_time: arrived_at − paid_at (solo órdenes inmediatas).

Al cierre del día (00:00 hora local) las órdenes finalizadas se archivan: se asigna deleted_at (soft delete = archivado, no borrado físico).

Estados por audiencia

status_for_clients, status_for_shoppers, status_for_providers, status_for_company_admins, status_for_branch_admins, status_for_partners, status_for_payment son códigos de texto estables (constantes, no localizados). Valen N/A cuando la audiencia no aplica a la orden (p. ej. status_for_shoppers en una orden sin shopper); no debería ocurrir en apps reales. latest_status es el valor de status inmediatamente anterior al actual. status_data es solo para depurar los bitmasks; se mantiene por retrocompatibilidad y no debe usarse en integraciones nuevas.

Montos

Todos los montos usan sufijo _e2 (entero = monto × 100). Definiciones:

  • subtotal_original_e2: total de productos, sin descuentos.
  • subtotal_e2: subtotal_original_e2 tras aplicar descuentos de precio base.
  • tax_e2: suma de la lista taxes (envío, servicio de app, shopper, descuentos, tarifas extra…).
  • total_e2: monto final. Equivale a subtotal_e2 + tax_e2.
  • branch_subtotal_e2: monto de cara al comercio. subtotal_original_e2 − branch_discounts_e2 (descuentos asumidos por el comercio).
  • delivery_fee_e2: costo del envío de la orden.
  • delivery_fee_e2_paid_for_client: cuánto de ese envío pagó el cliente (0 si hay promo de envío gratis; total o parcial según promociones).
  • delivery_fee_to_pay_e2: cuánto se le debe pagar al repartidor por el envío.

Orden de cálculo: se suma subtotal_original_e2 → se aplican descuentos de base_price (subtotal_e2) → se calculan y registran en taxes: descuentos de subtotal, servicio de app (service_fee_e2), envío y sus descuentos, shopper y sus descuentos, tarifas adicionales (config global + comercio) → tax_e2 = suma de taxes → total_e2 = subtotal_e2 + tax_e2. Si el método de pago aplica comisión, se cobra total_e2 + payment_fee_e2 sin alterar los montos de la orden (payment_fee_e2 vive en Payment).

Notas y gotchas

  • Pickup: en órdenes con branch_id el punto de recolección es la ubicación del comercio (pickup_*_e6 no se usan). En órdenes sin branch_id se usan pickup_latitude_e6, pickup_longitude_e6 y pickup_address.
  • number: correlativo desde 1 por branch_id; en órdenes sin comercio, correlativo por company_id.
  • uid: identificador legible para el usuario. Con comercio: "<número de comercio>-<número de orden>". Sin comercio: prefijo L + secuencia global de la company (ej. L001-0000001).
  • Dirección de entrega: client_address (string plano) está deprecado en favor de client_address_data (país, address_line_1/2, postal_code, …). Coexisten por retrocompatibilidad.
  • Ubicaciones: client_*_e6 y pickup_*_e6 están siendo reemplazados por locations (lista de OrderLocation), que soporta multiparada e incluye started_at, arrived_at y notes por parada.
  • source: null en órdenes nativas; el nombre del origen (Ridery, WhatsApp, Square, …) cuando la creó una integración externa.
  • Snapshots (currency_snapshot, company_currency_snapshot, shopper_snapshot, order_provider_snapshot): copias congeladas al crear la orden; cambios posteriores en el origen (moneda por defecto de la company, teléfono/vehículo del repartidor…) no la afectan.
  • Shopper vs repartidor: el shopper (solo supermercados) selecciona los productos y se los entrega al repartidor, que hace el reparto al cliente. Una orden puede tener ambos.

Estructura de Datos

Atributo Tipo Descripción
id int
number int\|null Número correlativo de la orden (por branch_id, o por company_id si no hay comercio)
status int Bitmask de estado; ver flags is_* y onInitializeBitMaskBags()
subtotal_e2 int Total de productos tras descuentos de precio base (× 100)
total_e2 int Monto final de la orden. Equivale a subtotal_e2 + tax_e2 (× 100)
tax_e2 int Suma de la lista taxes: envío, servicio de app, shopper, descuentos, tarifas extra (× 100)
notes string\|null Notas de entrega escritas por el cliente
scheduled_at datetime\|null Fecha/hora de entrega solicitada (órdenes programadas); null = inmediata
client_latitude_e6 int Latitud del punto de entrega (× 1e6)
client_longitude_e6 int Longitud del punto de entrega (× 1e6)
client_address_data array\|null Dirección de entrega estructurada (país, address_line_1/2, postal_code…)
pickup_latitude_e6 int Latitud del punto de recolección; solo órdenes sin branch_id (× 1e6)
pickup_longitude_e6 int Longitud del punto de recolección; solo órdenes sin branch_id (× 1e6)
pickup_address string\|null Dirección de recolección; solo órdenes sin branch_id
completed_at datetime\|null Momento de finalización de la orden (entrega o cancelación)
deleted_at datetime\|null Momento de archivado (soft delete al cierre del día en hora local)
created_at datetime\|null
updated_at datetime\|null
company_id int Company dueña de la orden
client_id int\|null Cliente dueño de la orden
creator_id int\|null Admin que creó la orden en nombre del cliente; null si la creó el propio cliente
branch_id int\|null Comercio (sucursal) de la orden; null en envío directo / servicio
uid string\|null Identificador legible: "<comercio>-<orden>" con comercio, o "<code de company>-<secuencia>" con prefijo L sin comercio (ej. L001-0000001)
receiver_name string\|null Nombre de quien recibe
receiver_phone string\|null Teléfono de quien recibe
is_gift bool\|null La recibe otra persona distinta a quien creó la orden
shopper_id int\|null Repartidor que actúa de shopper (selecciona los productos); solo supermercados
currency_iso string\|null Moneda en la que paga el cliente esta orden
branch_group_id int\|null Comercio (marca, no sucursal) al que pertenece; usado en reportes por comercio
subtotal_original_e2 int\|null Total de productos sin descuentos (× 100)
branch_rating_id int\|null Calificación que el cliente dejó al comercio por esta orden
paid_at datetime\|null Momento del hito de pago (FLAG_PAID / FLAG_POST_PAYMENT; no se sobreescribe)
being_prepared_at datetime\|null Momento en que el comercio/shopper inició la preparación
prepared_at datetime\|null Momento en que la orden quedó lista
collected_at datetime\|null Momento en que el repartidor recolectó la orden
arrived_at datetime\|null Momento de llegada del repartidor al punto de entrega
preparation_time int\|null Segundos de preparación: prepared_at − being_prepared_at
total_preparation_time int\|null Segundos totales de preparación: desde paid_at (inmediatas) o desde being_prepared_at (programadas)
collection_time int\|null Segundos entre orden lista y recolección: collected_at − prepared_at
arrival_time int\|null Segundos desde el pago hasta la llegada al destino; solo órdenes inmediatas
fleet_association_id int\|null Asociación/tarifa de envío elegida para la orden (aunque aún no haya repartidor asignado)
source string\|null Origen externo de la orden (Ridery, WhatsApp, Square…); null en órdenes nativas
city_id int\|null Ciudad de la orden (del comercio, o del destino si no hay comercio); define visibilidad para admins de ciudad
client_address string\|null Dirección de entrega en texto plano (deprecado: usar client_address_data)
locations array\|null Paradas de la entrega (lista de {@link OrderLocation}); reemplaza a client_*_e6 / pickup_*_e6 y soporta multiparada
order_edit_data OrderEditData\|null Datos de la edición de la orden en curso (cambios de ítems pendientes de confirmar)
ordered_goods array\|null Lista de productos de la orden (snapshot)
is_service bool BitMask (({@link self::status} & 0x1) !== 0)
is_pickup_enabled bool BitMask (({@link self::status} & 0x2) !== 0)
is_type_digital bool BitMask (({@link self::status} & 0x4) !== 0)
is_delivery bool BitMask (({@link self::status} & 0x8) !== 0)
is_bid_waiting_client bool BitMask (({@link self::status} & 0x10) !== 0)
is_bid_waiting_admin bool BitMask (({@link self::status} & 0x20) !== 0)
is_bid_waiting_provider bool BitMask (({@link self::status} & 0x40) !== 0)
is_asap bool BitMask (({@link self::status} & 0x80) !== 0)
is_status_unconfirmed bool BitMask (({@link self::status} & 0x100) !== 0)
is_payment_waiting_confirmation bool BitMask (({@link self::status} & 0x200) !== 0)
is_payment_confirmed bool BitMask (({@link self::status} & 0x400) !== 0)
is_provider_assigned bool BitMask (({@link self::status} & 0x800) !== 0)
is_provider_started bool BitMask (({@link self::status} & 0x1000) !== 0)
is_status_arrived bool BitMask (({@link self::status} & 0x2000) !== 0)
is_provider_working bool BitMask (({@link self::status} & 0x4000) !== 0)
is_status_completed bool BitMask (({@link self::status} & 0x8000) !== 0)
is_status_canceled bool BitMask (({@link self::status} & 0x10000) !== 0)
is_status_completed_ok bool BitMask (({@link self::status} & 0x20000) !== 0)
is_refund_applied bool BitMask (({@link self::status} & 0x40000) !== 0)
is_refund_pending bool BitMask (({@link self::status} & 0x80000) !== 0)
is_payment_later bool BitMask (({@link self::status} & 0x100000) !== 0)
is_status_being_prepared bool BitMask (({@link self::status} & 0x200000) !== 0)
is_status_prepared bool BitMask (({@link self::status} & 0x400000) !== 0)
is_provider_arrived bool BitMask (({@link self::status} & 0x800000) !== 0)
is_provider_collected bool BitMask (({@link self::status} & 0x1000000) !== 0)
is_status_expired bool BitMask (({@link self::status} & 0x2000000) !== 0)
is_shopper_allowed bool BitMask (({@link self::status} & 0x4000000) !== 0)
is_shopper_assigned bool BitMask (({@link self::status} & 0x8000000) !== 0)
is_pool_private bool BitMask (({@link self::status} & 0x10000000) !== 0)
is_invoice_allowed bool BitMask (({@link self::status} & 0x20000000) !== 0)
is_for_shipping bool BitMask (({@link self::status} & 0x40000000) !== 0)
has_item_updates bool BitMask (({@link self::status} & 0x80000000) !== 0)
is_sent_to_pool bool BitMask (({@link self::status} & 0x100000000) !== 0)
is_trip bool BitMask (({@link self::status} & 0x200000000) !== 0)
is_trip_locked bool BitMask (({@link self::status} & 0x400000000) !== 0)
is_bot_attempting bool BitMask (({@link self::status} & 0x800000000) !== 0)
is_no_provider_dispatch bool BitMask (({@link self::status} & 0x1000000000) !== 0)
is_dispatched_without_provider bool BitMask (({@link self::status} & 0x2000000000) !== 0)
is_payment_later_required bool BitMask (({@link self::status} & 0x4000000000) !== 0)
is_type_good bool BitMask (({@link self::status} & 0x1) === 0)
is_scheduled bool BitMask (({@link self::status} & 0x80) === 0)
is_status_confirmed bool BitMask (({@link self::status} & 0x100) === 0)
is_no_bid_waiting bool BitMask ((({@link self::status} & 0x70) >> 4) === 0)
additional_delivery_fee_e2 int
admin_url string
administrator_notes Collection Notas de administración registradas ante incidencias
allLogs ApiLog>
allOrderedGoodItems OrderedGood>
allPayments Payment>
amount_for_debugging Money\|null
applied_taxes array
assignedOrderProviders OrderProvider>
assigning_bot_status string\|null
balance OrderBalance
base_delivery_fee_e2 int
base_price_e2 int
bids Bid>
bids_snapshot array
branch Branch\|null
branch_group BranchGroup\|null
branchPendingFee BranchPendingFee\|null
branchRating BranchRating\|null
branch_subtotal_e2 int Monto de cara al comercio: subtotal_original_e2 − branch_discounts_e2 (× 100)
cancellationReason OrderCancellationReason\|null
cashback_e2 int
cashbacks CouponUsage>
charges_e2 int
client Client\|null
client_debt_e2 int
client_payment_e2 int
clientRating ClientRating\|null
client_rating_e2 int Calificación que el cliente dejó al comercio, × 100 (ej. 450 = 4.5)
clientRatings ClientRating>
company Company
companyActiveOrder CompanyActiveOrder\|null
company_currency_snapshot Currency\|null Moneda por defecto de la company al momento de crear la orden (snapshot)
creator Admin\|null
currency_rates array
currency_snapshot Currency\|null Moneda del comercio al momento de crear la orden (snapshot; puede tener tasa distinta a la de la company)
current_delay_in_seconds int
delivery_eta_in_seconds int Tiempo estimado del delivery desde que se recolecta la orden (segundos)
delivery_fee_e2 int Costo del envío de la orden (× 100)
delivery_fee_e2_paid_for_client int Cuánto del envío pagó el cliente: 0 con promo de envío gratis, total, o parcial según promos (× 100)
delivery_fee_to_pay_e2 int Cuánto se le debe pagar al repartidor por el envío (× 100)
delivery_notes string
desired_pickup_at datetime\|null
destination_city City\|null
device array\|null Metadatos del dispositivo que creó la orden
discount_e2 int
discounts CouponUsage>
discountsAndCashbacks CouponUsage>
driver_assigning_delay_in_seconds int
effective_discount_e2 int
effective_service_fee_e2 int
estimated_max_weight int
estimated_route DirectionsEstimated\|null Ruta del trayecto de delivery calculada por el servicio externo de rutas (distancia y tiempo)
estimated_route_for_assigned_provider DirectionsEstimated\|null
external_id string\|null
external_source string\|null
fleet Fleet\|null
fleet_association FleetAssociation\|null
fleet_association_shipment_action string\|null
full_delivery_eta_in_seconds int Tiempo estimado total de la orden (segundos)
full_preparation_eta_in_seconds int
generalInvoiceItems GeneralInvoiceItem>
gmv_e2 int
goodRatings GoodRating>
goods Good>
google_maps_url string\|null
gross_total_e2 int
histories OrderHistory>
initial_eta datetime
invoiceDocumentItems InvoiceDocumentItem>
is_arriving_for_pickup bool
is_expiration_allowed bool
is_provider_chat_allowed bool El cliente puede chatear con el repartidor de esta orden
is_provider_dial_allowed bool El cliente puede llamar al repartidor de esta orden
items_quantity int
last_status_change int
latest_status string Valor de status inmediatamente anterior al actual
local_date datetime
logs ApiLog>
notifications Notification>
order_location_history Collection
orderProviderServices OrderProviderService>
order_provider_snapshot OrderProvider\|null Datos congelados del repartidor asignado a la orden
orderProviders OrderProvider>
orderedGoodItems OrderedGood>
orderedGoodItemsWithPromo OrderedGood>
ordered_goods_history Collection
package_content string\|null
package_description string
package_info PackageInfo\|null
paid_amount_e2 int
partner array\|null Datos del servicio externo que creó la orden (incluye su OrderID externo y campos propios de la integración)
partner_name string\|null Nombre del servicio/asociado externo
partner_pod_pin string\|null PIN para validar la entrega entre el comercio y el servicio externo
partner_provider_id int\|null
partner_validation_code array\|null
partner_validation_url string\|null URL con un QR para autorizar la entrega
payment_attempting string\|null Método de pago que el usuario está intentando (Stripe, PayPal…); pago aún no concretado
payment_balance_e2 int
payment_debt_e2 int
payment_error string\|null Último error de pago; se limpia cuando hay un pago exitoso
payment_types array Tipos de pago realizados sobre la orden
payments Payment>
pickup_delay_in_seconds int
pickup_eta datetime
pickup_eta_in_seconds int
probable_eta datetime\|null ETA total estimado por el sistema: preparación del comercio + llegada del repartidor + trayecto
promo_code CouponUsage\|null
promo_code_e2 int
promo_code_tax OrderTax\|null
proofOfDeliveries ProofOfDelivery>
providerPendingFees ProviderPendingFee>
providerRatings ProviderRating>
providers Provider>
relatedBalanceMovements BalanceMovement>
revenue_e2 int
selected_payment_method SelectedPaymentMethod\|null Método elegido para pago contra entrega (POS, efectivo…)
service_charge array\|null Servicio de envío elegido para la orden (el fleet_association ganador entre los candidatos)
service_fee_e2 int Comisión de servicio de la app aplicada a la orden (× 100)
service_matches array\|null
shopper Provider\|null
shopper_attachments Collection Adjuntos cargados por el shopper (ej. fotos de la compra)
shopper_fee_e2 int
shopper_fee_to_pay_e2 int
shopper_notes Collection Notas registradas por el shopper
shopper_snapshot Provider\|null Datos congelados del shopper asignado
snapshots OrderDataSnapshot>
status_data array Volcado de los bitmasks para depuración; se mantiene por retrocompatibilidad, no usar en integraciones
status_for_branch_admins string Código de estado estable para administradores del comercio; N/A si no aplica
status_for_clients string Código de estado estable para el cliente; N/A si no aplica
status_for_company_admins string Código de estado estable para administradores de la company; N/A si no aplica
status_for_partners string Código de estado estable para el servicio/asociado externo; N/A si no aplica
status_for_payment string Código de estado de pago estable; N/A si no aplica
status_for_providers string Código de estado estable para el repartidor; N/A si no aplica
status_for_shoppers string Código de estado estable para el shopper; N/A si no aplica
subtotal_discount_e2 int
subtotal_promo_code_e2 int
tab_groups array
taxes OrderTax> Detalle de cargos y descuentos aplicados a la orden (delivery, servicio, promos…)
taxes_for_branch Collection
tracking_url string\|null
weight int

Ver Json

Endpoints

Insertar Order

Insertar Order de Client

Crear orden (deprecado)

Crea una Order para un cliente en un comercio, armando internamente un carrito.

{warning} Endpoint deprecado. Use el flujo de Cart (Carrito).

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/clients/{clientId}/orders Authorization
{
    "receiver_name": "string|max:64",
    "receiver_phone": "string|max:32",
    "client_dni": "string|max:32",
    "client_phone": "string|max:32",
    "client_name": "string|max:128",
    "client_email": "string|email:rfc,filter",
    "is_gift": "boolean",
    "client_latitude_e6": "required_without:client_address_id|integer|between:-90000000,90000000",
    "client_longitude_e6": "required_with:client_latitude_e6||integer|between:-180000000,180000000",
    "client_address": "string|max:512",
    "client_address_id": "integer",
    "pickup_latitude_e6": "integer|between:-90000000,90000000",
    "pickup_longitude_e6": "integer|between:-180000000,180000000",
    "pickup_address": "string|max:512",
    "provider_id": "integer",
    "scheduled_at": "date",
    "use_local_tz": "boolean",
    "notes": "string|max:255",
    "goods": [
        {
            "good_id": "required|integer|exists:goods,id",
            "quantity": "required|integer|min:1",
            "units": "nullable|numeric|min:0.000001",
            "provider_id": "integer",
            "notes": "string|max:255",
            "properties": [
                {
                    "property_id": "required|integer",
                    "value": "required|string"
                }
            ]
        }
    ],
    "subtotal_e2": "integer|min:0",
    "service_charge_id": "nullable|integer",
    "service_charge": "nullable|array",
    "available_delivery_providers": "nullable|array",
    "use_balance": "boolean",
    "coupon_code": "nullable|string|min:5|max:20",
    "cart_identifier": "integer|min:0",
    "all_errors": "",
    "simulate": "",
    "force_scheduling": "boolean",
    "force_providers": [
        "integer"
    ]
}

Errores de negocio

Código HTTP Cuándo ocurre
EC140 400 El client_address_id indicado no pertenece al cliente o no existe.
EF312 400 El coupon_code no es válido o ya fue utilizado.
EF323 400 El código corresponde a una gift card; solo se canjea desde el perfil.
EC603 400 El contenido del carrito resultante no es válido.
EC229 400 Uno o más ítems del pedido no son válidos.

Listar Order

{info} Soporta: Paginación Filters Carga dinámica

Listar órdenes

Lista las Order accesibles para el usuario autenticado. Si no se envía city_id y el usuario es administrador de una ciudad, se filtra automáticamente por su ciudad.

Parámetros de query adicionales:

  • city_id: filtra por la ciudad del comercio de la orden.
  • assignment: shopper | deliverer | any | none — estado de asignación de la orden.
  • mode: deleted | all — incluye órdenes archivadas (fuerza la paginación).
Método URI Cabeceras
GET /companies/{companyId}/orders Authorization

Listar Order de BranchGroup

{info} Soporta: Paginación Filters Carga dinámica

Listar órdenes de un comercio (marca)

Lista las Order de todas las sucursales del branch_group (comercio/marca) indicado. Con mode=deleted o mode=all incluye órdenes archivadas.

Método URI Cabeceras
GET /companies/{companyId}/branch-groups/{branchGroupId}/orders Authorization

Listar Order de Branch

{info} Soporta: Paginación Filters Carga dinámica

Listar órdenes de un comercio

Lista las Order de la sucursal indicada. Con is_paid=1 (o si el comercio tiene auto-asignación de repartidor al pagar) filtra por órdenes pagadas. Con mode=deleted o mode=all incluye órdenes archivadas.

Método URI Cabeceras
GET /companies/{companyId}/branches/{branchId}/orders Authorization

Listar Order de Client

{info} Soporta: Paginación Filters Carga dinámica

Listar órdenes de un cliente

Lista las Order del cliente indicado. Con mode=deleted o mode=all incluye órdenes archivadas.

Método URI Cabeceras
GET /companies/{companyId}/clients/{clientId}/orders Authorization

Listar órdenes activas de un cliente

{info} Soporta: Filters

Devuelve las Order en curso del cliente (según CompanyActiveOrder), sin paginar.

Método URI Cabeceras
GET /companies/{companyId}/clients/{clientId}/orders/active Authorization

Listar órdenes disponibles para un repartidor

Devuelve las Order que el repartidor puede tomar según sus habilitaciones (repartidor, shopper, envío, viaje), su pertenencia a flotas, la distancia al punto de recolección, geocercas, restricciones de método de pago a flota y la configuración de pool del comercio. Las órdenes con partner externo se excluyen. Cada orden consultada queda registrada como vista por el repartidor.

Método URI Cabeceras
GET /companies/{companyId}/providers/{providerId}/orders/available Authorization

Listar Order de Admin

{info} Soporta: Paginación

Listar órdenes creadas por un administrador

Lista las Order cuyo creator_id es el administrador indicado (órdenes que ese admin registró en nombre de un cliente). Con mode=deleted o mode=all incluye órdenes archivadas.

Método URI Cabeceras
GET /companies/{companyId}/admins/{adminId}/orders Authorization

Lista el histórico de cambios de una orden

Método URI Cabeceras
GET /companies/{companyId}/orders/{orderId}/order-histories Authorization

Mostrar Order

{info} Soporta: Carga dinámica

Mostrar orden

Devuelve el detalle completo de una Order, incluido el snapshot del servicio de envío (service_charge). Acepta órdenes archivadas. Cuando la consulta un repartidor, éste queda registrado como visor de la orden.

Método URI Cabeceras
GET /companies/{companyId}/orders/{orderId} Authorization

Actualizar Order

{info} Soporta: Paginación Filters Carga dinámica

Actualizar orden

Actualiza campos editables de una Order y gestiona las notas de administración (admin_notes): con admin_note_id edita una nota existente (guardando una versión previa si cambió el texto); sin él, crea una nota nueva. Acepta órdenes archivadas.

Método URI Cabeceras
PATCH /companies/{companyId}/orders/{orderId} Authorization
{
    "admin_note_id": "nullable|integer|min:1",
    "admin_notes": "nullable|string|max:512"
}

Subir imagen a una nota de administrador

{info} Soporta: Paginación Filters Carga dinámica

Crea una evidencia (imagen) y lo vincula a una nota de administrador de una Orden. Se puede visualizar por el atributo de Orden: administrator_notes.attachments

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/add-attachment Authorization
{
    "admin_notes": "nullable|string|max:512",
    "attachment": "nullable|image|mimes:jpeg,png,bmp|max:8192"
}

Subir una nota de administrador a una Orden

{info} Soporta: Paginación Filters Carga dinámica

Crea una evidencia (text) con su imagen y lo vincula a una nota de administrador de una Orden. Se puede visualizar por el atributo de Orden: administrator_notes.attachments

Método URI Cabeceras
POST /orders/{orderId}/administrator-notes Authorization
{
    "admin_notes": "nullable|string|max:512",
    "attachment": "nullable|image|mimes:jpeg,png,bmp|max:8192"
}

Subir notas/adjuntos como Shopper

{info} Soporta: Paginación Filters Carga dinámica

Crea una evidencia (imagen) y una nota (texto) de un shopper y lo vincula a una orden. Útil para subir facturas o evidencias de la compra. Se puede visualizar por el atributo de Orden: shopper_notes. Sólo disponible para el shopper asignado.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/add-shopper-notes Authorization
{
    "shopper_notes": [
        {
            "text": "nullable|string|max:512",
            "attachments": [
                "required|image|mimes:jpeg,png,bmp|max:8192"
            ]
        }
    ]
}

Cambiar dirección de envío

{info} Soporta: Paginación Filters Carga dinámica

Aplica el cambio de dirección de destino de la Order previamente calculado con check-destination-address: actualiza tarifa de envío, ETA y flota asignada, y guarda el historial de ubicaciones. Si aumenta la deuda, la orden vuelve a estado de pago pendiente.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/update-destination-address Authorization
{
    "client_latitude_e6": "required|integer|between:-90000000,90000000",
    "client_longitude_e6": "required|integer|between:-180000000,180000000",
    "client_address": "nullable|string|max:512",
    "address_notes": "nullable|string|max:255",
    "contact_name": "nullable|string|max:80",
    "contact_phone": "nullable|string|max:20",
    "contact_instructions": "nullable|string|max:1024"
}

Errores de negocio

Código HTTP Cuándo ocurre
EC100 400 La orden no admite repartidor.
EC116 400 La orden ya está finalizada.
EC244 400 La orden no soporta envío a domicilio.
EC240 400 No hay un cálculo previo válido para esa dirección; ejecute primero check-destination-address.

Acciones de Order

Acción en lote sobre órdenes

Ejecuta una acción de transición sobre varias Order a la vez (campo ids). El parámetro de ruta action acepta: set-confirmed, set-paid, set-running, set-ready, set-completed, set-post-payment, set-being-prepared, set-prepared. Cada orden se procesa como si se llamara al endpoint individual correspondiente; la respuesta detalla el resultado por orden. Los errores de negocio son los del endpoint de la acción elegida.

Método URI Cabeceras
POST /companies/{companyId}/orders/batch-action/{action} Authorization
{
    "ids": [
        "integer|min:1"
    ],
    "payload": ""
}

Confirmar orden

Confirma una Order pendiente y le asigna su number correlativo. Solo aplica a órdenes de comercio con al menos un producto.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-confirmed Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC103 400 La orden ya estaba confirmada.
EC242 400 La orden no está asociada a un comercio.
EC138 400 La orden no tiene productos.

Marcar orden como pagada

Registra un pago manual sobre la Order en nombre de un administrador. Útil para resolver incidencias con pagos ya recibidos fuera de la plataforma.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-paid Authorization
{
    "type": "string|in:gateway,form,post-payment,balance",
    "name": "string",
    "ref": "string"
}

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC102 400 La orden no está confirmada.
EC105 400 La orden ya está pagada.
EC106 400 La orden tiene reportes de pago pendientes de validación.

Iniciar orden (sin envío)

Marca una Order de comercio como en curso. Solo para órdenes que no requieren repartidor (retiro en tienda o consumo en local).

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-running Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC101 400 La orden admite repartidor; use el flujo de asignación en su lugar.
EC108 400 La orden ya fue iniciada.
EC242 400 La orden no está asociada a un comercio.

Marcar orden como lista (sin envío)

Marca una Order de comercio como lista para entregar. Solo para órdenes que no requieren repartidor.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-ready Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC102 400 La orden no está confirmada.
EC242 400 La orden no está asociada a un comercio.
EC101 400 La orden admite repartidor; use el flujo de asignación en su lugar.

Finalizar orden (entregada)

Marca una Order como entregada. Requiere que el método de pago esté definido. Si la orden requiere repartidor y ya está en estado "llegó", exige verificación en dos pasos: se completará sin generar ganancia para ningún repartidor.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-completed Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC104 400 La orden no tiene método de pago definido.

Cancelar orden

Cancela una Order. Si ya estaba completada con éxito, se marca como no entregada (a efectos de facturación) y se exige verificación en dos pasos, porque puede disparar un reembolso al cliente y anular el pago al repartidor o al comercio. Envía un correo de aviso.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-canceled Authorization
{
    "reason": "required|string|max:64",
    "target_user_type": {
        "nullable": true,
        "string": true
    }
}

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está cancelada.

Activar pago contra entrega

Permite avanzar una Order sin pago previo: se cobrará al momento de la entrega (POS, efectivo, etc.). Requiere orden de comercio, no digital y que admita repartidor.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-post-payment Authorization
{
    "id": "nullable|string",
    "currency_iso": "required_with:id|string|min:3|max:8",
    "cash_amount_e2": "nullable|integer|min:1"
}

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC144 400 La orden es digital y no admite pago contra entrega.
EC100 400 La orden no admite repartidor.
EC242 400 La orden no está asociada a un comercio.
EC105 400 La orden ya está pagada.
EC504 400 El método de pago no está disponible para el pool privado de la orden.

Pagar orden con saldo del cliente

Salda la deuda de la Order debitando el saldo disponible del cliente.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-balance-payment Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC105 400 La orden ya está pagada.
EF500 400 El saldo del cliente es insuficiente para cubrir la deuda de la orden.

Iniciar preparación

Marca que el comercio inició la preparación de la Order. Registra being_prepared_at.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-being-prepared Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC102 400 La orden no está confirmada.
EC126 400 La orden ya está en preparación.
EC128 400 La orden ya está preparada.
EC242 400 La orden no está asociada a un comercio.

Marcar orden como preparada

Marca la Order como preparada y lista para entregar (al repartidor o al cliente). Con assign_shopper_as_deliverer: true el shopper asignado queda también como repartidor.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-prepared Authorization
{
    "assign_shopper_as_deliverer": "nullable|boolean"
}

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC102 400 La orden no está confirmada.
EC242 400 La orden no está asociada a un comercio.
EC138 400 La orden no tiene productos.
EC135 400 Se pidió usar el shopper como repartidor pero la orden no tiene shopper asignado.

Mover al pool privado

Pasa la Order al pool privado: el envío lo maneja el propio comercio. Requiere que el comercio tenga una flota propia.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-private-pool Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC102 400 La orden no está confirmada.
EC100 400 La orden no admite repartidor.
EC114 400 La orden ya está asignada.
EC142 400 La orden ya está en el pool privado.
EC242 400 La orden no está asociada a un comercio.
ES020 400 El comercio no tiene una flota propia habilitada.

Mover al pool público

Pasa la Order al pool público: el envío puede asignarse a cualquier flota de la plataforma.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-public-pool Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC102 400 La orden no está confirmada.
EC100 400 La orden no admite repartidor.
EC114 400 La orden ya está asignada.
EC141 400 La orden no está en el pool privado.
EC242 400 La orden no está asociada a un comercio.

Listar flotas disponibles para la orden

Devuelve las opciones de servicio de envío (flotas/tarifas) calculadas para la Order, tomadas del snapshot de matches. Requiere orden con repartidor y sin asignar.

Método URI Cabeceras
GET /companies/{companyId}/orders/{orderId}/available-fleets Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC100 400 La orden no admite repartidor.
EC114 400 La orden ya está asignada.
EC238 400 La orden no tiene una lista de opciones de envío disponible.

Cambiar flota de envío

Cambia la flota/tarifa de envío de la Order eligiendo una de las opciones del snapshot de matches (service_charge_id).

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/set-selected-fleet Authorization
{
    "service_charge_id": "required|integer"
}

Errores de negocio

Código HTTP Cuándo ocurre
EC100 400 La orden no admite repartidor, o el partner externo ya está asignado.
EC114 400 La orden ya está asignada.
EC238 400 La orden no tiene una lista de opciones de envío disponible.
EC239 400 El service_charge_id indicado no está en la lista de opciones de la orden.
EC241 400 No se puede cambiar de flota por una restricción de pago a flota (POS).

Enviar orden al pool

Encola la Order para asignación automática de repartidor según la configuración vigente. Con force: true fuerza el reintento aunque ya haya un intento en curso.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/send-to-pool Authorization
{
    "force": "bool"
}

Errores de negocio

Código HTTP Cuándo ocurre
EC116 400 La orden ya está finalizada.
EC102 400 La orden no está confirmada.
EC100 400 La orden no admite repartidor.
EC114 400 La orden ya está asignada y su flota no admite reenvío al pool.

Marca la orden como despachada sin asignación de repartidor.

Solo válido para órdenes creadas con entrega a cargo del comercio (is_no_provider_dispatch). Habilita la posterior completación de la orden.

Método URI Cabeceras
POST /orders/{orderId}/set-dispatched-without-provider Authorization

Excluir orden de facturación

Quita la Order de la facturación del comercio: el comercio no recibirá pago por ella. Exige verificación en dos pasos. La orden debe estar finalizada y asociada a un comercio.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/exclude-invoices Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC242 400 La orden no está asociada a un comercio.
EC115 400 La orden no está finalizada.
EC147 400 La orden ya está excluida de facturación, o su conciliación ya fue excluida, o ya tiene una factura emitida.

Incluir orden en facturación

Reincorpora la Order a la facturación del comercio: el comercio recibirá el pago correspondiente aunque la orden no se haya entregado al cliente. Exige verificación en dos pasos. La orden debe estar finalizada y asociada a un comercio.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/include-invoices Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EC242 400 La orden no está asociada a un comercio.
EC115 400 La orden no está finalizada.
EC147 400 La orden ya está incluida en facturación, o su conciliación ya fue incluida, o ya tiene una factura emitida.

Calcular cambio de dirección de envío

{info} Soporta: Paginación Filters Carga dinámica

Recalcula la tarifa y el ETA del envío de la Order para una nueva dirección de destino, sin aplicarlo. El resultado se cachea 5 minutos para confirmarlo luego con update-destination-address.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/check-destination-address Authorization
{
    "client_latitude_e6": "required|integer|between:-90000000,90000000",
    "client_longitude_e6": "required|integer|between:-180000000,180000000"
}

Errores de negocio

Código HTTP Cuándo ocurre
EC100 400 La orden no admite repartidor.
EC116 400 La orden ya está finalizada.
EC244 400 La orden no soporta envío a domicilio.
EC240 400 No hay flota de envío disponible para la nueva dirección.

Crear orden desde administración (deprecado)

Variante de creación para administradores: identifica al cliente por client_email (client_name, client_dni, client_phone opcionales) y lo crea si no existe; luego crea la Order igual que el endpoint de creación de cliente.

{warning} Endpoint deprecado. Use el flujo de Cart (Carrito).

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/orders Authorization
{
    "receiver_name": "string|max:64",
    "receiver_phone": "string|max:32",
    "client_dni": "string|max:32",
    "client_phone": "string|max:32",
    "client_name": "string|max:128",
    "client_email": "string|email:rfc,filter",
    "is_gift": "boolean",
    "client_latitude_e6": "required_without:client_address_id|integer|between:-90000000,90000000",
    "client_longitude_e6": "required_with:client_latitude_e6||integer|between:-180000000,180000000",
    "client_address": "string|max:512",
    "client_address_id": "integer",
    "pickup_latitude_e6": "integer|between:-90000000,90000000",
    "pickup_longitude_e6": "integer|between:-180000000,180000000",
    "pickup_address": "string|max:512",
    "provider_id": "integer",
    "scheduled_at": "date",
    "use_local_tz": "boolean",
    "notes": "string|max:255",
    "goods": [
        {
            "good_id": "required|integer|exists:goods,id",
            "quantity": "required|integer|min:1",
            "units": "nullable|numeric|min:0.000001",
            "provider_id": "integer",
            "notes": "string|max:255",
            "properties": [
                {
                    "property_id": "required|integer",
                    "value": "required|string"
                }
            ]
        }
    ],
    "subtotal_e2": "integer|min:0",
    "service_charge_id": "nullable|integer",
    "service_charge": "nullable|array",
    "available_delivery_providers": "nullable|array",
    "use_balance": "boolean",
    "coupon_code": "nullable|string|min:5|max:20",
    "cart_identifier": "integer|min:0",
    "all_errors": "",
    "simulate": "",
    "force_scheduling": "boolean",
    "force_providers": [
        "integer"
    ]
}

Errores de negocio

Código HTTP Cuándo ocurre
EC140 400 El client_address_id indicado no pertenece al cliente o no existe.
EF312 400 El coupon_code no es válido o ya fue utilizado.
EF323 400 El código corresponde a una gift card; solo se canjea desde el perfil.
EC603 400 El contenido del carrito resultante no es válido.
EC229 400 Uno o más ítems del pedido no son válidos.

Asigna un shopper a una orden.

Método URI Cabeceras
PUT /companies/{companyId}/orders/{orderId}/shoppers/{providerId} Authorization

Quita al Shopper de una orden. La orden queda libre para asignarla a otro Shopper.

Método URI Cabeceras
DELETE /companies/{companyId}/orders/{orderId}/shoppers/{providerId} Authorization

Ajustar el monto de una orden

Agrega un OrderTax de tipo ajuste (amount_e2 positivo o negativo) a la Order, con description. Con adjust_client_balance: true el ajuste impacta el saldo/deuda del cliente (soporta pagos parciales si la orden no está preparada ni es de pago diferido). Con is_forced: true se permite ajustar aunque la orden ya tenga factura, recalculándola. El monto final de la orden no puede quedar en negativo.

Método URI Cabeceras
POST /companies/{companyId}/orders/{orderId}/adjust Authorization
{
    "amount_e2": "required|integer",
    "description": "required|string|max:128",
    "adjust_client_balance": "required|boolean",
    "is_forced": "nullable|boolean"
}

Errores de negocio

Código HTTP Cuándo ocurre
EC124 400 La orden está cancelada.
EC146 400 La orden ya tiene una factura emitida (use is_forced para ajustar igualmente).

Relaciones