Orders

Visión General

El dominio Orders es responsable del ciclo de vida de los pedidos en la plataforma Getnet. Un pedido representa una solicitud de acreditación, compra de equipo o cambio de producto realizada por un merchant (establecimiento comercial).

Creación de Pedido — POST /orders

Prerrequisito: Selección de Ofertas

Antes de crear un pedido, el canal debe haber realizado previamente la llamada al endpoint GET /offerings (documentado en offerings.md), mostrado las ofertas disponibles al cliente y capturado la selección del establecimiento.

El canal puede recibir una o más ofertas disponibles. El cliente selecciona una o más ofertas para contratar.

information icon
⚠️ Guarde el order_id devuelto por la creación del pedido — es obligatorio en todas las llamadas posteriores: PUT /orders/{order_id} (actualización), POST /orders/{order_id}/validation (validación) y PUT /orders/{order_id}/submit (envío). Sin él no es posible dar continuidad al pedido.

Cumplimentación del campo merchant

El campo merchant identifica el establecimiento que está realizando el pedido. El registro del merchant debe haber sido realizado previamente conforme se describe en merchants.md.

Prerrequisito — Registro del merchant

Antes de crear el pedido, el canal debe llamar a GET /merchants/{merchant_id} para confirmar que el merchant existe y obtener su identificador.

Regla de mapeo

El campo merchant_id está en la raíz del objeto devuelto por GET /merchants/{merchant_id}. El campo merchant del pedido debe cumplimentarse únicamente con ese valor:
Campo en el pedido (merchant)Origen en el retorno de GET /merchants/{merchant_id}
merchant_idmerchant_id (raíz del objeto)

Ejemplo

Retorno de GET /merchants/{merchant_id} (simplificado):
json
{ "merchant_id": "6a0fc6f29a4f90ca92a8670e", "acquirer_code": "getnet", "merchant_legal_data": {} }
Campo merchant en el payload de POST /orders:
json
{ "merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" } }

Cumplimentación del campo items

El campo items del payload de POST /orders es un array que representa, de forma aplanada (flat), todos los productos de todas las ofertas seleccionadas por el cliente.

Regla general de mapeo

Para cada oferta seleccionada por el cliente, itere sobre el array items[] de la oferta devuelta por GET /offerings. Cada entrada de ese array se convierte en un objeto dentro del items[] del pedido.
text
GET /offerings → offering[n].items[x] → POST /orders → items[sequencial]

Campos obligatorios de cada ítem del pedido

Campo en el pedido (items[*])Origen en el retorno de GET /offeringsObservación
item_sequence_numberSecuencial global creciente (1, 2, 3…) considerando todos los ítems de todas las ofertas seleccionadas.
offering.priced_offering_idoffering.priced_offering_id (raíz de la oferta)El priced_offering_id está en la raíz del objeto de la oferta, no dentro de items.
offering.smart_offering_idoffering.priced_offering_id (raíz de la oferta)Debe cumplimentarse con el mismo valor de priced_offering_id.
productoffering.items[x].productEl objeto product debe enviarse íntegramente como se devuelve en la oferta.
quantityoffering.items[x].quantityCantidad indicada en la oferta para ese producto.

Campos opcionales/condicionales de cada ítem del pedido

Los campos siguientes existen dentro de items[x] en el retorno de GET /offerings para determinados tipos de producto. Cuando están presentes, deben reenviarse en el ítem correspondiente del pedido:
Campo en el pedido (items[*])Origen en el retorno de GET /offeringsCuando está presente
settlement_periodoffering.items[x].settlement_periodProductos de tipo composite (adquirencia).
unit_priceoffering.items[x].unit_priceProductos con precificación (p. ej.: terminal con alquiler mensual).
total_priceoffering.items[x].total_priceProductos con precificación (p. ej.: terminal con alquiler mensual).

Cumplimentación del campo delivery_info

El campo delivery_info contiene la información de entrega del equipo.

Prerrequisito — Consulta de tipos de envío

Antes de cumplimentar delivery_info, el canal debe llamar a GET /offerings/delivery-data (documentado en offerings.yaml) informando el legal_document_number y el postal_code del cliente. La respuesta devuelve los tipos de envío disponibles en el array delivery_methods[].

El cliente selecciona el tipo de envío deseado entre los disponibles:

delivery_typeDescripción
scheduledEntrega Programada
normalEntrega Convencional
expressEntrega Express

Dirección de entrega — delivery_address

Debe cumplimentarse con la dirección de entrega del equipo informada por el cliente. Sigue la misma estructura que los campos de dirección del merchant (business_address, residential_address, commercial_address).

Campos por tipo de envío

Programada (scheduled)

CampoOrigen / Valor
delivery_type"scheduled" (fijo)
delivery_amountdelivery_methods[x].delivery_amount de GET /offerings/delivery-data
delivery_timedelivery_methods[x].delivery_time de GET /offerings/delivery-data
recommended_delivery_periodPeríodo seleccionado por el cliente ("morning", "afternoon" o "night")
period_gridEntrada de delivery_methods[x].period_grid[] correspondiente al período seleccionado por el cliente
delivery_reference_pointPunto de referencia informado por el cliente
delivery_time_typenull
Ejemplo:
json
{ "delivery_info": { "delivery_type": "scheduled", "delivery_amount": 0, "delivery_time": "0", "recommended_delivery_period": "morning", "period_grid": [ { "date": "2024-12-04", "recommended_delivery_period": "M", "begin_time": "08:00:00", "end_time": "11:30:00" } ], "delivery_reference_point": "Próximo ao mercado da esquina", "delivery_time_type": null, "delivery_address": { "street": "Rua Exemplo", "number": "123", "district": "Centro", "city": "Porto Alegre", "state": "RS", "postal_code": "90000000", "country": "BR" } } }

Convencional (normal)

CampoOrigen / Valor
delivery_type"normal" (fijo)
delivery_amountdelivery_methods[x].delivery_amount de GET /offerings/delivery-data
delivery_timedelivery_methods[x].delivery_time de GET /offerings/delivery-data
delivery_time_typedelivery_methods[x].delivery_time_type de GET /offerings/delivery-data (D o H)
Ejemplo:
json
{ "delivery_info": { "delivery_type": "normal", "delivery_amount": 0, "delivery_time": "3", "delivery_time_type": "D", "delivery_address": { "street": "Rua Exemplo", "number": "123", "district": "Centro", "city": "Porto Alegre", "state": "RS", "postal_code": "90000000", "country": "BR" } } }

Express (express)

CampoOrigen / Valor
delivery_type"express" (fijo)
delivery_amountdelivery_methods[x].delivery_amount de GET /offerings/delivery-data
delivery_timedelivery_methods[x].delivery_time de GET /offerings/delivery-data
delivery_time_typedelivery_methods[x].delivery_time_type de GET /offerings/delivery-data (D o H)
Ejemplo:
json
{ "delivery_info": { "delivery_type": "express", "delivery_amount": 2500, "delivery_time": "3", "delivery_time_type": "D", "delivery_address": { "street": "Rua Exemplo", "number": "123", "district": "Centro", "city": "Porto Alegre", "state": "RS", "postal_code": "90000000", "country": "BR" } } }

Ejemplo de mapeo

Retorno de GET /offerings (simplificado)

El cliente seleccionó dos ofertas: "Adquirência Físico Aluguel" (1 ítem) y "Oferta E-commerce - Link de Pagamento V2" (7 ítems). A continuación, la estructura resumida del retorno:
json
[ { "priced_offering_id": "6a0fc78fd653164a21cf71f8", "smart_offering_id": "6a0fc78fd653164a21cf71f8", "name": "Adquirência Físico Aluguel", "items": [ { "item_sequence_number": 1, "product": { "product_id": "693241e8c4e00969b33efaf1", "name": "ADQUIRENCIA FÍSICO ALUGUEL", "product_type": "composite", "composite_type": "acquirer", "transaction_channel_types": ["physical"], "modalities": ["rent"] }, "quantity": 1, "settlement_period": "receive_now_2" } ] }, { "priced_offering_id": "6a0fc78fd653164a21cf7201", "smart_offering_id": "6a0fc78fd653164a21cf7201", "name": "Oferta E-commerce - Link de Pagamento V2", "items": [ { "item_sequence_number": 1, "product": { "product_id": "69b2ece03abb838e8be1b21d", "name": "Terminal Ecommerce", "product_type": "terminal", "terminal_type": "ecommerce", "transaction_channel_type": "online", "modality": "rent", "delivery_method": "na", "wireless": false, "print_receipt": false, "model": "ecommerce" }, "quantity": 1, "unit_price": 0, "total_price": 0 }, { "item_sequence_number": 2, "product": { "product_id": "52fadc5225294c7781c862c4e4a2d91a", "name": "Conta SuperGet", "product_type": "service", "service_type": "service", "product_configuration": { "keyword": "prepaid_card", "issuer": "superget" } }, "quantity": 1 }, { "item_sequence_number": 3, "product": { "product_id": "6781192295d5d10a6194fe15", "name": "GetPay (link de pagamento)", "product_type": "service", "service_type": "ecommerce_service", "product_configuration": { "keyword": "ecommerce_payment_link" } }, "quantity": 1 } ] } ]

Payload resultante para POST /orders — campo items

Todos los ítems se aplanan en un único array con numeración secuencial global:
json
{ "items": [ { "item_sequence_number": 1, "offering": { "priced_offering_id": "6a0fc78fd653164a21cf71f8", "smart_offering_id": "6a0fc78fd653164a21cf71f8" }, "product": { "product_id": "693241e8c4e00969b33efaf1", "name": "ADQUIRENCIA FÍSICO ALUGUEL", "product_type": "composite", "composite_type": "acquirer", "transaction_channel_types": ["physical"], "modalities": ["rent"] }, "quantity": 1, "settlement_period": "receive_now_2" }, { "item_sequence_number": 2, "offering": { "priced_offering_id": "6a0fc78fd653164a21cf7201", "smart_offering_id": "6a0fc78fd653164a21cf7201" }, "product": { "product_id": "69b2ece03abb838e8be1b21d", "name": "Terminal Ecommerce", "product_type": "terminal", "terminal_type": "ecommerce", "transaction_channel_type": "online", "modality": "rent", "delivery_method": "na", "wireless": false, "print_receipt": false, "model": "ecommerce" }, "quantity": 1, "unit_price": 0, "total_price": 0 }, { "item_sequence_number": 3, "offering": { "priced_offering_id": "6a0fc78fd653164a21cf7201", "smart_offering_id": "6a0fc78fd653164a21cf7201" }, "product": { "product_id": "52fadc5225294c7781c862c4e4a2d91a", "name": "Conta SuperGet", "product_type": "service", "service_type": "service", "product_configuration": { "keyword": "prepaid_card", "issuer": "superget" } }, "quantity": 1 }, { "item_sequence_number": 4, "offering": { "priced_offering_id": "6a0fc78fd653164a21cf7201", "smart_offering_id": "6a0fc78fd653164a21cf7201" }, "product": { "product_id": "6781192295d5d10a6194fe15", "name": "GetPay (link de pagamento)", "product_type": "service", "service_type": "ecommerce_service", "product_configuration": { "keyword": "ecommerce_payment_link" } }, "quantity": 1 } ] }
information icon
Nota: Los ítems de la segunda oferta asumen numeración secuencial continuando a partir del último ítem de la primera oferta (2, 3, 4…). El item_sequence_number original de cada ítem dentro de la oferta (offering.items[x].item_sequence_number) se descarta — lo que vale es la secuencia global del pedido.

Reglas importantes

1. Secuencial global de ítems

El item_sequence_number es un contador único e incremental para todo el array items del pedido, independientemente de cuántas ofertas se hayan seleccionado.

2. priced_offering_id y smart_offering_id provienen de la raíz de la oferta

Estos dos campos deben cumplimentarse con el valor de priced_offering_id que está en la raíz del objeto de la oferta devuelta por GET /offerings — y no dentro de items[x]. Ambos (priced_offering_id y smart_offering_id) reciben el mismo valor.

3. El objeto product se envía íntegramente

El objeto product debe copiarse exactamente como se devuelve en offering.items[x].product, incluyendo todos los campos específicos del tipo de producto (terminal_type, modality, delivery_method, product_configuration, etc.). No omitir campos.

4. Campos condicionales por tipo de producto

Algunos campos existen en el ítem de la oferta solo para determinados tipos de producto:

  • settlement_period: presente en productos de tipo composite (adquirencia). Debe reenviarse en el ítem del pedido.
  • unit_price / total_price: presentes cuando el producto tiene un precio definido (p. ej.: terminal con alquiler mensual). Deben reenviarse en el ítem del pedido. Cuando no hay precio, enviar null.

5. Una oferta puede tener múltiples ítems

Una única oferta seleccionada puede devolver múltiples productos en su array items[]. Cada producto se convierte en un ítem separado en el pedido, todos compartiendo el mismo offering.priced_offering_id y offering.smart_offering_id.

Cumplimentación del campo merchant_accounts

El campo merchant_accounts es una lista de domicilios bancarios — es decir, las cuentas bancarias donde el merchant recibirá los recibibles de las transacciones realizadas en las máquinas y servicios de Getnet.
Debe crearse un ítem por marca contratada en las ofertas seleccionadas.

Estructura de cada ítem

CampoDescripción
brandMarca a la que se aplica el domicilio (visa, master, elo, amex, hipercard, pix)
merchant.merchant_idEl mismo merchant_id del campo raíz merchant del pedido
bank_account.bank.bank_countryPaís del banco (p. ej.: "BR")
bank_account.bank_codeCódigo de compensación del banco (FEBRABAN)
bank_account.bank_branch_codeNúmero de la sucursal
bank_account.bank_account_numberNúmero de cuenta + dígito verificador
bank_account.bank_account_currencyMoneda de la cuenta (p. ej.: "BRL")
bank_account.account_typeTipo de la cuenta: cc (corriente), pp (ahorro)
payment_centertrue para activar centralización de pagos
merchant_account_restrictionLista de restricciones. Enviar [] cuando no haya restricciones

Ejemplo

En el ejemplo siguiente, el merchant configura el mismo domicilio bancario para cuatro marcas:

json
{ "merchant_accounts": [ { "brand": "master", "merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" }, "bank_account": { "bank": { "bank_country": "BR", "bank_code": "033" }, "bank_branch_code": "0001", "bank_account_number": "123456789", "bank_account_currency": "BRL", "account_type": "cc" }, "payment_center": true, "merchant_account_restriction": [] }, { "brand": "visa", "merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" }, "bank_account": { "bank": { "bank_country": "BR", "bank_code": "033" }, "bank_branch_code": "0001", "bank_account_number": "123456789", "bank_account_currency": "BRL", "account_type": "cc" }, "payment_center": true, "merchant_account_restriction": [] }, { "brand": "elo", "merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" }, "bank_account": { "bank": { "bank_country": "BR", "bank_code": "033" }, "bank_branch_code": "0001", "bank_account_number": "123456789", "bank_account_currency": "BRL", "account_type": "cc" }, "payment_center": true, "merchant_account_restriction": [] }, { "brand": "amex", "merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" }, "bank_account": { "bank": { "bank_country": "BR", "bank_code": "033" }, "bank_branch_code": "0001", "bank_account_number": "123456789", "bank_account_currency": "BRL", "account_type": "cc" }, "payment_center": true, "merchant_account_restriction": [] } ] }

Tipos de cuenta (account_type)

ValorDescripción
ccCuenta Corriente
ppCuenta de Ahorro

Actualización del Pedido — PUT /orders/{order_id}

Visión general

El endpoint PUT /orders/{order_id} permite actualizar los datos de un pedido existente, por ejemplo para añadir o corregir información antes del envío.

⚠️ Sustitución total del pedido

El PUT sustituye íntegramente el pedido. Nunca envíe un payload parcial — los campos omitidos serán eliminados. Envíe siempre el objeto completo del pedido.

Diferencia respecto al merchant

A diferencia de PUT /merchants/{merchant_id}, el pedido no sufre enriquecimiento después de la creación: la plataforma no añade ninguna información nueva al objeto. Los datos almacenados en el pedido son exactamente los que el canal envió en POST /orders.

Por esta razón, el comportamiento recomendado depende de cómo el canal gestiona el estado del pedido:

SituaciónQué hacer
Canal almacena la estructura del pedido en su dominioNo es necesario llamar a GET /orders/{order_id}. Basta con modificar o incrementar los campos en la estructura local y enviar el PUT con el objeto completo.
Canal no almacena la estructura del pedido localmenteBuscar el pedido actual con GET /orders/{order_id} (usando el order_id devuelto por POST /orders), aplicar los cambios y luego enviar el PUT.

Parámetro de ruta

ParámetroTipoDescripción
order_idstringID devuelto en la creación del pedido (POST /orders)

Recalcular campos de totalización

Tras cualquier cambio en los ítems del pedido, los campos de totalización deben recalcularse antes de enviar el PUT. La regla es la misma que la de la creación — consulte la sección Cumplimentación de los campos de totalización a continuación.

Cumplimentación de los campos de totalización

Los campos de totalización del pedido representan la suma de los valores de los productos de tipo terminal presentes en el array items, agrupados por el tipo de precificación (pricing_model.pricing_type) de cada producto.

Regla general

Para cada ítem del pedido donde product.product_type = "terminal", sume el valor de total_price del ítem conforme el product.pricing_model.pricing_type, y cumplimente el campo correspondiente en la raíz del pedido:
Campo en el pedidopricing_model.pricing_type de los terminales sumados
total_fixed_pricefixed_price
total_monthly_rentmonthly_rent
total_affiliation_feeaffiliation_fee
total_recurrentrecurrent
total_payment_pricepayment_price
total_licenselicense
information icon
Los ítems cuyo product.product_type no sea terminal (p. ej.: composite, service) no entran en los cálculos de totalización.

Ejemplo

Supongamos que el pedido tiene los siguientes ítems de tipo terminal:
Ítemproduct_typepricing_model.pricing_typetotal_price
1terminalmonthly_rent7990
2terminalmonthly_rent4990
3terminalfixed_price19900
4composite

La cumplimentación de los campos de totalización sería:

json
{ "total_fixed_price": 19900, "total_monthly_rent": 12980, "total_affiliation_fee": 0, "total_recurrent": 0, "total_payment_price": 0, "total_license": 0 }
information icon
Nota: Los campos sin terminales correspondientes deben enviarse con valor 0.

Validación del Pedido — POST /orders/{order_id}/validation

Visión general

Tras crear el pedido con POST /orders, el canal recibirá el order_id. Antes de enviar el pedido definitivamente, es altamente recomendable llamar a POST /orders/{order_id}/validation.
Este endpoint realiza una validación completa de los datos del pedido — aplicando las mismas reglas de negocio del envío — sin cambiar el estado del pedido. Si hay inconsistencias, el canal puede corregirlas antes del envío definitivo.
information icon
⚠️ Importante: El endpoint es opcional, pero se recomienda encarecidamente. Tras la llamada a PUT /orders/{order_id}/submit, si el pedido es rechazado, no es posible corregirlo — será rechazado definitivamente.

Parámetro de ruta

ParámetroTipoDescripción
order_idstringID devuelto en la creación del pedido (POST /orders)

Cómo interpretar la respuesta

La respuesta contiene un campo report con la información de la validación. Para verificar si la validación aprobó o rechazó el pedido:
  1. Verifique el campo report.recommended.status:
    • "approved" → El pedido es correcto y puede enviarse.
    • "reproved" → El pedido contiene errores que deben corregirse antes del envío.
  2. Si report.recommended.status = "reproved", verifique la lista report.details[]. Cada ítem de la lista posee el campo detail_description con la descripción del motivo del rechazo.

Ejemplo de respuesta con rechazo

json
{ "report": { "details": [ { "visible": true, "detail_type": "missing_mandatory_data", "detail_attribute": "qualification.order.items", "detail_description": "Não foi encontrado composite correspondente ao terminal 6932501bc4e00969b33efaf8. Para cada terminal do pedido deve haver um composite com tipo de canal de transação (transaction_channel_type) correspondente.", "detail_code": "QDOBR-0129" } ], "recommended": { "status": "reproved", "last_status_update_date": "2026-05-22T12:44:41.365199901Z" } } }

Campos relevantes de la respuesta

CampoDescripción
report.recommended.statusResultado de la validación: "approved" o "reproved"
report.details[]Lista de detalles de los errores encontrados (presente cuando reproved)
report.details[].detail_descriptionDescripción legible del motivo del rechazo
report.details[].detail_typeTipo del error (p. ej.: missing_mandatory_data)
report.details[].detail_attributeAtributo del pedido que causó el error
report.details[].detail_codeCódigo interno del error

Envío del Pedido — PUT /orders/{order_id}/submit

Visión general

El endpoint PUT /orders/{order_id}/submit representa la confirmación definitiva del pedido por parte del cliente. Al llamarlo, el canal declara que el cliente revisó toda la información del pedido y confirma su conformidad.
information icon
⚠️ Atención: Tras el envío, si el pedido es rechazado, no es posible corregirlo. Por este motivo, se recomienda encarecidamente utilizar POST /orders/{order_id}/validation antes del envío.

Parámetro de ruta

ParámetroTipoDescripción
order_idstringID devuelto en la creación del pedido (POST /orders)

Respuesta en caso de rechazo

Si el pedido es rechazado durante el envío, la respuesta contendrá un objeto error con información del rechazo:
  1. Verifique si existe error.report.recommended con valor "reproved".
  2. El campo message aporta un mensaje genérico sobre el rechazo.
  3. Para entender el motivo detallado, verifique report.details[] y lea el campo detail_description de cada ítem.
Ejemplo de respuesta en caso de rechazo:
json
{ "error": { "message": "Pedido reprovado.", "report": { "recommended": "reproved", "details": [ { "visible": true, "detail_type": "missing_mandatory_data", "detail_attribute": "qualification.order.items", "detail_description": "Não foi encontrado composite correspondente ao terminal 6932501bc4e00969b33efaf8. Para cada terminal do pedido deve haver um composite com tipo de canal de transação (transaction_channel_type) correspondente.", "detail_code": "QDOBR-0129" } ] } } }

Respuesta en caso de éxito

Cuando el envío es exitoso, la respuesta contiene:

  • situation.status = "submitted" → indica que el pedido fue recibido por Getnet y está en procesamiento.
  • order_number → número del pedido generado por Getnet, que puede ser usado por el cliente para hacer seguimiento de su pedido.
Ejemplo de respuesta en caso de éxito:
json
{ "order_id": "6a1056da1d16baecee8580ee", "order_number": "MPGXZEGPEE", "audit_information": { "creation_date": "2026-05-22T13:15:06.361Z", "update_date": "2026-05-22T13:16:22.633Z", "channel_data": { "channel": "getnet_ecommerce", "login": "", "branch": "", "enrollment_number": "", "name": "", "publisher": "ecommerce" } }, "situation": { "status": "submitted", "status_name": "Submetido", "status_update_date": "2026-05-22T13:16:22.633Z" } }

Campos relevantes de la respuesta de éxito

CampoDescripción
order_idIdentificador interno del pedido
order_numberNúmero del pedido generado por Getnet para seguimiento por parte del cliente
situation.status"submitted" — pedido recibido y en análisis por Getnet
situation.status_nameNombre legible del estado (p. ej.: "Submetido")
situation.status_update_dateFecha y hora de la última actualización del estado

Flujo resumido

text
1. Canal llama a 600;">GET /merchants/{merchant_id} │ ├─ merchant_id → merchant.merchant_id en el pedido └─ merchant_id → merchant_accounts[*].merchant.merchant_id │ ▼ 2. Canal llama a 600;">GET /offerings │ ▼ 3. Canal llama a 600;">GET /offerings/delivery-data (legal_document_number + postal_code) │ ├─ Cliente selecciona tipo de envío (scheduled / normal / express) ├─ delivery_methods[x].delivery_amount → delivery_info.delivery_amount ├─ delivery_methods[x].delivery_time → delivery_info.delivery_time ├─ delivery_methods[x].delivery_time_type → delivery_info.delivery_time_type (normal/express) ├─ delivery_methods[x].period_grid[y] → delivery_info.period_grid (scheduled) └─ período seleccionado → delivery_info.recommended_delivery_period (scheduled) │ ▼ 4. Canal muestra ofertas al cliente │ ▼ 5. Cliente selecciona una o más ofertas │ ▼ 6. Para cada oferta seleccionada: └─ Para cada ítem en offering.items[]: ├─ item_sequence_number = siguiente número secuencial global ├─ offering.priced_offering_id = offering.priced_offering_id (raíz de la oferta) ├─ offering.smart_offering_id = offering.priced_offering_id (raíz de la oferta) ├─ product = item.product (copia íntegra) ├─ quantity = item.quantity ├─ settlement_period = item.settlement_period (si está presente) ├─ unit_price = item.unit_price (si está presente) └─ total_price = item.total_price (si está presente) │ ▼ 7. Cliente informa datos bancarios → montar merchant_accounts[]: └─ Un ítem por marca contratada: ├─ brand = marca (visa / master / elo / amex / ...) ├─ merchant.merchant_id = merchant_id (paso 1) ├─ bank_account.bank.bank_code = código FEBRABAN del banco ├─ bank_account.bank_branch_code = sucursal ├─ bank_account.bank_account_number = cuenta + dígito ├─ bank_account.account_type = cc / pp ├─ payment_center = true/false └─ merchant_account_restriction = [] │ ▼ 8. Canal calcula los campos de totalización: └─ Para cada ítem donde product.product_type = "terminal": ├─ pricing_type = "monthly_rent" → sumar total_price en total_monthly_rent ├─ pricing_type = "fixed_price" → sumar total_price en total_fixed_price ├─ pricing_type = "affiliation_fee" → sumar total_price en total_affiliation_fee ├─ pricing_type = "recurrent" → sumar total_price en total_recurrent ├─ pricing_type = "payment_price" → sumar total_price en total_payment_price └─ pricing_type = "license" → sumar total_price en total_license │ ▼ 9. Canal llama a 600;">POST /orders con merchant, delivery_info, items, merchant_accounts y campos de totalización │ └─ Recibe el order_id del pedido creado ⚠️ Guardar el order_id — obligatorio en los pasos siguientes │ ▼ 9a. (Si es necesario) Canal actualiza el pedido vía 600;">PUT /orders/{order_id} │ ├─ Si el canal almacena el pedido localmente → modificar estructura local y enviar 600;">PUT completo └─ Si no lo almacena → 600;">GET /orders/{order_id} → aplicar cambios → enviar 600;">PUT completo (Recalcular campos de totalización si los ítems fueron modificados) │ ▼ 10. (Recomendado) Canal llama a 600;">POST /orders/{order_id}/validation │ ├─ report.recommended.status = "approved" → puede proceder al envío └─ report.recommended.status = "reproved" → verificar report.details[].detail_description y corregir el pedido antes de enviar │ ▼ 11. Canal llama a 600;">PUT /orders/{order_id}/submit (cliente confirmó los datos del pedido) │ ├─ Rechazado → error.report.recommended = "reproved" │ verificar report.details[].detail_description │ (el pedido ya no puede corregirse) │ └─ Aprobado → situation.status = "submitted" order_number generado para seguimiento del pedido por parte del cliente