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; } }
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; } }