Conectando Business One y 3cx

En la primera parte vimos como crear el esqueleto para nuestro plugin de 3cx. En este artículo crearemos el plugin que nos permitira comunicar SAP B1 con el cliente de 3cx.

La primera vez que vi la documentación me parecio un poco confusa.

Pero basicamente todo plugin de 3cx consiste en una clase que será la encargada de conectarse con el cliente y gestionar los diferentes eventos.

Esta clase es una clase normal con unos procedimientos estaticos. Y para darle esta funcionalidad se realizará mediante atributos.

El primer atributo que utilizaremos sera el [CRMPluginLoader] que se indica a nivel de clase. Y con el que indicamos que esa es la clase que gestiona la conexión y inicialización del plugin.

El siguiente atributo es [CRMPluginInitializer] que se usa a nivel de procedimiento estático. Cón el indicamos que procedimiento será el encargado de inicializar nuestro conector y programar los eventos. Este procedimiento recibira un handler al controlador de llamadas.

Mediante este handler podemos programar los eventos que deseamos intercetar. Nos ayudaremos de una estructura tipo Singleton, ademas con una variable para evitar que al ser asincrona la llamada se ejecuten multiples veces a la vez.

 [CRMPluginLoader]
    public class SkolPhonePlugin
    {
        /// <summary>
        ///  Este objeto al poder realizarse llamadas multiples y de forma asincrona nos permitira gestionar que no se ejecuten dos procesos simultaneos.
        /// </summary>
        private static object lockObj = new object();

        /// <summary>
        ///  Variable donde guardaremos la unica instancia de la clase que gestiona los mensajes. 
        /// </summary>
        private static SkolPhonePlugin plugin = null;
        private IMyPhoneCallHandler callHandler;

        private SkolPhonePlugin(IMyPhoneCallHandler callHandler)
        {
            this.callHandler = callHandler;
        }

        [CRMPluginInitializer]
        public static void Loader(IMyPhoneCallHandler CallHandler)
        {
            lock (lockObj)
            {
                if (plugin != null) return;
                plugin = new SkolPhonePlugin(CallHandler);
            }
        }

    }

Ahora bastará añadir dos gestores de eventos con el handler de las llamadas que hemos recibido.

this.callHandler.OnCallStatusChanged += new CallInfoHandler(eventCallStatusChanged);

this.callHandler.OnMyPhoneStatusChanged += new MyPhoneStatusHandler(eventMyPhoneStatusChanged);

Ahora pondremos tres puntos de depuración. El primero en la primera linea del constructor donde guardamos el handler que nos envia el cliente.

El segundo en el gestor de eventos de OnMyPhoneStatusChanged.

Si ahora ejecutamos nuestro proyecto y todo esta configurado correctamente empezara la ejecución y se parará en el breakpoint del constructor.

punto depuracion

Si continuamos la ejecución y tenemos una licencia pro se parará en el segundo punto de interrupción y veremos que el estatus es Logged.

punto depuracion logged

Ahora si continuamos depurando, se iniciará el cliente de la 3cx con alguna decoración debido a que lo estamos iniciando desde visual studio.

punto depuracion logged

En este paso antes de empezar a codificar el servidor que nos permitira integrar B1 o otro producto con la 3cx quedá validar que detectamos correctamente las llamadas.

Para ello pondremos un breakpoint ejecutaremos la aplicación. Una vez iniciada realizaremos una llamada . Nota: Bajad el volumen, se quedará sonando continuamente hasta que acabemos de depurar.