Manual de usuario — FACTSYNC

Este manual explica como configurar una conexion con SAGE 200c y como definir metodos de sincronizacion mediante el modulo FACTSYNC. No se requieren conocimientos tecnicos: el proceso se realiza integramente desde la interfaz web.

Indice

  1. Conceptos basicos
  2. Crear y configurar una conexion SAGE 200c
    1. Acceso al listado de conexiones
    2. Crear una conexion nueva
    3. Campos de configuracion de SAGE 200c
    4. Guardar la conexion
  3. Crear y configurar un metodo
    1. Acceso al listado de metodos
    2. Crear un metodo nuevo
    3. Campos de configuracion del metodo
    4. Configurar la frecuencia (cron)
    5. Configurar los argumentos (ARGS)
    6. Guardar el metodo
  4. Explorar y ejecutar sincronizaciones
    1. Acceso al explorador de datos
    2. Importar datos (GET)
    3. Exportar datos (POST / PUT)
  5. Metodos disponibles para SAGE 200c
  6. Resolucion de problemas comunes
  7. Glosario de campos SAGE ↔ Softbase

1. Conceptos basicos

FACTSYNC se organiza en dos niveles:

ConceptoDescripcionEjemplo
Conexion Credenciales y parametros para conectar con un sistema externo. Una conexion puede tener multiples metodos. «SAGE Produccion» — conexion al servidor SAGE de la empresa
Metodo Una operacion concreta de sincronizacion: que datos se mueven, en que direccion y con que frecuencia. «Importar clientes cada 6 horas» — metodo customers GET

Las operaciones posibles de un metodo son:

OperacionDireccionDescripcion
GETSAGE → SoftbaseImporta datos de SAGE hacia el sistema local
POSTSoftbase → SAGECrea registros nuevos en SAGE
PUTSoftbase → SAGEActualiza registros existentes en SAGE

2. Crear y configurar una conexion SAGE 200c

2.1 Acceso al listado de conexiones

Navega hasta el modulo FACTSYNC. Veras el listado de conexiones existentes con columnas ID, TIPO, NOMBRE y botones de accion.

Pantalla Gestion de conexiones con el listado de conexiones existentes y el boton Anadir.

Desde aqui puedes:

2.2 Crear una conexion nueva

Haz clic en + AGREGAR. Aparece un dialogo modal:

Modal Nueva conexion con los campos Nombre y Tipo, y los botones Cerrar y Crear.
  1. Rellena el campo NOMBRE Escribe un nombre descriptivo que te ayude a identificar la conexion (p. ej. «SAGE Produccion» o «SAGE Test»). Puede contener espacios.
  2. Selecciona el TIPO En el desplegable, elige sage200c. El tipo determina que campos de configuracion apareceran y que metodos estaran disponibles.
  3. Haz clic en CREAR El sistema crea la conexion y abre automaticamente el formulario de detalle donde podras rellenar las credenciales.

2.3 Campos de configuracion de SAGE 200c

Una vez creada la conexion, el formulario de detalle muestra dos secciones: Datos generales y Configuracion. Las pestanas de navegacion de la izquierda permiten acceder a los metodos asociados y al registro de cambios.

Formulario de detalle de una conexion SAGE 200c mostrando los campos Datos generales y Configuracion (SAGE_ENDPOINT, SAGE_USERNAME, SAGE_PASSWORD, SAGE_TOKEN, SAGE_EXPIRES, SAGE_SECTORS).

A continuacion se detalla cada campo de la seccion Configuracion:

SAGE_ENDPOINT

Descripcion: URL base de la API de SAGE 200c, sin barra final.
Ejemplo: https://sage.empresa.com/api/v1
Obligatorio: Si

SAGE_USERNAME

Descripcion: Client ID del proveedor OAuth2 de SAGE (no es el nombre de usuario de Windows ni del ERP).
Donde encontrarlo: El administrador de SAGE lo proporciona al configurar el acceso a la API.
Obligatorio: Si

SAGE_PASSWORD

Descripcion: Client Secret OAuth2 correspondiente al SAGE_USERNAME.
Obligatorio: Si

SAGE_TOKEN

Descripcion: Bearer token de autenticacion. No es necesario rellenarlo manualmente: el sistema lo obtiene y lo renueva automaticamente en cada sincronizacion. El campo es de solo lectura.
Obligatorio: No (gestionado automaticamente)

SAGE_EXPIRES

Descripcion: Timestamp de caducidad del token actual. No es necesario rellenarlo manualmente: el sistema lo actualiza automaticamente. El campo es de solo lectura.
Obligatorio: No (gestionado automaticamente)

SAGE_SECTORS

Descripcion: Campo de SAGE de donde se obtienen los sectores de los clientes. Elige la opcion que se ajuste a como los clasifica tu instalacion de SAGE:

OpcionCampo SAGE usadoCuando usarla
sectors (por defecto)CodigoSector_La mayoria de instalaciones estandar
tipus_clientCodigoTipoClienteLcCuando los sectores se gestionan por tipo de cliente; activa la expansion de condiciones especiales por tipo
colectiusCodigoColectivoClienteLcCuando los sectores se gestionan por colectivos
Obligatorio: No (valor por defecto: sectors)

2.4 Guardar la conexion

  1. Revisa todos los campos Asegurate de que SAGE_ENDPOINT, SAGE_USERNAME y SAGE_PASSWORD estan correctamente rellenados.
  2. Haz clic en 💾 GUARDAR El sistema guarda la configuracion. El token se obtendra automaticamente la primera vez que se ejecute un metodo.
La conexion ya es funcional. El siguiente paso es crear los metodos de sincronizacion que definan que datos se mueven y con que frecuencia.
Eliminar una conexion es irreversible. El boton 🗑 ELIMINAR borra la conexion y todos los metodos asociados, y elimina las columnas fsync_external_id y fsync_export_status de todas las tablas afectadas. Los datos ya importados no se borran, pero pierden el vinculo con el origen externo.

3. Crear y configurar un metodo

3.1 Acceso al listado de metodos

Desde el formulario de detalle de la conexion, haz clic en la pestana METODOS CONEXION en el panel izquierdo. Veras todos los metodos configurados para esta conexion.

Pantalla Gestion de metodos con el listado de metodos configurados (columnas Id, Metodo, Descripcion, Activo, Estado, Frecuencia, Ultima ejecucion).

Significado de las columnas de estado:

3.2 Crear un metodo nuevo

Haz clic en + AGREGAR. Aparece el modal de creacion:

Modal Anadir metodo con los campos Metodo (customers GET) y Descripcion, y los botones Cerrar y Crear.
  1. Selecciona el METODO El desplegable muestra todas las operaciones disponibles para el tipo de conexion. Cada opcion indica el nombre del metodo y la operacion (GET, POST o PUT). Consulta la seccion 5 para la lista completa de metodos de SAGE 200c.
  2. Escribe una DESCRIPCION Una descripcion clara te ayudara a identificar el metodo en el listado. Ejemplos: «Importar clientes cada 6h», «Sincronizar stocks cada noche», «Exportar pedidos a SAGE».
  3. Haz clic en CREAR El sistema crea el metodo y abre el formulario de detalle para terminar de configurarlo.

3.3 Campos de configuracion del metodo

Formulario de detalle de un metodo customers GET con los campos Descripcion, Activado, Frecuencia Cron (0 */6 * * *) con validador visual, y Args (JSON).
CONEXION

Muestra la conexion a la que pertenece el metodo. No es editable una vez creado el metodo.

METODO

Nombre de la operacion y su direccion, p. ej. customers (GET). No es editable una vez creado.

ESTADO

VIGENTE El metodo es operativo. OBSOLETO El metodo se ha desactivado permanentemente y el formulario pasa a ser de solo lectura. Solo el administrador puede cambiar el estado.

ACTIVADO

Controla si el metodo participa en las ejecuciones automaticas programadas.

Y — ActivadoEl metodo se ejecutara automaticamente cuando llegue la frecuencia configurada.
N — DesactivadoEl metodo existe y es configurable, pero no se ejecuta automaticamente. Aun puede lanzarse manualmente desde el explorador.
DESCRIPCION

Texto libre para identificar el metodo. Se recomienda que sea descriptivo e incluya la frecuencia, p. ej. «Importar clientes desde SAGE — cada 6 horas».

FRECUENCIA CRON

Expresion cron de 5 campos que determina cuando se ejecuta el metodo automaticamente. Dejar el campo vacio implica que el metodo solo se ejecutara manualmente. Se detalla en la seccion 3.4.

ARGS

Parametros adicionales en formato JSON que se pasan al metodo. La mayoria de metodos no necesitan ningun argumento; algunos metodos especificos si. Se detalla en la seccion 3.5.

3.4 Configurar la frecuencia (cron)

El campo FRECUENCIA CRON acepta una expresion estandar de 5 campos separados por espacio:

┌─────────── minuto (0–59) │ ┌──────── hora (0–23) │ │ ┌───── dia del mes (1–31) │ │ │ ┌── mes (1–12) │ │ │ │ ┌─ dia de la semana (0–7, 0 y 7 = domingo) │ │ │ │ │ * * * * *

Ejemplos practicos:

ExpresionSignificadoRecomendado para
0 */6 * * *Cada 6 horas (a :00 del minuto)Clientes, empleados, sectores
0 2 * * *Cada dia a las 02:00Articulos, precios, stocks
0 1 * * MONCada lunes a la 01:00Reimportacion completa semanal
0 0 1 * *El primer dia de cada mes a las 00:00Sincronizaciones mensuales
*/30 * * * *Cada 30 minutosDocumentos (pedidos, albaranes)
0 8-18 * * MON-FRICada hora entre las 8:00 y las 18:00, de lunes a viernesExportacion de pedidos en horario laboral
(vacio)Solo ejecucion manualMetodos de exportacion puntuales
Validacion en tiempo real: El campo FRECUENCIA CRON tiene un validador integrado que muestra en texto plano el significado de la expresion que escribes, ayudandote a confirmar que es correcta antes de guardar.

3.5 Configurar los argumentos (ARGS)

El campo ARGS permite pasar parametros adicionales al metodo en formato JSON. La mayoria de metodos funcionan sin necesidad de especificar ninguno (puedes dejar el campo vacio o poner {}).

ARGS vacios (la mayoria de metodos)

{}

Filtrar por fecha de modificacion

Para cualquier metodo GET, puedes restringir el rango de datos a importar:

{ "filter": [ { "field": "FechaAlta", "value": "2026-01-01", "comparator": ">=" } ] }

Limitar el numero de registros por pagina

{ "limit": 100, "pagination_server": true }

Archivar (o no) los registros no recibidos — archive_others

Por defecto, al finalizar una sincronizacion completa FACTSYNC archiva (arxivat='Y' / actiu='N') los registros que ya estaban sincronizados por ese metodo pero que no se han recibido en esta pasada. Para desactivar este comportamiento, anade archive_others: "N" dentro de extra_params:

{ "extra_params": { "archive_others": "N" } }
Cuando usar "N": si el metodo importa solo un subconjunto de datos (por ejemplo con un filter por fecha o por serie), dejarlo en "Y" (el valor por defecto) podria archivar registros validos que simplemente no entraban en esta pasada. Valor por defecto: "Y" (mantiene el comportamiento historico de archivar siempre).
En productos: con "N" tambien se omite la sincronizacion de visibilidad web (cleanup de taxonomia), que recorre toda la tabla de articulos y ajusta el CMS (d_items) segun el campo web. Asi, importar un solo producto con archive_others: "N" no oculta del web al resto de productos. Se acepta tambien la variante en CamelCase ArchiveOthers.

Metodo external_documents GET — especificar el tipo de documento

El metodo external_documents requiere indicar que tipo de documento se quiere importar. Es necesario crear un metodo separado para cada tipo:

Tipo de documentoARGS necesarios
Facturas
{"extra_params": {"type": "invoices"}}
Albaranes
{"extra_params": {"type": "delivery_notes"}}
Pedidos (importar desde SAGE)
{"extra_params": {"type": "orders"}}
Ayuda integrada: Haz clic en el boton ❓ AYUDA del formulario del metodo para consultar la documentacion completa de los ARGS disponibles para tu tipo de conexion.

3.6 Guardar el metodo

  1. Revisa la configuracion Comprueba que ACTIVADO, FRECUENCIA y ARGS sean correctos.
  2. Haz clic en 💾 GUARDAR El sistema guarda el metodo. A partir de ahora aparecera en el listado de metodos y, si tiene frecuencia y esta activado, se ejecutara automaticamente.
Eliminar un metodo es irreversible. El boton 🗑 ELIMINAR borra el metodo y elimina la columna fsync_get_status_{id} de las tablas afectadas. Los datos importados no se borran, pero el historial de ejecucion se pierde.

4. Explorar y ejecutar sincronizaciones

El Explorador de datos es la herramienta principal para lanzar sincronizaciones manualmente, previsualizar los datos antes de importarlos y gestionar las exportaciones.

4.1 Acceso al explorador de datos

Hay dos vias de acceso:

Data Explorer con la barra lateral de metodos disponibles (Customers expandido mostrando GET con los botones Ver original, Ver transformado e Importar).

La barra lateral izquierda muestra un grupo para cada metodo configurado. Los botones que aparecen a la derecha de cada metodo dependen de la operacion:

BotonOperacionDescripcion
🔍 Ver originalGETMuestra los datos tal como los devuelve SAGE, sin ninguna transformacion. Util para verificar la conexion.
📊 Ver transformadoGETMuestra los datos con los campos ya mapeados al formato interno de Softbase, tal como se importaran.
📥 ImportarGETEjecuta la importacion real. Guarda los datos en la base de datos local.
👁️ Ver exportacionPOST / PUTMuestra la tabla de registros pendientes de exportar a SAGE.

4.2 Importar datos (GET)

  1. (Opcional) Verifica la conexion con 🔍 Ver original Haz clic en el boton de la lupa simple. Si la conexion funciona, veras una tabla con los datos en bruto de SAGE. Si no se carga nada o aparece un error, revisa los campos SAGE_ENDPOINT, SAGE_USERNAME y SAGE_PASSWORD de la conexion.
  2. (Opcional) Previsualiza con 📊 Ver transformado Muestra los datos ya procesados y normalizados. Comprueba que los campos se mapean correctamente antes de importar.
  3. Haz clic en 📥 Importar El panel principal muestra el progreso en tiempo real: barras de progreso, registros procesados y consola de log. El proceso puede tardar unos minutos si hay muchos registros. No cierres la ventana mientras se ejecuta.
Data Explorer durante una importacion customers GET con la consola Output Log visible mostrando el detalle de la llamada al conector, su estado y los posibles errores.
Consola de log: Haz clic en el boton Log Console (esquina superior derecha de la vista) para mostrar u ocultar la consola en tiempo real. Los mensajes [OK] indican exito, [SKIP] indica un registro ignorado (generalmente por no poder resolver una referencia) y [ERROR] indica un problema que hay que revisar.

4.3 Exportar datos (POST / PUT)

Para los metodos de exportacion (como orders POST o customers PUT):

  1. Haz clic en 👁️ Ver exportacion Se abre la tabla de registros pendientes de enviar a SAGE. Cada fila muestra el estado actual:
    • PENDIENTE — Registro pendiente de exportar
    • EXPORTADO — Registro ya enviado correctamente (o marcado manualmente como exportado)
    • NO EXPORTABLE — Registro marcado manualmente como no exportable: no se enviara y no aparece entre los pendientes
    • ERROR — La ultima exportacion ha fallado
  2. Abre el menu Acciones En la cabecera de la vista hay un menu desplegable Acciones (al estilo de los listados de mantenimiento) que agrupa todas las operaciones. Marca primero las casillas de las filas que quieras tratar (o usa la casilla de la cabecera para seleccionarlas todas) y elige una opcion:
    • Exportar seleccionados — Envia a SAGE las filas marcadas que se pueden exportar.
    • Exportar todo lo pendiente — Envia todos los registros con estado PENDIENTE o ERROR.
    • Marcar como exportadas — Marca las filas seleccionadas como exportadas sin enviarlas. Util para pedidos correctos que ya se han gestionado fuera del sistema: dejan de aparecer entre los pendientes y el cron no los procesa.
    • Marcar como no exportable — Marca las filas seleccionadas como no exportables (pedidos que seguramente nunca se enviaran). Tambien salen del listado de pendientes y el cron los ignora, pero quedan diferenciadas con el distintivo NO EXPORTABLE para no confundirlas con las exportadas correctamente.
    Al exportar de verdad, las filas se actualizan en tiempo real: se ponen verdes en caso de exito y rojas en caso de error. Un registro marcado como no exportable se puede devolver al listado de pendientes con el boton Desmarcar (icono de deshacer) de su fila.
Data Explorer en modo Export View para orders POST, con el menu desplegable Acciones (Exportar seleccionados, Exportar todo lo pendiente, Marcar como exportadas, Marcar como no exportable) y la tabla filtrable de registros a exportar por estado.
Filtros de la vista de exportacion: Puedes filtrar por ID, descripcion o estado (Todos / Pendientes / Exportados / No exportables) para localizar registros concretos antes de exportar.

5. Metodos disponibles para SAGE 200c

Metodos de importacion (GET — SAGE → Softbase)

MetodoDatos importadosARGS especiales
currenciesDivisas y factores de cambioNinguno
sectorsSectores / tipos / colectivos de cliente (fuente controlada por SAGE_SECTORS)Ninguno
employeesComisionistas / comercialesNinguno
product_familiesFamilias de producto (primer nivel)Ninguno
product_groupsGrupos / subfamilias de productoNinguno
productsArticulos, precios base, precios de ofertaNinguno
product_imagesImagenes de articulos (Base64)Ninguno
discount_linesLineas de descuento / tarifasNinguno
conditionsPrecios estandar por tramos de volumenNinguno
customersClientes (incluye cadenas y comisionistas)Ninguno
addressesDirecciones secundarias de clientesNinguno
warehousesAlmacenesNinguno
stocksStock por articulo y almacenNinguno
external_documentsFacturas{"extra_params": {"type": "invoices"}}
external_documentsAlbaranes{"extra_params": {"type": "delivery_notes"}}
external_documentsPedidos desde SAGE{"extra_params": {"type": "orders"}}
payment_methodsFormas de pago / condiciones de plazoNinguno
contactsContactos de clientesNinguno
custom_fieldsCampos personalizados de SAGE (caracteristicas)Ninguno
translationsTraducciones de articulos por idiomaNinguno
cleanup_taxonomyLimpieza de taxonomia (areas, familias, grupos) segun productos web activosNo llama a la API; ejecucion local. "noapi": "Y"
Orden de importacion recomendado: Para una configuracion inicial, importa las entidades maestras primero para garantizar que las referencias se puedan resolver correctamente:
  1. currencies
  2. sectors · employees
  3. discount_lines (tarifas) · payment_methods
  4. product_families → product_groups → products → product_images
  5. customers → addresses → contacts
  6. conditions (depende de tarifas, productos y clientes)
  7. warehouses → stocks
  8. custom_fields · translations
  9. external_documents (facturas, albaranes, pedidos)
  10. cleanup_taxonomy (limpieza local, sin API)

Metodos de exportacion (POST / PUT — Softbase → SAGE)

MetodoOperacionDatos exportados
ordersPOSTEnvia pedidos de Softbase hacia SAGE

6. Resolucion de problemas comunes

ProblemaCausa probableSolucion
«Ver original» no devuelve nada o da error de conexion SAGE_ENDPOINT, SAGE_USERNAME o SAGE_PASSWORD incorrectos Abre el formulario de la conexion, verifica los tres campos y guarda. Comprueba que el servidor SAGE es accesible desde la red.
El token caduca constantemente El servidor SAGE devuelve tokens de vida muy corta Normal: el conector renueva el token automaticamente en cada llamada. Si ves errores 401 frecuentes, comprueba que el reloj del servidor Softbase y el de SAGE estan sincronizados (NTP).
Registros con [SKIP] en el log El registro referencia una entidad que no se ha importado todavia (p. ej. un articulo que no existe en Softbase) Importa primero las entidades maestras (articulos, clientes, almacenes) y vuelve a importar los documentos que dependen de ellas.
Los sectores de los clientes no se importan El campo SAGE_SECTORS no coincide con como SAGE gestiona los sectores Cambia SAGE_SECTORS a tipus_client o colectius y vuelve a importar los sectores y los clientes.
El metodo de importacion se ha ejecutado pero no veo los datos nuevos El metodo se ejecuto anteriormente y los datos ya existian (actualizacion sin cambios visibles) Usa «Ver transformado» para comprobar que los datos llegan correctamente de SAGE. Si el problema persiste, revisa el log de la ultima ejecucion.
La exportacion de un pedido falla El cliente o el articulo no tiene fsync_external_id (no se ha sincronizado desde SAGE) Asegurate de que el cliente y todos los articulos del pedido se han importado primero desde SAGE. Sin identificador externo no se puede crear el documento en SAGE. Para los clientes, puedes activar {"extra_params": {"export_customers": "Y"}} en el metodo orders POST para que se exporten automaticamente.
Los documentos (facturas, albaranes) no se importan Los ARGS del metodo external_documents no especifican el tipo Comprueba que el campo ARGS contiene {"extra_params": {"type": "invoices"}} (o el tipo correspondiente). Se necesita un metodo diferente para cada tipo de documento.
El metodo no se ejecuta automaticamente a pesar de tener frecuencia configurada El metodo tiene ACTIVADO = N o la tarea cron del sistema no se esta ejecutando Verifica que ACTIVADO = Y. Comprueba con el administrador del sistema que el cron de FACTSYNC (FSYN_cron) se ejecuta periodicamente.

7. Glosario de campos SAGE ↔ Softbase

Esta seccion lista los mapeos de campos que aplica el conector sage200c.php al importar datos desde SAGE 200c hacia Softbase. Son los mismos mapeos que documenta la Referencia API en cada endpoint, agrupados aqui por entidad para consulta rapida.

Convencion de prefijos:
Este glosario refleja el conector actual. Si SAGE añade campos nuevos o cambia nombres, hay que actualizar tanto los arrays $_mapejat_* de sage200c.php como esta tabla.

customers — Clientes (cli_ficha)

Campo SAGECampo SoftbaseNotas
CodigoCliente__id_extern__ / id_externClave externa principal
CodigoCadena_id_parentSi difiere de CodigoCliente, el cliente es hijo de la cadena
RazonSocialempresa
Nombrenom
EMail1email
Telefonotelefon
Telefono2telefon2
Telefono3telefon_movil
Faxfax
CifDninif / num_docMismo valor en ambos campos
FechaAltadata_altaConvertido a Unix timestamp
FechaNacimientodata_naixement
FechaBajaLcdata_baixa
BajaEmpresaLcarxivatDerivado: 0→'N', ≠0→'Y'
CodigoContablesubcuenta
CodigoDivisaid_divisaResuelto a tbl_divisas.id
CodigoCondicionesid_forma_pagoResuelto via lookup de formas de pago importadas (COND_{CodigoCondiciones})
TarifaPrecioid_linea_descompteLa tarifa SAGE se mapea como linea de descuento
CodigoRuta_id_ruta
CodigoComisionistaid_treballadorComisionista 1 (principal)
CodigoComisionista2_4___treballadors[]Hasta 4 comisionistas adicionales
ComercialAsignadoLcid_comercial
CodigoSector_id_sectorFuente seleccionable via SAGE_SECTORS
CodigoTipoClienteLcid_sectorSi SAGE_SECTORS='tipus_client'
CodigoColectivoClienteLcid_sectorSi SAGE_SECTORS='colectius'
ClaveIVAclau_iva
%Descuentodescompte1
RiesgoMaximocredit
ObservacionesClienteobservacions
DIRecodi_dir3_gestor
CodigoBancoCC_id_banc
CodigoAgenciaCC_id_sucursal
DCCC_digit
CCCCC_compte
IBANCC_iban
SiglaNacionCC_paisTambien usado en la direccion principal
DomiciliocarrerDireccion principal del cliente
Numero1numero
Pisopis
Escaleraescala
Puertaporta

addresses — Direcciones secundarias (tbl_adreces)

Campo SAGECampo SoftbaseNotas
IdDomicilio__id_extern__ / id_extern
CodigoClienteid_tablaResuelto a cli_ficha.id; tabla='cli_ficha'
NumeroDomiciliocodiGuardado para recuperar el NumeroDomicilio sin llamada API. Si vale 0, el registro se ignora (es la direccion principal)
RazonSocialnomDerivado: RazonSocial + " (" + TipoDomicilio + ")"
TipoDomiciliodefecteDerivado: 'F'→'Y' (fiscal por defecto), resto 'N'
Domicilio + Domicilio2carrerConcatenados con espacio
Numero1numero
Pisopis
Escaleraescala
Puertaporta
Telefonotelefon
Telefono2telefon_movil

products — Articulos (art_subarticles)

Campo SAGECampo SoftbaseNotas
CodigoArticulo__id_extern__ / codi
DescripcionArticulomodel
PrecioComprapreu_compra
PrecioCosteEstandarpreu_costCoste estandar calculado
CodigoFamiliaid_familiaResuelto via _get_id_familia()
CodigoSubfamiliaid_articleResuelto via _get_id_article()
PrecioVenta__preus[TARIFA_BASE]Precio base
PrecioVentasinIVA1/2/3__preus[LINIA_DESC_n]Precios por linea de descuento
PrecioOfertasinIVA__preus[TARIFA_BASE_OFERTA]Solo si la oferta esta vigente (FechaInicioOferta ≤ hoy ≤ FechaFinalOferta)
GrupoIvaid_tipus_ivaResuelto via _get_tipus_iva() (cache desde api/iva)
ObsoletoLc__importSi -1 el registro se descarta (__import=false), no se importa
PublicarInternetarxivat / webDerivado: -1→arxivat='N',web='Y' · ≠-1→arxivat='Y',web='N'
FechaAltadata_altaConvertido a Unix timestamp
CodigoContablesubcuenta

product_families — Familias (art_families)

Campo SAGECampo SoftbaseNotas
CodigoFamilia__id_extern__Filtro: CodigoSubfamilia = '**********'
Descripciondescripcio
PublicarGCRMarxivat / webDerivado igual que en products

product_groups — Grupos / subfamilias (art_articles)

Campo SAGECampo SoftbaseNotas
CodigoSubfamilia__id_extern__Filtro: CodigoSubfamilia <> '**********'
Descripciondescripcio
CodigoFamiliaid_familiaResuelto via _get_id_familia()
PublicarGCRMarxivat / webDerivado igual que en products

product_images — Imagenes de articulo (d_items_fotos)

Campo SAGECampo SoftbaseNotas
ImagenExt__id_extern__UUID; si cambia respecto al guardado, se descarga de nuevo via api/imagen/{id}
CodigoArticulo__codi_articleResuelto a art_subarticles.id
sysDescripcionBinariodescripcio
ImagenBase64archivo en discoDescargado via api/imagen/{id} y guardado en files/public/products/prod_{ImagenExt}

sectors — Sectores de cliente (cli_sectors)

Campo SAGECampo SoftbaseNotas
CodigoSector_ / CodigoTipoClienteLc / CodigoColectivoClienteLc__id_extern__Segun SAGE_SECTORS
DescripcionSector_ / TipoClienteLc / ColectivoClienteLcdescripcioSegun SAGE_SECTORS

employees — Comisionistas / comerciales (ficha_treballador)

Campo SAGECampo SoftbaseNotas
CodigoComisionista__id_extern__
Comisionistanom
CifDninif
Telefonotelefon
Telefono2telefon_movil
EMail1email
DomiciliocarrerDireccion enriquecida via _add_address_to_data()

discount_lines — Lineas de descuento / tarifas (art_linees_descompte)

Campo SAGECampo SoftbaseNotas
Tarifa__id_extern__
DescripcionTarifadescripcioDerivado: Tarifa + " - " + DescripcionTarifa
IndicadorTarifa__IndicadorTarifa0 = precio · 1 = % incremento · 2 = valor incremento

conditions — Condiciones de precio (art_condicions)

El metodo realiza tres pasadas que comparten tabla destino con distinto ambito (tarifa, cliente, condicion especial).

Campo SAGECampo SoftbaseNotas
IdTarifaPrecio / IdArticuloCliente / CodigoCondicionLc__id_extern__Segun la pasada
Tarifaid_tablaPasada 1: resuelto a art_linees_descompte.id
CodigoClienteid_tablaPasadas 2 y 3: resuelto a cli_ficha.id
CodigoArticuloid_tipus_elementResuelto a art_subarticles.id
CodigoFamilia / CodigoSubfamiliaid_tipus_elementPasada 3: si el ambito es familia o grupo
FechaIniciodata_iniConvertido a Unix timestamp
FechaFinaldata_fiAjustado a 23:59:59 del dia indicado
Precio / PrecioOfertavalor + tipus_condicio='preu'Ajustado por la cascada de descuentos
%Descuento 1/2/3valor + tipus_condicio='desc'% efectivo de la cascada
volumen del tramovolumDerivado del tramo de cantidad de la tarifa
StatusActivoeliminatSi ≠-1 se marca eliminat=time()

conditions (2ª pasada) — Precios especiales por cliente (art_condicions)

Dentro del método conditions GET, el conector hace una segunda llamada a api/articulos_cliente (filtrando Automatico=0) para traer los precios y descuentos especiales definidos por cliente–artículo. Estos registros se insertan en la misma tabla art_condicions que los tramos de tarifa.

Campo SAGECampo SoftbaseNotas
IdArticuloCliente__id_extern__
CodigoClienteid_tablaResuelto a cli_ficha.id; tabla='cli_ficha'
CodigoArticuloid_tipus_elementResuelto a art_subarticles.id
PrecioOferta + %Descuento1/2/3valorSi PrecioOferta>0: tipus_condicio='preu' con cascada de descuentos. Si solo %Descuento>0: tipus_condicio='desc'
sin precio ni descuento__import=false → el registro se ignora

warehouses — Almacenes (mag_magatzems)

Campo SAGECampo SoftbaseNotas
CodigoAlmacen__id_extern__
Almacendescripcio
Domicilio + Municipio + CodigoPostal + ProvinciaadrecaConcatenados
actiu / webSiempre 'Y' en importacion

stocks — Stock por articulo y almacen (art_subarticles_estoc)

Campo SAGECampo SoftbaseNotas
IdAcumuladoStock__id_extern__
CodigoArticuloid_subarticleResuelto a art_subarticles.id
CodigoAlmacenid_magatzemResuelto a mag_magatzems.id
UnidadSaldoestoc
PrecioMediovalor_mig_unitari

currencies — Divisas (tbl_divisas)

Campo SAGECampo SoftbaseNotas
CodigoDivisa__id_extern__ / codi
Divisanom
SimboloDivisasimbol
Decimalesdecimals
FactorCambioEurofactor_conversio

external_documents — Pedidos / Albaranes / Facturas (ext_documents)

Cabecera comun a los tres tipos:

Campo SAGECampo SoftbaseNotas
IdPedidoCli / IdAlbaranCli / IdFacturaCli__id_extern__Segun el tipo
CodigoClienteid_clientResuelto via _get_id_client()
EjercicioPedido / ...Albaran / ...Facturaany
SeriePedido / ...Albaran / ...Facturaserie
NumeroPedido / ...Albaran / ...Facturanumero
FechaPedido / ...Albaran / ...FacturadataConvertido a timestamp
ImporteBrutototal_brut
ImporteLiquidototal
FactorCambiofactor_conversio
CodigoDivisaid_divisaResuelto via _get_id_divisa()
tipusValor fijo por tipo: PEDIDO / ALBARA / FACTURA
StatusFacturado (albaran)estat1→'FACTURAT' · 0→'OBERT'
StatusContabilizado (factura)estat1→'COMPTABILITZAT' · 0→'PENDENT'
estado (pedido)estat0→'BLOQUEADO' · 1→'SERVIDO' · 2→'PENDIENTE'
StatusAbonosubestat1→'ABONO' en albaranes y facturas
PathFicheroattached[]Una entrada por adjunto, descargado via api/doc/{path}

Lineas (mismo mapeo para los tres tipos, dentro de args.Linies[]):

Campo SAGECampo SoftbaseNotas
CodigoArticuloid_subarticle + referenciaResuelto via _get_id_subarticle()
DescripcionArticulodescripcio
UnidadesPedidas (pedido) / Unidades (albaran/factura)quantitat
Preciopreu
ImporteBrutoBaseImponible / ImporteNetoLineasdescompteDerivado: (Bruto - Neto) / Bruto × 100
ImporteNetopreu_netSubtotal de linea
%Iva / CodigoIvaiva% de IVA aplicado

payment_methods — Formas de pago (fac_formes_pago)

Campo SAGECampo SoftbaseNotas
IdCondicion__id_extern__Prefijado como COND_{CodigoCondiciones}
FormadePagodescripcion
NumeroPlazosvencimientos
DiasPrimerPlazo__dias_primer_plazoSolo visualizacion
DiasEntrePlazos__dias_entre_plazosSolo visualizacion
Remesablecomptat / rebutsDerivado: -1→comptat='N',rebuts='Y' · ≠-1→comptat='Y',rebuts='N'

contacts — Contactos de clientes (tbl_contactes)

Nota: Actualmente este metodo utiliza datos de ejemplo incrustados en el codigo (stub). La llamada a api/contactos esta preparada pero comentada, pendiente de activacion en produccion.
Campo SAGECampo SoftbaseNotas
IdContacto__id_extern__
CodigoClienteid_tablaResuelto a cli_ficha.id; tabla='cli_ficha'. Si no existe, __import=false
Nombre + Apellido1 + Apellido2nomConcatenados; fallback a NombreContactoLc
TelefonoContactoLctelefon
Telefono2ContactoLctelefon_movil
Telefono3ContactoLcextensio
EMail1email
Cargocarrec
CodigoAreaContactoLcdepartament
EsContactoComercialLcdefecteDerivado: -1→'Y', resto 'N'
BajaEmpresaLcarxivatDerivado: 0→'N', ≠0→'Y'

custom_fields — Campos personalizados (art_caracteristiques)

Campo SAGECampo SoftbaseNotas
sysId__id_extern__
sysRotulodescripcio

translations — Traducciones de articulos (d_items_idiomes)

Importa las traducciones de descripcion de articulos desde api/idiomas_articulos. Solo se importan registros cuyo articulo exista en Softbase y cuyo idioma tenga equivalencia en el mapa interno.

Campo SAGECampo SoftbaseNotas
IdIdioma__id_extern__Fallback: CodigoArticulo_CodigoIdioma_
CodigoArticuloid_itemResuelto via _get_item_subarticle()
CodigoIdioma_id_idiomaMapa: CAT→ca, CAS→es, ING→en, POR→pt, FRA→fr, ALE→de, ITA→it
DescripcionArticulotitol
Descripcion2Articulosubtitol

cleanup_taxonomy — Limpieza de taxonomia

Metodo especial que no realiza ninguna llamada a la API de SAGE. Ejecuta una limpieza local de areas, familias y grupos en funcion de los productos web activos. Configurado con "noapi": "Y" en el JSON del conector.

orders POST — Exportacion de pedidos hacia SAGE

El conector envia el pedido con la estructura {Cabecera, Lineas[]}. Los campos clave que requieren estar resueltos previamente:

Campo SoftbaseCampo SAGE enviadoNotas
cli_ficha.fsync_external_id_{id_connexio}Cabecera.CodigoClienteSi esta vacio, el pedido no se puede exportar
art_subarticles.fsync_external_id_{id_connexio}Lineas[].CodigoArticuloSi esta vacio para alguna linea, el pedido falla
mag_magatzems.fsync_external_id_{id_connexio}Lineas[].CodigoAlmacen
extra_params.serie del metodoCabecera.SerieDocumentoEn blanco o sin definir, la serie/linea de origen del pedido (ver tabla siguiente)
ped_pedidos.idCabecera.NumeroDocumentoReferencia temporal; SAGE devolvera el numero definitivo

Parametros disponibles en args.extra_params del metodo orders POST:

ParametroTipoDescripcion
liniesString / ArraySeries/lineas de pedido (linea_pedido) a leer, separadas por comas ("A,WEB") o como array. En blanco o sin definir = todos los pedidos.
serieStringSerie de destino (Cabecera.SerieDocumento). En blanco o sin definir, la serie/linea de origen del pedido.
export_customers"Y"Exporta automaticamente el cliente del pedido si no esta sincronizado: primero lo busca en SAGE por NIF (CifDni) o Email (EMail1) para vincularlo; si no existe, lo crea via customers POST.
customers_methodIntegerID del metodo customers POST a usar para exportar el cliente (hereda sus default_values). Si no se indica, se usa el metodo customers POST activo de la misma conexion.
Pedidos aplazados: como la creacion de clientes en SAGE no es instantanea, cuando se envia un cliente nuevo el pedido se marca con un valor negativo en ped_pedidos.fsync_export_status_{id_connexio} (el valor absoluto es el timestamp del proximo reintento, 3 minutos despues). El cron de exportacion lo reprocesa automaticamente cuando vence. Si el cliente ya se habia enviado pero aun no aparece en SAGE, no se vuelve a enviar (se evitan duplicados) y el pedido se aplaza de nuevo.
Validacion de customers_method: con export_customers: "Y", si customers_method es invalido (el ID no existe, no es un metodo customers POST, o pertenece a otra conexion), o si no se indica y la conexion no tiene ningun metodo customers POST activo, los pedidos con cliente nuevo (no sincronizado) se marcan como error: en la vista previa de exportacion aparecen en rojo como no exportables con el motivo, y en la ejecucion se registran como error en el log sin enviar nada a SAGE. Los pedidos con cliente ya sincronizado se exportan con normalidad.
{"extra_params": {"linies": "WEB,B2B", "serie": "W", "export_customers": "Y", "customers_method": 27}}

Comportamiento del parametro serie:

ValorResultado en SAGE (Cabecera.SerieDocumento)
"serie": "W"Serie W para todos los pedidos de este metodo
"serie": "" (clave presente, en blanco)La serie/linea de origen de cada pedido (linea_pedido de Softbase)
Clave no definidaLa serie/linea de origen de cada pedido (igual que en blanco)

Varios metodos orders POST con series diferentes: como cada metodo tiene su propio campo ARGS, se pueden crear varios metodos orders POST en la misma conexion, cada uno con su serie de destino:

// Metodo 1: pedidos de la linea WEB → serie "W" en SAGE
{"extra_params": {"linies": "WEB", "serie": "W"}}

// Metodo 2: pedidos de la linea B2B → serie "B" en SAGE
{"extra_params": {"linies": "B2B", "serie": "B"}}
Con varios metodos orders POST:

customers POST / PUT — Exportacion de clientes hacia SAGE

El conector carga la ficha completa de cli_ficha y envia un subconjunto reducido de campos:

Campo SoftbaseCampo SAGE enviado
empresaRazonSocial
nomNombre
emailEMail1
telefonTelefono
nifCifDni
fsync_external_id_{id_connexio}CodigoCliente (solo en PUT, en cuerpo y URL)
El uso de POST o PUT lo decide el conector segun el estado del registro: si fsync_external_id esta vacio se llama a POST /api/clientes; si ya esta rellenado, a PUT /api/clientes/{codi}.

Parametros disponibles en args.extra_params del metodo customers POST:

ParametroTipoDescripcion
default_valuesObjetoValores por defecto de campos de SAGE que se anaden al crear el cliente (POST). Cada clave es el nombre exacto del campo en SAGE y el valor es el valor por defecto (como string).
{
    "extra_params": {
        "default_values": {
            "CodigoTipoClienteLc": "110",
            "PeriodicidadFacturas": "1",
            "EnvioEFactura": "-1",
            "CodigoComisionista": "10",
            "CodigoComisionista2_": "10",
            "CodigoTransportista_": "451"
        }
    }
}
Puntos a tener en cuenta: