private void AgregarTitulosMovimientos(CrearVentaData ventaData, VentaTitulo titulo, Guid ventaId, int?actualPr, int?actualCn)
        {
            //foreach (var titulo in ventaData.Titulos)
            // {
            TitulosMovimiento tituloMovimiento = new TitulosMovimiento();

            tituloMovimiento.TituloId            = titulo.TituloId;
            tituloMovimiento.TipoComprobanteId   = ventaData.TipoComprobanteSeleccionado;
            tituloMovimiento.ComprobanteId       = ventaId;
            tituloMovimiento.SucursalComprobante = ventaData.SucursalId;
            tituloMovimiento.Fecha = _clock.Now;
            TituloStock stock = new TituloStock();

            stock = Uow.TitulosStock.Obtener(t => t.TituloId == titulo.TituloId && t.SucursalId == ventaData.SucursalId);
            if (stock != null)
            {
                tituloMovimiento.CntAntPr       = actualPr;
                tituloMovimiento.CntAntCn       = actualCn;
                tituloMovimiento.CntMinPr       = titulo.CantidadPropia ?? 0;
                tituloMovimiento.CntMinCn       = titulo.CantidadConsignada ?? 0;
                tituloMovimiento.FechaAlta      = _clock.Now;
                tituloMovimiento.OperadorAltaId = ventaData.OperadorId;
                tituloMovimiento.SucursalAltaId = ventaData.SucursalId;
            }

            Uow.TitulosMovimiento.Agregar(tituloMovimiento);
            Uow.Commit();
            ///}
        }
        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;
                int actualPr        = tituloStock.StkPr ?? 0;
                int actualCn        = tituloStock.StkCn ?? 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");
                    }
                }
                titulo.CantidadPropia     = cantpropia;
                titulo.CantidadConsignada = cantconsiganda;

                AgregarTitulosMovimientos(ventaData, titulo, venta.Id, actualPr, actualCn);

                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);
        }
        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     = 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();
        }