esofitec. CoreDocs

esofitec. CoreDocs

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 escalar dbo.QuitarCaracteresEspeciales que usan las etiquetas REP3-.

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#

  1. Instalar el diccionario en la empresa y comprobar que existe SIT_SYNC_SMG_LOG y los nueve desencadenadores.
  2. Ejecutar View_SalesmanagoContacts.sql en ESOFITEC_OTRS y comprobar con un SELECT que la vista devuelve filas.
  3. Desplegar el ejecutable y crear appsettings.json a partir del .sample.
  4. Si Salesmanago ya tiene contactos con etiquetas antiguas, activar DeleteAllDatabaseCustomTags con el patrón que las identifique y lanzar el ejecutable sin parámetros para verlo en consola.
  5. Activar ExportAllContactsToSalesmanago y volver a lanzar para cargar todos los contactos.
  6. Poner los tres interruptores de FirstRun a false.
  7. 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.
  8. 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.