Ejemplo n.º 1
0
        private void LlenarPagos(int iVentaID)
        {
            var oPagos = Datos.GetListOf <VentasPagosView>(q => q.VentaID == iVentaID);

            this.dgvAbonos.Rows.Clear();
            string sFormaDePago, sVales = "";

            foreach (var oPago in oPagos)
            {
                // Se obtiene el folio de cobranza, según el pago
                var    oCobranzaT = Datos.GetEntity <CobranzaTicket>(c => c.VentaPagoID == oPago.VentaPagoID);
                string sTicket    = (oCobranzaT == null ? "" : oCobranzaT.Ticket);
                //
                sFormaDePago = UtilDatos.VentaPagoFormasDePago(oPago.VentaPagoID);
                if (sFormaDePago.Contains("NC"))
                {
                    sVales = UtilDatos.VentaPagoVales(oPago.VentaPagoID);
                }
                this.dgvAbonos.Rows.Add(oPago.Fecha, sFormaDePago, sVales, oPago.VentaPagoID, oPago.Importe, sTicket);
            }
        }
Ejemplo n.º 2
0
        public override bool Ejecutar()
        {
            // Se valida la opción
            if (!this.ctlFacturar.Validar())
            {
                return(false);
            }

            // Se pregunta si se debe facturar al mismo cliente de las ventas o a otro
            int iAFClienteID = this.Cliente.ClienteID;

            if (UtilLocal.MensajePregunta("¿Deseas hacer la factura a nombre del cliente seleccionado?") == DialogResult.No)
            {
                iAFClienteID = 0;
                var frmValor = new MensajeObtenerValor("Selecciona el cliente para facturar:", "", MensajeObtenerValor.Tipo.Combo);
                frmValor.CargarCombo("ClienteID", "Nombre", Datos.GetListOf <Cliente>(q => q.ClienteID != Cat.Clientes.Mostrador && q.Estatus));
                if (frmValor.ShowDialog(Principal.Instance) == DialogResult.OK)
                {
                    iAFClienteID = Util.Entero(frmValor.Valor);
                }
                frmValor.Dispose();
            }
            if (iAFClienteID == 0)
            {
                return(false);
            }

            // Se solicita el usuario que realiza el proceso
            int iUsuarioID = 0;
            var Res        = UtilLocal.ValidarObtenerUsuario("Ventas.FacturarTickets.Agregar");

            if (Res.Error)
            {
                return(false);
            }
            iUsuarioID = Res.Respuesta.UsuarioID;

            // Se muestra la ventana de "Cargando.."
            Cargando.Mostrar();

            //
            DateTime dAhora = DateTime.Now;

            // Se obtienen los datos de los productos, por si se cambió la descripción
            List <ProductoVenta> oPartes = null;

            if (this.ctlFacturar.MostrarTodasLasPartes)
            {
                oPartes = this.ctlDetalle.ObtenerListaVenta();
            }

            // Se procede a generar la factura
            var oVentasAF     = this.ctlFacturar.GenerarListaDeVentas();
            var oFormasDePago = this.ctlFacturar.FormasDePagoLibre;
            var ResFe         = VentasLoc.GenerarFacturaElectronica(oVentasAF, iAFClienteID, oPartes, oFormasDePago, this.ctlFacturar.Observacion, null);

            if (ResFe.Error)
            {
                UtilLocal.MensajeAdvertencia(ResFe.Mensaje);
                return(false);
            }

            // Se guarda el dato de que fue una factura de ventas

            var oFactura = Datos.GetEntity <VentaFactura>(q => q.VentaFacturaID == ResFe.Respuesta && q.Estatus);

            oFactura.Convertida       = true;
            oFactura.RealizoUsuarioID = iUsuarioID;
            Datos.Guardar <VentaFactura>(oFactura);

            // Se manda a afectar contabilidad (AfeConta)
            foreach (int iVentaID in oVentasAF)
            {
                var oVentaV = Datos.GetEntity <VentasView>(c => c.VentaID == iVentaID);
                if (oVentaV.ACredito)
                {
                    ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.VentaCredito, iVentaID, (oFactura.Serie + oFactura.Folio), oVentaV.Cliente);
                    // Se verifica si el ticket ya está pagado, para hacer la póliza correspondiente a dicho pago
                    if (oVentaV.Pagado > 0)
                    {
                        var oPagos = Datos.GetListOf <VentaPago>(c => c.VentaID == iVentaID && c.Estatus);
                        foreach (var oReg in oPagos)
                        {
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.PagoVentaCredito, oReg.VentaPagoID
                                                            , ((oFactura.Serie + oFactura.Folio) + " / " + UtilDatos.VentaPagoFormasDePago(oReg.VentaPagoID))
                                                            , oVentaV.Cliente, oReg.SucursalID);
                        }
                    }

                    // Se borra la póliza temporal creada por ser ticket a crédito
                    ContaProc.BorrarPolizaTemporalTicketCredito(iVentaID);
                }
                else
                {
                    ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.VentaContadoFacturaConvertida, iVentaID
                                                    , (oFactura.Serie + oFactura.Folio), oVentaV.Cliente, oVentaV.SucursalID);
                }
            }

            // Se guarda el dato de pendiente por descontar en la factura global, si aplica
            // Se guardan datos cuando se están facturando tickets abonados en otras sucursales
            foreach (int iVentaID in oVentasAF)
            {
                // Se obtienen los abonos de otras sucursales
                var oAbonos = Datos.GetListOf <VentasPagosView>(c => c.VentaID == iVentaID && c.SucursalID != GlobalClass.SucursalID)
                              .GroupBy(c => new { c.VentaID, c.SucursalID }).Select(c => new { c.Key.VentaID, c.Key.SucursalID, Abonado = c.Sum(s => s.Importe) });
                if (oAbonos != null && oAbonos.Count() > 0)
                {
                    foreach (var oReg in oAbonos)
                    {
                        var oPendiente = new FacturaGlobalPendientePorDescontar()
                        {
                            VentaID    = oReg.VentaID,
                            Fecha      = dAhora,
                            SucursalID = oReg.SucursalID,
                            Importe    = oReg.Abonado
                        };
                        Datos.Guardar <FacturaGlobalPendientePorDescontar>(oPendiente);
                    }
                }
            }

            // Se cierra la ventana de "Cargando.."
            Cargando.Cerrar();

            // Se muestra una notifiación con el resultado
            UtilLocal.MostrarNotificacion("Procedimiento ejecutado correctamente.");

            // Se limpia después de haberse guardado
            this.Limpiar();

            return(true);
        }
Ejemplo n.º 3
0
        public override bool Ejecutar()
        {
            // Se valida que el importe a pagar sea mayor que cero
            if (this.ctlCobranza.Total <= 0)
            {
                UtilLocal.MensajeAdvertencia("No hay ningún importe a pagar.");
                return(false);
            }

            // Se valida el cobro
            if (!this.ctlCobro.Validar())
            {
                return(false);
            }

            // Se valida que el pago sea en la misma sucursal que el primer abono, si hubiera
            var    oVentasACobrar = this.ctlCobranza.ObtenerVentasMarcadas();
            string sVentasOt      = "";

            foreach (var oReg in oVentasACobrar)
            {
                if (Datos.Exists <VentaPago>(c => c.VentaID == oReg.VentaID && c.Estatus && c.SucursalID != GlobalClass.SucursalID))
                {
                    sVentasOt += (", " + oReg.Folio);
                }
            }
            if (sVentasOt != "" && oVentasACobrar[0].VentaID != 270157)  // Modificaciòn temporal para no evaluar esa venta - 2015-08-24
            {
                UtilLocal.MensajeAdvertencia("Las siguientes ventas ya fueron abonadas en otra sucursal, por lo tanto aquí no se pueden cobrar.\n\n"
                                             + sVentasOt.Substring(2));
                return(false);
            }

            // Si se quiere pagar con Vales, se valida que sólo sea una venta
            var oFormasDePago = this.ctlCobro.GenerarPagoDetalle();

            if (oFormasDePago.Any(c => c.TipoFormaPagoID == Cat.FormasDePago.Vale) && oVentasACobrar.Count > 1)
            {
                UtilLocal.MensajeAdvertencia("En selecciones múltiples no se puede usar vales. Es necesario seleccionar sólo una venta.");
                return(false);
            }

            // Confirmación
            if (UtilLocal.MensajePregunta("¿Estás seguro que deseas realizar el abono indicado?") != DialogResult.Yes)
            {
                return(false);
            }

            // Se completa el cobro, por si fue pago en efectivo
            if (!this.ctlCobro.CompletarCobro())
            {
                return(false);
            }

            // Se solicita la validación de autorización, si aplica
            int iAutorizoID = 0;

            if (this.ctlCobro.AutorizacionDeNotasDeCreditoRequerida)
            {
                var Res = UtilLocal.ValidarObtenerUsuario("Autorizaciones.Ventas.Cobro.NotaDeCreditoOtroCliente", "Autorización");
                iAutorizoID = (Res.Exito ? Res.Respuesta.UsuarioID : 0);
            }

            // Se procede a guardar los datos
            DateTime dAhora = DateTime.Now;

            // Se generan los pagos para las ventas marcadas, hasta donde alcance el importe
            decimal mPago            = this.ctlCobro.Suma;
            var     oVentasAfectadas = new List <VentasACreditoView>();
            var     oPagosDetalleGen = new List <VentaPagoDetalle>();
            var     oIdsPago         = new List <int>();

            foreach (var oVentaACobrar in oVentasACobrar)
            {
                // Si la venta no tiene saldo, se salta
                if (oVentaACobrar.Restante <= 0)
                {
                    continue;
                }

                var oPago = new VentaPago()
                {
                    VentaID = oVentaACobrar.VentaID,
                    Fecha   = dAhora,
                };
                var     oPagoDetalle = new List <VentaPagoDetalle>();
                decimal mPagoForma   = 0;
                oVentaACobrar.Pagado = 0;  // Se hace cero para que sólo sume lo pagado en esta ocasión
                foreach (var oFormaDePago in oFormasDePago)
                {
                    mPagoForma = (oFormaDePago.Importe > oVentaACobrar.Restante ? oVentaACobrar.Restante : oFormaDePago.Importe);
                    if (oFormaDePago.Importe > 0)
                    {
                        oPagoDetalle.Add(new VentaPagoDetalle()
                        {
                            TipoFormaPagoID = oFormaDePago.TipoFormaPagoID,
                            Importe         = mPagoForma,
                            BancoID         = oFormaDePago.BancoID,
                            Folio           = oFormaDePago.Folio,
                            Cuenta          = oFormaDePago.Cuenta,
                            NotaDeCreditoID = oFormaDePago.NotaDeCreditoID
                        });

                        mPago -= mPagoForma;
                        oFormaDePago.Importe   -= mPagoForma;
                        oVentaACobrar.Pagado   += mPagoForma;
                        oVentaACobrar.Restante -= mPagoForma;
                        if (oVentaACobrar.Restante <= 0)
                        {
                            break;
                        }
                    }
                }
                Guardar.VentaPago(oPago, oPagoDetalle);

                // Se agrega la venta actual a las ventas afectadas
                oVentasAfectadas.Add(oVentaACobrar);
                oIdsPago.Add(oPago.VentaPagoID);
                oPagosDetalleGen.AddRange(oPagoDetalle);

                if (mPago <= 0)
                {
                    break;
                }
            }

            // Se manda a generar la póliza contable (AfeConta)
            foreach (int iPagoID in oIdsPago)
            {
                var oPagoV = Datos.GetEntity <VentasPagosView>(c => c.VentaPagoID == iPagoID);
                if (oPagoV.Facturada)
                {
                    ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.PagoVentaCredito, iPagoID
                                                    , (oPagoV.Folio + " / " + UtilDatos.VentaPagoFormasDePago(iPagoID)), oPagoV.Cliente);
                }

                // Si es tiecket a crédito, se hace ajuste de pólizas
                if (!oPagoV.Facturada)
                {
                    ContaProc.BorrarPolizaTemporalTicketCredito(oPagoV.VentaID);
                    var oVentaV = Datos.GetEntity <VentasView>(c => c.VentaID == oPagoV.VentaID);
                    if (oVentaV.VentaEstatusID == Cat.VentasEstatus.Cobrada)
                    {
                        ContaProc.CrearPolizaTemporalTicketCredito(oPagoV.VentaID, (oVentaV.Total - oVentaV.Pagado));
                    }
                }
            }

            // Se guardan la autorizaciones aplicables
            if (this.ctlCobro.AutorizacionDeNotasDeCreditoRequerida)
            {
                // Se agrega una autorización por cada nota de otro cliente
                var oNotasOC = this.ctlCobro.NotasDeCreditoOtrosClientes();
                foreach (var oNotaOC in oNotasOC)
                {
                    VentasProc.GenerarAutorizacion(Cat.AutorizacionesProcesos.NotaDeCreditoOtroClienteUsar, Cat.Tablas.NotaDeCredito, oNotaOC, iAutorizoID);
                }
            }

            // Se guardan los datos del cobro, para reimpresión de tickets
            string sFolioCob = VentasProc.GenerarFolioDeCobranza();
            int    iCuenta   = 0;

            foreach (var oVentaAf in oVentasAfectadas)
            {
                Datos.Guardar <CobranzaTicket>(new CobranzaTicket()
                {
                    Ticket      = sFolioCob,
                    VentaID     = oVentaAf.VentaID,
                    ClienteID   = this.Cliente.ClienteID,
                    Folio       = oVentaAf.Folio,
                    Fecha       = oVentaAf.Fecha,
                    Vencimiento = oVentaAf.Vencimiento,
                    Total       = oVentaAf.Total,
                    Pagado      = oVentaAf.Pagado,
                    Restante    = oVentaAf.Restante,
                    VentaPagoID = oIdsPago[iCuenta++]
                });
            }

            // Se genera el ticket correspondiente
            VentasLoc.GenerarTicketCobranza(sFolioCob);

            // Si se pagó con vale, se verifica si se crearon nuevos vales por importes restantes. Y se mandan a imprimir
            var oValesCreados = VentasProc.ObtenerValesCreados(oPagosDetalleGen);

            foreach (var oReg in oValesCreados)
            {
                VentasLoc.GenerarTicketNotaDeCredito(oReg.NotaDeCreditoID);
            }

            // Se muestra una notifiación con el resultado
            UtilLocal.MostrarNotificacion("Procedimiento completado correctamente.");

            // Se limpia después de haberse guardado
            this.Limpiar();

            return(true);
        }