Ir al contenido

HubfiscalStoreSage

Almacena la salida de SageCreateDocument en la base de datos centralizada Hub Fiscal (MySQL/MariaDB). Debe colocarse inmediatamente después del paso de creación en Sage X3, tanto si el documento fue exitoso como si fallo.

Caracteristicas principales:

  • Upsert: Si el pedido ya tiene un registro lo actualiza, si no lo inserta. Evita duplicados en reintentos.
  • Registro de fallos: Almacena los intentos fallidos con status: failed, incrementando retry_count en cada reintento.
  • Transacción atomica: Inserta en documents, fiscal_status y logs en una sola transacción — hace rollback completo en caso de error.
  • Propagación de contacto: Lee los datos del contacto (nombre/nome, nif, email) del objeto contato propagado por el workflow.
CampoTipoRequeridoDescripción
credentials_idcredentialsSiCredencial Hub Fiscal MySQL/MariaDB (tipo sqlQuery)
country_isotextNoCódigo ISO del pais. Por defecto usa el campo pais de la respuesta de Sage. Default: ES
document_typeselectNoTipo de documento fallback si no viene en la respuesta de Sage. Default: FT
entity_sourcetextNoOrigen del pedido: shopify, manual, api. Default: shopify
currencytextNoMoneda ISO fallback. Default: EUR
save_payloadselectNoGuardar el JSON completo de Sage en payload_json (hasta 50KB). Default: Si

El nodo extrae automáticamente los campos de la respuesta Sage:

Campo Hub FiscalOrigen Sage
entity_iddata.shopify_order_id → data.entity_id → _meta_.shopify_order_id → idRegistro
order_numberdata.shopify_order_number → data.order_number → _meta_.order_number
country_isoconfig → data.pais → ES
typedata.tipificacao → config → FT
fiscal_doc_iddata.idRegistro
fiscal_doc_numberdata.descripcion → idRegistro
total_netdata.totalNet → data.total
total_taxdata.totalTax
total_grossdata.total
contact_namedata.contato.nombre → data.contato.nome → data.contact_name
contact_nifdata.contato.nif → data.contact_nif
contact_emaildata.contato.email → data.email
issued_atdata.fecha → hoy

SageCreateDocument no incluye shopify_order_id en su salida nativa. Para que este nodo pueda correlacionarlo con el pedido Shopify, propaga ese campo mediante un nodo Transform o SetVariable anterior:

{
"shopify_order_id": "{{id}}",
"shopify_order_number": "{{order_number}}",
"contato": {
"nombre": "{{billing_address.name}}",
"nif": "{{note_attributes[?name=='nif'].value}}",
"email": "{{email}}",
"pais": "{{billing_address.country_code}}"
}
}

Alternativamente, el objeto _meta_ del workflow puede transportar shopify_order_id y order_number entre nodos.

Entrada esperada: la salida de SageCreateDocument:

{
"success": true,
"idRegistro": 1042,
"schema": "SAGEBCN",
"tercero": "CT-000001",
"planta": "22_ES",
"total": 78.18,
"descripcion": "Pedido Shopify #14522",
"pais": "ES",
"tipificacao": "FT",
"fecha": "2026-04-20",
"message": "Documento Sage creado (ID: 1042) en SAGEBCN.YFACTERCAB",
"shopify_order_id": "6684429451477",
"shopify_order_number": "14522",
"contato": {
"nombre": "Juan Garcia",
"nif": "B12345678",
"email": "cliente@ejemplo.com",
"pais": "ES"
}
}
{
"success": true,
"hub_document_id": 18,
"entity_id": "6684429451477",
"order_number": "14522",
"country_iso": "ES",
"type": "FT",
"status": "completed",
"fiscal_provider": "sage",
"fiscal_doc_id": "1042",
"fiscal_doc_number": "Pedido Shopify #14522",
"total_gross": 78.18,
"currency": "EUR",
"message": "Documento Sage registrado en Hub Fiscal (ID: 18, Sage ID: 1042)"
}
Shopify Webhook → HubfiscalStoreShopify (pending)
→ SageCreateDocument
→ HubfiscalStoreSage (actualiza a completed)
  • Sage no devuelve ATCUD — la columna atcud se almacena como NULL para documentos Sage.
  • Si entity_id esta vacío (no hay shopify_order_id en el payload), el nodo usa idRegistro de Sage como ID de entidad. Es un fallback seguro pero el registro en Hub Fiscal no se correlacionara con el pedido Shopify original si no se propaga shopify_order_id.
  • El campo fiscal_status.action se establece a void para documentos NC (nota de crédito / abono) y create para el resto.