Addons a medida / 4198 - ESOFITEC GLOBAL SOLUTIONS, S.L. / Sit.Sync.Smg
Instalación y configuración
La instalación tiene tres piezas que van en sitios distintos: el diccionario en la empresa de a3ERP, la vista en la base de datos auxiliar y el ejecutable con su configuración en el servidor que lanzará la tarea programada. Las tres pueden estar en máquinas diferentes siempre que el ejecutable llegue por red a la instancia SQL.
Requisitos#
| Requisito | Detalle |
|---|---|
| a3ERP | Versión 13.02.02 o superior. La estructura de contactos (__CONTACTOS, __CONTACTOSRELACION, __ORGANIZACION) es la de a3ERP 13 |
| Sit.Sat | Instalado en la empresa: las etiquetas de mantenimiento y el valor de cartera leen SIT_SAT_CABE_PROY, SIT_SAT_CABE_CUOTA y SIT_SAT_LINEA_CUOTA |
| .NET Framework | 4.8 en el servidor donde se ejecuta |
| Usuario SQL Server | Un usuario propio, con lectura sobre las tablas de la empresa que usa la vista, lectura sobre la vista en ESOFITEC_OTRS, y escritura sobre __CONTACTOS de la empresa (para la bajada de opt-out) |
| Salida a Internet | HTTPS hacia app3.salesmanago.pl (API de Salesmanago) y, si el correo va por Office 365, hacia login.microsoftonline.com y graph.microsoft.com |
| Cuenta de API de Salesmanago | Propietario (Owner), ClientId y ClientSecret de la API, generados desde la administración de Salesmanago |
| Cuenta de correo | Un registro de aplicación de Entra ID con permiso de envío sobre el buzón remitente, o un servidor SMTP con usuario y contraseña |
No hace falta usuario de a3ERP ni licencia de ActiveX: el sincronizador no usa NAX.
Componentes a instalar#
El diccionario DSIT_SYNC_SMG#
Se instala en la empresa de a3ERP como cualquier otro diccionario de extensión de Esofitec (Extensiones\Sofitec\SIT_SYNC_SMG\diccionarios\DSIT_SYNC_SMG). Crea la tabla SIT_SYNC_SMG_LOG y los nueve desencadenadores descritos en Funcionamiento.
Desde el momento en que se instala, a3ERP empieza a registrar cambios en SIT_SYNC_SMG_LOG aunque el ejecutable no esté todavía en marcha. La tabla no se limpia sola; ver la purga del registro.
La vista SalesmanagoContacts#
El script View_SalesmanagoContacts.sql del repositorio crea la vista en la base de datos ESOFITEC_OTRS con CREATE OR ALTER, así que sirve tanto para crearla como para actualizarla. La vista referencia por nombre completo dos bases de datos de la misma instancia:
ESOFITEC: la empresa de a3ERP, para todos los datos de contactos, clientes, potenciales y mantenimientos.ESOFITEC_OTRS: la propia base de datos de la vista, donde debe existir la función escalardbo.QuitarCaracteresEspecialesque usan las etiquetasREP3-.
Si alguna de las dos no existe con ese nombre en la instancia, la vista no compila. En un entorno de pruebas hay que crear ambas o adaptar los nombres en el script antes de ejecutarlo.
El ejecutable#
El instalador de Esofitec genera el paquete Sit.Sync.Smg_<versión>.7z con el ejecutable y sus dependencias, que se despliegan en C:\SIT\Services\Sit_Sync_Smg. El instalador conserva appsettings.json y lastTimestamp.txt al actualizar; si el despliegue se hace copiando a mano, hay que preservar esos dos ficheros.
La carpeta desplegada contiene, además de las DLL de dependencias:
C:\SIT\Services\Sit_Sync_Smg\
├── Sit.Sync.Smg.exe
├── Sit.Sync.Smg.exe.config
├── appsettings.json ← configuración real (no se distribuye)
├── appsettings.json.sample ← plantilla de la configuración
└── lastTimestamp.txt ← lo crea la primera ejecución
Tarea programada#
La ejecución periódica es una tarea del Programador de tareas de Windows con estos valores:
| Ajuste | Valor |
|---|---|
| Programa | C:\SIT\Services\Sit_Sync_Smg\Sit.Sync.Smg.exe |
| Argumentos | -auto |
| Iniciar en | C:\SIT\Services\Sit_Sync_Smg |
| Ejecutar | Tanto si el usuario ha iniciado sesión como si no, con un usuario que tenga acceso a la carpeta |
| Desencadenador | Diario, fuera del horario de trabajo. En ESOFITEC, de madrugada de lunes a viernes |
El campo Iniciar en es obligatorio
El ejecutable busca appsettings.json y lastTimestamp.txt en el directorio de trabajo, no en la carpeta donde está el .exe. Si la tarea no tiene informado Iniciar en, el proceso termina con No se ha encontrado el archivo de configuración appsettings.json en el log, no sincroniza nada y no envía correo.
El fichero appsettings.json#
Se crea copiando appsettings.json.sample a appsettings.json y rellenándolo. El fichero contiene credenciales de SQL Server, de la API de Salesmanago y del correo; debe protegerse con permisos NTFS para que solo lo lean los administradores y el usuario de la tarea programada.
{
"Logging": {
"FileLogLevel": 2,
"DebuggerLogLevel": 1,
"ConsoleLogLevel": 0
},
"Salesmanago": {
"Owner": "propietario@ejemplo.com",
"ClientId": "<clientId de la API de Salesmanago>",
"ClientSecret": "<clientSecret de la API de Salesmanago>",
"RegexPatternCustomTags": "^[0-Z]{4}-.+"
},
"A3erpServer": {
"Server": "<servidor>\\<instancia>",
"A3erpDataBase": "ESOFITEC",
"AuxiliarDataBase": "ESOFITEC_OTRS",
"User": "<usuario SQL>",
"Password": "<contraseña SQL>"
},
"FirstRun": {
"ExportAllContactsToSalesmanago": false,
"ImportToa3ERPAllOptIn": false,
"DeleteAllDatabaseCustomTags": false,
"RegexPatternCustomTags": "^\\[.+",
"SalesmanagoBackupDirectory": ""
},
"SitFrameworkMailerSettings": {
"MailerType": "Office365",
"Office365Settings": {
"clientId": "<id de aplicación de Entra ID>",
"clientSecret": "<secreto de la aplicación>",
"tenantId": "<id del tenant>",
"UserId": "remitente@ejemplo.com"
},
"SmtpSettings": {
"host": "",
"port": 587,
"user": "",
"password": "",
"enableSsl": true
}
},
"NotificationEmail": "soporte@ejemplo.com"
}
Al arrancar se validan las secciones Salesmanago y A3erpServer completas. Si falta alguna o alguno de sus campos, el proceso termina sin sincronizar y el log recoge una línea por cada dato que falta, del tipo No se ha proporcionado el dato "User" de la sección "A3erpServer" de la configuración.
Sección A3erpServer#
| Campo | Descripción |
|---|---|
Server |
Instancia de SQL Server. En JSON la barra invertida se escribe doble |
A3erpDataBase |
Base de datos de la empresa a3ERP con el diccionario DSIT_SYNC_SMG instalado |
AuxiliarDataBase |
Base de datos donde está la vista SalesmanagoContacts |
User, Password |
Usuario SQL con los permisos indicados en los requisitos. Se conectan con autenticación SQL, no integrada |
Sección Salesmanago#
| Campo | Descripción |
|---|---|
Owner |
Correo del propietario de los contactos en Salesmanago. Todos los contactos se crean y consultan bajo ese propietario |
ClientId, ClientSecret |
Credenciales de la API de Salesmanago |
RegexPatternCustomTags |
Expresión regular que deben cumplir las etiquetas para que el sincronizador las gestione. Ver qué etiquetas gestiona |
Sección FirstRun#
Los tres interruptores activan el modo masivo. Los tres deben estar a false en la operación normal.
| Campo | Descripción |
|---|---|
ExportAllContactsToSalesmanago |
Reexportar todos los contactos de la vista |
ImportToa3ERPAllOptIn |
Bajar el opt-out de todos los contactos de Salesmanago |
DeleteAllDatabaseCustomTags |
Quitar de todos los contactos de Salesmanago las etiquetas que cumplan el patrón de esta sección |
RegexPatternCustomTags |
Patrón de las etiquetas a borrar. Obligatorio si DeleteAllDatabaseCustomTags es true; es independiente del patrón de la sección Salesmanago |
SalesmanagoBackupDirectory |
Carpeta donde descargar la copia de todos los contactos. Obligatoria si ImportToa3ERPAllOptIn o DeleteAllDatabaseCustomTags son true. Se borra al terminar |
Sección Logging#
Nivel mínimo que se escribe en cada uno de los tres destinos de log. Los valores son los del enumerado estándar de niveles de log de .NET:
| Valor | Nivel |
|---|---|
| 0 | Trace |
| 1 | Debug |
| 2 | Information |
| 3 | Warning |
| 4 | Error |
| 5 | Critical |
| 6 | None (no registra nada) |
FileLogLevel gobierna el fichero de log, que se escribe en C:\Logs\. ConsoleLogLevel solo aplica cuando se lanza sin -auto y DebuggerLogLevel solo con un depurador adjunto. Hasta que se lee la configuración el fichero registra a partir de Warning, por lo que un fallo al cargar la configuración siempre queda registrado. La sección es opcional; sin ella, los tres destinos usan Information.
Correo de notificación#
NotificationEmail es la dirección que recibe el resumen de cada ejecución. Si se deja vacía no se envía correo.
SitFrameworkMailerSettings es la configuración de la librería de correo de Esofitec, común a otros desarrollos. MailerType elige entre Office365 (envío con Microsoft Graph desde un registro de aplicación de Entra ID, con UserId como buzón remitente) y SMTP; solo hace falta rellenar la subsección correspondiente.
Cifrar el secreto del correo
Office365Settings.clientSecret y SmtpSettings.password admiten el valor cifrado con la herramienta Sit.Framework.Encrypter. El cifrado está ligado al equipo, así que hay que generarlo en el mismo servidor donde se ejecuta el sincronizador. A3erpServer.Password y Salesmanago.ClientSecret no admiten cifrado y van en claro, de ahí la importancia de los permisos NTFS sobre el fichero.
Los secretos de Entra ID caducan
El secreto del registro de aplicación tiene una caducidad máxima de veinticuatro meses. Cuando caduca, la sincronización sigue funcionando pero el correo de resumen deja de llegar sin más aviso que una línea de error en C:\Logs\. Conviene anotar la fecha de caducidad y renovarlo antes.
Puesta en marcha por primera vez#
- Instalar el diccionario en la empresa y comprobar que existe
SIT_SYNC_SMG_LOGy los nueve desencadenadores. - Ejecutar
View_SalesmanagoContacts.sqlenESOFITEC_OTRSy comprobar con unSELECTque la vista devuelve filas. - Desplegar el ejecutable y crear
appsettings.jsona partir del.sample. - Si Salesmanago ya tiene contactos con etiquetas antiguas, activar
DeleteAllDatabaseCustomTagscon el patrón que las identifique y lanzar el ejecutable sin parámetros para verlo en consola. - Activar
ExportAllContactsToSalesmanagoy volver a lanzar para cargar todos los contactos. - Poner los tres interruptores de
FirstRunafalse. - Crear la tarea programada y esperar a la primera ejecución. Al no existir
lastTimestamp.txt, procesará los cambios de los últimos siete días y a partir de ahí será incremental. - Comprobar que llega el correo de resumen.
Actualizar a una versión nueva#
Basta con sustituir el contenido de C:\SIT\Services\Sit_Sync_Smg por la nueva versión conservando appsettings.json y lastTimestamp.txt. Si la versión nueva trae cambios en la vista, ejecutar de nuevo View_SalesmanagoContacts.sql; el CREATE OR ALTER la actualiza sin tocar nada más. El diccionario solo hay que reinstalarlo si la versión nueva lo modifica.