Пример #1
0
        public override void Ejecutar()
        {
            Respuesta respuesta = new Respuesta();
            Dictionary <string, string> idsAcumulados = Entorno.Instancia.IdsAcumulados;
            PDevolucion devolucion = new PDevolucion();
            bool        implementaImpuestoCompuesto = Entorno.Instancia.Parametros.ObtenerValorParametro <bool>("pdv.definicion_impuesto_compuesta");

            /*if (!bool.TryParse(Parametros.Parametro("pdv.definicion_impuesto_compuesta").Valor, out implementaImpuestoCompuesto))
             * {
             *  implementaImpuestoCompuesto = false;
             * }*/

            // Imprimir factura
            string factura         = ProcesarPlantilla.Factura(Entorno.Instancia.Devolucion, Entorno.Instancia.Terminal, Entorno.Instancia.Usuario);
            string modeloImpresora = Entorno.Instancia.Impresora.Marca ?? "impresora";

            //
            log.InfoFormat("[CmdPagarVenta] Devolucion Finalizada, Transaccion: {0}, Factura {1}", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1), (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1));

            string tirillaActual = "";

            iu.PanelVentas.Tirilla.ForEach(x =>
            {
                tirillaActual += String.Format("Codigo: {0}, Descripción: {1} ({4}), Cantidad: {2}, Precio: {3} ", x.Codigo, x.Descripcion, x.Cantidad, x.Subtotal, x.PrecioVentaUnidad);
                tirillaActual += Environment.NewLine;
            });
            log.Info("Items tirilla:" + tirillaActual + Environment.NewLine + "Total: " + Entorno.Instancia.Devolucion.TotalVenta + Environment.NewLine + "Totales Impuestos: " + Entorno.Instancia.Devolucion.ImpuestosIncluidos.Sum(x => x.Value[2]) + Environment.NewLine + "Cant Artículos Vendidos: " + Entorno.Instancia.Devolucion.NumeroDeItemsVenta + Environment.NewLine);

            var tiempoGuardarDevolucion = new MetricaTemporizador("TerminarDevolucionFinalizada");

            devolucion.GuardarDevolucion(Entorno.Instancia.Devolucion, ref idsAcumulados, Entorno.Instancia.Terminal, Entorno.Instancia.Usuario, ((int)TipoTransaccion.Devolucion).ToString(), factura, modeloImpresora, implementaImpuestoCompuesto, out respuesta);
            if (respuesta.Valida == false)
            {
                this.iu.PanelVentas.VisorMensaje = "No se pudo procesar la devolución, intente nuevamente.";
                Telemetria.Instancia.AgregaMetrica(tiempoGuardarDevolucion.Para().AgregarPropiedad("Exitoso", false).AgregarPropiedad("Transaccion", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1)).AgregarPropiedad("Factura", (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1)).AgregarPropiedad("TotalVenta", Entorno.Instancia.Devolucion.TotalVenta).AgregarPropiedad("TotalImpuestoVenta", Entorno.Instancia.Devolucion.ImpuestosIncluidos.Sum(x => x.Value[2])).AgregarPropiedad("NroArticulosVenta", Entorno.Instancia.Devolucion.NumeroDeItemsVenta).AgregarPropiedad("Error:", respuesta.Mensaje));

                //
                SolicitudVolver volver = new SolicitudVolver(Solicitud.Volver);
                Reactor.Instancia.Procesar(volver);

                //
                LimpiarVentaFinalizada();
            }
            else
            {
                //Log a azure
                Telemetria.Instancia.AgregaMetrica(tiempoGuardarDevolucion.Para().AgregarPropiedad("Exitoso", true).AgregarPropiedad("Transaccion", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1)).AgregarPropiedad("Factura", (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1)).AgregarPropiedad("TotalVenta", Entorno.Instancia.Devolucion.TotalVenta).AgregarPropiedad("TotalImpuestoVenta", Entorno.Instancia.Devolucion.ImpuestosIncluidos.Sum(x => x.Value[2])).AgregarPropiedad("NroArticulosVenta", Entorno.Instancia.Devolucion.NumeroDeItemsVenta));

                // Imprimir
                Entorno.Instancia.Impresora.Imprimir(factura, cortarPapel: true, abrirCajon: true);

                //
                Entorno.Instancia.IdsAcumulados = idsAcumulados;

                //
                respuesta = new Respuesta(false);
                ETerminal terminal = new PTerminal().BuscarTerminalPorCodigo(Common.Config.Terminal, out respuesta);
                Entorno.Instancia.Terminal = terminal;

                LimpiarVentaFinalizada();
                log.Debug("[CmdTerminarDevolucion] Devolucion finalizada.");

                //
                decimal valorCambio = Entorno.Instancia.Devolucion.TotalVenta * -1;
                iu.PanelVentas.VisorCliente.Total = 0;
                iu.PanelVentas.VisorMensaje       = string.Format("Cambio: {0}", valorCambio.ToCustomCurrencyFormat());

                try
                {
                    Respuesta respuesta2;

                    bool checkFactura = Entorno.Instancia.Terminal.VerificarLimiteNumeracion(out respuesta);
                    bool checkFecha   = Entorno.Instancia.Terminal.VerificarFechaAutorizacion(out respuesta2);

                    if (respuesta.Valida && !(respuesta.Mensaje.Equals("")))
                    {
                        iu.PanelVentas.VisorMensaje = string.Format("Cambio: {0} - " + respuesta.Mensaje, valorCambio.ToCustomCurrencyFormat());
                    }
                    else if (respuesta2.Valida && !(respuesta2.Mensaje.Equals("")))
                    {
                        iu.PanelVentas.VisorMensaje = string.Format("Cambio: {0} - " + respuesta2.Mensaje, valorCambio.ToCustomCurrencyFormat());
                    }
                }
                catch (Exception e)
                {
                    log.ErrorFormat("[CmdterminarDevolucion] {0}", e.Message);
                    Telemetria.Instancia.AgregaMetrica(new Excepcion(e));
                }

                //
                log.InfoFormat("[CmdTerminarDevolucion] --> Transaccion finalizada");

                //
                iu.PanelOperador.CodigoCliente = "";

                // Mostrar fin devolución en pantalla cliente.
                iu.MostrarDisplayCliente(DisplayCliente.FinVenta);

                //
                Entorno.Instancia.Devolucion.EstaAbierta = false;
                Entorno.Instancia.Devolucion             = null;
            }
        }
Пример #2
0
        /// <summary>
        ///
        /// </summary>
        public override void Ejecutar()
        {
            log.Info("[CmdPagarVenta] Pago Ingresado: " + solicitud.ValorEntrada);

            bool implementaImpuestoCompuesto = Entorno.Instancia.Parametros.ObtenerValorParametro <bool>("pdv.definicion_impuesto_compuesta");
            bool obligaIngresarValor         = Entorno.Instancia.Parametros.ObtenerValorParametro <bool>("pdv.pago.obliga_ingresar_valor");

            //copia de seguridad de venta por si algo falla.
            string jsonCopiaVenta = JsonConvert.SerializeObject(Entorno.Instancia.Venta, Formatting.Indented);

            //string jsonCopiaImpuestos = JsonConvert.SerializeObject(Entorno.Instancia.Venta.ImpuestosIncluidos, Formatting.Indented);
            var copiaImpuestosIncluidos = Entorno.Instancia.Venta.ImpuestosIncluidos;

            try
            {
                #region valida entrada de pago

                //obtiene el valor ingresado para pagar la venta.
                decimal pago    = -1;
                string  entrada = solicitud.ValorEntrada;

                if (string.IsNullOrEmpty(entrada))
                {
                    if (this.solicitud.Pago != null)
                    {
                        pago = this.solicitud.Pago.Valor;
                        if (pago == 0)
                        {
                            pago = Entorno.Instancia.Vista.PanelPago.VisorCliente.Total;
                            this.solicitud.Pago.Valor = pago;
                        }
                    }
                    else
                    {
                        if (obligaIngresarValor)
                        {
                            Entorno.Instancia.Vista.PanelOperador.MensajeOperador = "Debe ingresar un valor a pagar.";
                            log.Warn("Se obliga a ingresar un valor a pagar.");

                            //
                            Solicitudes.SolicitudPanelPago solVolver = new Solicitudes.SolicitudPanelPago(Enums.Solicitud.Pagar, "Debe ingresar un valor a pagar.");
                            Reactor.Instancia.Procesar(solVolver);
                            return;
                        }
                        else
                        {
                            //Toma el total de la venta.
                            pago = Entorno.Instancia.Vista.PanelPago.VisorCliente.Total;
                        }
                    }
                }
                else
                {
                    if (entrada == "VentaPagada")
                    {
                        //Se calcula el total ($) de artículos cancelados + el total de pagos realizados.
                        log.Info("La venta ha sido pagada, se finaliza de la venta.");
                        decimal totalPagos = (Entorno.Instancia.Venta.Pagos.Sum(p => p.Valor));
                        pago = totalPagos;
                    }
                    else if (!decimal.TryParse(entrada, out pago))
                    {
                        log.Warn("El valor ingresado no es válido");
                        Entorno.Instancia.Vista.PanelPago.VisorMensaje = "El valor ingresado no es válido";
                    }
                }

                if (pago <= 0)
                {
                    log.WarnFormat("Monto no válido [{0}]", pago);
                    Entorno.Instancia.Vista.PanelPago.VisorMensaje = "Monto no válido";
                    //
                    SolicitudPanelPago volver = new SolicitudPanelPago(Enums.Solicitud.Pagar, "Monto no válido");
                    Reactor.Instancia.Procesar(volver);
                    return;
                }
                else
                {
                    this.ValorPago = pago;
                }

                #endregion


                //valida el total de la venta.

                //pago total de la venta
                Respuesta respuesta = new Respuesta();
                if (this.ValorPago == Entorno.Instancia.Venta.PorPagar)
                {
                    //
                    EMedioPago medioPago = null;
                    EPago      ePago     = null;
                    if (this.solicitud.Pago != null)
                    {
                        ePago     = this.solicitud.Pago;
                        medioPago = ePago.MedioPago;
                    }
                    else
                    {
                        if (this.solicitud.TipoSolicitud == Solicitud.PagoEfectivo)
                        {
                            if (entrada != "VentaPagada")
                            {
                                var medioPagoEfectivo = Entorno.Instancia.MediosPago.Where(m => m.MedioPago == MediosPago.Efectivo);
                                if (!medioPagoEfectivo.IsNullOrEmptyList())
                                {
                                    medioPago = new PMediosPago().GetAllMediosPago().MedioPago(medioPagoEfectivo.FirstOrDefault().CodigoMedioPago);
                                    ePago     = new EPago(medioPago, this.ValorPago);
                                }
                                else
                                {
                                    throw new Exception($"No se encontró medio de pago {MediosPago.Efectivo} configurado en entorno");
                                }
                            }
                        }
                        else
                        {
                            log.Error($"La solicitud contiene un pago nulo o vacío y el medio de pago no efectivo. Solicitud: {this.solicitud}");
                            throw new Exception($"No se encontró medio de pago {MediosPago.Efectivo} configurado en entorno");
                        }
                    }

                    if (entrada != "VentaPagada")
                    {
                        Entorno.Instancia.Venta.AgregarPago(medioPago, ePago, out respuesta);
                        if (respuesta.Valida)
                        {
                            Telemetria.Instancia.AgregaMetrica(new Evento("AgregarPago").AgregarPropiedad("Transaccion", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1)).AgregarPropiedad("Factura", (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1)).AgregarPropiedad("Valor", (ePago.Valor)));
                            log.InfoFormat("[CmdPagarVenta] Pago Agregado: {0}, Transaccion: {1}, Factura {2}", ePago.Valor, (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1), (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1));
                        }
                        else
                        {
                            log.WarnFormat("[CmdPagarVenta.Ejecutar] {0}", respuesta.Mensaje);
                            return;
                        }
                    }
                    else
                    {
                        Entorno.Instancia.Venta.PorPagar = 0;
                    }

                    //Validar saldo pendiente por pagar.
                    if (Entorno.Instancia.Venta.PorPagar == 0)
                    {
                        Dictionary <string, string> idsAcumulados = Entorno.Instancia.IdsAcumulados;
                        string factura         = ProcesarPlantilla.Factura(Entorno.Instancia.Venta, Entorno.Instancia.Terminal, Entorno.Instancia.Usuario);
                        string modeloImpresora = Entorno.Instancia.Impresora.Marca ?? "impresora";
                        PVenta venta           = new PVenta();

                        //Log a azure

                        string tirillaActual = "";
                        iu.PanelVentas.Tirilla.ForEach(x =>
                        {
                            tirillaActual += Environment.NewLine;
                            tirillaActual += String.Format("Código: {0}, Descripción: {1} ({4}), Cantidad: {2}, Precio: {3} ", x.Codigo, x.Descripcion, x.Cantidad, x.Subtotal, x.PrecioVentaUnidad);
                        });
                        log.Info("Items tirilla:" + tirillaActual + Environment.NewLine + "Total: " + Entorno.Instancia.Venta.TotalVenta + Environment.NewLine + "Totales Impuestos: " + Entorno.Instancia.Venta.ImpuestosIncluidos.Sum(x => x.Value[2]) + Environment.NewLine + "Cant Artículos Vendidos: " + Entorno.Instancia.Venta.NumeroDeItemsVenta + Environment.NewLine);

                        //
                        log.InfoFormat("[CmdPagarVenta] Venta Finalizada, Transaccion: {0}, Factura {1}", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1), (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1));

                        var tiempoGuardarVenta = new MetricaTemporizador("TerminarVentaFinalizada");

                        venta.GuardarVenta(Entorno.Instancia.Venta, ref idsAcumulados, Entorno.Instancia.Terminal, Entorno.Instancia.Usuario, ((int)TipoTransaccion.Venta).ToString(), factura, modeloImpresora, implementaImpuestoCompuesto, out respuesta);
                        if (respuesta.Valida == false)
                        {
                            Telemetria.Instancia.AgregaMetrica(tiempoGuardarVenta.Para().AgregarPropiedad("Exitoso", false).AgregarPropiedad("Transaccion", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1)).AgregarPropiedad("Factura", (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1)).AgregarPropiedad("TotalVenta", Entorno.Instancia.Venta.TotalVenta).AgregarPropiedad("TotalImpuestoVenta", Entorno.Instancia.Venta.ImpuestosIncluidos.Sum(x => x.Value[2])).AgregarPropiedad("NroArticulosVenta", Entorno.Instancia.Venta.NumeroDeItemsVenta).AgregarPropiedad("Error", respuesta.Mensaje));
                            throw new Exception(respuesta.Mensaje);
                        }
                        else
                        {
                            Telemetria.Instancia.AgregaMetrica(tiempoGuardarVenta.Para().AgregarPropiedad("Exitoso", true).AgregarPropiedad("Transaccion", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1)).AgregarPropiedad("Factura", (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1)).AgregarPropiedad("TotalVenta", Entorno.Instancia.Venta.TotalVenta).AgregarPropiedad("TotalImpuestoVenta", Entorno.Instancia.Venta.ImpuestosIncluidos.Sum(x => x.Value[2])).AgregarPropiedad("NroArticulosVenta", Entorno.Instancia.Venta.NumeroDeItemsVenta));
                            Entorno.Instancia.IdsAcumulados = idsAcumulados;
                            //
                            Entorno.Instancia.Venta.EstaAbierta = false;


                            //
                            respuesta = new Respuesta(false);
                            ETerminal terminal = new PTerminal().BuscarTerminalPorCodigo(Common.Config.Terminal, out respuesta);
                            if (respuesta.Valida)
                            {
                                Entorno.Instancia.Terminal = terminal;

                                string mensaje = string.Empty;

                                //Valida si debe abrir cajón monedero.
                                bool abreCajon         = false;
                                var  mediosPagoEntorno = new PMediosPago().GetAllMediosPago().ListaMediosPago;
                                var  mediosPagoVenta   = (from m in mediosPagoEntorno
                                                          join mp in Entorno.Instancia.Venta.Pagos on m.Codigo.ToLower() equals mp.MedioPago.Codigo.ToLower()
                                                          select m);


                                //Verifica si hay algún medio de pago configurado para abrir cajón entre los pagos realizados.
                                var mediosPagoAbreCajon = mediosPagoVenta.Where(m => m.AbreCajon);
                                if (!mediosPagoAbreCajon.IsNullOrEmptyList())
                                {
                                    abreCajon = true;
                                }
                                else
                                {
                                    if (medioPago != null)
                                    {
                                        abreCajon = medioPago.AbreCajon;
                                    }
                                }

                                //Imprimir
                                Respuesta resImpresion = Entorno.Instancia.Impresora.Imprimir(factura, true, abreCajon);

                                //
                                LimpiarVentaFinalizada();

                                //
                                if (!resImpresion.Valida)
                                {
                                    Entorno.Vista.PanelOperador.MensajeOperador = resImpresion.Mensaje;
                                }


                                //
                                log.Info("[CmdPagarVenta.Ejecutar] --> Transaccion finalizada.");

                                //
                                iu.PanelOperador.CodigoCliente = "";

                                //
                                decimal valorCambio = Entorno.Instancia.Venta.PorPagar * -1;
                                iu.PanelVentas.VisorCliente.Total = 0;
                                iu.PanelVentas.VisorMensaje       = string.Format("Cambio: {0}", valorCambio.ToCustomCurrencyFormat());
                                try
                                {
                                    Respuesta respuesta2;

                                    bool checkFactura = Entorno.Instancia.Terminal.VerificarLimiteNumeracion(out respuesta);
                                    bool checkFecha   = Entorno.Instancia.Terminal.VerificarFechaAutorizacion(out respuesta2);

                                    if (respuesta.Valida && !(respuesta.Mensaje.Equals("")))
                                    {
                                        iu.PanelVentas.VisorMensaje = string.Format("Cambio: {0} - " + respuesta.Mensaje, valorCambio.ToCustomCurrencyFormat());
                                    }
                                    else if (respuesta2.Valida && !(respuesta2.Mensaje.Equals("")))
                                    {
                                        iu.PanelVentas.VisorMensaje = string.Format("Cambio: {0} - " + respuesta2.Mensaje, valorCambio.ToCustomCurrencyFormat());
                                    }

                                    decimal valorLimite = Entorno.Instancia.Parametros.ObtenerValorParametro <Decimal>("pdv.aviso_monto_max_en_caja");
                                    decimal valorCaja   = venta.DineroEnCaja(Entorno.Instancia.Terminal.Codigo, Entorno.Instancia.Usuario.IdUsuario, out respuesta);
                                    log.InfoFormat("[CmdPagarVenta.Ejecutar] --> Valor en caja : {0}, Valor máximo: {1}", valorCaja.ToCustomCurrencyFormat(), valorLimite.ToCustomCurrencyFormat());
                                    if (valorCaja > valorLimite)
                                    {
                                        iu.PanelVentas.VisorMensaje = string.Format("Cambio: {0} - Tope máximo en caja excedido", valorCambio.ToCustomCurrencyFormat());
                                    }
                                }
                                catch (Exception e)
                                {
                                    log.ErrorFormat("[CmdPagarVenta] {0}", e.Message);
                                    Telemetria.Instancia.AgregaMetrica(new Excepcion(e));
                                }

                                //
                                iu.MostrarPanelVenta();
                            }
                        }
                    }
                }
                else if (this.ValorPago < Entorno.Instancia.Venta.PorPagar)
                {
                    //
                    EMedioPago medioPago = null;
                    EPago      ePago     = null;
                    if (this.solicitud.Pago != null)
                    {
                        ePago     = this.solicitud.Pago;
                        medioPago = ePago.MedioPago;
                    }
                    else
                    {
                        medioPago = new PMediosPago().GetAllMediosPago().MedioPago("1");
                        ePago     = new EPago(medioPago, this.ValorPago);
                    }
                    Entorno.Instancia.Venta.AgregarPago(medioPago, ePago, out respuesta);
                    if (!respuesta.Valida)
                    {
                        log.WarnFormat("[CmdPagarVenta.Ejecutar.277] {0}", respuesta.Mensaje);
                        return;
                    }
                    else
                    {
                        // agregar a lista de medio de pago
                        Entorno.Instancia.Vista.PanelPago.AgregarMedioPagoUI(new DTOs.DItemMedioPago {
                            CodigoMedioPago = ePago.MedioPago.Codigo, NombreMedioPago = ePago.MedioPago.Tipo, ValorMedioPago = ePago.Valor
                        });

                        //
                        iu.PanelVentas.VisorCliente.Total = Entorno.Instancia.Venta.PorPagar;
                        iu.PanelPago.VisorCliente.Total   = Entorno.Instancia.Venta.PorPagar;
                        iu.PanelPago.VisorEntrada         = string.Empty;
                        iu.PanelPago.VisorMensaje         = "";

                        //
                        log.InfoFormat("[CmdPagarVenta] Medio de pago agregado. Valor: [{0}]", this.ValorPago.ToCustomCurrencyFormat());

                        if (Reactor.Instancia.EstadoFSMActual != EstadosFSM.Pago)
                        {
                            Solicitudes.SolicitudPanelPago solicitud = new Solicitudes.SolicitudPanelPago(Solicitud.Pagar);
                            Reactor.Instancia.Procesar(solicitud);
                        }

                        //Valida si no está el panel de pago activo.
                        if (!(iu.PanelActivo is IPanelPago))
                        {
                            if (iu.PanelPagoManual != null)
                            {
                                iu.PanelPagoManual.LimpiarPagoFinalizado();
                            }

                            if (Reactor.Instancia.EstadoFSMActual != EstadosFSM.Pago)
                            {
                                Solicitudes.SolicitudPanelPago solicitud = new Solicitudes.SolicitudPanelPago(Solicitud.Pagar);
                                Reactor.Instancia.Procesar(solicitud);
                            }
                        }
                    }
                }
                else if (this.ValorPago > Entorno.Instancia.Venta.PorPagar)
                {
                    //
                    EMedioPago medioPago = null;
                    EPago      ePago     = null;
                    if (this.solicitud.Pago != null)
                    {
                        ePago     = this.solicitud.Pago;
                        medioPago = ePago.MedioPago;
                    }
                    else
                    {
                        medioPago = new PMediosPago().GetAllMediosPago().MedioPago("1");
                        ePago     = new EPago(medioPago, this.ValorPago);
                    }
                    Entorno.Instancia.Venta.AgregarPago(medioPago, ePago, out respuesta);
                    if (!respuesta.Valida)
                    {
                        log.WarnFormat("[CmdPagarVenta.Ejecutar.329] {0}", respuesta.Mensaje);
                        return;
                    }
                    else
                    {
                        //Validar saldo pendiente por pagar.
                        if (Entorno.Instancia.Venta.PorPagar < 0)
                        {
                            Dictionary <string, string> idsAcumulados = Entorno.Instancia.IdsAcumulados;
                            PVenta venta = new PVenta();
                            respuesta = new Respuesta();

                            //
                            string factura         = ProcesarPlantilla.Factura(Entorno.Instancia.Venta, Entorno.Instancia.Terminal, Entorno.Instancia.Usuario);
                            string modeloImpresora = Entorno.Instancia.Impresora.Marca ?? "impresora";

                            //
                            log.InfoFormat("[CmdPagarVenta] Venta Finalizada, Transaccion: {0}, Factura {1}", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1), (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1));

                            string tirillaActual = "";
                            iu.PanelVentas.Tirilla.ForEach(x =>
                            {
                                tirillaActual += Environment.NewLine;
                                tirillaActual += String.Format("Codigo: {0}, Descripción: {1} ({4}), Cantidad: {2}, Precio: {3} ", x.Codigo, x.Descripcion, x.Cantidad, x.Subtotal, x.PrecioVentaUnidad);
                            });
                            log.Info("Items tirilla:" + tirillaActual + Environment.NewLine + "Total: " + Entorno.Instancia.Venta.TotalVenta + Environment.NewLine + "Totales Impuestos: " + Entorno.Instancia.Venta.ImpuestosIncluidos.Sum(x => x.Value[2]) + Environment.NewLine + "Cant Artículos Vendidos: " + Entorno.Instancia.Venta.NumeroDeItemsVenta + Environment.NewLine);

                            var tiempoGuardarVenta = new MetricaTemporizador("TerminarVentaFinalizada");

                            venta.GuardarVenta(Entorno.Instancia.Venta, ref idsAcumulados, Entorno.Instancia.Terminal, Entorno.Instancia.Usuario, ((int)TipoTransaccion.Venta).ToString(), factura, modeloImpresora, implementaImpuestoCompuesto, out respuesta);
                            if (respuesta.Valida == false)
                            {
                                Telemetria.Instancia.AgregaMetrica(tiempoGuardarVenta.Para().AgregarPropiedad("Exitoso", false).AgregarPropiedad("Transaccion", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1)).AgregarPropiedad("Factura", (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1)).AgregarPropiedad("TotalVenta", Entorno.Instancia.Venta.TotalVenta).AgregarPropiedad("TotalImpuestoVenta", Entorno.Instancia.Venta.ImpuestosIncluidos.Sum(x => x.Value[2])).AgregarPropiedad("NroArticulosVenta", Entorno.Instancia.Venta.NumeroDeItemsVenta));
                                throw new Exception(respuesta.Mensaje);
                            }

                            //Log a azure
                            Telemetria.Instancia.AgregaMetrica(tiempoGuardarVenta.Para().AgregarPropiedad("Exitoso", true).AgregarPropiedad("Transaccion", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1)).AgregarPropiedad("Factura", (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1)).AgregarPropiedad("TotalVenta", Entorno.Instancia.Venta.TotalVenta).AgregarPropiedad("TotalImpuestoVenta", Entorno.Instancia.Venta.ImpuestosIncluidos.Sum(x => x.Value[2])).AgregarPropiedad("NroArticulosVenta", Entorno.Instancia.Venta.NumeroDeItemsVenta));

                            //
                            decimal valorCambio = Entorno.Instancia.Venta.PorPagar * -1;

                            //
                            Entorno.Instancia.Impresora.Imprimir(factura, true, medioPago.AbreCajon);

                            //
                            Entorno.Instancia.Venta.EstaAbierta = false;
                            Entorno.Instancia.IdsAcumulados     = idsAcumulados;

                            //
                            respuesta = new Respuesta(false);
                            ETerminal terminal = new PTerminal().BuscarTerminalPorCodigo(Common.Config.Terminal, out respuesta);
                            Entorno.Instancia.Terminal = terminal;

                            //
                            LimpiarVentaFinalizada();

                            //
                            iu.PanelOperador.CodigoCliente = "";

                            //
                            iu.PanelVentas.VisorCliente.Total = 0;
                            iu.PanelVentas.VisorMensaje       = string.Format("Cambio: {0}", valorCambio.ToCustomCurrencyFormat());
                            try
                            {
                                decimal valorLimite = Entorno.Instancia.Parametros.ObtenerValorParametro <Decimal>("pdv.aviso_monto_max_en_caja");
                                decimal valorCaja   = venta.DineroEnCaja(Entorno.Instancia.Terminal.Codigo, Entorno.Instancia.Usuario.IdUsuario, out respuesta);
                                log.InfoFormat("[CmdPagarVenta.Ejecutar] --> Valor en caja : {0}, Valor máximo: {1}", valorCaja.ToCustomCurrencyFormat(), valorLimite.ToCustomCurrencyFormat());
                                if (valorCaja > valorLimite)
                                {
                                    iu.PanelVentas.VisorMensaje = string.Format("Cambio: {0} - Tope máximo en caja excedido", valorCambio.ToCustomCurrencyFormat());
                                }
                            }
                            catch (Exception e)
                            {
                                log.ErrorFormat("[CmdPagarVenta] {0}", e.Message);
                                Telemetria.Instancia.AgregaMetrica(new Excepcion(e));
                            }

                            //
                            log.InfoFormat("[CmdPagarVenta] --> Transaccion finalizada, cambio {0}", valorCambio.ToCustomCurrencyFormat());

                            iu.MostrarPanelVenta();
                        }
                    }
                }
                else if (this.ValorPago == -1)
                {
                    Dictionary <string, string> idsAcumulados = Entorno.Instancia.IdsAcumulados;
                    PVenta venta = new PVenta();
                    respuesta = new Respuesta();
                    //
                    string factura         = ProcesarPlantilla.Factura(Entorno.Instancia.Venta, Entorno.Instancia.Terminal, Entorno.Instancia.Usuario);
                    string modeloImpresora = Entorno.Instancia.Impresora.Marca ?? "impresora";


                    //
                    log.InfoFormat("[CmdPagarVenta] Venta Finalizada, Transaccion: {0}, Factura {1}", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1), (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1));

                    string tirillaActual = "";
                    iu.PanelVentas.Tirilla.ForEach(x =>
                    {
                        tirillaActual += Environment.NewLine;
                        tirillaActual += String.Format("Codigo: {0}, Descripción: {1} ({4}), Cantidad: {2}, Precio: {3} ", x.Codigo, x.Descripcion, x.Cantidad, x.Subtotal, x.PrecioVentaUnidad);
                    });
                    log.Info("Items tirilla:" + tirillaActual + Environment.NewLine + "Total: " + Entorno.Instancia.Venta.TotalVenta + Environment.NewLine + "Totales Impuestos: " + Entorno.Instancia.Venta.ImpuestosIncluidos.Sum(x => x.Value[2]) + Environment.NewLine + "Cant Artículos Vendidos: " + Entorno.Instancia.Venta.NumeroDeItemsVenta + Environment.NewLine);

                    var tiempoGuardarVenta = new MetricaTemporizador("TerminarVentaFinalizada");

                    venta.GuardarVenta(Entorno.Instancia.Venta, ref idsAcumulados, Entorno.Instancia.Terminal, Entorno.Instancia.Usuario, ((int)TipoTransaccion.Venta).ToString(), factura, modeloImpresora, implementaImpuestoCompuesto, out respuesta);
                    if (respuesta.Valida == false)
                    {
                        Telemetria.Instancia.AgregaMetrica(tiempoGuardarVenta.Para().AgregarPropiedad("Exitoso", false).AgregarPropiedad("Transaccion", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1)).AgregarPropiedad("Factura", (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1)).AgregarPropiedad("TotalVenta", Entorno.Instancia.Venta.TotalVenta).AgregarPropiedad("TotalImpuestoVenta", Entorno.Instancia.Venta.ImpuestosIncluidos.Sum(x => x.Value[2])).AgregarPropiedad("NroArticulosVenta", Entorno.Instancia.Venta.NumeroDeItemsVenta));
                        throw new Exception(respuesta.Mensaje);
                    }

                    //Log a azure
                    Telemetria.Instancia.AgregaMetrica(tiempoGuardarVenta.Para().AgregarPropiedad("Exitoso", true).AgregarPropiedad("Transaccion", (Entorno.Instancia.Terminal.NumeroUltimaTransaccion + 1)).AgregarPropiedad("Factura", (Entorno.Instancia.Terminal.NumeroUltimaFactura + 1)).AgregarPropiedad("TotalVenta", Entorno.Instancia.Venta.TotalVenta).AgregarPropiedad("TotalImpuestoVenta", Entorno.Instancia.Venta.ImpuestosIncluidos.Sum(x => x.Value[2])).AgregarPropiedad("NroArticulosVenta", Entorno.Instancia.Venta.NumeroDeItemsVenta));

                    //
                    Entorno.Instancia.Impresora.Imprimir(factura, true, true);


                    if (!string.IsNullOrEmpty(respuesta.Mensaje))
                    {
                        Entorno.Vista.PanelOperador.MensajeOperador = respuesta.Mensaje;
                        log.ErrorFormat("[CmdPagarVenta]: {0}", respuesta.Mensaje);
                    }

                    Entorno.Instancia.IdsAcumulados = idsAcumulados;

                    //
                    Entorno.Instancia.Venta.EstaAbierta = false;

                    //
                    respuesta = new Respuesta(false);
                    ETerminal terminal = new PTerminal().BuscarTerminalPorCodigo(Common.Config.Terminal, out respuesta);
                    Entorno.Instancia.Terminal = terminal;

                    //
                    LimpiarVentaFinalizada();

                    //
                    decimal valorCambio = Entorno.Instancia.Venta.PorPagar * -1;
                    iu.PanelVentas.VisorCliente.Total = 0;
                    iu.PanelVentas.VisorMensaje       = string.Format("Cambio: {0}", valorCambio.ToCustomCurrencyFormat());

                    try
                    {
                        decimal valorLimite = Entorno.Instancia.Parametros.ObtenerValorParametro <Decimal>("pdv.aviso_monto_max_en_caja");
                        decimal valorCaja   = venta.DineroEnCaja(Entorno.Instancia.Terminal.Codigo, Entorno.Instancia.Usuario.IdUsuario, out respuesta);
                        log.InfoFormat("[CmdPagarVenta.Ejecutar] --> Valor en caja : {0}, Valor máximo: {1}", valorCaja.ToCustomCurrencyFormat(), valorLimite.ToCustomCurrencyFormat());
                        if (valorCaja > valorLimite)
                        {
                            iu.PanelVentas.VisorMensaje = string.Format("Cambio: {0} - Tope máximo en caja excedido", valorCambio.ToCustomCurrencyFormat());
                        }
                    }
                    catch (Exception e)
                    {
                        log.ErrorFormat("[CmdPagarVenta] {0}", e.Message);
                        Telemetria.Instancia.AgregaMetrica(new Excepcion(e));
                    }

                    log.InfoFormat("[CmdPagarVenta] --> Transaccion finalizada, cambio {0}", valorCambio.ToCustomCurrencyFormat());

                    //
                    iu.PanelOperador.CodigoCliente = "";

                    iu.MostrarPanelVenta();
                }

                if (respuesta.Valida)
                {
                    iu.MostrarDisplayCliente(DisplayCliente.FinVenta);
                }
            }
            catch (Exception ex)
            {
                //
                Telemetria.Instancia.AgregaMetrica(new Excepcion(ex));
                log.ErrorFormat("[CmdPagarVenta] {0}", ex.Message);

                //
                iu.PanelOperador.MensajeOperador = ex.Message;
                EVenta copiaVenta = JsonConvert.DeserializeObject <EVenta>(jsonCopiaVenta);
                Entorno.Instancia.Venta = copiaVenta;
                Entorno.Instancia.Venta.ImpuestosIncluidos = copiaImpuestosIncluidos;

                //
                Solicitudes.SolicitudPagarVenta solVolver = new Solicitudes.SolicitudPagarVenta(Enums.Solicitud.Pagar, Entorno.Instancia.Vista.PanelPago.VisorEntrada);
                Reactor.Instancia.Procesar(solVolver);
            }
        }