private void RealizarVenta()
        {
            CrearVentaData ventaData = new CrearVentaData();

            ventaData.EsVentaReservada = _formMode == ActionFormMode.Edit;
            ventaData.OperadorId = Context.OperadorActual.Id;
            ventaData.SucursalId = Context.SucursalActual.Id;
            ventaData.NumeroComprobante = _id;
            ventaData.ClienteId = _cliente.Id;

            ventaData.TipoComprobanteSeleccionado = UcBuscadorCliente.TipoComprobanteSeleccionado;
            ventaData.CondicionVentaSeleccionada = UcBuscadorCliente.CondicionVentaSeleccionada;
            ventaData.TipoCajaMovimientoSeleccionado = UcBuscadorCliente.TipoCajaMovimientoSeleccionado;

            ventaData.TotalPagar = UcTotalesVenta.TotalPagar;
            ventaData.Senas = UcTotalesVenta.Senas;
            ventaData.CreditosDevolucion = UcTotalesVenta.CreditosDevolucion;

            ventaData.Titulos = UcTitulosVenta.Titulos;

            ventaData.CajaActualId = Context.CajaActual.Id;
            ventaData.Anticipo = UcCuentaCorrienteInfo.Anticipo;
            //ventaData.SubTotal = UcCuentaCorrienteInfo.SubTotal;
            ventaData.SubTotal = UcTotalesVenta.SubTotal;

            ventaData.Pagos = UcTotalesVenta.Pagos;
            ventaData.Cuotas = UcCuentaCorrienteInfo.Cuotas;
            ventaData.Montocuota = UcCuentaCorrienteInfo.Montocuota;
            ventaData.VencimientoCuota = UcCuentaCorrienteInfo.Vencimiento;
            ventaData.PcAlta = Environment.MachineName;
            ventaData.PuntoVenta = Context.SucursalActual.SucursalNumero ?? 1;
            CrearVentaResponse ventaResponse;

            try
            {
                ventaResponse = _ventaNegocio.CrearVenta(ventaData);
            }
            catch (ApplicationException ex)
            {
                _messageBoxDisplayService.ShowError(ex.Message);
                return;
            }

            foreach (var comprobante in ventaResponse.Comprobantes)
            {
                using (var crearComprobante = FormFactory.Create<FrmComprobante>())
                {
                    crearComprobante._concepto = comprobante.Concepto;
                    crearComprobante._LCN = comprobante.LCN;
                    var conv = new Conversion();
                    crearComprobante._montoTexto = conv.enletras((comprobante.Importe - comprobante.ImpOcupado).ToString());
                    crearComprobante._montoActualizado = (comprobante.Importe - comprobante.ImpOcupado);
                    crearComprobante.ShowDialog();
                }
            }

            _messageBoxDisplayService.ShowSuccess(Resources.MessageSuccessVentaExitosa);

            if (ChkImprimir.Checked)
            {
                _directPrint.Descripcion = ventaResponse.FacturaInfo.Descripcion;
                _directPrint.FormaPago = ventaResponse.FacturaInfo.FormaPago;
                _directPrint.Recargo = UcTotalesVenta.Recargo.ToString();
                _directPrint.GenerarFactura(ventaResponse.VentaId);
            }

            using (var crearVenta = FormFactory.Create<FrmFacturaVenta>(ventaResponse.VentaId))
            {
                crearVenta._descripcion = ventaResponse.FacturaInfo.Descripcion;
                crearVenta._formaPago = ventaResponse.FacturaInfo.FormaPago;
                crearVenta._recargo = UcTotalesVenta.Recargo.ToString();

                crearVenta.ShowDialog();
            }

            OnVentaRealizada();

            if (_formMode == ActionFormMode.Edit)
            {
                this.Close();
            }

            //LimpiarFormularioVenta();
        }
        public CrearVentaResponse CrearVenta(CrearVentaData ventaData)
        {
            CrearVentaResponse reponse = new CrearVentaResponse();

            var venta = AgregarVenta(ventaData);

            foreach (var titulo in ventaData.Titulos)
            {
                //Descontar stock
                var tituloStock =
                    Uow.TitulosStock.Obtener(ts => ts.TituloId == titulo.TituloId && ts.SucursalId == ventaData.SucursalId);
                var cantidadAVender = titulo.Cantidad;
                int? cantpropia = 0;
                int? cantconsiganda = 0;

                if (tituloStock.StkPr > 0)
                {
                    if (tituloStock.StkPr >= cantidadAVender)
                    {
                        tituloStock.StkPr -= cantidadAVender;
                        cantpropia = cantidadAVender;
                        cantidadAVender = 0;
                    }
                    else
                    {
                        cantpropia = tituloStock.StkPr;
                        cantidadAVender -= tituloStock.StkPr;
                        tituloStock.StkPr = 0;
                    }
                }

                if (cantidadAVender > 0 && tituloStock.StkCn > 0)
                {

                    if (tituloStock.StkCn >= cantidadAVender && tituloStock.StkCn > 0)
                    {
                        tituloStock.StkCn -= cantidadAVender;
                        cantconsiganda = cantidadAVender;
                    }
                    else
                    {
                        throw new ApplicationException("No hay suficiente stock para completar la venta");
                    }
                }

                Uow.TitulosStock.Modificar(tituloStock);

                AgregarVentaDetalle(venta, ventaData.SucursalId, ventaData.OperadorId,
                                    titulo.TituloId, titulo.Cantidad, titulo.SubTotal,
                                    titulo.PrecioBase, titulo.Descuento, cantpropia, cantconsiganda);

                if (titulo.CantidadConsignada > 0 && cantconsiganda > 0)
                {
                    AgregarTitulosConsignacionVendida(ventaData, titulo.TituloId, titulo.ProveedorId, venta, cantconsiganda);

                    ActualizarTitulosConsignaciones(ventaData, titulo.TituloId, titulo.ProveedorId, cantconsiganda);
                }
            }

            var caja = ActualizarCajaActual(ventaData, venta);

            var cajaMovimiento = CrearCajaMovimiento(ventaData, caja, venta);

            reponse.FacturaInfo.Descripcion += "Seña  $" + cajaMovimiento.Senia + ". ";

            foreach (var pago in ventaData.Pagos)
            {
                switch (pago.TipoPago)
                {
                    case FormaPago.Efectivo:
                        cajaMovimiento.Efectivo = pago.Importe;
                        reponse.FacturaInfo.FormaPago += "Efectivo $" + pago.Importe + ". ";
                        break;
                    case FormaPago.Tarjeta:
                        ProcesarPagoTarjeta(ventaData, pago, cajaMovimiento);
                        reponse.FacturaInfo.FormaPago += "Tarjeta " + pago.Descripcion + " $" + pago.Importe + ". ";
                        break;
                    case FormaPago.Cheque:
                        ProcesarPagoCheque(ventaData, pago, cajaMovimiento);
                        reponse.FacturaInfo.FormaPago += "Cheque " + pago.Descripcion + " $" + pago.Importe + ". ";
                        break;
                    case FormaPago.Deposito:
                        ProcesarPagoDeposito(ventaData, pago, cajaMovimiento, venta, caja);
                        reponse.FacturaInfo.FormaPago += "Deposito " + pago.Descripcion + " $" + pago.Importe + ". ";
                        break;

                    case FormaPago.CuentaCorriente:
                        ProcesarPagoCuentaCorriente(ventaData, reponse, venta);
                        reponse.FacturaInfo.Descripcion = "Anticipo $" + ventaData.Anticipo + ". " + reponse.FacturaInfo.Descripcion;
                        break;
                }
            }

            Uow.CajaMovimientos.Agregar(cajaMovimiento);

            AgregarClienteMovimiento(ventaData, venta);

            if (!ventaData.EsVentaReservada)
                AumentarNumeroFactura(ventaData.OperadorId, ventaData.SucursalId);

            ActualizarSeniasCliente(ventaData, reponse);

            ActualizarCreditosAFavorCliente(ventaData, reponse);

            reponse.VentaId = venta.Id;

            Uow.Commit();

            return reponse;
        }