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;
            }
        }
示例#2
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 invoice = (Entity)context.InputParameters["Target"];

                    if (invoice.LogicalName != "invoice")
                    {
                        return;
                    }
                    else
                    {
                        ContactEntity contactEntity = new ContactEntity();
                        RequestHelpers reqHelpers = new RequestHelpers();
                        InvoiceMethods invoiceMethods = new InvoiceMethods();

                        


                        var validationStatusMessages = invoiceMethods.GetEntityValidationStatus(invoice, 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

                        //Verificar numero de factura

                        InvoiceNumberCheckRequest.Request checkInvoiceRequest = reqHelpers.CheckInvoiceNumberRequest(invoice, 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

                        InvoiceCreateRequest.Request request = reqHelpers.GetInvoiceCreateRequestObject(invoice, service, trace);
                        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(InvoiceCreateRequest.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.CreateInvoice;
                        wrData.Authorization = Configuration.TokenForAboxServices;

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

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

                            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                            {
                                deserializer = new DataContractJsonSerializer(typeof(InvoiceCreateRequest.ServiceResponse));
                                serviceResponseProperties = (InvoiceCreateRequest.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!=null)
                                {

                                    if ((serviceResponseProperties.response.details != null) && (serviceResponseProperties.response.details.validationresults != null) && (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 registrar la factura, por favor intenta nuevamente.";
                                        }
                                        Exception ex = new Exception($"{messageRows}");
                                        ex.Data["HasFeedbackMessage"] = true;
                                        throw ex;
                                    }else if (!String.IsNullOrEmpty(serviceResponseProperties.response.message))
                                    {
                                        string messageRows = serviceResponseProperties.response.message;
                                        Exception ex = new Exception($"{messageRows}");
                                        ex.Data["HasFeedbackMessage"] = true;
                                        throw ex;
                                    }
                                    else
                                    {
                                        string messageRows = "Ocurrió un error al registrar la factura, por favor intenta nuevamente.";
                                        Exception ex = new Exception($"{messageRows}");
                                        ex.Data["HasFeedbackMessage"] = true;
                                        throw ex;
                                    }

                                }


                                //

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

                            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(serviceResponse.Data)))
                            {
                                deserializer = new DataContractJsonSerializer(typeof(InvoiceCreateRequest.ServiceResponse));
                                serviceResponseProperties = (InvoiceCreateRequest.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);
                }
            }
        }
        /// <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;
            }
        }