Addons a medida / 4198 - ESOFITEC GLOBAL SOLUTIONS, S.L. / Sit.Sync.Smg
Funcionamiento
El sincronizador es incremental: no vuelca toda la base de datos en cada ejecución, sino solo lo que ha cambiado desde la anterior. Para conseguirlo se apoya en dos cosas: una marca de tiempo que guarda al terminar y un registro de cambios que a3ERP va rellenando por sí solo mediante desencadenadores. Este artículo recorre el ciclo completo de una ejecución.
Arranque y parámetros#
El ejecutable admite una sola forma de invocación con parámetro:
| Invocación | Comportamiento |
|---|---|
Sit.Sync.Smg.exe -auto |
Ejecución silenciosa, sin ventana. Es la que debe usar la tarea programada |
Sit.Sync.Smg.exe (sin parámetros) |
Abre una consola que muestra el log en tiempo real y, al terminar, espera una tecla antes de cerrarse. Útil para diagnosticar a mano |
| Cualquier otro parámetro | No ejecuta nada: registra un error crítico en el log y termina |
La periodicidad la fija la tarea programada. En el despliegue actual de ESOFITEC se ejecuta una vez al día, de madrugada, de lunes a viernes.
La ventana de sincronización#
Al arrancar, el sincronizador lee lastTimestamp.txt (en la carpeta del ejecutable) y toma su valor como inicio de la ventana; el fin de la ventana es el instante del arranque. Tanto la subida como la bajada trabajan solo con lo que ha cambiado dentro de esa ventana. Al terminar la ejecución normal, escribe en el fichero la fecha y hora de fin.
Si el fichero no existe, la ventana empieza siete días antes del arranque. Borrar el fichero es, por tanto, la forma rápida de forzar que se reprocesen los cambios de la última semana.
Cambios durante la ejecución
Los cambios que se registran en a3ERP mientras el sincronizador está en marcha quedan entre el fin de una ventana y el inicio de la siguiente y no se exportan hasta que el contacto vuelva a modificarse. Por eso conviene programar la ejecución fuera del horario de trabajo.
Qué cambios se detectan en a3ERP#
El diccionario DSIT_SYNC_SMG crea la tabla SIT_SYNC_SMG_LOG y nueve desencadenadores que insertan en ella una fila por cada relación de contacto afectada. Solo se registran relaciones de contacto cuya entidad es un cliente (IDTIPOENTIDAD = 1) o un cliente potencial (IDTIPOENTIDAD = 3) y que tienen correo electrónico informado.
| Desencadenador | Tabla | Evento | Cuándo registra |
|---|---|---|---|
TGR__SIT_SYNC_SMG_LOG__CONTACTOSRELACION |
__CONTACTOSRELACION |
Insert, update, delete | Siempre. Es el único que informa el correo anterior |
TGR__SIT_SYNC_SMG_LOG__CONTACTOS |
__CONTACTOS |
Update | Cualquier cambio en la ficha del contacto |
TGR__SIT_SYNC_SMG_LOG__ORGANIZACION |
__ORGANIZACION |
Update | Cualquier cambio en los datos comunes de cliente o potencial (nombre, dirección, características) |
TGR__SIT_SYNC_SMG_LOG__CLIENTES |
__CLIENTES |
Update | Cualquier cambio en los datos propios de la ficha de cliente |
TGR__SIT_SYNC_SMG_LOG__CARGOS |
__CARGOS |
Update | Solo si cambia DESCRIPCION |
TGR__SIT_SYNC_SMG_LOG__REPRESEN |
REPRESEN |
Update | Solo si cambia NOMREP |
TGR__SIT_SYNC_SMG_LOG__RUTAS |
RUTAS |
Update | Solo si cambia NOMRUTA |
TGR__SIT_SYNC_SMG_LOG__SIT_SAT_CABE_CUOTA |
SIT_SAT_CABE_CUOTA |
Update | Solo si cambia SIT_SAT_BAJA |
TGR__SIT_SYNC_SMG_LOG__SIT_SAT_LINEA_CUOTA |
SIT_SAT_LINEA_CUOTA |
Insert, update, delete | Siempre |
Cada fila de SIT_SYNC_SMG_LOG guarda el correo de la relación (SIT_SYNC_SMG_EMAIL), el correo anterior si lo hubo (SIT_SYNC_SMG_EMAIL_OLD), el tipo de operación I, U o D (SIT_SYNC_SMG_TIPO), la fecha y hora (SIT_SYNC_SMG_FECHA), el identificador de la relación de contacto (SIT_SYNC_SMG_ID_RELACION) y la tabla que originó el registro (SIT_SYNC_SMG_TABLA_ORIGEN).
Hay tablas que alimentan las etiquetas y no tienen desencadenador. Un cambio en ellas no genera registro y la etiqueta solo se actualizará en Salesmanago cuando el contacto vuelva a modificarse por otro motivo:
__CLIENTESPOT: los campos exclusivos de la ficha de cliente potencial (por ejemplo su representante 3).ARTICULOyCARACTERISTICAS: cambiar la característica 3 de un artículo o la descripción de una característica de organización.
Subida de contactos a Salesmanago#
La subida arranca leyendo todas las filas de SIT_SYNC_SMG_LOG cuya fecha cae dentro de la ventana. Si no hay ninguna, lo anota en el log y pasa directamente a la bajada.
Con los identificadores de relación de esas filas consulta la vista SalesmanagoContacts y obtiene el estado actual de cada contacto, ya compuesto con todos sus datos, propiedades y etiquetas. Da igual cuántas filas de registro tenga un contacto o en qué orden se produjeran: se envía una única vez con su estado final. Las relaciones que ya no aparecen en la vista (porque se han borrado o han perdido el correo) no se envían.
Para cada contacto de la vista, el sincronizador pregunta a Salesmanago si existe un contacto con ese correo:
- Si no existe, lo crea con todos sus datos, propiedades y las etiquetas que cumplen el patrón configurado.
- Si existe, lo actualiza. Los datos de contacto y las propiedades se sobrescriben. Con las etiquetas calcula la diferencia: añade las que cumplen el patrón y el contacto todavía no tiene, y quita las que cumplen el patrón, el contacto tiene y ya no le corresponden. Las que ya tenía y siguen aplicando no se reenvían, de modo que el contador de etiquetas de Salesmanago no se altera.
Un error con un contacto concreto (por ejemplo, un rechazo de la API) se registra y se incluye en el correo de resumen, pero no detiene el proceso: se continúa con el siguiente.
Correos sustituidos y contactos obsoletos#
Salesmanago no ofrece al sincronizador un borrado de contactos, así que las bajas se traducen en un opt-out forzado de correo y de teléfono. Se aplica en dos situaciones:
- El correo de la relación ha cambiado o se ha vaciado. El registro de cambios trae el correo anterior. Si ese correo anterior ya no pertenece a ninguno de los contactos que se van a enviar, se busca en Salesmanago y se le fuerza el opt-out. El correo nuevo se crea como un contacto nuevo.
- La relación de contacto está marcada como obsoleta. El contacto se actualiza con normalidad y, además, se le fuerza el opt-out.
Es el único caso en que el sincronizador toca el consentimiento en Salesmanago. Al crear un contacto nuevo no envía ningún valor de opt-in: la API de Salesmanago lo da de alta con opt-in por defecto.
Borrar la relación no da de baja al contacto
Cuando se borra una relación de contacto en a3ERP, el desencadenador registra el mismo correo como actual y como anterior, y el sincronizador no lo trata como sustituido: el contacto queda en Salesmanago tal y como estaba, con opt-in. Para dar de baja un contacto hay que marcarlo obsoleto o vaciarle el correo, dejar que pase una ejecución y borrarlo después si se quiere.
Qué etiquetas gestiona#
En Salesmanago conviven las etiquetas que vienen de a3ERP con las que marketing crea a mano. Para que el sincronizador no borre las segundas, solo gestiona (añade o quita) las etiquetas que cumplen la expresión regular RegexPatternCustomTags de la sección Salesmanago de la configuración. Las demás las ignora por completo.
El patrón de referencia es ^[0-Z]{4}-.+: cuatro caracteres alfanuméricos, un guion y cualquier cosa detrás. Es el formato de EMPR-, REPR-, RUTA-, DEPT-, REP3-, MANT-, BAJA- y ARTI-. Las etiquetas que la vista genera con otro formato no lo cumplen y no se envían con ese patrón; el detalle está en Datos sincronizados.
Bajada de los opt-out a a3ERP#
Después de la subida, el sincronizador pide a Salesmanago la lista de contactos creados o modificados dentro de la ventana y los descarga en bloques de cincuenta. De cada uno le interesa un único dato: si tiene el opt-out de correo activo.

Con el correo del contacto de Salesmanago busca en a3ERP todos los contactos de __CONTACTOS cuyo EMAIL coincida, o que tengan alguna relación en __CONTACTOSRELACION con ese EMAIL, y les pone ENVIAREMAIL a verdadero si no hay opt-out y a falso si lo hay. En la ficha del contacto de a3ERP es la casilla Enviar e-mail.

Sobre este flujo conviene tener presente:
- Nunca crea contactos en a3ERP. Si el correo no existe en
__CONTACTOSni en__CONTACTOSRELACION, el contacto de Salesmanago se ignora. - Actualiza el campo
ENVIAREMAILde__CONTACTOS, el de la ficha del contacto, no el de la relación. - La comparación de correos es exacta salvo espacios en los extremos. Mayúsculas y minúsculas se comparan según la intercalación de la base de datos.
- Solo traslada el opt-out de correo. El opt-out de teléfono y la casilla Permitir publicidad de a3ERP no intervienen.
- Como la bajada ocurre después de la subida y la ventana termina en el instante del arranque, los contactos que el propio sincronizador acaba de modificar en Salesmanago no vuelven a bajar en la misma ejecución.
Correo de notificación#
Al terminar, tanto si todo ha ido bien como si ha fallado algo, se envía un correo a la dirección de NotificationEmail con la librería de correo de Esofitec, configurada en la sección SitFrameworkMailerSettings.
| Situación | Asunto |
|---|---|
| Sin errores | Importación SalesManago finalizada exitosamente |
| Con algún error | Importación SalesManago finalizada con errores |
El cuerpo contiene los errores acumulados durante la ejecución (contacto afectado y mensaje) y termina con Importación finalizada.. Un error que impide siquiera arrancar, como no encontrar el fichero de configuración, no genera correo: solo queda en el fichero de log.
Si NotificationEmail está vacío, no se envía nada. Si el envío falla, el error se escribe en el fichero de log y la ejecución se considera terminada igualmente: la sincronización en sí no se ve afectada.
Modo masivo o de primera ejecución#
La sección FirstRun de la configuración tiene tres interruptores. Si cualquiera de ellos está a true, la ejecución entra en modo masivo: no se hace la subida ni la bajada incrementales y no se actualiza lastTimestamp.txt.
| Interruptor | Qué hace |
|---|---|
DeleteAllDatabaseCustomTags |
Recorre todos los contactos de Salesmanago y les quita las etiquetas que cumplen el patrón RegexPatternCustomTags de la sección FirstRun (que puede ser distinto del de la sección Salesmanago) |
ImportToa3ERPAllOptIn |
Recorre todos los contactos de Salesmanago y traslada su opt-out a a3ERP, igual que la bajada normal pero sin ventana |
ExportAllContactsToSalesmanago |
Recorre toda la vista SalesmanagoContacts en páginas de mil y crea o actualiza cada contacto en Salesmanago, igual que la subida normal |
Los dos primeros necesitan una copia local de toda la base de contactos de Salesmanago. Si el directorio SalesmanagoBackupDirectory no existe o no contiene ficheros .json, el sincronizador descarga todos los contactos en ficheros de mil (ddMMyyyy_N.json) antes de empezar. Procesa los ficheros en orden, renombra cada uno a .backup al terminarlo y, cuando ha acabado con todos, borra el directorio completo. Si el proceso se interrumpe a medias, los ficheros ya procesados están renombrados y al relanzar se vuelve a descargar todo.
Cada interruptor es independiente: se puede lanzar solo la limpieza de etiquetas, por ejemplo. El orden dentro de una misma ejecución es limpieza y bajada de opt-out (juntas, contacto a contacto) y después la exportación completa.
Desactivar el modo masivo al terminar
Mientras algún interruptor de FirstRun siga a true, cada ejecución de la tarea programada repetirá el proceso masivo y la sincronización incremental no se hará. Al terminar hay que volver a poner los tres a false.