示例#1
0
        public EInvoice()
        {
            sharedMethods = new MShared();

            connectionString = ConfigurationManager.AppSettings["ConnectionString"].ToString();
            contactEntity    = new ContactEntity();
            pharmacyEntity   = new PharmacyEntity();
        }
        public InvoiceUpdateRequest.Request GetInvoiceUpdateRequestObject(Entity invoice, IOrganizationService service, ITracingService trace)
        {
            InvoiceUpdateRequest.Request request = null;
            MShared sharedMethods = new MShared();

            try
            {
                //Se reutiliza el método porque son casi las mismas propiedades
                InvoiceCreateRequest.Request objectRequest = this.GetInvoiceCreateRequestObject(invoice, service, trace);

                if (objectRequest != null)
                {
                    request = new InvoiceUpdateRequest.Request
                    {
                        billDate     = objectRequest.billDate,
                        billNumber   = objectRequest.billId,
                        billImageUrl = objectRequest.billImageUrl,
                        patientId    = objectRequest.patientId,
                        pharmacyId   = objectRequest.pharmacyId,
                    };
                    request.products = new InvoiceUpdateRequest.Request.Product[objectRequest.products.Length];
                    for (int i = 0; i < objectRequest.products.Length; i++)
                    {
                        request.products[i] = new InvoiceUpdateRequest.Request.Product
                        {
                            id       = objectRequest.products[i].id,
                            quantity = objectRequest.products[i].quantity
                        };
                    }
                }

                if (request != null)
                {
                    if (invoice.Attributes.Contains(InvoiceFields.InvoiceNumber))
                    {
                        request.billId = Convert.ToString(invoice.GetAttributeValue <int>(InvoiceFields.IdAboxInvoice));
                    }
                }

                return(request);
            }
            catch (Exception ex)
            {
                sharedMethods.LogPluginFeedback(new LogClass
                {
                    Exception  = ex.ToString(),
                    Level      = "error",
                    ClassName  = this.GetType().ToString(),
                    MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                    Message    = $"Error al obtener la estructura para el request",
                    ProcessId  = ""
                }, trace);
                trace.Trace($"MethodName: {new StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());
                throw ex;
            }
        }
示例#3
0
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            sharedMethods = new MShared();

            try
            {
                // Obtain the execution context from the service provider.
                IPluginExecutionContext     context        = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService        service        = serviceFactory.CreateOrganizationService(context.UserId);
                // The InputParameters collection contains all the data passed in the message request.

                /*Esta validación previene la ejecución del Plugin de cualquier
                 * transacción realizada a través del Web API desde Abox*/
                if (context.InitiatingUserId == new Guid("7dbf49f3-8be8-ea11-a817-002248029f77"))
                {
                    return;
                }

                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    // Obtain the target entity from the input parameters.
                    Entity invoiceUpdated = (Entity)context.InputParameters["Target"];

                    if (invoiceUpdated.LogicalName != "invoice")
                    {
                        return;
                    }
                    else
                    {
                        InvoiceEntity  invoiceEntity  = new InvoiceEntity();
                        RequestHelpers reqHelpers     = new RequestHelpers();
                        InvoiceMethods invoiceMethods = new InvoiceMethods();


                        //



                        string[] columnsToGet  = new string[] { InvoiceFields.InvoiceNumber, InvoiceFields.IdAboxInvoice, InvoiceFields.Customer, InvoiceFields.Pharmacy, InvoiceFields.ProductsSelectedJson, InvoiceFields.InvoiceImageWebUrl, InvoiceFields.PurchaseDate, InvoiceFields.EntityId };
                        var      columnSet     = new ColumnSet(columnsToGet);
                        Entity   invoiceToSave = service.Retrieve(invoiceEntity.EntitySingularName, invoiceUpdated.Id, columnSet);

                        //Limitar ejecucion del Plugin cuando el ID ABOX Invoice de Dynamics está vacío.
                        if (!invoiceToSave.Attributes.Contains(InvoiceFields.IdAboxInvoice))
                        {
                            Exception ex = new Exception($"Esta factura no posee un ID de factura Abox registrado. Por favor contacte al administrador.");
                            ex.Data["HasFeedbackMessage"] = true;
                            throw ex;
                        }

                        string newInvoiceNumber      = null;
                        string originalInvoiceNumber = null;
                        if (invoiceUpdated.Attributes.Contains(InvoiceFields.InvoiceNumber))
                        {
                            newInvoiceNumber = invoiceUpdated.Attributes[InvoiceFields.InvoiceNumber].ToString();
                        }

                        if (invoiceToSave.Attributes.Contains(InvoiceFields.InvoiceNumber))
                        {
                            originalInvoiceNumber = invoiceToSave.Attributes[InvoiceFields.InvoiceNumber].ToString();
                        }


                        //borrar

                        sharedMethods.LogPluginFeedback(new LogClass
                        {
                            Exception  = "",
                            Level      = "debug",
                            ClassName  = this.GetType().ToString(),
                            MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                            Message    = $"original: {originalInvoiceNumber} - New: {newInvoiceNumber}",
                            ProcessId  = ""
                        }, trace);

                        //borrar

                        /*Recorrer los atributos que cambiaron y sobreescribirselos a la entidad factura actual para
                         * tener la información completa que se enviará al servicio*/
                        foreach (string keyName in invoiceUpdated.Attributes.Keys)
                        {
                            if (invoiceToSave.Attributes.ContainsKey(keyName))
                            {
                                invoiceToSave.Attributes[keyName] = invoiceUpdated.Attributes[keyName];
                            }
                        }

                        //



                        var validationStatusMessages = invoiceMethods.GetEntityValidationStatus(invoiceToSave, service, trace);

                        if (validationStatusMessages.Count > 0)
                        {
                            string messageRows = "";


                            //foreach (var message in validationStatusMessages)
                            //{
                            //    messageRows += message+"\n";
                            //}

                            /*El mensaje que se envia al usuario a Dynamics es poco amigable y si se envia un mensaje muy largo, la forma en que lo muestra es completamente
                             * ilegible, por esto solo se muestra un mensaje a la vez
                             * Para mostrar un mensaje mas amigable, hay que implementar un propio boton de Save en el Ribbon*/
                            messageRows = validationStatusMessages[0];
                            Exception ex = new Exception($"{messageRows}");
                            ex.Data["HasFeedbackMessage"] = true;
                            throw ex;
                        }


                        #region Verificar número de factura

                        if ((newInvoiceNumber != null) && (newInvoiceNumber != originalInvoiceNumber))
                        {
                            //Verificar numero de factura

                            InvoiceNumberCheckRequest.Request checkInvoiceRequest = reqHelpers.CheckInvoiceNumberRequest(invoiceToSave, service, trace);

                            DataContractJsonSerializer serializerCheckNumber = new DataContractJsonSerializer(typeof(InvoiceNumberCheckRequest.Request));
                            MemoryStream memoryStreamCheckNumber             = new MemoryStream();
                            serializerCheckNumber.WriteObject(memoryStreamCheckNumber, checkInvoiceRequest);
                            var jsonObjectCheckRequest = Encoding.Default.GetString(memoryStreamCheckNumber.ToArray());
                            memoryStreamCheckNumber.Dispose();

                            //Valores necesarios para hacer el Post Request
                            WebRequestData wrDataCheckNumber = new WebRequestData();
                            wrDataCheckNumber.InputData = jsonObjectCheckRequest;

                            wrDataCheckNumber.ContentType = "application/json";

                            // sharedMethods.GetUserTypeId(userTypeReference.Id.ToString());

                            wrDataCheckNumber.Url           = AboxServices.CheckInvoiceNumber;
                            wrDataCheckNumber.Authorization = Configuration.TokenForAboxServices;



                            var serviceResponseCheckNumber = sharedMethods.DoPostRequest(wrDataCheckNumber, trace);
                            InvoiceNumberCheckRequest.ServiceResponse serviceCheckNumberResponseProperties = null;
                            if (serviceResponseCheckNumber.IsSuccessful)
                            {
                                DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(InvoiceNumberCheckRequest.ServiceResponse));

                                using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponseCheckNumber.Data)))
                                {
                                    deserializer = new DataContractJsonSerializer(typeof(InvoiceNumberCheckRequest.ServiceResponse));
                                    serviceCheckNumberResponseProperties = (InvoiceNumberCheckRequest.ServiceResponse)deserializer.ReadObject(ms);
                                }
                            }

                            if (serviceCheckNumberResponseProperties != null)
                            {
                                if ((serviceCheckNumberResponseProperties.response != null) && (serviceCheckNumberResponseProperties.response.message != null))
                                {
                                    if (serviceCheckNumberResponseProperties.response.code.ToString() != "0")
                                    {
                                        Exception ex = new Exception($"{serviceCheckNumberResponseProperties.response.message}");
                                        ex.Data["HasFeedbackMessage"] = true;
                                        throw ex;
                                    }
                                }
                            }
                            else
                            {
                                Exception ex = new Exception("Ha ocurrido un error al intentar validar el número de la factura, por favor intente nuevamente.");
                                ex.Data["HasFeedbackMessage"] = true;
                                throw ex;
                            }
                        }



                        //end verificar numero de factura

                        #endregion

                        InvoiceUpdateRequest.Request request    = reqHelpers.GetInvoiceUpdateRequestObject(invoiceToSave, service, trace);
                        DataContractJsonSerializer   serializer = new DataContractJsonSerializer(typeof(InvoiceUpdateRequest.Request));
                        MemoryStream memoryStream = new MemoryStream();
                        serializer.WriteObject(memoryStream, request);
                        var jsonObject = Encoding.Default.GetString(memoryStream.ToArray());
                        memoryStream.Dispose();

                        //Valores necesarios para hacer el Post Request
                        WebRequestData wrData = new WebRequestData();
                        wrData.InputData = jsonObject;
                        trace.Trace("Objeto Json:" + jsonObject);
                        wrData.ContentType = "application/json";

                        // sharedMethods.GetUserTypeId(userTypeReference.Id.ToString());

                        wrData.Url           = AboxServices.UpdateInvoice;
                        wrData.Authorization = Configuration.TokenForAboxServices;



                        var serviceResponse = sharedMethods.DoPostRequest(wrData, trace);
                        InvoiceUpdateRequest.ServiceResponse serviceResponseProperties = null;
                        if (serviceResponse.IsSuccessful)
                        {
                            DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(InvoiceUpdateRequest.ServiceResponse));

                            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                            {
                                deserializer = new DataContractJsonSerializer(typeof(InvoiceUpdateRequest.ServiceResponse));
                                serviceResponseProperties = (InvoiceUpdateRequest.ServiceResponse)deserializer.ReadObject(ms);
                            }


                            //TODO:Revisar si viene como 0 string o null desde el servicio
                            if (serviceResponseProperties.response.code.ToString() != "0")
                            {
                                trace.Trace(Constants.ErrorMessageCodeReturned + serviceResponseProperties.response.code);

                                //Exception serviceEx = new Exception(Constants.GeneralAboxServicesErrorMessage + serviceResponseProperties.response.message);

                                //serviceEx.Data["HasFeedbackMessage"] = true;
                                //throw serviceEx;



                                //

                                if (serviceResponseProperties.response.details.validationresults.Count > 0)
                                {
                                    string messageRows = "";


                                    //foreach (var message in validationStatusMessages)
                                    //{
                                    //    messageRows += message+"\n";
                                    //}

                                    /*El mensaje que se envia al usuario a Dynamics es poco amigable y si se envia un mensaje muy largo, la forma en que lo muestra es completamente
                                     * ilegible, por esto solo se muestra un mensaje a la vez
                                     * Para mostrar un mensaje mas amigable, hay que implementar un propio boton de Save en el Ribbon*/
                                    string message = "";
                                    if (serviceResponseProperties.response.details.validationresults[0].validationresults != null)
                                    {
                                        if (serviceResponseProperties.response.details.validationresults[0].validationresults.validationMessages.Count > 0)
                                        {
                                            message = serviceResponseProperties.response.details.validationresults[0].validationresults.validationMessages.ElementAtOrDefault(0).message;
                                        }
                                    }

                                    if (!String.IsNullOrEmpty(serviceResponseProperties.response.details.validationresults[0].message))
                                    {
                                        message = serviceResponseProperties.response.details.validationresults[0].message;
                                    }

                                    if (!String.IsNullOrEmpty(message))
                                    {
                                        messageRows = message;
                                    }
                                    else
                                    {
                                        messageRows = "Ocurrió un error al actualizar la factura, por favor intenta nuevamente.";
                                    }
                                    Exception ex = new Exception($"{messageRows}");
                                    ex.Data["HasFeedbackMessage"] = true;
                                    throw ex;
                                }

                                //
                            }
                            else
                            {
                                //invoiceUpdated.Attributes.Add(InvoiceFields.IdAboxInvoice, serviceResponseProperties.response.details.idFactura);
                            }
                        }
                        else
                        {
                            DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(InvoiceUpdateRequest.ServiceResponse));

                            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                            {
                                deserializer = new DataContractJsonSerializer(typeof(InvoiceUpdateRequest.ServiceResponse));
                                serviceResponseProperties = (InvoiceUpdateRequest.ServiceResponse)deserializer.ReadObject(ms);
                            }

                            if (serviceResponseProperties != null && !String.IsNullOrEmpty(serviceResponseProperties.response.message))
                            {
                                Exception serviceEx = new Exception(Constants.GeneralAboxServicesErrorMessage + serviceResponseProperties.response.message);
                                serviceEx.Data["HasFeedbackMessage"] = true;
                                throw serviceEx;
                            }
                            else
                            {
                                Exception ex = new Exception(Constants.GeneralAboxServicesErrorMessage);
                                ex.Data["HasFeedbackMessage"] = true;
                                throw ex;
                            }
                        }

                        ///
                    }
                }
            }
            catch (Exception ex)
            {
                trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());

                try
                {
                    sharedMethods.LogPluginFeedback(new LogClass
                    {
                        Exception  = ex.ToString(),
                        Level      = "error",
                        ClassName  = this.GetType().ToString(),
                        MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                        Message    = "Excepción en plugin",
                        ProcessId  = ""
                    }, trace);
                }
                catch (Exception e)
                {
                    trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + e.ToString());
                }

                if (ex.Data["HasFeedbackMessage"] != null)
                {
                    throw new InvalidPluginExecutionException(ex.Message);
                }
                else
                {
                    throw new InvalidPluginExecutionException(Constants.GeneralPluginErrorMessage);
                }
            }
        }
示例#4
0
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            sharedMethods = new MShared();
            try
            {
                IPluginExecutionContext     context        = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService        service        = serviceFactory.CreateOrganizationService(context.UserId);

                /*Esta validación previene la ejecución del Plugin de cualquier
                 * transacción realizada a través del Web API desde Abox*/
                if (context.InitiatingUserId == new Guid("7dbf49f3-8be8-ea11-a817-002248029f77"))
                {
                    return;
                }

                Entity contactUpdated = null;
                UpdatePatientRequest.Request     updatePatientRequest = null;
                UpdateAccountRequest.Request     updateAccountRequest = null;
                SignupIntoAccountRequest.Request patientSignupRequest = null;
                ContactMethods contactMethods = new ContactMethods();

                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    contactEntity  = new ContactEntity();
                    contactUpdated = (Entity)context.InputParameters["Target"];
                    if (contactUpdated.LogicalName != contactEntity.EntitySingularName)
                    {
                        return;
                    }
                    else
                    {
                        if (contactUpdated != null)
                        {
                            /*Desde otros plugins, cuando se cambia un valor de un field a nivel de código o se crea una realcion,
                             * automáticamente llama la ejecución de este plugin. Esta validación se hace porque desde el plugin de ChildContactsAssociation,
                             *  luego de realizar el registro de tutor y el hijo en la BD mediante los servicios, se hace una asociación en Dynamics,
                             * y por lo tanto este plugin se ejecuta para actualizar el valor del lookup del contacto hijo referenciando al contacto padre*/
                            if (contactUpdated.Attributes.Keys.Contains(ContactFields.ContactxContactLookup))
                            {
                                return;
                            }

                            if (contactUpdated.Attributes.Keys.Contains(ContactFields.IdAboxPatient))
                            {
                                return;
                            }

                            helperMethods = new RequestHelpers();

                            #region -> Set request data based on Contact

                            //contactMethods = new ContactMethods();

                            string[] columnsToGet = new string[] { ContactFields.IdAboxPatient, ContactFields.Country, ContactFields.Province, ContactFields.Canton, ContactFields.District, ContactFields.Interests, ContactFields.UserType, ContactFields.IdType, ContactFields.Id, ContactFields.Firstname, ContactFields.SecondLastname, ContactFields.Lastname, ContactFields.Gender, ContactFields.Birthdate, ContactFields.ContactxContactLookup, ContactFields.Phone, ContactFields.SecondaryPhone, ContactFields.Email, ContactFields.IsChildContact, ContactFields.NoEmail, ContactFields.IsUserTypeChange };
                            var      columnSet    = new ColumnSet(columnsToGet);
                            Entity   contactData  = service.Retrieve(contactEntity.EntitySingularName, contactUpdated.Id, columnSet);

                            //Limitar ejecucion del Plugin cuando el ID ABOX PATIENT de Dynamics está vacío.
                            if (!contactData.Attributes.Contains(ContactFields.IdAboxPatient))
                            {
                                Exception ex = new Exception($"Este contacto no posee un ID de paciente Abox registrado. Por favor contacte al administrador.");
                                ex.Data["HasFeedbackMessage"] = true;
                                throw ex;
                            }

                            string userType = "";

                            if (contactData.Attributes.Contains(ContactFields.UserType))
                            {
                                EntityReference userTypeReference = null;
                                userTypeReference = (EntityReference)contactData.Attributes[ContactFields.UserType];
                                if (userTypeReference != null)
                                {
                                    userType = sharedMethods.GetUserTypeId(userTypeReference.Id.ToString());
                                }
                            }

                            /*Recorrer los atributos que cambiaron y sobreescribirselos a la entidad contacto actual para
                             * tener la información completa que se enviará al servicio*/
                            foreach (string keyName in contactUpdated.Attributes.Keys)
                            {
                                if (contactData.Attributes.ContainsKey(keyName))
                                {
                                    contactData.Attributes[keyName] = contactUpdated.Attributes[keyName];
                                }
                            }


                            //Validar Datos

                            var validationStatusMessages = contactMethods.GetEntityValidationStatus(contactData, trace);

                            if (validationStatusMessages.Count > 0)
                            {
                                string messageRows = "";


                                //foreach (var message in validationStatusMessages)
                                //{
                                //    messageRows += message+"\n";
                                //}

                                /*El mensaje que se envia al usuario a Dynamics es poco amigable y si se envia un mensaje muy largo, la forma en que lo muestra es completamente
                                 * ilegible, por esto solo se muestra un mensaje a la vez
                                 * Para mostrar un mensaje mas amigable, hay que implementar un propio boton de Save en el Ribbon*/
                                messageRows = validationStatusMessages[0];
                                Exception ex = new Exception($"{messageRows}");
                                ex.Data["HasFeedbackMessage"] = true;
                                throw ex;
                            }

                            bool isProfileChange = false;

                            if (contactData.Attributes.Contains(ContactFields.IsUserTypeChange))
                            {
                                isProfileChange = contactData.GetAttributeValue <bool>(ContactFields.IsUserTypeChange);
                            }

                            EntityReference newUserTypeReference = null;
                            //TODO: Usar algun field para indicar que el usuario esta explicitamente haciendo un cambio de perfil
                            if (isProfileChange && contactData.Attributes.Contains(ContactFields.UserType))
                            {
                                patientSignupRequest = helperMethods.GetSignupPatientIntoAccountRequestObject(contactData, service, trace);
                                newUserTypeReference = (EntityReference)contactData.Attributes[ContactFields.UserType];
                            }

                            /*Validar si es un usuario tipo Paciente y no tiene un cuidador o tutor, se utilizara el servicio
                             * de update patient*/
                            else if (contactData.Attributes.Contains(ContactFields.ContactxContactLookup))
                            {
                                updatePatientRequest = helperMethods.GetPatientUpdateStructure(contactData, service, trace);
                            }
                            else
                            {
                                //Si es cuidador, tutor, o paciente que no está a cargo de nadie se usa el update account
                                updateAccountRequest = helperMethods.GetAccountUpdateStructure(contactData, service, trace);
                            }


                            //else
                            //{
                            //    string contactName = "";

                            //    if (contactData.Attributes.Contains(ContactFields.Firstname))
                            //        contactName += contactData.GetAttributeValue<string>(ContactFields.Firstname);

                            //    if (contactData.Attributes.Contains(ContactFields.Lastname))
                            //        contactName += " " + contactData.GetAttributeValue<string>(ContactFields.Lastname);

                            //    if (contactData.Attributes.Contains(ContactFields.SecondLastname))
                            //        contactName += " " + contactData.GetAttributeValue<string>(ContactFields.SecondLastname);

                            //    Exception ex = new Exception($"Ocurrió un problema identificando el tipo de usuario del contacto. {(!String.IsNullOrEmpty(contactName) ? "(" + contactName + ")" : "")}");
                            //    ex.Data["HasFeedbackMessage"] = true;
                            //    throw ex;
                            //}

                            #endregion -> Set request data based on Contact

                            DataContractJsonSerializer serializer = null;
                            MemoryStream memoryStream             = new MemoryStream();
                            string       serviceUrl = "";

                            if (isProfileChange)
                            {
                                serializer = new DataContractJsonSerializer(typeof(SignupIntoAccountRequest.Request));
                                serializer.WriteObject(memoryStream, patientSignupRequest);
                                serviceUrl = AboxServices.SignIntoAccountService;
                            }
                            else
                            {
                                if (updatePatientRequest != null)
                                {
                                    serializer = new DataContractJsonSerializer(typeof(UpdatePatientRequest.Request));
                                    serializer.WriteObject(memoryStream, updatePatientRequest);
                                    serviceUrl = AboxServices.UpdatePatientService;
                                }
                                else if (updateAccountRequest != null)
                                {
                                    serializer = new DataContractJsonSerializer(typeof(UpdateAccountRequest.Request));
                                    serializer.WriteObject(memoryStream, updateAccountRequest);
                                    serviceUrl = AboxServices.UpdateAccountService;
                                }
                            }



                            var jsonObject = Encoding.Default.GetString(memoryStream.ToArray());
                            memoryStream.Dispose();

                            //Valores necesarios para hacer el Post Request
                            WebRequestData wrData = new WebRequestData();
                            wrData.InputData     = jsonObject;
                            wrData.ContentType   = "application/json";
                            wrData.Authorization = "Bearer " + Configuration.TokenForAboxServices;

                            wrData.Url = serviceUrl;

                            var serviceResponse = sharedMethods.DoPostRequest(wrData, trace);
                            UpdatePatientRequest.ServiceResponse     updatePatientResponse   = null;
                            UpdateAccountRequest.ServiceResponse     updateAccountResponse   = null;
                            SignupIntoAccountRequest.ServiceResponse signIntoAccountResponse = null;
                            if (serviceResponse.IsSuccessful)
                            {
                                if (isProfileChange && patientSignupRequest != null)
                                {
                                    //

                                    DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(SignupIntoAccountRequest.ServiceResponse));

                                    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                                    {
                                        deserializer            = new DataContractJsonSerializer(typeof(SignupIntoAccountRequest.ServiceResponse));
                                        signIntoAccountResponse = (SignupIntoAccountRequest.ServiceResponse)deserializer.ReadObject(ms);
                                    }

                                    if (signIntoAccountResponse.response.code.ToString() != "0")
                                    {
                                        trace.Trace(Constants.ErrorMessageCodeReturned + signIntoAccountResponse.response.code);

                                        Exception serviceEx = new Exception(Constants.GeneralAboxServicesErrorMessage + signIntoAccountResponse.response.message);
                                        serviceEx.Data["HasFeedbackMessage"] = true;
                                        throw serviceEx;
                                    }
                                    else
                                    {
                                        //contact.Attributes.Add("new_idaboxpatient", serviceResponseProperties.response.details.idPaciente);
                                        if (isProfileChange && newUserTypeReference != null)
                                        {
                                            if (contactData.Attributes.Contains(ContactFields.UserType))
                                            {
                                                contactData.Attributes.Remove(ContactFields.UserType);
                                                contactData.Attributes.Add(ContactFields.UserType, newUserTypeReference);
                                            }
                                            else
                                            {
                                                contactData.Attributes.Add(ContactFields.UserType, newUserTypeReference);
                                            }
                                        }
                                    }

                                    //
                                }
                                else if (updatePatientRequest != null)
                                {
                                    //Leer respuesta del servicio de Update Patient

                                    DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(UpdatePatientRequest.ServiceResponse));

                                    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                                    {
                                        deserializer          = new DataContractJsonSerializer(typeof(UpdatePatientRequest.ServiceResponse));
                                        updatePatientResponse = (UpdatePatientRequest.ServiceResponse)deserializer.ReadObject(ms);
                                    }

                                    if (updatePatientResponse.response.code != "MEMCTRL-1014")
                                    {
                                        Exception serviceEx = new Exception(Constants.GeneralAboxServicesErrorMessage + updatePatientResponse.response.message);
                                        serviceEx.Data["HasFeedbackMessage"] = true;
                                        throw serviceEx;
                                    }
                                    else
                                    {
                                    }
                                }
                                else if (updateAccountRequest != null)
                                {
                                    //Leer respuesta del servicio Update Account
                                    DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(UpdateAccountRequest.ServiceResponse));

                                    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                                    {
                                        deserializer          = new DataContractJsonSerializer(typeof(UpdateAccountRequest.ServiceResponse));
                                        updateAccountResponse = (UpdateAccountRequest.ServiceResponse)deserializer.ReadObject(ms);
                                    }

                                    if (updateAccountResponse.response.code != "MEMCTRL-1015")
                                    {
                                        trace.Trace(Constants.ErrorMessageCodeReturned + updateAccountResponse.response.code);
                                        throw new InvalidPluginExecutionException(Constants.ErrorMessageTransactionCodeReturned + updateAccountResponse.response.message);
                                    }
                                    else
                                    {
                                        //contact.Attributes.Add("new_idaboxpatient", serviceResponseProperties.response.details.idPaciente);
                                    }
                                }
                            }
                            else
                            {
                                Exception ex = new Exception(Constants.GeneralAboxServicesErrorMessage);
                                ex.Data["HasFeedbackMessage"] = true;
                                throw ex;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());

                try
                {
                    sharedMethods.LogPluginFeedback(new LogClass
                    {
                        Exception  = ex.ToString(),
                        Level      = "error",
                        ClassName  = this.GetType().ToString(),
                        MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                        Message    = "Excepción en plugin",
                        ProcessId  = ""
                    }, trace);
                }
                catch (Exception e)
                {
                    trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + e.ToString());
                }

                if (ex.Data["HasFeedbackMessage"] != null)
                {
                    throw new InvalidPluginExecutionException(ex.Message);
                }
                else
                {
                    throw new InvalidPluginExecutionException(Constants.GeneralPluginErrorMessage);
                }
            }
        }
示例#5
0
 public Doctor()
 {
     sharedMethods = new MShared();
     doctorEntity  = new DoctorEntity();
 }
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            sharedMethods = new MShared();
            try
            {
                // Obtain the execution context from the service provider.
                IPluginExecutionContext     context        = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService        service        = serviceFactory.CreateOrganizationService(context.UserId);
                // The InputParameters collection contains all the data passed in the message request.

                /*Esta validación previene la ejecución del Plugin de cualquier
                 * transacción realizada a través del Web API desde Abox*/
                if (context.InitiatingUserId == new Guid("7dbf49f3-8be8-ea11-a817-002248029f77"))
                {
                    return;
                }

                EntityReference targetEntity = null;

                string relationshipName = string.Empty;

                EntityReferenceCollection relatedEntities = null;

                EntityReference doctorRelated = null;

                Entity parentContact = null;

                UpdatePatientRequest.Request updatePatientRequest = null;

                #region Associate & Disassociate

                // if (context.MessageName.ToLower() == "associate" || context.MessageName.ToLower() == "disassociate")
                if (context.MessageName.ToLower() == "associate")
                {
                    contactEntity = new ContactEntity();

                    // Get the “Relationship” Key from context

                    if (context.InputParameters.Contains("Relationship"))

                    {
                        // Get the Relationship name for which this plugin fired
                        relationshipName = ((Relationship)context.InputParameters["Relationship"]).SchemaName;
                    }

                    // Check the "Relationship Name" with your intended one

                    if (relationshipName != ContactFields.ContactxContactRelationship)
                    {
                        return;
                    }
                    else
                    {
                        productEntity        = new ProductEntity();
                        updatePatientRequest = new UpdatePatientRequest.Request();

                        #region -> Target

                        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
                        {
                            helperMethods = new RequestHelpers();
                            targetEntity  = (EntityReference)context.InputParameters["Target"];

                            string[] columnsToGet = new string[] { ContactFields.IdAboxPatient, ContactFields.UserType, ContactFields.Id, ContactFields.Country, ContactFields.Firstname, ContactFields.SecondLastname, ContactFields.Lastname, ContactFields.Email };
                            var      columnSet    = new ColumnSet(columnsToGet);
                            parentContact = service.Retrieve(contactEntity.EntitySingularName, targetEntity.Id, columnSet);
                        }

                        #endregion -> Target

                        #region -> Related

                        relatedEntities = context.InputParameters["RelatedEntities"] as EntityReferenceCollection;

                        string userType = "";
                        if (parentContact.Attributes.Contains(ContactFields.UserType))
                        {
                            EntityReference userTypeReference = null;
                            userTypeReference = (EntityReference)parentContact.Attributes[ContactFields.UserType];
                            if (userTypeReference != null)
                            {
                                userType = sharedMethods.GetUserTypeId(userTypeReference.Id.ToString());
                            }
                        }

                        if (userType == "02" || userType == "03")
                        {
                            if (relatedEntities.Count > 0)
                            {
                                RequestHelpers reqHelpers = new RequestHelpers();

                                ContactMethods contactMethods = new ContactMethods();

                                var contactsRelated = contactMethods.GetContactChildContacts(parentContact, service);

                                if (contactsRelated != null)
                                {
                                    if (contactsRelated.Entities.Count + relatedEntities.Count > 1 || relatedEntities.Count > 1)
                                    {
                                        //TODO: QUICK CREATE se comporta distinto, entra aqui despues de haber asociado y esta mandando este mensaje
                                        //TODO:Hacer constante configurable de cantidad de bajo cuido permitidos

                                        Exception ex = new Exception("No es posible asignar más de un contacto bajo cuido.");
                                        ex.Data["HasFeedbackMessage"] = true;
                                        throw ex;
                                    }
                                }

                                string[] columnsToGet = new string[] { ContactFields.IdAboxPatient, ContactFields.Country, ContactFields.UserType, ContactFields.IdType, ContactFields.Id, ContactFields.Firstname, ContactFields.SecondLastname, ContactFields.Lastname, ContactFields.Gender, ContactFields.Birthdate, ContactFields.Email };
                                var      columnSet    = new ColumnSet(columnsToGet);

                                for (int i = 0; i < relatedEntities.Count; i++)
                                {
                                    EntityReference r = relatedEntities[i];
                                    Entity          childContactToAssociate = service.Retrieve(contactEntity.EntitySingularName, r.Id, columnSet);
                                    PatientSignupRequest.Request request    = reqHelpers.GetSignupPatientUnderCareRequestObject(childContactToAssociate, parentContact, service, trace);

                                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(PatientSignupRequest.Request));
                                    MemoryStream memoryStream             = new MemoryStream();
                                    serializer.WriteObject(memoryStream, request);
                                    var jsonObject = Encoding.Default.GetString(memoryStream.ToArray());
                                    memoryStream.Dispose();

                                    //Valores necesarios para hacer el Post Request
                                    WebRequestData wrData = new WebRequestData();
                                    wrData.InputData = jsonObject;

                                    wrData.ContentType   = "application/json";
                                    wrData.Authorization = Configuration.TokenForAboxServices;

                                    if (userType == "02")
                                    {
                                        wrData.Url = AboxServices.CaretakerChildService;
                                    }
                                    else if (userType == "03")
                                    {
                                        wrData.Url = AboxServices.TutorChildService;
                                    }

                                    var serviceResponse = sharedMethods.DoPostRequest(wrData, trace);
                                    PatientSignupRequest.ServiceResponse serviceResponseProperties = null;
                                    if (serviceResponse.IsSuccessful)
                                    {
                                        DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(PatientSignupRequest.ServiceResponse));

                                        using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                                        {
                                            deserializer = new DataContractJsonSerializer(typeof(PatientSignupRequest.ServiceResponse));
                                            serviceResponseProperties = (PatientSignupRequest.ServiceResponse)deserializer.ReadObject(ms);
                                        }

                                        if (serviceResponseProperties.response.code != "MEMEX-0002")
                                        {
                                            trace.Trace(Constants.ErrorMessageCodeReturned + serviceResponseProperties.response.code);



                                            //TODO: No se esta respetando este throw y el plugin se esta ejecutando de todas formas
                                            Exception serviceEx = new Exception(Constants.GeneralAboxServicesErrorMessage + serviceResponseProperties.response.message);
                                            serviceEx.Data["HasFeedbackMessage"] = true;
                                            throw serviceEx;
                                        }
                                        else
                                        {
                                            //Esta linea automaticamente llama al plugin de Update y se esta llamando sin intención
                                            //childContactToAssociate.Attributes.Add(ContactFields.IdAboxPatient, serviceResponseProperties.response.details.idPaciente);

                                            try
                                            {
                                                childContactToAssociate[ContactFields.IdAboxPatient] = serviceResponseProperties.response.details.idPaciente;
                                                EntityReference userTypeReference = new EntityReference("new_usertype", new Guid(Constants.PatientUndercareIdType));
                                                childContactToAssociate[ContactFields.UserType] = userTypeReference;
                                                service.Update(childContactToAssociate);
                                            }
                                            catch (Exception ex)
                                            {
                                                #region log

                                                try
                                                {
                                                    sharedMethods.LogPluginFeedback(new LogClass
                                                    {
                                                        Exception  = ex.ToString(),
                                                        Level      = "error",
                                                        ClassName  = this.GetType().ToString(),
                                                        MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                                                        Message    = $"Error actualizando la entidad",
                                                        ProcessId  = ""
                                                    }, trace);
                                                }
                                                catch (Exception e)
                                                {
                                                }

                                                #endregion log
                                            }



                                            PatientSignupRequest.ServiceResponse welcomeServiceResponseProperties = null;
                                            PatientSignupRequest.Request         requestForWelcome = reqHelpers.GetWelcomeMailRequestForTutorsAndCaretakers(parentContact, service, trace);

                                            serializer   = new DataContractJsonSerializer(typeof(PatientSignupRequest.Request));
                                            memoryStream = new MemoryStream();
                                            serializer.WriteObject(memoryStream, requestForWelcome);
                                            var jsonObjectForWelcomeMail = Encoding.Default.GetString(memoryStream.ToArray());
                                            memoryStream.Dispose();

                                            WebRequestData wrDataWelcomeMail = new WebRequestData();
                                            wrDataWelcomeMail.InputData     = jsonObjectForWelcomeMail;
                                            wrDataWelcomeMail.ContentType   = "application/json";
                                            wrDataWelcomeMail.Authorization = Configuration.TokenForAboxServices;
                                            wrDataWelcomeMail.Url           = AboxServices.WelcomeSendMailService;

                                            var serviceResponseWelcome = sharedMethods.DoPostRequest(wrDataWelcomeMail, trace);

                                            if (serviceResponseWelcome.IsSuccessful)
                                            {
                                                DataContractJsonSerializer deserializerWelcomeResponse = new DataContractJsonSerializer(typeof(PatientSignupRequest.ServiceResponse));

                                                using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponseWelcome.Data)))
                                                {
                                                    deserializerWelcomeResponse      = new DataContractJsonSerializer(typeof(PatientSignupRequest.ServiceResponse));
                                                    welcomeServiceResponseProperties = (PatientSignupRequest.ServiceResponse)deserializerWelcomeResponse.ReadObject(ms);
                                                }

                                                if (welcomeServiceResponseProperties.response.code != "0")
                                                {
                                                    trace.Trace(Constants.ErrorMessageCodeReturned + welcomeServiceResponseProperties.response.code);


                                                    Exception serviceEx = new Exception(Constants.GeneralAboxServicesErrorMessage + serviceResponseProperties.response.message);
                                                    serviceEx.Data["HasFeedbackMessage"] = true;
                                                    throw serviceEx;
                                                }
                                                else
                                                {
                                                }
                                            }
                                            else
                                            {
                                                trace.Trace(Constants.GeneralAboxServicesErrorMessage);
                                                //validar mensaje de respuesta
                                                throw new InvalidPluginExecutionException(Constants.GeneralAboxServicesErrorMessage);
                                            }

                                            //var serviceResponse = sharedMethods.DoPostRequest(wrData, trace);
                                        }
                                    }
                                    else
                                    {
                                        trace.Trace(Constants.GeneralAboxServicesErrorMessage);
                                        throw new InvalidPluginExecutionException(Constants.GeneralAboxServicesErrorMessage + serviceResponseProperties.response.message);
                                    }
                                }
                            }
                        }

                        #endregion -> Related
                    }
                }

                #endregion Associate & Disassociate
            }

            catch (Exception ex)
            {
                trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());

                try
                {
                    sharedMethods.LogPluginFeedback(new LogClass
                    {
                        Exception  = ex.ToString(),
                        Level      = "error",
                        ClassName  = this.GetType().ToString(),
                        MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                        Message    = "Excepción en plugin",
                        ProcessId  = ""
                    }, trace);
                }
                catch (Exception e)
                {
                    trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + e.ToString());
                }

                if (ex.Data["HasFeedbackMessage"] != null)
                {
                    throw new InvalidPluginExecutionException(ex.Message);
                }
                else
                {
                    throw new InvalidPluginExecutionException(Constants.GeneralPluginErrorMessage);
                }
            }
        }
示例#7
0
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            sharedMethods  = new MShared();
            contactMethods = new ContactMethods();
            try
            {
                // Obtain the execution context from the service provider.
                IPluginExecutionContext     context        = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService        service        = serviceFactory.CreateOrganizationService(context.UserId);
                // The InputParameters collection contains all the data passed in the message request.

                /*Esta validación previene la ejecución del Plugin de cualquier
                 * transacción realizada a través del Web API desde Abox*/
                if (context.InitiatingUserId == new Guid("7dbf49f3-8be8-ea11-a817-002248029f77"))
                {
                    return;
                }

                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    // Obtain the target entity from the input parameters.
                    Entity contact = (Entity)context.InputParameters["Target"];

                    if (contact.LogicalName != "contact")
                    {
                        return;
                    }
                    else
                    {
                        RequestHelpers reqHelpers = new RequestHelpers();



                        if (contact.Attributes.Contains(ContactFields.IdAboxPatient))
                        {
                            Exception ex = new Exception($"Este contacto ya posee un Id Paciente de Abox registrado.({Convert.ToString(contact.GetAttributeValue<int>(ContactFields.IdAboxPatient))})");
                            ex.Data["HasFeedbackMessage"] = true;
                            throw ex;
                        }


                        var validationStatusMessages = contactMethods.GetEntityValidationStatus(contact, trace);

                        if (validationStatusMessages.Count > 0)
                        {
                            string messageRows = "";


                            //foreach (var message in validationStatusMessages)
                            //{
                            //    messageRows += message+"\n";
                            //}

                            /*El mensaje que se envia al usuario a Dynamics es poco amigable y si se envia un mensaje muy largo, la forma en que lo muestra es completamente
                             * ilegible, por esto solo se muestra un mensaje a la vez
                             * Para mostrar un mensaje mas amigable, hay que implementar un propio boton de Save en el Ribbon*/
                            messageRows = validationStatusMessages[0];
                            Exception ex = new Exception($"{messageRows}");
                            ex.Data["HasFeedbackMessage"] = true;
                            throw ex;
                        }

                        /* Cuando se esta creando un paciente que va a ser un paciente bajo cuido de un tutor/cuidador,
                         * Se tiene que identificar este escenario para no hacer ningun request aca, la creacion del paciente se hace
                         * desde el associate*/

                        if (contact.GetAttributeValue <bool>(ContactFields.IsChildContact))
                        {
                            return;
                        }

                        PatientSignupRequest.Request request = reqHelpers.GetSignupPatientRequestObject(contact, service, trace);

                        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(PatientSignupRequest.Request));
                        MemoryStream memoryStream             = new MemoryStream();
                        serializer.WriteObject(memoryStream, request);
                        var jsonObject = Encoding.Default.GetString(memoryStream.ToArray());
                        memoryStream.Dispose();

                        //Valores necesarios para hacer el Post Request
                        WebRequestData wrData = new WebRequestData();
                        wrData.InputData = jsonObject;
                        trace.Trace("Objeto Json:" + jsonObject);
                        wrData.ContentType = "application/json";


                        EntityReference userTypeReference = null;
                        userTypeReference = (EntityReference)contact.Attributes[ContactFields.UserType];
                        string userTypeFromContactBeingCreated = userTypeReference.Id.ToString();
                        // sharedMethods.GetUserTypeId(userTypeReference.Id.ToString());

                        if (userTypeFromContactBeingCreated == Constants.CareTakerIdType || userTypeFromContactBeingCreated == Constants.TutorIdType)
                        {
                            wrData.Url           = AboxServices.MainPatientForTutorOrCaretakerService;
                            wrData.Authorization = Configuration.TokenForAboxServices;
                        }
                        else if (userTypeFromContactBeingCreated == Constants.OtherInterestIdType)
                        {
                            wrData.Url = AboxServices.ConsumerSignup;
                        }
                        else
                        {
                            wrData.Url = AboxServices.PatientSignup;
                        }



                        trace.Trace("Url:" + wrData.Url);

                        var serviceResponse = sharedMethods.DoPostRequest(wrData, trace);
                        PatientSignupRequest.ServiceResponse serviceResponseProperties = null;
                        if (serviceResponse.IsSuccessful)
                        {
                            DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(PatientSignupRequest.ServiceResponse));

                            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                            {
                                deserializer = new DataContractJsonSerializer(typeof(PatientSignupRequest.ServiceResponse));
                                serviceResponseProperties = (PatientSignupRequest.ServiceResponse)deserializer.ReadObject(ms);
                            }

                            if (serviceResponseProperties.response.code != "MEMEX-0002")
                            {
                                trace.Trace(Constants.ErrorMessageCodeReturned + serviceResponseProperties.response.code);



                                Exception serviceEx = new Exception(Constants.GeneralAboxServicesErrorMessage + serviceResponseProperties.response.message);
                                serviceEx.Data["HasFeedbackMessage"] = true;
                                throw serviceEx;
                            }
                            else
                            {
                                bool saveWithoutEmail = false;
                                if (contact.Attributes.Contains(ContactFields.NoEmail))
                                {
                                    saveWithoutEmail = Convert.ToBoolean(contact.GetAttributeValue <OptionSetValue>(ContactFields.NoEmail).Value);
                                }
                                if (saveWithoutEmail)
                                {
                                    //TODO: Cual sera el correo default desde CRM
                                    if (contact.Attributes.Contains(ContactFields.Email))
                                    {
                                        contact.Attributes.Add(ContactFields.Email, request.contactinfo.email);
                                    }
                                }



                                contact.Attributes.Add(ContactFields.IdAboxPatient, serviceResponseProperties.response.details.idPaciente);
                            }
                        }
                        else
                        {
                            DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(PatientSignupRequest.ServiceResponse));

                            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                            {
                                deserializer = new DataContractJsonSerializer(typeof(PatientSignupRequest.ServiceResponse));
                                serviceResponseProperties = (PatientSignupRequest.ServiceResponse)deserializer.ReadObject(ms);
                            }

                            if (serviceResponseProperties != null && !String.IsNullOrEmpty(serviceResponseProperties.response.message))
                            {
                                Exception serviceEx = new Exception(Constants.GeneralAboxServicesErrorMessage + serviceResponseProperties.response.message);
                                serviceEx.Data["HasFeedbackMessage"] = true;
                                throw serviceEx;
                            }
                            else
                            {
                                Exception ex = new Exception(Constants.GeneralAboxServicesErrorMessage);
                                ex.Data["HasFeedbackMessage"] = true;
                                throw ex;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());

                try
                {
                    sharedMethods.LogPluginFeedback(new LogClass
                    {
                        Exception  = ex.ToString(),
                        Level      = "error",
                        ClassName  = this.GetType().ToString(),
                        MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                        Message    = "Excepción en plugin",
                        ProcessId  = ""
                    }, trace);
                }
                catch (Exception e)
                {
                    trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + e.ToString());
                }

                if (ex.Data["HasFeedbackMessage"] != null)
                {
                    throw new InvalidPluginExecutionException(ex.Message);
                }
                else
                {
                    throw new InvalidPluginExecutionException(Constants.GeneralPluginErrorMessage);
                }
            }
        }
示例#8
0
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            sharedMethods = new MShared();
            try
            {
                // Obtain the execution context from the service provider.
                IPluginExecutionContext     context        = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService        service        = serviceFactory.CreateOrganizationService(context.UserId);
                // The InputParameters collection contains all the data passed in the message request.

                /*Esta validación previene la ejecución del Plugin de cualquier
                 * transacción realizada a través del Web API desde Abox que usa un usuario específico*/
                if (context.InitiatingUserId == new Guid("7dbf49f3-8be8-ea11-a817-002248029f77"))
                {
                    return;
                }

                Entity         doseInput      = null;
                Entity         contact        = null;
                Entity         product        = null;
                ContactMethods contactMethods = new ContactMethods();

                UpdatePatientRequest.Request updatePatientRequest = null;

                // The InputParameters collection contains all the data passed in the message request.
                if (context.InputParameters.Contains("Target") && (context.InputParameters["Target"] is Entity) || context.InputParameters["Target"] is EntityReference)
                {
                    contactEntity = new ContactEntity();
                    doseEntity    = new DoseEntity();

                    //Cuando el plugin es un Delete, el inputParameter trae EntityReference, cuando es Create, trae Entity
                    if (context.InputParameters["Target"] is Entity)
                    {
                        /*Si existe una Preimagen, se obtiene toda la información de la entidad que se está actualizando de esta preimagen
                         * y se cambia el valor que se está actualizando*/
                        if (context.PreEntityImages.Contains("UpdatedEntity"))
                        {
                            Entity updatedDose = (Entity)context.InputParameters["Target"];
                            doseInput = (Entity)context.PreEntityImages["UpdatedEntity"];
                            if (doseInput.Attributes.Contains(DoseFields.Dose) && updatedDose.Attributes.Contains(DoseFields.Dose))
                            {
                                doseInput[DoseFields.Dose] = updatedDose[DoseFields.Dose];
                            }
                        }
                        else
                        {
                            doseInput = (Entity)context.InputParameters["Target"];
                        }
                    }
                    else if (context.InputParameters["Target"] is EntityReference && context.PreEntityImages.Contains("DeletedEntity"))
                    {
                        doseInput = (Entity)context.PreEntityImages["DeletedEntity"];
                    }

                    if (doseInput.LogicalName != doseEntity.EntitySingularName)
                    {
                        return;
                    }
                    else
                    {
                        //Cast as Entity the dose being created

                        #region -> Related Contact

                        productEntity        = new ProductEntity();
                        doseEntity           = new DoseEntity();
                        updatePatientRequest = null;

                        Guid contactId = new Guid();

                        if (doseInput.Attributes.Contains(DoseFields.ContactxDose))
                        {
                            EntityReference contactReference = (EntityReference)doseInput.Attributes[DoseFields.ContactxDose];
                            if (contactReference != null)
                            {
                                contactId = contactReference.Id;
                            }
                        }

                        string[] columnsToGet = new string[] { ContactFields.IdAboxPatient, ContactFields.Country, ContactFields.UserType, ContactFields.IdType, ContactFields.Id, ContactFields.Firstname, ContactFields.SecondLastname, ContactFields.Lastname, ContactFields.Gender, ContactFields.Birthdate };
                        var      columnSet    = new ColumnSet(columnsToGet);

                        contact = service.Retrieve(contactEntity.EntitySingularName, contactId, columnSet);

                        if (contact != null)
                        {
                            RequestHelpers helperMethods = new RequestHelpers();


                            var relatedContacts = contactMethods.GetContactChildContacts(contact, service);

                            if (relatedContacts != null)
                            {
                                if (relatedContacts.Entities.Count > 0)
                                {
                                    Exception serviceEx = new Exception("No es posible realizar esta operación en usuarios que tienen pacientes bajo cuido registrados.");
                                    serviceEx.Data["HasFeedbackMessage"] = true;
                                    throw serviceEx;
                                }
                            }

                            string userType = "";

                            if (contact.Attributes.Contains(ContactFields.UserType))
                            {
                                EntityReference userTypeReference = null;
                                userTypeReference = (EntityReference)contact.Attributes[ContactFields.UserType];
                                if (userTypeReference != null)
                                {
                                    userType = sharedMethods.GetUserTypeId(userTypeReference.Id.ToString());
                                }
                            }

                            if (userType == "05")
                            {
                                Exception serviceEx = new Exception("Es necesario cambiar el tipo de usuario de este contacto para poder gestionar los productos.");
                                serviceEx.Data["HasFeedbackMessage"] = true;
                                throw serviceEx;
                            }


                            updatePatientRequest = helperMethods.GetPatientUpdateStructure(contact, service, trace);
                        }

                        #endregion -> Related Contact

                        doseEntity = new DoseEntity();
                        switch (context.MessageName.ToLower())
                        {
                        case "create":

                            #region Dose Created

                            //Validar que exista la relación Dosis-Producto
                            if (doseInput.Attributes.Contains(DoseFields.DosexProduct))
                            {
                                EntityReference productReference = null;
                                //Se obtiene la referencia del producto que tiene la entidad Dosis
                                productReference = (EntityReference)doseInput.Attributes[DoseFields.DosexProduct];
                                if (productReference != null)
                                {
                                    //Se obtiene el producto
                                    product = service.Retrieve(productEntity.EntitySingularName, productReference.Id, new ColumnSet(new string[] { ProductFields.ProductNumber }));

                                    //Se obtiene el ID del producto
                                    if (product.Attributes.Contains(ProductFields.ProductNumber))
                                    {
                                        string frequency = "";

                                        if (doseInput.Attributes.Contains(DoseFields.Dose))
                                        {
                                            int value = (doseInput.GetAttributeValue <OptionSetValue>(DoseFields.Dose)).Value;
                                            frequency = sharedMethods.GetDoseFrequencyValue(value);
                                        }

                                        if (updatePatientRequest.medication == null)
                                        {
                                            updatePatientRequest.medication = new UpdatePatientRequest.Request.Medication();
                                        }

                                        if (updatePatientRequest.medication.products != null)
                                        {
                                            //guardar la cantidad de productos que tiene el paciente
                                            var tempProducts = updatePatientRequest.medication.products;

                                            //inicializar un nuevo array con una posición adicional que guardará el nuevo dosis-producto
                                            updatePatientRequest.medication.products = new UpdatePatientRequest.Request.Product[tempProducts.Length + 1];

                                            for (int i = 0; i < tempProducts.Length; i++)
                                            {
                                                updatePatientRequest.medication.products[i] = new UpdatePatientRequest.Request.Product
                                                {
                                                    frequency = tempProducts[i].frequency,
                                                    productid = tempProducts[i].productid
                                                };
                                            }

                                            //agregar el nuevo dosis-producto al array
                                            updatePatientRequest.medication.products[updatePatientRequest.medication.products.Length - 1] = new UpdatePatientRequest.Request.Product
                                            {
                                                frequency = frequency,
                                                productid = product.GetAttributeValue <string>(ProductFields.ProductNumber)
                                            };
                                        }
                                        else
                                        {
                                            updatePatientRequest.medication.products = new UpdatePatientRequest.Request.Product[1];
                                            updatePatientRequest.medication.products[updatePatientRequest.medication.products.Length - 1] = new UpdatePatientRequest.Request.Product
                                            {
                                                frequency = frequency,
                                                productid = product.GetAttributeValue <string>(ProductFields.ProductNumber)
                                            };
                                        }
                                    }
                                }
                            }

                            #endregion Dose Created

                            break;

                        case "delete":

                            //Validar que exista la relación Dosis-Producto
                            if (doseInput.Attributes.Contains(DoseFields.EntityId))
                            {
                                EntityReference productReference = null;
                                productReference = (EntityReference)doseInput.Attributes[DoseFields.DosexProduct];

                                //Se obtiene la referencia del producto que tiene la entidad Dosis
                                product = service.Retrieve(productEntity.EntitySingularName, productReference.Id, new ColumnSet(new string[] { ProductFields.ProductNumber }));

                                if (product != null)
                                {
                                    //Se obtiene el ID del producto
                                    if (product.Attributes.Contains(ProductFields.ProductNumber))
                                    {
                                        if (updatePatientRequest.medication != null)
                                        {
                                            System.Collections.Generic.List <UpdatePatientRequest.Request.Product> productsToSave = new System.Collections.Generic.List <UpdatePatientRequest.Request.Product>();

                                            for (int i = 0; i < updatePatientRequest.medication.products.Length; i++)
                                            {
                                                /*Agregar a la lista de los productos-dosis que se enviarán al servicio todos los productos excepto el producto de la dosis que se está eliminando*/
                                                if (updatePatientRequest.medication.products[i].productid != product.GetAttributeValue <string>(ProductFields.ProductNumber))
                                                {
                                                    productsToSave.Add(updatePatientRequest.medication.products[i]);
                                                }
                                            }

                                            int countProductsRelated = updatePatientRequest.medication.products.Length;

                                            //reducir el tamaño del array
                                            updatePatientRequest.medication.products = new UpdatePatientRequest.Request.Product[countProductsRelated - 1];

                                            //agregar los productos que se van a guardar.
                                            for (int i = 0; i < updatePatientRequest.medication.products.Length; i++)
                                            {
                                                updatePatientRequest.medication.products[i] = productsToSave[i];
                                            }
                                        }
                                    }
                                }
                            }

                            break;

                        case "update":

                            //Validar que exista la relación Dosis-Producto
                            if (doseInput.Attributes.Contains(DoseFields.DosexProduct))
                            {
                                EntityReference productReference = null;
                                //Se obtiene la referencia del producto que tiene la entidad Dosis
                                productReference = (EntityReference)doseInput.Attributes[DoseFields.DosexProduct];
                                if (productReference != null)
                                {
                                    //Se obtiene el producto
                                    product = service.Retrieve(productEntity.EntitySingularName, productReference.Id, new ColumnSet(new string[] { ProductFields.ProductNumber }));

                                    //Se obtiene el ID del producto
                                    if (product.Attributes.Contains(ProductFields.ProductNumber))
                                    {
                                        string frequency = "";

                                        if (doseInput.Attributes.Contains(DoseFields.Dose))
                                        {
                                            int value = (doseInput.GetAttributeValue <OptionSetValue>(DoseFields.Dose)).Value;
                                            frequency = sharedMethods.GetDoseFrequencyValue(value);
                                        }

                                        if (updatePatientRequest.medication == null)
                                        {
                                            updatePatientRequest.medication = new UpdatePatientRequest.Request.Medication();
                                        }

                                        for (int i = 0; i < updatePatientRequest.medication.products.Length; i++)
                                        {
                                            //Buscar el producto que se está actualizando para cambiarle los datos
                                            if (updatePatientRequest.medication.products[i].productid == product.GetAttributeValue <string>(ProductFields.ProductNumber))
                                            {
                                                //actualizar la frecuencia, el producto no debe actualizarse, para esto se crea otro
                                                updatePatientRequest.medication.products[i] = new UpdatePatientRequest.Request.Product
                                                {
                                                    frequency = frequency,
                                                    productid = updatePatientRequest.medication.products[i].productid
                                                };
                                                break;
                                            }
                                        }
                                    }
                                }
                            }

                            break;
                        }

                        ///Request service POST
                        ///

                        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(UpdatePatientRequest.Request));
                        MemoryStream memoryStream             = new MemoryStream();
                        serializer.WriteObject(memoryStream, updatePatientRequest);
                        var jsonObject = Encoding.Default.GetString(memoryStream.ToArray());
                        memoryStream.Dispose();

                        //Valores necesarios para hacer el Post Request
                        WebRequestData wrData = new WebRequestData();
                        wrData.InputData     = jsonObject;
                        wrData.ContentType   = "application/json";
                        wrData.Authorization = "Bearer " + Configuration.TokenForAboxServices;

                        wrData.Url = AboxServices.UpdatePatientService;

                        var serviceResponse = sharedMethods.DoPostRequest(wrData, trace);
                        UpdatePatientRequest.ServiceResponse serviceResponseProperties = null;
                        if (serviceResponse.IsSuccessful)
                        {
                            DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(UpdatePatientRequest.ServiceResponse));

                            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                            {
                                deserializer = new DataContractJsonSerializer(typeof(UpdatePatientRequest.ServiceResponse));
                                serviceResponseProperties = (UpdatePatientRequest.ServiceResponse)deserializer.ReadObject(ms);
                            }

                            if (serviceResponseProperties.response.code != "MEMCTRL-1014")
                            {
                                trace.Trace(Constants.ErrorMessageCodeReturned + serviceResponseProperties.response.code);

                                Exception serviceEx = new Exception(Constants.GeneralAboxServicesErrorMessage + serviceResponseProperties.response.message);
                                serviceEx.Data["HasFeedbackMessage"] = true;
                                throw serviceEx;
                            }
                            else
                            {
                                //contact.Attributes.Add("new_idaboxpatient", serviceResponseProperties.response.details.idPaciente);
                            }
                        }
                        else
                        {
                            throw new InvalidPluginExecutionException(Constants.GeneralAboxServicesErrorMessage);
                        }

                        //TODO: Capturar excepción con servicios de Abox Plan y hacer un Logging
                    }
                }
            }
            catch (Exception ex)
            {
                trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());

                try
                {
                    sharedMethods.LogPluginFeedback(new LogClass
                    {
                        Exception  = ex.ToString(),
                        Level      = "error",
                        ClassName  = this.GetType().ToString(),
                        MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                        Message    = "Excepción en plugin",
                        ProcessId  = ""
                    }, trace);
                }
                catch (Exception e)
                {
                    trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + e.ToString());
                }

                if (ex.Data["HasFeedbackMessage"] != null)
                {
                    throw new InvalidPluginExecutionException(ex.Message);
                }
                else
                {
                    throw new InvalidPluginExecutionException(Constants.GeneralPluginErrorMessage);
                }
            }
        }
        public List <string> GetEntityValidationStatus(Entity contact, Microsoft.Xrm.Sdk.ITracingService trace)
        {
            List <string> validationMessages = new List <string>();

            MShared sharedMethods = new MShared();

            try
            {
                bool isChildContact = false;
                if (contact.Attributes.Contains(ContactFields.IsChildContact))
                {
                    isChildContact = contact.GetAttributeValue <bool>(ContactFields.IsChildContact);
                }

                if (contact.Attributes.Contains(ContactFields.Id))
                {
                    if (contact.Attributes.Contains(ContactFields.IdType))
                    {
                        int idType = contact.GetAttributeValue <OptionSetValue>(ContactFields.IdType).Value;

                        if (idType != Constants.ForeignerIdValue && idType != Constants.MinorIdValue)
                        {
                            if (!sharedMethods.IsValidNumericID(contact.Attributes[ContactFields.Id].ToString(), trace))
                            {
                                validationMessages.Add(ValidationMessages.Contact.IdentificationFormat);
                            }
                        }
                        else if (idType == Constants.ForeignerIdValue)
                        {
                            if (!sharedMethods.IsAlphanumeric(contact.Attributes[ContactFields.Id].ToString(), trace))
                            {
                                validationMessages.Add(ValidationMessages.Contact.AlphanumericForeignerIdFormat + " en el campo Cédula");
                            }
                        }
                    }
                }



                if (contact.Attributes.Contains(ContactFields.Firstname))
                {
                    if (!sharedMethods.IsValidName(contact.Attributes[ContactFields.Firstname].ToString(), trace))
                    {
                        validationMessages.Add($"{ValidationMessages.Contact.ValidName} en el campo Nombre");
                    }

                    if (!sharedMethods.IsValidMaxLength(contact.Attributes[ContactFields.Firstname].ToString(), Constants.MaxNameLength, trace))
                    {
                        validationMessages.Add(String.Format(ValidationMessages.Contact.MaxLengthFormat, Constants.MaxNameLength) + " en el campo Nombre");
                    }

                    if (!sharedMethods.IsValidMinLength(contact.Attributes[ContactFields.Firstname].ToString(), Constants.MinNameLength, trace))
                    {
                        validationMessages.Add(String.Format(ValidationMessages.Contact.MinLengthFormat, Constants.MinNameLength) + " en el campo Nombre");
                    }
                }

                if (contact.Attributes.Contains(ContactFields.Lastname))
                {
                    if (!sharedMethods.IsValidLastname(contact.Attributes[ContactFields.Lastname].ToString(), trace))
                    {
                        validationMessages.Add($"{ValidationMessages.Contact.ValidName} en el campo Primer Apellido");
                    }

                    if (!sharedMethods.IsValidMaxLength(contact.Attributes[ContactFields.Lastname].ToString(), Constants.MaxNameLength, trace))
                    {
                        validationMessages.Add(String.Format(ValidationMessages.Contact.MaxLengthFormat, Constants.MaxNameLength) + " en el campo Primer Apellido");
                    }

                    if (!sharedMethods.IsValidMinLength(contact.Attributes[ContactFields.Lastname].ToString(), Constants.MinNameLength, trace))
                    {
                        validationMessages.Add(String.Format(ValidationMessages.Contact.MinLengthFormat, Constants.MinNameLength) + " en el campo Primer Apellido");
                    }
                }

                if (contact.Attributes.Contains(ContactFields.SecondLastname))
                {
                    if (!sharedMethods.IsValidLastname(contact.Attributes[ContactFields.SecondLastname].ToString(), trace))
                    {
                        validationMessages.Add($"{ValidationMessages.Contact.ValidName} en el campo Segundo Apellido");
                    }

                    if (!sharedMethods.IsValidMaxLength(contact.Attributes[ContactFields.SecondLastname].ToString(), Constants.MaxNameLength, trace))
                    {
                        validationMessages.Add(String.Format(ValidationMessages.Contact.MaxLengthFormat, Constants.MaxNameLength) + " en el campo Segundo Apellido");
                    }

                    if (!sharedMethods.IsValidMinLength(contact.Attributes[ContactFields.SecondLastname].ToString(), Constants.MinNameLength, trace))
                    {
                        validationMessages.Add(String.Format(ValidationMessages.Contact.MinLengthFormat, Constants.MinNameLength) + " en el campo Segundo Apellido");
                    }
                }

                if (contact.Attributes.Contains(ContactFields.Password))
                {
                    if (!isChildContact && !sharedMethods.IsValidPassword(contact.Attributes[ContactFields.Password].ToString(), trace))
                    {
                        validationMessages.Add($"{ValidationMessages.Contact.PasswordFormat}");
                    }
                }

                if (contact.Attributes.Contains(ContactFields.Birthdate))
                {
                    DateTime birthdate = new DateTime();
                    birthdate = contact.GetAttributeValue <DateTime>(ContactFields.Birthdate);
                    if (birthdate != null)
                    {
                        DateTime today = DateTime.Now;

                        if (sharedMethods.GetAge(birthdate) < 12 && !isChildContact)
                        {
                            validationMessages.Add(ValidationMessages.Contact.AgeLimit);
                        }
                    }
                }


                if (contact.Attributes.Contains(ContactFields.Phone))
                {
                    //Los contactos bajo cuido no validan este campo pues no lo tienen disponible, esta informacion la tiene le paciente a cargo de ellos
                    if (!isChildContact && !sharedMethods.HasOnlyNumbers(contact.Attributes[ContactFields.Phone].ToString(), trace))
                    {
                        validationMessages.Add($"{ValidationMessages.Contact.OnlyNumbers} en el campo Teléfono");
                    }
                }

                if (contact.Attributes.Contains(ContactFields.SecondaryPhone))
                {
                    //Los contactos bajo cuido no validan este campo pues no lo tienen disponible, esta informacion la tiene le paciente a cargo de ellos
                    if (!isChildContact && !sharedMethods.HasOnlyNumbers(contact.Attributes[ContactFields.SecondaryPhone].ToString(), trace))
                    {
                        validationMessages.Add($"{ValidationMessages.Contact.OnlyNumbers} en el campo Teléfono Opcional");
                    }
                }

                //if (contact.Attributes.Contains(ContactFields.Email))
                //{
                //    if (!sharedMethods.IsValidEmail(contact.Attributes[ContactFields.Email].ToString(), trace))
                //    {
                //        validationMessages.Add($"{ValidationMessages.Contact.OnlyNumbers} en el campo Teléfono Opcional");
                //    }
                //}

                return(validationMessages);
            }
            catch (Exception ex)
            {
                sharedMethods.LogPluginFeedback(new LogClass
                {
                    Exception  = ex.ToString(),
                    Level      = "error",
                    ClassName  = this.GetType().ToString(),
                    MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                    Message    = $"Error validando los datos de la entidad.",
                    ProcessId  = ""
                }, trace);
                trace.Trace($"MethodName: {new StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());

                throw ex;
            }
        }
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            sharedMethods = new MShared();
            try
            {
                // Obtain the execution context from the service provider.
                IPluginExecutionContext     context        = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService        service        = serviceFactory.CreateOrganizationService(context.UserId);
                // The InputParameters collection contains all the data passed in the message request.

                /*Esta validación previene la ejecución del Plugin de cualquier
                 * transacción realizada a través del Web API desde Abox*/
                if (context.InitiatingUserId == new Guid("7dbf49f3-8be8-ea11-a817-002248029f77"))
                {
                    return;
                }

                EntityReference targetEntity = null;

                string relationshipName = string.Empty;

                EntityReferenceCollection relatedEntities = null;

                EntityReference doctorRelated = null;

                Entity contact = null;

                UpdatePatientRequest.Request updatePatientRequest = null;

                #region Associate & Disassociate

                // if (context.MessageName.ToLower() == "associate" || context.MessageName.ToLower() == "disassociate")
                if (context.MessageName.ToLower() == "associate" || context.MessageName.ToLower() == "disassociate")
                {
                    contactEntity = new ContactEntity();

                    // Get the “Relationship” Key from context

                    if (context.InputParameters.Contains("Relationship"))

                    {
                        // Get the Relationship name for which this plugin fired
                        relationshipName = ((Relationship)context.InputParameters["Relationship"]).SchemaName;
                    }

                    // Check the "Relationship Name" with your intended one

                    if (relationshipName != ContactFields.ContactxDoctorRelationship)
                    {
                        return;
                    }
                    else
                    {
                        productEntity        = new ProductEntity();
                        updatePatientRequest = new UpdatePatientRequest.Request();
                        ContactMethods contactMethods = new ContactMethods();
                        #region -> Target

                        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
                        {
                            helperMethods = new RequestHelpers();
                            targetEntity  = (EntityReference)context.InputParameters["Target"];

                            string[] columnsToGet = new string[] { ContactFields.IdAboxPatient, ContactFields.Country, ContactFields.UserType, ContactFields.IdType, ContactFields.Id, ContactFields.Firstname, ContactFields.SecondLastname, ContactFields.Lastname, ContactFields.Gender, ContactFields.Birthdate };
                            var      columnSet    = new ColumnSet(columnsToGet);
                            contact = service.Retrieve(contactEntity.EntitySingularName, targetEntity.Id, columnSet);

                            var relatedContacts = contactMethods.GetContactChildContacts(contact, service);

                            if (relatedContacts != null)
                            {
                                if (relatedContacts.Entities.Count > 0)
                                {
                                    Exception serviceEx = new Exception("No es posible realizar esta operación en usuarios que tienen pacientes bajo cuido registrados.");
                                    serviceEx.Data["HasFeedbackMessage"] = true;
                                    throw serviceEx;
                                }
                            }


                            string userType = "";

                            if (contact.Attributes.Contains(ContactFields.UserType))
                            {
                                EntityReference userTypeReference = null;
                                userTypeReference = (EntityReference)contact.Attributes[ContactFields.UserType];
                                if (userTypeReference != null)
                                {
                                    userType = sharedMethods.GetUserTypeId(userTypeReference.Id.ToString());
                                }
                            }

                            if (userType == "05")
                            {
                                Exception serviceEx = new Exception("Es necesario cambiar el tipo de usuario de este contacto para poder agregar médicos.");
                                serviceEx.Data["HasFeedbackMessage"] = true;
                                throw serviceEx;
                            }
                            //updatePatientRequest.personalinfo = new UpdatePatientRequest.Request.Personalinfo();



                            updatePatientRequest = helperMethods.GetPatientUpdateStructure(contact, service, trace);
                        }

                        #endregion -> Target

                        #region -> Related

                        doctorEntity    = new DoctorEntity();
                        relatedEntities = context.InputParameters["RelatedEntities"] as EntityReferenceCollection;

                        if (relatedEntities.Count > 0)
                        {
                            if (context.MessageName.ToLower() == "associate")
                            {
                                #region -> Associate

                                int relatedEntitiesCount         = relatedEntities.Count;
                                int contactCurrentRelatedDoctors = 0;
                                System.Collections.Generic.List <UpdatePatientRequest.Request.Medic> medicsToSave = new System.Collections.Generic.List <UpdatePatientRequest.Request.Medic>();
                                if (updatePatientRequest.medication == null)
                                {
                                    updatePatientRequest.medication        = new UpdatePatientRequest.Request.Medication();
                                    updatePatientRequest.medication.medics = new UpdatePatientRequest.Request.Medic[relatedEntitiesCount];
                                }
                                else
                                {
                                    if (updatePatientRequest.medication.medics == null)
                                    {
                                        updatePatientRequest.medication.medics = new UpdatePatientRequest.Request.Medic[relatedEntitiesCount];
                                    }
                                    else
                                    {
                                        contactCurrentRelatedDoctors = updatePatientRequest.medication.medics.Length;

                                        if (contactCurrentRelatedDoctors > 0)
                                        {
                                            for (int i = 0; i < contactCurrentRelatedDoctors; i++)
                                            {
                                                medicsToSave.Add(updatePatientRequest.medication.medics[i]);
                                            }

                                            updatePatientRequest.medication.medics = new UpdatePatientRequest.Request.Medic[relatedEntitiesCount + contactCurrentRelatedDoctors];
                                        }
                                    }
                                }

                                for (int i = 0; i < relatedEntitiesCount; i++)
                                {
                                    doctorRelated = relatedEntities[i];

                                    Entity doctor = service.Retrieve(doctorEntity.EntitySingularName, doctorRelated.Id, new ColumnSet(DoctorFields.DoctorIdKey));
                                    if (doctor.Attributes.Contains(DoctorFields.DoctorIdKey))
                                    {
                                        medicsToSave.Add(new UpdatePatientRequest.Request.Medic
                                        {
                                            medicid = doctor.GetAttributeValue <string>(DoctorFields.DoctorIdKey)
                                        });
                                    }
                                }

                                int totalMedicsToSaveCount = updatePatientRequest.medication.medics.Length;
                                for (int i = 0; i < totalMedicsToSaveCount; i++)
                                {
                                    updatePatientRequest.medication.medics[i] = medicsToSave[i];
                                }

                                #endregion -> Associate
                            }
                            else
                            {
                                #region -> Disassociate

                                if (updatePatientRequest.medication != null)
                                {
                                    if (updatePatientRequest.medication.medics != null)
                                    {
                                        System.Collections.Generic.List <UpdatePatientRequest.Request.Medic> medicsToSave = new System.Collections.Generic.List <UpdatePatientRequest.Request.Medic>();

                                        //Recorrer la lista de medicos que se estan desasociando del contacto
                                        foreach (var relatedItem in relatedEntities)
                                        {
                                            //Obtener la entidad con el Id de Medico
                                            Entity doctorToRemove = service.Retrieve(doctorEntity.EntitySingularName, relatedItem.Id, new ColumnSet(DoctorFields.DoctorIdKey));
                                            int    medicsLength   = updatePatientRequest.medication.medics.Length;

                                            //Buscar en la lista de medicos que tiene el usuario
                                            for (int i = 0; i < medicsLength; i++)
                                            {
                                                //Agregar a la lista de medicos a guardar, aquellos que no fueron desasociados
                                                if (updatePatientRequest.medication.medics[i].medicid != doctorToRemove.GetAttributeValue <string>(DoctorFields.DoctorIdKey))
                                                {
                                                    medicsToSave.Add(updatePatientRequest.medication.medics[i]);
                                                }
                                            }
                                        }

                                        //Enviar como null si no hay pacientes a guardar
                                        if (medicsToSave.Count == 0)
                                        {
                                            updatePatientRequest.medication.medics = null;
                                        }
                                        else
                                        {
                                            //Modificar el tamaño del array y agregar los médicos que se guardarán
                                            updatePatientRequest.medication.medics = new UpdatePatientRequest.Request.Medic[medicsToSave.Count];
                                            int length = updatePatientRequest.medication.medics.Length;
                                            for (int i = 0; i < length; i++)
                                            {
                                                updatePatientRequest.medication.medics[i] = medicsToSave[i];
                                            }
                                        }
                                    }
                                }

                                #endregion -> Disassociate
                            }
                        }

                        #endregion -> Related

                        ///Request service POST
                        ///

                        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(UpdatePatientRequest.Request));
                        MemoryStream memoryStream             = new MemoryStream();
                        serializer.WriteObject(memoryStream, updatePatientRequest);
                        var jsonObject = Encoding.Default.GetString(memoryStream.ToArray());
                        memoryStream.Dispose();

                        //Valores necesarios para hacer el Post Request
                        WebRequestData wrData = new WebRequestData();
                        wrData.InputData     = jsonObject;
                        wrData.ContentType   = "application/json";
                        wrData.Authorization = "Bearer " + Configuration.TokenForAboxServices;

                        wrData.Url = AboxServices.UpdatePatientService;

                        var serviceResponse = sharedMethods.DoPostRequest(wrData, trace);
                        UpdatePatientRequest.ServiceResponse serviceResponseProperties = null;
                        if (serviceResponse.IsSuccessful)
                        {
                            DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(UpdatePatientRequest.ServiceResponse));

                            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                            {
                                deserializer = new DataContractJsonSerializer(typeof(UpdatePatientRequest.ServiceResponse));
                                serviceResponseProperties = (UpdatePatientRequest.ServiceResponse)deserializer.ReadObject(ms);
                            }

                            if (serviceResponseProperties.response.code != "MEMCTRL-1014")
                            {
                                trace.Trace(Constants.ErrorMessageCodeReturned + serviceResponseProperties.response.code);

                                Exception serviceEx = new Exception(Constants.GeneralAboxServicesErrorMessage + serviceResponseProperties.response.message);
                                serviceEx.Data["HasFeedbackMessage"] = true;
                                throw serviceEx;
                            }
                            else
                            {
                                //contact.Attributes.Add("new_idaboxpatient", serviceResponseProperties.response.details.idPaciente);
                            }
                        }
                        else
                        {
                            throw new InvalidPluginExecutionException(Constants.GeneralAboxServicesErrorMessage);
                        }
                    }
                }

                #endregion Associate & Disassociate
            }
            catch (Exception ex)
            {
                trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());

                try
                {
                    sharedMethods.LogPluginFeedback(new LogClass
                    {
                        Exception  = ex.ToString(),
                        Level      = "error",
                        ClassName  = this.GetType().ToString(),
                        MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                        Message    = "Excepción en plugin",
                        ProcessId  = ""
                    }, trace);
                }
                catch (Exception e)
                {
                    trace.Trace($"MethodName: {new System.Diagnostics.StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + e.ToString());
                }

                if (ex.Data["HasFeedbackMessage"] != null)
                {
                    throw new InvalidPluginExecutionException(ex.Message);
                }
                else
                {
                    throw new InvalidPluginExecutionException(Constants.GeneralPluginErrorMessage);
                }
            }
        }
示例#11
0
 public EDose()
 {
     sharedMethods    = new MShared();
     connectionString = ConfigurationManager.AppSettings["ConnectionString"].ToString();
 }
示例#12
0
        public List <string> GetEntityValidationStatus(Entity invoice, IOrganizationService service, Microsoft.Xrm.Sdk.ITracingService trace)
        {
            List <string> validationMessages = new List <string>();

            MShared       sharedMethods = new MShared();
            ContactEntity contactEntity = new ContactEntity();

            try
            {
                Entity contact = null;
                if (invoice.Attributes.Contains(InvoiceFields.Customer))
                {
                    EntityReference contactReference = invoice.GetAttributeValue <EntityReference>(InvoiceFields.Customer);

                    string[] columnsToGet = new string[] { ContactFields.IdAboxPatient, ContactFields.Country };
                    var      columnSet    = new ColumnSet(columnsToGet);
                    contact = service.Retrieve(contactEntity.EntitySingularName, contactReference.Id, columnSet);

                    if (contact != null)
                    {
                        if (!contact.Attributes.Contains(ContactFields.IdAboxPatient))
                        {
                            validationMessages.Add($"Este contacto no posee un Id de paciente Abox registrado");
                        }
                    }
                }

                if (!invoice.Attributes.Contains(InvoiceFields.Pharmacy))
                {
                    validationMessages.Add($"La farmacia es requerida.");
                }


                if (invoice.Attributes.Contains(InvoiceFields.InvoiceImageWebUrl))
                {
                    if (String.IsNullOrEmpty(invoice.GetAttributeValue <string>(InvoiceFields.InvoiceImageWebUrl)))
                    {
                        validationMessages.Add($"La imagen de la factura es requerida.");
                    }
                }
                else
                {
                    validationMessages.Add($"La imagen de la factura es requerida.");
                }

                if (invoice.Attributes.Contains(InvoiceFields.ProductsSelectedJson))
                {
                    if (String.IsNullOrEmpty(invoice.GetAttributeValue <string>(InvoiceFields.ProductsSelectedJson)))
                    {
                        validationMessages.Add($"No se han podido identificar los productos requeridos para guardar esta factura.");
                    }
                }
                else
                {
                    validationMessages.Add($"No se han podido identificar los productos requeridos para guardar esta factura.");
                }



                if (invoice.Attributes.Contains(InvoiceFields.PurchaseDate))
                {
                    DateTime date = new DateTime();
                    date = invoice.GetAttributeValue <DateTime>(InvoiceFields.PurchaseDate);
                    if (date != null)
                    {
                        DateTime today = DateTime.Now;

                        if (date > today)
                        {
                            validationMessages.Add("La fecha de la factura no puede ser mayor a la fecha actual.");
                        }
                    }
                }
                else
                {
                    validationMessages.Add($"La fecha de la factura es requerida.");
                }



                //if (invoice.Attributes.Contains(InvoiceFields.PurchaseDate))
                //{
                //    DateTime date = new DateTime();
                //    date = invoice.GetAttributeValue<DateTime>(InvoiceFields.PurchaseDate);
                //    if (date != null)
                //    {
                //        DateTime today = DateTime.Now;

                //        if (DateTime.)
                //        {

                //        }

                //    }
                //}



                return(validationMessages);
            }
            catch (Exception ex)
            {
                sharedMethods.LogPluginFeedback(new LogClass
                {
                    Exception  = ex.ToString(),
                    Level      = "error",
                    ClassName  = this.GetType().ToString(),
                    MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                    Message    = $"Error validando los datos de la entidad.",
                    ProcessId  = ""
                }, trace);
                trace.Trace($"MethodName: {new StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());

                throw ex;
            }
        }
示例#13
0
        /// <summary>
        /// Obtiene un objeto para convertir a JSON y enviarlo a los servicios de Abox Plan.
        /// </summary>
        /// <param name="invoice">Entidad factura a la que se le extraen los atributos</param>
        /// <param name="service"></param>
        /// <param name="trace"></param>
        /// <returns></returns>
        public InvoiceCreateRequest.Request GetInvoiceCreateRequestObject(Entity invoice, IOrganizationService service, ITracingService trace)
        {
            var     request       = new InvoiceCreateRequest.Request();
            MShared sharedMethods = new MShared();

            try
            {
                ContactEntity  contactEntity  = new ContactEntity();
                PharmacyEntity pharmacyEntity = new PharmacyEntity();

                Entity contact = null;
                if (invoice.Attributes.Contains(InvoiceFields.Customer))
                {
                    EntityReference contactReference = invoice.GetAttributeValue <EntityReference>(InvoiceFields.Customer);

                    string[] columnsToGet = new string[] { ContactFields.IdAboxPatient, ContactFields.Country };
                    var      columnSet    = new ColumnSet(columnsToGet);
                    contact = service.Retrieve(contactEntity.EntitySingularName, contactReference.Id, columnSet);
                }

                if ((contact != null) && (contact.Attributes.Contains(ContactFields.IdAboxPatient)))
                {
                    request.patientId = contact.GetAttributeValue <int>(ContactFields.IdAboxPatient);
                }

                if (invoice.Attributes.Contains(InvoiceFields.InvoiceNumber))
                {
                    request.billId = invoice.GetAttributeValue <string>(InvoiceFields.InvoiceNumber);
                }


                if (invoice.Attributes.Contains(InvoiceFields.PurchaseDate))
                {
                    DateTime date = new DateTime();
                    date = invoice.GetAttributeValue <DateTime>(InvoiceFields.PurchaseDate);
                    if (date != null)
                    {
                        request.billDate = date.ToString("yyyy-MM-dd");
                    }
                }

                if (invoice.Attributes.Contains(InvoiceFields.ProductsSelectedJson))
                {
                    DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(InvoiceCreateRequest.Request.Product[]));

                    using (var ms = new System.IO.MemoryStream(Encoding.Unicode.GetBytes(invoice.GetAttributeValue <string>(InvoiceFields.ProductsSelectedJson))))
                    {
                        deserializer     = new DataContractJsonSerializer(typeof(InvoiceCreateRequest.Request.Product[]));
                        request.products = (InvoiceCreateRequest.Request.Product[])deserializer.ReadObject(ms);
                    }
                }

                if (invoice.Attributes.Contains(InvoiceFields.InvoiceImageWebUrl))
                {
                    request.billImageUrl = invoice.GetAttributeValue <string>(InvoiceFields.InvoiceImageWebUrl);
                }



                if (invoice.Attributes.Contains(InvoiceFields.Pharmacy))
                {
                    EntityReference pharmacyReference = null;
                    pharmacyReference = (EntityReference)invoice.Attributes[InvoiceFields.Pharmacy];
                    if (pharmacyReference != null)
                    {
                        var pharmacyRetrieved = service.Retrieve(pharmacyEntity.EntitySingularName, pharmacyReference.Id, new ColumnSet(PharmacyFields.Id));
                        if (pharmacyRetrieved.Attributes.Contains(PharmacyFields.Id))
                        {
                            string idPharmacy = pharmacyRetrieved.GetAttributeValue <string>(PharmacyFields.Id);

                            if (!String.IsNullOrEmpty(idPharmacy))
                            {
                                request.pharmacyId = idPharmacy;
                            }
                        }
                    }
                }

                return(request);
            }
            catch (Exception ex)
            {
                sharedMethods.LogPluginFeedback(new LogClass
                {
                    Exception  = ex.ToString(),
                    Level      = "error",
                    ClassName  = this.GetType().ToString(),
                    MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                    Message    = $"Error al obtener la estructura para el request",
                    ProcessId  = ""
                }, trace);
                trace.Trace($"MethodName: {new StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());
                throw ex;
            }
        }
示例#14
0
        public InvoiceNumberCheckRequest.Request CheckInvoiceNumberRequest(Entity invoice, IOrganizationService service, ITracingService trace)
        {
            InvoiceNumberCheckRequest.Request requestResponse = new InvoiceNumberCheckRequest.Request();
            MShared        sharedMethods  = new MShared();
            ContactEntity  contactEntity  = new ContactEntity();
            PharmacyEntity pharmacyEntity = new PharmacyEntity();
            CountryEntity  countryEntity  = new CountryEntity();

            try
            {
                Entity contact = null;
                if (invoice.Attributes.Contains(InvoiceFields.Customer))
                {
                    EntityReference contactReference = invoice.GetAttributeValue <EntityReference>(InvoiceFields.Customer);

                    string[] columnsToGet = new string[] { ContactFields.IdAboxPatient, ContactFields.Country };
                    var      columnSet    = new ColumnSet(columnsToGet);
                    contact = service.Retrieve(contactEntity.EntitySingularName, contactReference.Id, columnSet);

                    if (contact != null)
                    {
                        if (contact.Attributes.Contains(ContactFields.Country))
                        {
                            EntityReference countryReference = null;
                            countryReference = (EntityReference)contact.Attributes[ContactFields.Country];
                            if (countryReference != null)
                            {
                                var countryRetrieved = service.Retrieve(countryEntity.EntitySingularName, countryReference.Id, new ColumnSet(CountryFields.IdCountry));
                                if (countryRetrieved.Attributes.Contains(CountryFields.IdCountry))
                                {
                                    string country = countryRetrieved.GetAttributeValue <string>(CountryFields.IdCountry);

                                    if (!String.IsNullOrEmpty(country))
                                    {
                                        requestResponse.countryId = country;
                                    }
                                }
                            }
                        }
                    }

                    if (invoice.Attributes.Contains(InvoiceFields.Pharmacy))
                    {
                        EntityReference pharmacyReference = null;
                        pharmacyReference = (EntityReference)invoice.Attributes[InvoiceFields.Pharmacy];
                        if (pharmacyReference != null)
                        {
                            var pharmacyRetrieved = service.Retrieve(pharmacyEntity.EntitySingularName, pharmacyReference.Id, new ColumnSet(PharmacyFields.Id));
                            if (pharmacyRetrieved.Attributes.Contains(PharmacyFields.Id))
                            {
                                string idPharmacy = pharmacyRetrieved.GetAttributeValue <string>(PharmacyFields.Id);

                                if (!String.IsNullOrEmpty(idPharmacy))
                                {
                                    requestResponse.pharmacyId = Convert.ToInt32(idPharmacy);
                                }
                            }
                        }
                    }

                    if (invoice.Attributes.Contains(InvoiceFields.InvoiceNumber))
                    {
                        requestResponse.purchaseNumber = invoice.GetAttributeValue <string>(InvoiceFields.InvoiceNumber);
                    }
                }
                return(requestResponse);
            }
            catch (Exception ex)
            {
                sharedMethods.LogPluginFeedback(new LogClass
                {
                    Exception  = ex.ToString(),
                    Level      = "error",
                    ClassName  = this.GetType().ToString(),
                    MethodName = System.Reflection.MethodBase.GetCurrentMethod().Name,
                    Message    = $"Error al obtener la estructura para el request",
                    ProcessId  = ""
                }, trace);
                trace.Trace($"MethodName: {new StackTrace(ex).GetFrame(0).GetMethod().Name}|--|Exception: " + ex.ToString());
                return(null);
            }
        }