Branch


Una sucursal de una Company: el comercio que vende productos o servicios, con su ubicación, su catálogo, sus tarifas y su configuración. Varias sucursales de la misma marca se agrupan en un BranchGroup (branch_group_id), del que heredan la identidad visual.

Estados

  • enabled — la company habilitó la sucursal. Si es false, no opera.
  • in_service — está abierta ahora. false = cerrada.
  • is_visible — se muestra en las apps de clientes.

Transiciones: set-enabled / set-disabled (deshabilitar además apaga is_visible e in_service), set-visible / set-hidden, set-in-service-enabled / set-in-service-disabled. Poner en servicio exige que la sucursal sea válida: dirección con coordenadas, stock de productos, ciudad visible, cuentas de payout y administradores activos; y respetar el horario de trabajo salvo settings.allow_timetable_skipping.

Herencia del comercio (BranchGroup)

Estos atributos se leen del branch_group: description, logo_url, logo_alt_url, is_market (tratar como mercado, muchos SKU), is_featured (destacado), in_order (orden de aparición), group_rating_e2 / group_rating_sum / group_rating_count y is_digital (productos digitales). set-featured-enabled / set-featured-disabled operan sobre el branch_group y están deprecados.

Opciones de operación (options)

options es un bitmask; los flags booleanos derivados (can_*, enable_*, disable_*) se definen en App\Models\Companies\CommerceBitMasks. Hay dos juegos espejo, uno para envíos (*_deliveries, *_delivery_*) y otro para servicios (*_services, *_service_*):

  • can_providers_pick_*_from_pool — los repartidores pueden autoasignarse desde el pool.
  • can_providers_confirm_*_from_clients / _from_admins — el repartidor debe confirmar antes de tomar la orden, según quién la creó.
  • can_clients_pick_providers_for_* — el cliente elige el repartidor al crear la orden.
  • can_clients_choose_*_after_provider_confirmation / can_admins_choose_*_after_provider_confirmation — cliente/admin elige entre los repartidores que confirmaron.
  • enable_*_orders_confirmation_by_admins_before_payment — un admin debe aprobar la orden antes del pago.
  • can_providers_forfeit_from_assigned_* — el repartidor puede renunciar a una asignación.
  • disable_* — deshabilita ese tipo de orden (disable_deliveries, disable_services_on_client_location) o su programación (disable_*_scheduling).
  • enable_bot_for_deliveries / enable_bot_for_services / enable_bot_for_shoppers — bot de asignación automática.
  • enable_pickups (envíos) — permite retiro en tienda; enable_services_on_branch_location (servicios) — el servicio puede prestarse en la sucursal.

Prueba de entrega (POD): enable_pod_code (PIN), enable_pod_pictures (fotos), enable_pod_forms (formularios), enable_pod_signature (firma). enabled_pods es la combinación de esos cuatro bits.

Promoción (promo_info)

Etiqueta de la promo actual; el front la interpreta según el primer carácter:

  • empieza con ! → mostrar el resto literal (promo_info.substring(1)).
  • empieza con % → porcentaje de descuento: "{resto}% Off".
  • empieza con < → agregar prefijo "Hasta": "Hasta {resto}$ de descuento".
  • si no → monto fijo, ej. "10.00" se muestra como "-10.00$".

Configuración de la sucursal (settings)

settings es un objeto con la configuración y estadísticas de la sucursal (heredada de la company si has_custom_settings es false). editable_settings devuelve solo las claves que el administrador puede modificar (PATCH settings); allowed_settings (solo super-admin) devuelve todas las filas BranchSetting en crudo. Los setting_* del modelo son el acceso tipado a estas mismas claves.

Claves editables:

Clave Tipo Descripción
uid string Identificador fiscal del comercio
slogan string Eslogan
terms_of_service string Términos de servicio
max_scheduling_days int Días máximos para programar una orden (0–365)
scheduling_delay_minutes int Anticipación mínima para programar
enable_work_schedules bool Usa horarios de trabajo para restringir pedidos
auto_sync_work_schedules bool El sistema abre/cierra la sucursal según el horario
pay_in_store bool|null Permite pago en tienda (órdenes pickup)
order_expiration_minutes int Expiración de una orden no pagada (min, ≥ 5)
system_expiration_hours int|null Expiración de la orden por el sistema (horas)
service_fee_name string Nombre del cargo por servicio de la app
service_fee_e2 / service_fee_prc int / float Cargo por servicio: monto fijo (× 100) y porcentaje (fracción 0–1) — cliente
order_tax_e2 / order_tax_prc int / float Cargo por servicio total (incluye lo del comercio)
shopper_fee_e2 / shopper_fee_prc int / float Tarifa de shopper: monto fijo y porcentaje
shopper_assign_distance int Radio (m) para asignar shopper (≥ 100)
use_company_service_fees bool Usa los cargos por servicio de la company
force_branch_service_fees bool Fuerza los cargos por servicio de la sucursal
min_purchase_amount_e2 int Monto mínimo de compra (× 100)
max_simultaneous_deliveries int Envíos simultáneos por repartidor (0–20)
orders_driver_assigning_in_mins int Minutos para asignar repartidor tras el pago
orders_shopper_eta_config array Config de ETA de shopper (time_base_in_minutes, weight_base_in_kg, extra_minutes_per_10kg)
auto_assign_driver_upon_payment bool Asigna repartidor automáticamente al pagar
is_pool_automatic bool Pool automático
pool_mode string Pool por defecto: company (la company entrega) o branch (el comercio entrega)
payments_mode string Destino de los pagos: company | branch | both
auto_eta_calc bool Calcula el ETA automáticamente
checkout_disclaimer string Aviso a mostrar en el checkout
allow_offline_orders bool Acepta órdenes con la sucursal cerrada
allow_timetable_skipping bool Permite operar fuera del horario configurado
weight_rounding_mode / tax_rounding_mode string Modo de redondeo de peso / de impuestos
inventory_reminder_delay int Horas para recordar sincronizar inventario (0–720)
service_reminder_delay int Minutos para recordar servicios (0–60)
add_rating_sum / add_rating_count int Ajuste manual del rating (suma y cantidad)
import_config array Configuración de importación de catálogo
is_special_contributor bool Contribuyente especial (fiscal)
islr_prc float Retención de ISLR (%)
iva_retention_prc float Retención de IVA (%)
is_payment_deduction_disabled bool No deducir el servicio del pago
is_digital_invoice_enabled bool Factura digital habilitada
is_global_tax_included bool El impuesto global ya está incluido en los precios
payout_accounts array Cuentas para recibir pagos
address_for_fiscal_docs / email_for_fiscal_docs / legal_name_for_fiscal_docs string|null Datos para documentos fiscales
emails_for_payments array|null Emails para notificaciones de pago
mark_too_busy_until date|null Marcar la sucursal como muy ocupada hasta esta fecha
auto_busy_quantity int|null Órdenes activas que disparan el modo "muy ocupada"

Claves visibles (solo lectura añadidas a lo anterior): min_checkout_price_e2, holiday_since, holiday_until.

Estructura de Datos

Atributo Tipo Descripción
id int
name string Nombre de la sucursal
enabled bool La company habilitó la sucursal; si es false, no opera
in_service bool La sucursal está abierta ahora mismo; false = cerrada
latitude_e6 int Latitud de la sucursal (× 1e6)
longitude_e6 int Longitud de la sucursal (× 1e6)
banner_url string URL del banner de la sucursal
address string\|null Dirección de la sucursal en texto
phone string\|null Teléfono de la sucursal
time_zone_offset string Offset de zona horaria (ej. -04:00); base para horarios y programación
options int Bitmask de opciones de operación (ver "Opciones de operación")
has_custom_settings bool Si es false, la configuración se hereda de la company
code int Número correlativo de la sucursal dentro de la company
created_at datetime\|null
updated_at datetime\|null
deleted_at datetime\|null
company_id int Company dueña de la sucursal (oculto)
branch_group_id int Comercio (marca) al que pertenece la sucursal
is_visible bool Si la sucursal se muestra en las apps de clientes
eta string\|null Tiempo estimado de entrega en minutos
internal_code string\|null Código interno del comercio (referencia propia)
promo_id int\|null {@link Coupon} de la promoción activa, si aplica
promo_info string\|null Etiqueta de la promoción (ver "Promoción" para el formato)
rating_e2 int Rating de la sucursal (× 100)
rating_sum int Suma de calificaciones recibidas
rating_count int Cantidad de calificaciones recibidas
domain string\|null Subdominio/identificador web de la sucursal (por defecto b<code>)
extensions array Datos de extensiones / integraciones
city_id int\|null {@link \App\Models\City} de la sucursal; define visibilidad y se autodetecta por la ubicación
can_providers_pick_deliveries_from_pool bool BitMask (({@link self::options} & 0x1) !== 0)
can_providers_confirm_deliveries_from_clients bool BitMask (({@link self::options} & 0x2) !== 0)
can_clients_pick_providers_for_deliveries bool BitMask (({@link self::options} & 0x4) !== 0)
can_clients_choose_deliveries_after_provider_confirmation bool BitMask (({@link self::options} & 0x8) !== 0)
can_providers_confirm_deliveries_from_admins bool BitMask (({@link self::options} & 0x10) !== 0)
can_admins_choose_deliveries_after_provider_confirmation bool BitMask (({@link self::options} & 0x20) !== 0)
enable_delivery_orders_confirmation_by_admins_before_payment bool BitMask (({@link self::options} & 0x40) !== 0)
can_providers_forfeit_from_assigned_deliveries bool BitMask (({@link self::options} & 0x80) !== 0)
enable_pickups bool BitMask (({@link self::options} & 0x100) !== 0)
disable_deliveries bool BitMask (({@link self::options} & 0x200) !== 0)
disable_deliveries_scheduling bool BitMask (({@link self::options} & 0x400) !== 0)
enable_bot_for_deliveries bool BitMask (({@link self::options} & 0x800) !== 0)
can_providers_pick_services_from_pool bool BitMask (({@link self::options} & 0x1000) !== 0)
can_providers_confirm_services_from_clients bool BitMask (({@link self::options} & 0x2000) !== 0)
can_clients_pick_providers_for_services bool BitMask (({@link self::options} & 0x4000) !== 0)
can_clients_choose_services_after_provider_confirmation bool BitMask (({@link self::options} & 0x8000) !== 0)
can_providers_confirm_services_from_admins bool BitMask (({@link self::options} & 0x10000) !== 0)
can_admins_choose_services_after_provider_confirmation bool BitMask (({@link self::options} & 0x20000) !== 0)
enable_service_orders_confirmation_by_admins_before_payment bool BitMask (({@link self::options} & 0x40000) !== 0)
can_providers_forfeit_from_assigned_services bool BitMask (({@link self::options} & 0x80000) !== 0)
enable_services_on_branch_location bool BitMask (({@link self::options} & 0x100000) !== 0)
disable_services_on_client_location bool BitMask (({@link self::options} & 0x200000) !== 0)
disable_services_scheduling bool BitMask (({@link self::options} & 0x400000) !== 0)
enable_bot_for_services bool BitMask (({@link self::options} & 0x800000) !== 0)
enable_pod_code bool BitMask (({@link self::options} & 0x1000000) !== 0)
enable_pod_pictures bool BitMask (({@link self::options} & 0x2000000) !== 0)
enable_pod_forms bool BitMask (({@link self::options} & 0x4000000) !== 0)
enable_pod_signature bool BitMask (({@link self::options} & 0x8000000) !== 0)
enabled_pods int BitMask (({@link self::options} & 0xf000000) >> 24)
enable_bot_for_shoppers bool BitMask (({@link self::options} & 0x40000000) !== 0)
setting_uid string Identificador fiscal del comercio (clave editable uid)
setting_slogan string Eslogan (clave editable slogan)
setting_max_scheduling_days int Días máximos para programar una orden
setting_scheduling_delay_minutes int Anticipación mínima (min) para programar una orden
setting_pay_in_store bool\|null Permite pago en tienda (órdenes pickup)
setting_enable_work_schedules bool Usa horarios de trabajo para restringir pedidos
setting_auto_sync_work_schedules bool El sistema abre/cierra la sucursal según el horario
setting_order_expiration_minutes int Expiración de una orden no pagada (min)
setting_service_fee_name string\|null Nombre del cargo por servicio de la app
setting_service_fee_flat_e2 int Cargo por servicio, monto fijo al cliente (× 100)
setting_service_fee_prc float Cargo por servicio, porcentaje al cliente (fracción 0–1)
setting_order_tax_flat_e2 int Cargo por servicio total (con lo del comercio), monto fijo (× 100)
setting_order_tax_prc float Cargo por servicio total, porcentaje (fracción 0–1)
setting_shopper_assign_distance int Radio (m) para asignar shopper
setting_shopper_fee_e2 int Tarifa de shopper, monto fijo (× 100)
setting_shopper_fee_prc float Tarifa de shopper, porcentaje (fracción 0–1)
setting_min_checkout_price_e2 int Monto mínimo de compra (× 100)
setting_service_app_modifiers Collection<int, \App\Models\ServiceAppSetting> Modificadores adicionales del cargo por servicio
setting_payments_mode string Destino de los pagos: company | branch | both
setting_pool_mode string Pool por defecto: company | branch
setting_max_simultaneous_deliveries int Envíos simultáneos por repartidor
setting_weight_rounding_mode string Modo de redondeo del peso
setting_tax_rounding_mode string Modo de redondeo de impuestos
setting_use_company_service_fees bool Usa los cargos por servicio de la company
setting_force_branch_service_fees bool Fuerza los cargos por servicio de la sucursal
setting_work_schedule array Horario de trabajo (bloques por día de la semana)
setting_sync_schedule array Horario de apertura/cierre automático
setting_flag_schedule array Horario de banderas/estados especiales
setting_auto_eta_calc bool Calcula el ETA automáticamente
setting_import_config array Configuración de importación de catálogo
setting_first_opening_date int\|null Timestamp de la primera puesta en servicio
setting_add_rating_sum int Ajuste manual de la suma de rating
setting_add_rating_count int Ajuste manual de la cantidad de calificaciones
setting_last_inventory_sync int\|null Timestamp de la última sincronización de inventario
setting_inventory_reminder_delay int Horas para recordar sincronizar inventario
setting_service_reminder_delay int Minutos para recordar servicios pendientes
setting_order_min_number int Número inicial para la numeración de órdenes
setting_last_order_dashboard string\|null Último dashboard de órdenes usado (interno)
setting_terms_of_service string\|null Términos de servicio del comercio
setting_checkout_disclaimer string\|null Aviso a mostrar en el checkout
setting_allow_offline_orders bool Acepta órdenes con la sucursal cerrada
setting_allow_timetable_skipping bool Permite operar fuera del horario configurado
setting_system_expiration_hours int\|null Expiración de la orden por el sistema (horas)
setting_orders_shopper_eta_config array Config de ETA de shopper (time_base_in_minutes, weight_base_in_kg, extra_minutes_per_10kg)
setting_orders_driver_assigning_in_mins int Minutos para asignar repartidor tras el pago
setting_is_pool_automatic bool Pool automático
setting_is_special_contributor bool Contribuyente especial (fiscal)
setting_islr_prc float Retención de ISLR (%)
setting_iva_retention_prc float Retención de IVA (%)
setting_is_payment_deduction_disabled bool No deducir el servicio del pago al comercio
setting_is_digital_invoice_enabled bool Factura digital habilitada
setting_is_global_tax_included bool El impuesto global ya está incluido en los precios
setting_payout_accounts PayoutAccount[]\|null Cuentas para recibir pagos (payout)
setting_taxes array Impuestos configurados para la sucursal
setting_auto_assign_driver_upon_payment bool Asigna repartidor automáticamente al pagar
setting_address_for_fiscal_docs string\|null Dirección para documentos fiscales
setting_email_for_fiscal_docs string\|null Email para documentos fiscales
setting_legal_name_for_fiscal_docs string\|null Razón social para documentos fiscales
setting_emails_for_payments array\|null Emails para notificaciones de pago
setting_mark_too_busy_until datetime\|null Marcar la sucursal como muy ocupada hasta esta fecha
setting_auto_busy_quantity int\|null Órdenes activas que disparan el modo "muy ocupada"
setting_holiday_since datetime\|null Inicio del período de feriado/pausa
setting_holiday_until datetime\|null Fin del período de feriado/pausa
activeBalanceModifiers BalanceModifier>
allLogs ApiLog>
allOrders Order> Órdenes de la sucursal, incluidas las archivadas
allSettings BranchSetting>
allowed_settings array Todas las filas de configuración en crudo (solo super-admin)
available_balance_e2 int Saldo disponible de la sucursal (× 100)
available_for_withdrawal_balance_e2 int Saldo disponible para retiro (× 100)
balance_e2 int Saldo total de la sucursal (× 100)
balanceModifiers BalanceModifier>
balanceMovements BalanceMovement>
branchGoods BranchGood> Catálogo (ofertas de productos) de la sucursal
branchGroup BranchGroup Comercio (marca) al que pertenece
categories Category> Categorías de producto de la sucursal
categoriesWithCount Category>
city City\|null
company Company
currencies Currency> Monedas configuradas para la sucursal
deliveryFees DeliveryFee>
description string\|null Descripción del comercio (heredada del branch_group)
editable_settings array Configuración que el administrador puede modificar (ver "Configuración de la sucursal")
eta_info array Tiempo probable de entrega estimado por IA según los artículos y la hora del pedido
first_opening_date datetime\|null Primera vez que la sucursal entró en servicio
firstOpeningDateSetting BranchSetting\|null
firstOrder Order\|null Primera orden de la sucursal
geofence_check array\|null Cobertura de la sucursal para la ubicación consultada (Company::check)
geofences BranchGeofence> Geocercas de cobertura de la sucursal
google_maps_url string\|null
group_rating_count int\|null Cantidad de calificaciones a nivel del comercio (heredado)
group_rating_e2 int\|null Rating a nivel del comercio, × 100 (heredado)
group_rating_sum int\|null Suma de calificaciones a nivel del comercio (heredado)
in_order int\|null Orden de aparición del comercio (heredado)
in_service_until datetime\|null Hora de cierre cuando la sucursal está por cerrar
international_currency Currency\|null Moneda internacional de la sucursal
is_branch_closing_soon bool Mostrar aviso de que la sucursal está por cerrar
is_featured bool\|null La sucursal está destacada (heredado)
is_market bool\|null Tratar la sucursal como un mercado, con muchos SKU (heredado)
is_new_branch bool La sucursal es nueva
is_too_busy bool La sucursal está marcada como muy ocupada (posibles demoras)
lastBalanceMovement BalanceMovement\|null
local_currency Currency\|null Moneda local de la sucursal
locked_for_withdrawal_balance_e2 int Saldo bloqueado para retiro (× 100)
logo_alt_url string\|null Logo alternativo del comercio (heredado)
logo_url string\|null Logo del comercio (heredado)
logs ApiLog>
options_info array Descripción legible de options
orders Order> Órdenes activas de la sucursal
pendingFeeConciliations PendingFeeConciliation>
pivotBranchCategories PivotBranchCategory>
promo Coupon\|null Cupón de la promoción activa
providersWithAccess Provider> Repartidores con acceso a la sucursal
public_rating_e2 int Rating mostrado públicamente (suavizado; × 100)
resources UploadedResource>
settings array Configuración y estadísticas de la sucursal (ver "Configuración de la sucursal")
smart_address string Dirección resumida para mostrar
workSchedules WorkSchedule> Horarios de trabajo de la sucursal

Ver Json

Endpoints

Insertar Branch

Insertar Branch de BranchGroup

Crear sucursal

Crea una Branch dentro de un branch_group (marca). Hereda las options de la company y arranca deshabilitada, fuera de servicio y no visible. Si se envía location_google_maps_link, se extraen de ahí la dirección y las coordenadas. Acepta settings para la configuración inicial y sincroniza el catálogo desde el comercio.

Método URI Cabeceras
POST /companies/{companyId}/branch-groups/{branchGroupId}/branches Authorization

Ver Json

Listar Branch

{info} Soporta: Paginación Filters

Listar sucursales

Lista las Branch de la company (ordenadas por visibles y habilitadas primero).

Método URI Cabeceras
GET /companies/{companyId}/branches N/A

Home por secciones

Arma el home de la app para una ubicación (latitude_e6 / longitude_e6, distance_in_meters opcional): Branch cercanas agrupadas por secciones y categorías, secciones de productos destacados con stock disponible y banners promocionados. Se usa para la pantalla principal del cliente.

Método URI Cabeceras
GET /companies/{companyId}/branches/by-sections N/A
{
    "latitude_e6": "required|integer|between:-90000000,90000000",
    "longitude_e6": "required|integer|between:-180000000,180000000",
    "distance_in_meters": "integer"
}

Listar Branch de BranchGroup

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

Listar sucursales de un comercio

Lista las Branch del branch_group (marca) indicado.

Método URI Cabeceras
GET /companies/{companyId}/branch-groups/{branchGroupId}/branches N/A

Configuración editable de la sucursal

Devuelve las claves de Branch settings que el administrador puede modificar.

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

Listar Branch de BranchCategory

{info} Soporta: Paginación Filters

Listar sucursales de una categoría

Lista las Branch asociadas a la BranchCategory indicada. Si la categoría es de nivel superior, incluye las de todas sus subcategorías.

Método URI Cabeceras
GET /companies/{companyId}/branch-categories/{branchCategoryId}/branches N/A

Mostrar Branch

{info} Soporta: Carga dinámica

Mostrar sucursal

Devuelve la Branch (acepta sucursales archivadas). Si se envían coordenadas (latitude_e6 / longitude_e6), geofence_check indica si esa ubicación entra en la cobertura de la sucursal.

Método URI Cabeceras
GET /companies/{companyId}/branches/{branchId} N/A
{
    "latitude_e6": "integer|between:-90000000,90000000",
    "longitude_e6": "integer|between:-180000000,180000000"
}

Actualizar Branch

Actualizar sucursal

Actualiza datos de la Branch. Si se envía location_google_maps_link, se extraen de ahí la dirección y las coordenadas. in_order se guarda en el branch_group (marca).

Método URI Cabeceras
PATCH /companies/{companyId}/branches/{branchId} Authorization
{
    "name": "max:112|string",
    "location_google_maps_link": "max:255|url",
    "latitude_e6": "integer|between:-90000000,90000000",
    "longitude_e6": "integer|between:-180000000,180000000",
    "address": "string|max:255",
    "phone": "string",
    "eta": "string",
    "internal_code": "string|max:16",
    "time_zone_offset": {
        "string": true,
        "regex": "/^[\+\-]([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
    },
    "options": "integer",
    "has_custom_settings": "boolean",
    "domain": "max:32|domain",
    "city_id": "nullable|integer|exists:cities,id"
}

Actualizar configuración de la sucursal

Actualiza las claves editables de Branch settings (ver "Configuración de la sucursal" en el modelo). Las claves no editables se ignoran; las claves protegidas requieren acceso a nivel de company. Acepta valores en formato "humano" (human_*). Un cambio en las tarifas de servicio dispara un email de aviso.

Método URI Cabeceras
PATCH /companies/{companyId}/branches/{branchId}/settings Authorization
{
    "uid": "string|max:64",
    "slogan": "string|max:80",
    "max_scheduling_days": "integer|min:0|max:365",
    "scheduling_delay_minutes": "integer|min:0",
    "enable_work_schedules": "boolean",
    "auto_sync_work_schedules": "boolean",
    "pay_in_store": "nullable|boolean",
    "order_expiration_minutes": "integer|min:5",
    "service_fee_name": "nullable|string|max:40",
    "service_fee_flat_e2": "integer|min:0",
    "human_service_fee_flat_e2": "numeric|min:0.0",
    "service_fee_prc": "numeric|between:0.0000,1.0000",
    "human_service_fee_prc": "numeric|between:0.00,100.00",
    "order_tax_flat_e2": "integer|min:0",
    "human_order_tax_flat_e2": "numeric|min:0.0",
    "order_tax_prc": "numeric|between:0.0000,1.0000",
    "human_order_tax_prc": "numeric|between:0.00,100.00",
    "shopper_fee_e2": "integer|min:0",
    "shopper_assign_distance": "integer|min:100",
    "human_shopper_fee_e2": "numeric|min:0.0",
    "shopper_fee_prc": "numeric|between:0.0000,1.0000",
    "human_shopper_fee_prc": "numeric|between:0.00,100.00",
    "add_rating_sum": "integer|min:0",
    "add_rating_count": "integer|min:0",
    "min_checkout_price_e2": "integer|min:0",
    "human_min_checkout_price_e2": "numeric|min:0.0",
    "import_config": "array",
    "terms_of_service": "string",
    "max_simultaneous_deliveries": "integer|min:0|max:20",
    "auto_eta_calc": "boolean",
    "checkout_disclaimer": "string",
    "allow_offline_orders": "boolean",
    "allow_timetable_skipping": "boolean",
    "inventory_reminder_delay": "integer|min:0|max:720",
    "service_reminder_delay": "integer|min:0|max:60",
    "use_company_service_fees": "boolean",
    "force_branch_service_fees": "boolean",
    "system_expiration_hours": "nullable|integer|min:0",
    "orders_driver_assigning_in_mins": "integer|min:0",
    "is_pool_automatic": "boolean",
    "is_special_contributor": "boolean",
    "islr_prc": "numeric|between:0.00,100.00",
    "human_islr_prc": "numeric|between:0.00,100.00",
    "iva_retention_prc": "numeric|between:0.00,100.00",
    "human_iva_retention_prc": "numeric|between:0.00,100.00",
    "is_payment_deduction_disabled": "boolean",
    "is_digital_invoice_enabled": "boolean",
    "is_global_tax_included": "boolean",
    "payout_accounts": [
        {
            "type": "required_with:payout_accounts.*|string|in:national_bank_account,mobile_payment",
            "document": "required_if:type,national_bank_account|required_if:type,mobile_payment|string|regex:/^[VEJGP].{7,15}$/",
            "name": "required_if:type,national_bank_account|string",
            "account": "required_if:type,national_bank_account|string|min:20",
            "bank_name": "required_if:type,national_bank_account|string|min:3|max:64",
            "bank_code": "required_if:type,mobile_payment|string|size:4",
            "phone": "required_if:type,mobile_payment|string|max:32",
            "email": "nullable|email:rfc,filter",
            "alias": "nullable|string|max:40"
        }
    ],
    "auto_assign_driver_upon_payment": "boolean",
    "address_for_fiscal_docs": "nullable|string|max:160",
    "email_for_fiscal_docs": "nullable|string|email:rfc,filter",
    "legal_name_for_fiscal_docs": "nullable|string|max:255",
    "emails_for_payments": [
        {
            "email": "rfc,filter"
        }
    ],
    "mark_too_busy_until": "nullable|date",
    "auto_busy_quantity": "nullable|integer",
    "payments_mode": "string|in:company,branch,both",
    "pool_mode": "string|in:company,branch",
    "weight_rounding_mode": "string|in:ceil,floor,half_up,half_down,truncate",
    "tax_rounding_mode": "string|in:ceil,floor,half_up,half_down,truncate",
    "orders_shopper_eta_config": {
        "time_base_in_minutes": {
            "required_with": "orders_shopper_eta_config",
            "integer": true,
            "min": " 1"
        },
        "weight_base_in_kg": {
            "required_with": "orders_shopper_eta_config",
            "integer": true,
            "min": " 1"
        },
        "extra_minutes_per_10kg": {
            "required_with": "orders_shopper_eta_config",
            "integer": true,
            "min": " 1"
        }
    },
    "service_app_modifiers": [
        {
            "is_enabled": "boolean",
            "name": "required|string|max:32",
            "label": "string|max:32",
            "description": "string",
            "layer": "integer|min:0|max:255",
            "price_min_e2": "integer|min:0",
            "human_price_min_e2": "numeric|min:0.0",
            "price_max_e2": "integer",
            "human_price_max_e2": "numeric",
            "hour_beg": {
                "string": true,
                "regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
            },
            "hour_end": {
                "string": true,
                "regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
            },
            "conditions": "array",
            "payment_methods": [
                "required|string"
            ],
            "payment_currencies": [
                "required|string"
            ]
        }
    ],
    "taxes": [
        {
            "is_enabled": "boolean",
            "name": "required|string|max:32",
            "label": "string|max:32",
            "description": "string",
            "layer": "integer|min:0|max:255",
            "price_min_e2": "integer|min:0",
            "human_price_min_e2": "numeric|min:0.0",
            "price_max_e2": "integer",
            "human_price_max_e2": "numeric",
            "hour_beg": {
                "string": true,
                "regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
            },
            "hour_end": {
                "string": true,
                "regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
            },
            "conditions": "array",
            "payment_methods": [
                "required|string"
            ],
            "payment_currencies": [
                "required|string"
            ]
        }
    ]
}

Eliminar Branch

Eliminar sucursal

Elimina la Branch. Debe estar deshabilitada y fuera de servicio. Si tiene órdenes, se archiva (soft delete); si no, se borra físicamente.

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

Errores de negocio

Código HTTP Cuándo ocurre
EA171 400 La sucursal está habilitada; hay que deshabilitarla primero.
EA173 400 La sucursal está en servicio; hay que sacarla de servicio primero.

Restaurar Branch

Restaurar sucursal

Restaura una Branch archivada (soft delete). Acepta los campos de update para aplicarlos al restaurar.

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/restore Authorization
{
    "name": "string|max:112"
}

Acciones de Branch

Sucursales para el mapa

{info} Soporta: Paginación Filters

Devuelve las Branch visibles con su ubicación, logo, estado de servicio y un heatmap_intensity (órdenes activas de envío sin recolectar). Respuesta cacheada ~15 s.

Método URI Cabeceras
GET /companies/{companyId}/branches/all N/A

Acción en lote sobre sucursales

Ejecuta una acción sobre varias Branch a la vez (campo ids). El parámetro de ruta action acepta: set-in-service-enabled, set-in-service-disabled, set-enabled, set-disabled, set-featured-enabled, set-featured-disabled, set-visible, set-hidden, update, delete. Cada sucursal se procesa como si se llamara al endpoint individual; la respuesta detalla el resultado por sucursal. Los errores de negocio son los del endpoint de la acción elegida.

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

Subir logo de la sucursal

Reemplaza el logo (campo image). El logo se guarda en el branch_group (marca), así que afecta a todas las sucursales del comercio.

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/upload-logo Authorization
{
    "image": "required|image|mimes:jpeg,png,bmp|max:8192|dimensions:min_width=600,ratio=1/1"
}

Subir banner de la sucursal

Reemplaza banner_url con la imagen subida (campo image). El banner es propio de la sucursal (no del comercio).

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/upload-banner Authorization
{
    "image": "required|image|mimes:jpeg,png,bmp|max:8192|dimensions:min_width=868,min_height=868"
}

Habilitar sucursal

Marca la Branch como habilitada (enabled = true). No la pone en servicio ni visible.

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/set-enabled Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EA171 400 La sucursal ya está habilitada.

Deshabilitar sucursal

Marca la Branch como deshabilitada y además la oculta (is_visible = false) y la saca de servicio (in_service = false).

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/set-disabled Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EA170 400 La sucursal no está habilitada.

Poner sucursal en servicio (abrir)

Abre la Branch (in_service = true, y la hace visible). Exige que la sucursal sea válida para operar y que el horario de trabajo lo permita (salvo settings.allow_timetable_skipping o acceso de administrador de la company).

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/set-in-service-enabled Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EA170 400 La sucursal no está habilitada.
EA173 400 La sucursal ya está en servicio.
EA179 400 La sucursal no tiene una dirección con coordenadas válidas.
EA174 400 La sucursal no tiene stock de productos.
EA181 400 La ciudad de la sucursal no está visible.
EF607 400 La sucursal no tiene cuentas de payout configuradas.
EA180 400 La sucursal no tiene administradores activos.
EC223 400 La sucursal está fuera de horario según sus horarios de trabajo.

Sacar sucursal de servicio (cerrar)

Cierra la Branch (in_service = false). No cambia enabled ni is_visible.

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/set-in-service-disabled Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EA172 400 La sucursal no está en servicio.

Destacar sucursal (deprecado)

{warning} Endpoint deprecado. Marca el branch_group de la Branch como destacado.

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/set-featured-enabled Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EA176 400 El comercio ya está destacado.

Quitar destacado de la sucursal (deprecado)

{warning} Endpoint deprecado. Quita el destacado del branch_group de la Branch.

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/set-featured-disabled Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EA175 400 El comercio no está destacado.

Mostrar sucursal en las apps

Marca la Branch como visible (is_visible = true). Requiere que esté habilitada, con dirección válida y con stock de productos.

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/set-visible Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EA170 400 La sucursal no está habilitada.
EA178 400 La sucursal ya está visible.
EA179 400 La sucursal no tiene una dirección con coordenadas válidas.
EA174 400 La sucursal no tiene stock de productos.

Ocultar sucursal de las apps

Marca la Branch como no visible (is_visible = false). No cambia enabled ni in_service.

Método URI Cabeceras
POST /companies/{companyId}/branches/{branchId}/set-hidden Authorization

Errores de negocio

Código HTTP Cuándo ocurre
EA177 400 La sucursal no está visible.

Configuración completa de la sucursal (super-admin)

Devuelve todas las filas BranchSetting en crudo. Restringido a super-admin.

Método URI Cabeceras
GET /companies/{companyId}/branches/{branchId}/allowed-settings Authorization

Relaciones