private void BtnCobrar_Click(object sender, EventArgs e)
        {
            if (dgvGrilla.DataSource == null)
            {
                MessageBox.Show(@"No hay Productos Cargados.",
                                @"Atención",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                return;
            }

            if ((TipoFormaPago)cmbFormaPago.SelectedItem == TipoFormaPago.Efectivo)
            {
                var ultimoComprobante = _comprobanteKioskoServicio.UltimoComprobanteId();

                var caja = _cajaServicio.Obtener(CajaAbiertaId).Id;

                var ClienteId = _clienteServicio.ObtenerPorDni(txtClienteDni.Text).Id;

                var fecha = dtpFecha.Value;

                var comprobante = new ComprobanteKioskoDto
                {
                    Numero          = (int)ultimoComprobante,
                    Fecha           = fecha,
                    SubTotal        = nudSubTotal.Value,
                    Descuento       = nudDescuento.Value,
                    Total           = nudTotal.Value,
                    UsuarioId       = (long)UsuarioLogueadoId,
                    ClienteId       = ClienteId,
                    TipoComprobante = (TipoComprobante)cmbTipoComprobante.SelectedItem,
                    Items           = _listaDetalles
                };

                _comprobanteKioskoServicio.GenerarComprobante(comprobante, caja);


                var traerComprobante = _comprobanteKioskoServicio.traerComprobantePorNumero(comprobante.Numero);


                var nuevoMovimiento = new MovimientoDto
                {
                    CajaId         = caja,
                    ComprobanteId  = traerComprobante.Id,
                    TipoMovimiento = TipoMovimiento.Ingreso,
                    UsuarioId      = UsuarioLogueadoId,
                    Monto          = nudTotal.Value,
                    Fecha          = dtpFecha.Value,
                    Descripcion    = "FAC_" + cmbTipoComprobante.Text + "_" +
                                     $"{_comprobanteKioskoServicio.UltimoComprobanteId()}" + "_" +
                                     DateTime.Now.ToShortDateString().Replace("/", string.Empty) + "_KIOSCO"
                };

                _movimientoServicio.Insertar(nuevoMovimiento);

                _cajaServicio.RealizarMovimiento(nuevoMovimiento);

                foreach (var items in _comprobanteKioskoDto.Items)
                {
                    //descontar stock
                    _articuloServicio.DescontarStock(items.ProductoId, items.Cantidad);
                }

                MessageBox.Show("Facturacion Realizada Correctamente",
                                "Informacion",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);

                LimpiarFormulario();
            }
        }
        private long?Facturar()
        {
            if (!VerificarDatosObligatorios())
            {
                MessageBox.Show("Error, complete los datos", "Error");
                return(null);
            }

            if (rbCtaCte.Checked)
            {
                bool puede_continuar = _clienteServicio.DescontarDeCuenta(idCliente, nudTotal.Value);
                if (!puede_continuar)
                {
                    MessageBox.Show("La cuenta del cliente no tiene suficiente saldo", "Adverencia");
                    return(null);
                }
            }

            /////////////////
            ///COMPROBANTE///
            /////////////////
            ComprobanteDTO comprobante = new ComprobanteDTO
            {
                Fecha     = DateTime.Now,
                UsuarioId = DatosSistema.UsuarioId,
                ClienteId = rbCtaCte.Checked ? idCliente : consumidorFinalId,
                Descuento = nudDescuento.Value,
                Items     = detalles.Values.ToList()
            };

            long comprobante_id;

            if (delivery)
            {
                comprobante_id = _comprobanteServicio.GenerarComprobanteDelivery(comprobante);
            }
            else
            {
                comprobante_id = _comprobanteServicio.Generar(comprobante);
            }

            ////////////////
            //Detalle Caja//
            ////////////////
            var formaDePago = TipoPago.Efectivo;

            if (rbCtaCte.Checked)
            {
                formaDePago = TipoPago.CtaCte;
            }
            if (rbTarjeta.Checked)
            {
                formaDePago = TipoPago.Tarjeta;
            }
            //Tipo pago propiedad de detalle caja no tiene cheque
            //asi que si es cheque no generamos detalle caja
            if (!rbCheque.Checked)
            {
                DetalleCajaDTO detalleCaja = new DetalleCajaDTO
                {
                    CajaId   = DatosSistema.CajaId,
                    Monto    = comprobante.Total,
                    TipoPago = formaDePago
                };
                _detalleCajaServicio.Generar(detalleCaja);
            }

            ////////////////
            ///FORMA PAGO///
            ////////////////

            if (rbEfectivo.Checked)
            {
                FormaPagoEfectivoDTO fp = new FormaPagoEfectivoDTO
                {
                    TipoFormaPago = TipoFormaPago.Efectivo,
                    Monto         = nudTotal.Value,
                    ComprobanteId = comprobante_id,
                };
                _formaPagoServicio.Generar(fp);
            }

            if (rbCtaCte.Checked)
            {
                //parte descontar cuenta ya está al principio
                FormaPagoCtaCteDTO fp = new FormaPagoCtaCteDTO
                {
                    TipoFormaPago = TipoFormaPago.CuentaCorriente,
                    Monto         = nudTotal.Value,
                    ComprobanteId = comprobante_id,
                    ClienteId     = idCliente,
                };
                _formaPagoServicio.Generar(fp);
            }

            if (rbCheque.Checked)
            {
                FormaPagoChequeDTO fp = new FormaPagoChequeDTO
                {
                    TipoFormaPago = TipoFormaPago.Cheque,
                    Monto         = nudTotal.Value,
                    ComprobanteId = comprobante_id,
                    BancoId       = ((BancoDTO)cbBanco.SelectedItem).Id,
                    Dias          = (int)nudDiasCheque.Value,
                    EnteEmisor    = txtEnteCheque.Text,
                    FechaEmision  = dtFechaCheque.Value,
                    Numero        = txtNumeroCheque.Text,
                };

                _formaPagoServicio.Generar(fp);
            }

            if (rbTarjeta.Checked)
            {
                FormaPagoTarjetaDTO fp = new FormaPagoTarjetaDTO
                {
                    TipoFormaPago = TipoFormaPago.Tarjeta,
                    Monto         = nudTotal.Value,
                    ComprobanteId = comprobante_id,
                    Numero        = txtNumeroTarjeta.Text,
                    Cupon         = "", //TODO ????
                    PlanTarjetaId = ((PlanTarjetaDTO)cbPlan.SelectedItem).Id,
                    NumeroTarjeta = txtClaveTarjeta.Text
                };

                _formaPagoServicio.Generar(fp);
            }

            //////////////
            //Movimiento//
            //////////////
            MovimientoDTO movimiento = new MovimientoDTO
            {
                CajaID        = DatosSistema.CajaId,
                ComprobanteID = comprobante_id,
                Tipo          = TipoMovimiento.Ingreso,
                UsuarioID     = DatosSistema.UsuarioId,
                Monto         = comprobante.Total,
                Fecha         = DateTime.Now,
            };

            _movimientoServicio.GenerarMovimiento(movimiento);

            foreach (var d in detalles)
            {
                //todo:producto tendria que tener si descuenta stock o no...
                _articuloServicio.DescontarStock(d.Value.ProductoId, d.Value.CantidadProducto);
            }

            MessageBox.Show("Factura exitosa.", delivery ? "Delivery" : "Kiosco");

            return((long?)comprobante_id);
            //Close();
        }