/// <summary> /// Método de la capa business para aplicar el vale de finlag /// </summary> /// <param name="aplicaValeRequest"></param> /// <returns></returns> public ResponseBussiness <OperationResponse> ProcesarAplicarValeFinlag(AplicaValeRequest aplicaValeRequest) { return(tryCatch.SafeExecutor(() => { using (TransactionScope scope = new TransactionScope()) { OperationResponse operationResponse = new OperationResponse(); // Se procesa en el servicio externo de Finlag para procesar la venta var respuestaWS = AplicarValeInternal(aplicaValeRequest); // Se procesa el movimiento Pago localmente if (respuestaWS.NumeroCodigo == 100) { // Si resultado OK se solicita y persiste la trama de impresión ConsultaValeFinlagRequest consultaValeFinlagRequest = new ConsultaValeFinlagRequest(); consultaValeFinlagRequest.FolioVale = aplicaValeRequest.FolioVale; ConsultaTramaImpresionResult consultaTramaImpresionResult = this.ObtenerTramaImpresion(consultaValeFinlagRequest); finlagRepository.ProcesarTramaImpresion(token.CodeStore, token.CodeBox, token.CodeEmployee, aplicaValeRequest.FolioOperacionAsociada, consultaTramaImpresionResult); // -------------- Si resultado OK se procesa el pago Finlag en base de datos localmente // Se procesan las promociones por venta foreach (var item in aplicaValeRequest.DescuentosPromocionalesPorVentaAplicados.DescuentoPromocionesAplicados) { OperationResponse response = new OperationResponse(); response = paymentProcessingRepository.PersistirPromocionesVenta(aplicaValeRequest.FolioOperacionAsociada, token.CodeStore, token.CodeBox, item.ImporteDescuento , item.CodigoPromocionAplicado, item.DescripcionCodigoPromocionAplicado, item.PorcentajeDescuento, item.CodigoRazonDescuento, item.FormaPagoCodigoPromocionAplicado); } // Se procesan las promociones por línea de venta foreach (var item in aplicaValeRequest.DescuentosPromocionalesPorLineaAplicados.DescuentoPromocionesAplicados) { OperationResponse response = new OperationResponse(); response = paymentProcessingRepository.PersistirPromocionesLineaVenta(aplicaValeRequest.FolioOperacionAsociada, token.CodeStore, token.CodeBox, item.Secuencia, item.ImporteDescuento , item.CodigoPromocionAplicado, item.DescripcionCodigoPromocionAplicado, item.PorcentajeDescuento, item.CodigoRazonDescuento, item.FormaPagoCodigoPromocionAplicado); } // Se persiste la información del cobro operationResponse = finlagRepository.ProcesarMovimientoAplicarVale(token.CodeStore, token.CodeBox, token.CodeEmployee, aplicaValeRequest); scope.Complete(); return operationResponse; } else { // Si resultado ERROR se regresa operationResponse.CodeNumber = respuestaWS.NumeroCodigo.ToString(); operationResponse.CodeDescription = respuestaWS.DescripcionCodigo; return operationResponse; } } })); }
/// <summary> /// Metodo para procesar tarjetas bancarias VISA/MASTERCARD /// </summary> /// <param name="request">Movimiento tarjeta bancaria</param> /// <returns>Respuesta de la operación</returns> public ResponseBussiness <PagoBancarioResponse> ProcesarTarjetaBancariaVisaMaster(ProcesarMovimientoTarjetaBancariaRequest request) { try { //return tryCatch.SafeExecutor(() => //{ PagoBancarioResponse respuesta = new PagoBancarioResponse(); using (TransactionScope scope = new TransactionScope()) { TarjetaBancariaBusiness tarjeta = new TarjetaBancariaBusiness(this.token); var funcionesCaja = funcionesRepository.GetFunctions(token.CodeBox, token.CodeStore); s.LogEntry(this.token.ToString(), 3); s.LogEntry(token.CodeBox.ToString(), 3); s.LogEntry(token.CodeStore.ToString(), 3); s.LogEntry(" vaciado token", 3); if (funcionesCaja != null) { s.LogEntry(" Entro a funciones caja diferente de nulo", 3); //s.LogEntry(" DescuentoPromocionesAplicados: " + request.Venta.ToString(), 1); if (request == null) { s.LogEntry(" request null", 3); } else { s.LogEntry(" request no null", 3); } if (request.DescuentosPromocionalesPorVentaAplicados.DescuentoPromocionesAplicados == null) { s.LogEntry(" Las promiciones son nulas", 3); } else { s.LogEntry(" Las promiciones son NO es nulo", 3); s.LogEntry($" TTTTT Las promiciones son NO es nulo {request.DescuentosPromocionalesPorVentaAplicados.DescuentoPromocionesAplicados.Length}", 3); } if (request.DescuentosPromocionalesPorVentaAplicados.DescuentoPromocionesAplicados.Length > 0) { s.LogEntry(" Las promiciones son cero", 3); } else { s.LogEntry($"es mayor a 0: {request.DescuentosPromocionalesPorVentaAplicados.DescuentoPromocionesAplicados.Length}", 1); } // Se procesan las promociones por venta foreach (var item in request.DescuentosPromocionalesPorVentaAplicados.DescuentoPromocionesAplicados) { OperationResponse response = new OperationResponse(); response = repository.PersistirPromocionesVenta(request.Venta.FolioOperacionAsociada, token.CodeStore, token.CodeBox, item.ImporteDescuento , item.CodigoPromocionAplicado, item.DescripcionCodigoPromocionAplicado, item.PorcentajeDescuento, item.CodigoRazonDescuento, item.FormaPagoCodigoPromocionAplicado); } // Se procesan las promociones por línea de venta foreach (var item in request.DescuentosPromocionalesPorLineaAplicados.DescuentoPromocionesAplicados) { OperationResponse response = new OperationResponse(); response = repository.PersistirPromocionesLineaVenta(request.Venta.FolioOperacionAsociada, token.CodeStore, token.CodeBox, item.Secuencia, item.ImporteDescuento , item.CodigoPromocionAplicado, item.DescripcionCodigoPromocionAplicado, item.PorcentajeDescuento, item.CodigoRazonDescuento, item.FormaPagoCodigoPromocionAplicado); } s.LogEntry(" antes de tarjeta.CobroVisaMasterCard", 3); s.LogEntry($" funcionesCaja.UrlLecturaBancaria: { funcionesCaja.UrlLecturaBancaria}", 3); s.LogEntry($" token.CodeStore: { token.CodeStore}", 3); s.LogEntry($" request.Venta.FolioOperacionAsociada: { request.Venta.FolioOperacionAsociada}", 3); s.LogEntry($" request.Venta.MesesFinanciamiento: { request.Venta.MesesFinanciamiento}", 3); s.LogEntry($" request.Venta.MesesParcialidades: { request.Venta.MesesParcialidades}", 3); s.LogEntry($" request.Venta.CodigoPromocion: {request.Venta.CodigoPromocion}", 3); s.LogEntry($" request.Venta.ImporteVentaTotal: {request.Venta.CodigoPromocion}", 3); s.LogEntry($" request.Venta.SecuenciaFormaPagoImporte: {request.Venta.SecuenciaFormaPagoImporte}", 3); respuesta = tarjeta.CobroVisaMasterCard(funcionesCaja.UrlLecturaBancaria, token.CodeStore, request.Venta.FolioOperacionAsociada, request.Venta.MesesFinanciamiento, request.Venta.MesesParcialidades, request.Venta.CodigoPromocion, request.Venta.ImporteVentaTotal, request.Venta.SecuenciaFormaPagoImporte); s.LogEntry(" despues de tarjeta.CobroVisaMasterCard", 3); if (!respuesta.SePuedePagarConPuntos && !respuesta.SePuedeRetirar) { if (respuesta.CodeNumber == 0) { request.Venta.CodigoFormaPagoImporte = respuesta.TipoTarjeta; var repuestaLocal = repository.ProcesarMovimientoTarjetaBancariaVenta(token.CodeStore, token.CodeBox, token.CodeEmployee, respuesta.Authorization, respuesta.CardNumber, request); scope.Complete(); } } } else { respuesta.CodeNumber = 103; respuesta.CodeDescription = "No existe funciones asociadas a la caja, revise las funciones registradas de la caja"; } } s.LogEntry("Sin errores", 1); return(respuesta); //}); } catch (Exception ex) { s.LogEntry(ex.Message, 3); s.LogEntry(ex.InnerException.Message, 3); return(null); } }
/// <summary> /// Método para finalizar la compra por tarjeta de MM /// </summary> /// <param name="request">Objeto petición con información de TCMM asociada</param> /// <returns></returns> public ResponseBussiness <FinalizarCompraResponse> FinalizarCompraTCMM(FinalizarCompraRequest request) { //request.PlanFinanciamiento: ID del plan de financiamiento //request.ImporteVentaTotal: Monto autorizado con la TCMM string mesesFinanciados; string montoMensualidad; //OCG: Recuparar número de meses para el financiamiento mesesFinanciados = request.MesesFinanciados.ToString(); return(tryCatch.SafeExecutor(() => { FinalizarCompraResponse response = new FinalizarCompraResponse(); InfoService infoService = new InfoService(); InformacionServiciosExternosBusiness informacionServiciosExternosBusiness = new InformacionServiciosExternosBusiness(); infoService = informacionServiciosExternosBusiness.ObtenerCadenaServicioExterno(7); var cadenaURL = infoService.UrlService; HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(cadenaURL + "/getPurchaseAuthorization"); httpWebRequest.Headers.Add("Authorization", credenciales.Licence); httpWebRequest.Method = "POST"; httpWebRequest.ContentType = "application/json"; var serializer = new Newtonsoft.Json.JsonSerializer(); // Inicia la Transaccion using (TransactionScope scope = new TransactionScope()) { // Se procesan las promociones por venta foreach (var item in request.DescuentosPromocionalesPorVentaAplicados.DescuentoPromocionesAplicados) { repository.PersistirPromocionesVenta(request.FolioOperacionAsociada, token.CodeStore, token.CodeBox, item.ImporteDescuento , item.CodigoPromocionAplicado, item.DescripcionCodigoPromocionAplicado, item.PorcentajeDescuento, item.CodigoRazonDescuento, item.FormaPagoCodigoPromocionAplicado); } // Se procesan las promociones por línea de venta foreach (var item in request.DescuentosPromocionalesPorLineaAplicados.DescuentoPromocionesAplicados) { repository.PersistirPromocionesLineaVenta(request.FolioOperacionAsociada, token.CodeStore, token.CodeBox, item.Secuencia, item.ImporteDescuento , item.CodigoPromocionAplicado, item.DescripcionCodigoPromocionAplicado, item.PorcentajeDescuento, item.CodigoRazonDescuento, item.FormaPagoCodigoPromocionAplicado); } //OCG: // Se procesa la persistencia localmente var movimientoVenta = repository.ProcesarMovimientoTarjetaMelodyMilano(token.CodeStore, token.CodeBox, token.CodeEmployee, "", request.NumeroTarjeta, request); // Se invoca el Servicio de Milano using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { using (var textWriter = new Newtonsoft.Json.JsonTextWriter(streamWriter)) { serializer.Serialize(textWriter, new { User = credenciales.UserName, Pwd = credenciales.Password, CardId = request.NumeroTarjeta, BranchId = token.CodeStore, TerminalNumber = token.CodeBox, VoucherNumber = movimientoVenta.Transaccion, TransactionAmount = request.ImporteVentaTotal, EntryMode = 12, FinancingSchemeId = request.PlanFinanciamiento }); } } var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var responseText = streamReader.ReadToEnd(); JToken responseJObject = JObject.Parse(responseText); response.CodigoRespuestaTCMM = new CodigoRespuestaTCMM(); response.CodigoRespuestaTCMM.CodigoRespuesta = Convert.ToString(responseJObject.SelectToken("ErrorCode")); response.CodigoRespuestaTCMM.MensajeRetorno = Convert.ToString(responseJObject.SelectToken("Message")); //OCG: Recuperar los valores del financiamiento para poder actualizar la tabla UpdatePlanFinanciamientoTCMM planesFinanciamiento = new UpdatePlanFinanciamientoTCMM(); planesFinanciamiento.folioOperacion = request.FolioOperacionAsociada; planesFinanciamiento.montoMensualidad = Convert.ToString(responseJObject.SelectToken("Response.MonthlyPayment")); planesFinanciamiento.financiamientoId = request.MesesFinanciados.ToString(); planesFinanciamiento.codigoFormaPago = request.CodigoFormaPagoImporte; planesFinanciamiento.codigoTienda = token.CodeStore; planesFinanciamiento.fechaActualizacion = DateTime.Now; planesFinanciamiento.codigoCaja = token.CodeBox; repository.spMilano_ActualizaPlazoFinanciamiento(planesFinanciamiento); //-- if (response.CodigoRespuestaTCMM.CodigoRespuesta == "0") { // Actualizar la autorización regresada por WS Milano response.Authorization = Convert.ToString(responseJObject.SelectToken("Response").SelectToken("AuthorizationNumber")); repository.ActualizarMovimientoTarjetaMelodyMilano(token.CodeStore, token.CodeBox, movimientoVenta.Transaccion, response.Authorization, request); scope.Complete(); } } } // Finalizar la Transacción return response; })); }
/// <summary> /// Método para asociar las formas de pago a una transacción /// </summary> /// <param name="codeStore">Código de tienda</param> /// <param name="codeBox">Código de caja</param> /// <param name="codeEmployee">Código de empleado cajero</param> /// <param name="folioOperacion">Folio de la operación</param> /// <param name="formasPagoUtilizadas">Formas de pago utilizadas</param> /// <param name="clasificacionVenta">Clasificación de la venta</param> public void AsociarFormasPago(int codeStore, int codeBox, int codeEmployee, String folioOperacion, FormaPagoUtilizado[] formasPagoUtilizadas, string clasificacionVenta) { Divisa[] divisas = this.ObtenerFormasPagoEfectivoMonedaExtranjera(codeStore); List <string> listaDivisas = new List <string>(); foreach (Divisa divisa in divisas) { listaDivisas.Add(divisa.Codigo); } FormaPagoResponse[] formasPagoVales = this.getFormasPagoVales(codeStore); List <string> listaFormasPagoVales = new List <string>(); foreach (FormaPagoResponse formaPagoVale in formasPagoVales) { listaFormasPagoVales.Add(formaPagoVale.CodigoFormaPago); } PaymentProcessingRepository paymentProcessingRepository = new PaymentProcessingRepository(); foreach (var formaPagoUtilizada in formasPagoUtilizadas) { // Pagos que deben registrarse exitosamente al momento de finalizar if (formaPagoUtilizada.Estatus == "PP") { formaPagoUtilizada.Estatus = "PE"; // Pagos con Vales if (validarCodigoFormaPago(formaPagoUtilizada.CodigoFormaPagoImporte, listaFormasPagoVales.ToArray())) { paymentProcessingRepository.ProcesarMovimientoVales(codeStore, codeBox, codeEmployee, folioOperacion, formaPagoUtilizada, clasificacionVenta); // Se procesan las promociones por venta foreach (var item in formaPagoUtilizada.DescuentosPromocionalesPorVentaAplicados.DescuentoPromocionesAplicados) { OperationResponse response = new OperationResponse(); response = paymentProcessingRepository.PersistirPromocionesVenta(folioOperacion, codeStore, codeBox, item.ImporteDescuento , item.CodigoPromocionAplicado, item.DescripcionCodigoPromocionAplicado, item.PorcentajeDescuento, item.CodigoRazonDescuento, item.FormaPagoCodigoPromocionAplicado); } // Se procesan las promociones por línea de venta foreach (var item in formaPagoUtilizada.DescuentosPromocionalesPorLineaAplicados.DescuentoPromocionesAplicados) { OperationResponse response = new OperationResponse(); response = paymentProcessingRepository.PersistirPromocionesLineaVenta(folioOperacion, codeStore, codeBox, item.Secuencia, item.ImporteDescuento , item.CodigoPromocionAplicado, item.DescripcionCodigoPromocionAplicado, item.PorcentajeDescuento, item.CodigoRazonDescuento, item.FormaPagoCodigoPromocionAplicado); } } // Pagos con Efectivo y con Moneda Extranjera if (validarCodigoFormaPago(formaPagoUtilizada.CodigoFormaPagoImporte, listaDivisas.ToArray())) { paymentProcessingRepository.ProcesarMovimientoEfectivo(codeStore, codeBox, codeEmployee, folioOperacion, formaPagoUtilizada); // Se procesan las promociones por venta foreach (var item in formaPagoUtilizada.DescuentosPromocionalesPorVentaAplicados.DescuentoPromocionesAplicados) { OperationResponse response = new OperationResponse(); response = paymentProcessingRepository.PersistirPromocionesVenta(folioOperacion, codeStore, codeBox, item.ImporteDescuento , item.CodigoPromocionAplicado, item.DescripcionCodigoPromocionAplicado, item.PorcentajeDescuento, item.CodigoRazonDescuento, item.FormaPagoCodigoPromocionAplicado); } // Se procesan las promociones por línea de venta foreach (var item in formaPagoUtilizada.DescuentosPromocionalesPorLineaAplicados.DescuentoPromocionesAplicados) { OperationResponse response = new OperationResponse(); response = paymentProcessingRepository.PersistirPromocionesLineaVenta(folioOperacion, codeStore, codeBox, item.Secuencia, item.ImporteDescuento , item.CodigoPromocionAplicado, item.DescripcionCodigoPromocionAplicado, item.PorcentajeDescuento, item.CodigoRazonDescuento, item.FormaPagoCodigoPromocionAplicado); } } } // Pagos que ya estan registrados y solo deben asociarse al momento de finalizar if (formaPagoUtilizada.Estatus == "PR") { paymentProcessingRepository.AsociarMovimientoRegistrado(codeStore, codeBox, folioOperacion, formaPagoUtilizada); } } }