예제 #1
0
        private void ProcesarPagoTarjeta(VentaDataBase ventaData, VentaPago pago, CajaMovimiento cajaMovimiento)
        {
            var pagoTarjeta = pago as VentaPagoTarjeta;

            if (cajaMovimiento.Tarjeta == null)
            {
                cajaMovimiento.Tarjeta = 0;
            }

            cajaMovimiento.Tarjeta += pago.Importe;
            //GUARDAR TARJETA MOVIMIENTO
            TarjetasMovimiento tarjetasMovimiento = new TarjetasMovimiento();

            tarjetasMovimiento.CajaMovimientoId = cajaMovimiento.Id;
            tarjetasMovimiento.TarjetaId        = pagoTarjeta.TarjetaId ?? 0;
            tarjetasMovimiento.LoteCupon        = pagoTarjeta.CuponNumero;
            tarjetasMovimiento.Fecha            = _clock.Now;
            tarjetasMovimiento.Importe          = (float)pago.Importe;
            tarjetasMovimiento.Estado           = 1; // No se
            tarjetasMovimiento.FechaAlta        = _clock.Now;
            tarjetasMovimiento.SucursalAltaId   = ventaData.SucursalId;
            tarjetasMovimiento.OperadorAltaId   = ventaData.OperadorId;

            Uow.TarjetasMovimientos.Agregar(tarjetasMovimiento);
        }
예제 #2
0
        public void GenerarPagoAutoNuevo(decimal?monto, FormaPago tipoPago)
        {
            if (Pagos.Count != 0)
            {
                foreach (var pago in Pagos)
                {
                    if (pago.TipoPago == tipoPago)
                    {
                        pago.Importe = monto;

                        GrillaPagos.DataSource = Pagos.ToList();
                        EliminarPagoCero();
                        RefrescarPagos();
                        return;
                    }
                }
            }
            VentaPago pagoNuevo = new VentaPago();

            pagoNuevo.TipoPago = tipoPago;
            pagoNuevo.Importe  = monto;
            Pagos.Add(pagoNuevo);

            GrillaPagos.DataSource = Pagos.ToList();
            RefrescarPagos();
        }
예제 #3
0
        private void ProcesarPagoCheque(VentaDataBase ventaData, VentaPago pago, CajaMovimiento cajaMovimiento)
        {
            var pagoCheque = pago as VentaPagoCheque;

            if (cajaMovimiento.Cheque == null)
            {
                cajaMovimiento.Cheque = 0;
            }

            cajaMovimiento.Cheque += pago.Importe;

            ChequesTercero chequesTercero = new ChequesTercero();

            chequesTercero.Id = Guid.NewGuid();
            chequesTercero.CajaMovimientoId = cajaMovimiento.Id;
            chequesTercero.BancoId          = pagoCheque.BancoId ?? 0;
            chequesTercero.NroCheque        = pagoCheque.Numero;
            chequesTercero.Fecha            = _clock.Now;
            chequesTercero.FechaCobro       = _clock.Now;
            chequesTercero.Importe          = (float)pago.Importe;
            chequesTercero.FechaAlta        = _clock.Now;
            chequesTercero.EstadoChequeId   = 0;
            chequesTercero.SucursalAltaId   = ventaData.SucursalId;
            chequesTercero.OperadorAltaId   = ventaData.OperadorId;

            Uow.ChequesTerceros.Agregar(chequesTercero);
        }
예제 #4
0
 private void OnPagoAgregado(VentaPago pago)
 {
     if (PagoAgregado != null)
     {
         PagoAgregado(this, pago);
     }
 }
예제 #5
0
        private void ProcesarPagoDeposito(VentaDataBase ventaData, VentaPago pago, CajaMovimiento cajaMovimiento, Venta venta, Caja caja)
        {
            var pagoDeposito = pago as VentaPagoDeposito;

            if (cajaMovimiento.Deposito == null)
            {
                cajaMovimiento.Deposito = 0;
            }

            //Guardar Cuentas Movimientos
            cajaMovimiento.Deposito += pago.Importe;

            CuentasMovimiento cuentasMovimiento = new CuentasMovimiento();

            cuentasMovimiento.CuentaId                 = pagoDeposito.CuentaId ?? 0;
            cuentasMovimiento.TipoMovimientoId         = 2; //Deposito
            cuentasMovimiento.FechaMovimiento          = pagoDeposito.Fecha;
            cuentasMovimiento.EstadoMovimientoCuentaId = 0;
            cuentasMovimiento.TipoComprobanteId        = ventaData.TipoComprobanteSeleccionado;
            cuentasMovimiento.ComprobanteId            = venta.Id;
            cuentasMovimiento.MonedaId                 = 0;
            cuentasMovimiento.CondicionVentaId         = ventaData.CondicionVentaSeleccionada;
            cuentasMovimiento.NroMovimiento            = pagoDeposito.Numero;
            cuentasMovimiento.Descripcion              = "DEPOSITO NRO " + pagoDeposito.Numero.ToString();
            cuentasMovimiento.FechaCobro               = _clock.Now;
            cuentasMovimiento.Debito         = 0;
            cuentasMovimiento.Credito        = pago.Importe;
            cuentasMovimiento.TipoCarga      = 2;
            cuentasMovimiento.CajaId         = caja.Id;
            cuentasMovimiento.FechaAlta      = _clock.Now;
            cuentasMovimiento.OperadorAltaId = ventaData.OperadorId;
            cuentasMovimiento.SucursalAltaId = ventaData.SucursalId;

            Uow.CuentasMovimientos.Agregar(cuentasMovimiento);
        }
예제 #6
0
        public void GenerarPagoAuto(decimal?monto)
        {
            if (Pagos.Count == 0)
            {
                VentaPago pago = new VentaPago();
                pago.TipoPago = FormaPago.Efectivo;
                pago.Importe  = monto;
                Pagos.Add(pago);
            }
            else
            {
                foreach (var pago in Pagos)
                {
                    switch (pago.TipoPago)
                    {
                    case FormaPago.Efectivo:
                        pago.Importe = monto;
                        break;
                    }
                }
            }

            GrillaPagos.DataSource = Pagos.ToList();
            RefrescarPagos();
        }
예제 #7
0
        public static ResAcc <int> GenerarPago(int iVentaID, decimal mImporte, int iFormaDePagoID, int iBancoID, string sFolio, string sCuenta)
        {
            // Se generan los datos del pago
            var oPago = new VentaPago()
            {
                VentaID = iVentaID,
                Fecha   = DateTime.Now
            };
            var oPagoDetalle = new List <VentaPagoDetalle>();

            oPagoDetalle.Add(new VentaPagoDetalle()
            {
                TipoFormaPagoID = iFormaDePagoID,
                Importe         = mImporte
            });
            if (iBancoID > 0)
            {
                oPagoDetalle[0].BancoID = iBancoID;
                oPagoDetalle[0].Folio   = sFolio;
                oPagoDetalle[0].Cuenta  = sCuenta;
            }

            // Se guarda el pago
            Guardar.VentaPago(oPago, oPagoDetalle);

            return(new ResAcc <int>(true, oPago.VentaPagoID));
        }
예제 #8
0
        public void GenerarPagoCuotas(decimal?monto)
        {
            if (Pagos.Count == 0)
            {
                VentaPago pago = new VentaPago();
                pago.TipoPago = FormaPago.CuentaCorriente;
                pago.Importe  = monto;
                monto         = 0;
                Pagos.Add(pago);
            }
            else
            {
                foreach (var pago in Pagos)
                {
                    if (pago.TipoPago == FormaPago.CuentaCorriente)
                    {
                        pago.Importe = monto;
                        monto        = 0;
                    }
                }
            }


            if (monto != 0)
            {
                VentaPago pago = new VentaPago();
                pago.TipoPago = FormaPago.CuentaCorriente;
                pago.Importe  = monto;
                Pagos.Add(pago);
            }

            GrillaPagos.DataSource = Pagos.ToList();
            RefrescarPagos();
        }
예제 #9
0
        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            VentaPago pago = ObtenerPago();

            var esValido = this.ValidarForm();

            if (esValido)
            {
                OnPagoAgregado(pago);
            }
            else
            {
                this.DialogResult = DialogResult.None;
            }
        }
예제 #10
0
        public static ResAcc <int> GenerarPagoNegativoPorNotaDeCredito(int iVentaID, decimal mImporte, int iNotaDeCreditoID)
        {
            // Se generan los datos del pago
            var oPago = new VentaPago()
            {
                VentaID = iVentaID,
                // TipoPagoID = Cat.TiposDePago.Contado,
                Fecha = DateTime.Now
            };
            var oPagoDetalle = new List <VentaPagoDetalle>();

            oPagoDetalle.Add(new VentaPagoDetalle()
            {
                TipoFormaPagoID = Cat.FormasDePago.Vale,
                Importe         = (mImporte * -1),
                NotaDeCreditoID = iNotaDeCreditoID
            });

            // Se guarda el pago
            Guardar.VentaPago(oPago, oPagoDetalle);

            return(new ResAcc <int>(true, oPago.VentaPagoID));
        }
예제 #11
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;
        }
        public void GenerarPagoAutoNuevo(decimal? monto, FormaPago tipoPago)
        {
            if (Pagos.Count != 0)
            {
                foreach (var pago in Pagos)
                {
                    if (pago.TipoPago == tipoPago)
                    {
                        pago.Importe = monto;

                        GrillaPagos.DataSource = Pagos.ToList();
                        EliminarPagoCero();
                        RefrescarPagos();
                        return;
                    }
                }
            }
            VentaPago pagoNuevo = new VentaPago();
            pagoNuevo.TipoPago = tipoPago;
            pagoNuevo.Importe = monto;
            Pagos.Add(pagoNuevo);

            GrillaPagos.DataSource = Pagos.ToList();
            RefrescarPagos();
        }
 private void EliminarPago(VentaPago ventaPago)
 {
     Pagos.Remove(ventaPago);
     RefrescarPagos();
 }
        public void GenerarPagoCuotas(decimal? monto)
        {
            if (Pagos.Count == 0)
            {
                VentaPago pago = new VentaPago();
                pago.TipoPago = FormaPago.CuentaCorriente;
                pago.Importe = monto;
                monto = 0;
                Pagos.Add(pago);
            }
            else
            {
                foreach (var pago in Pagos)
                {
                    if (pago.TipoPago == FormaPago.CuentaCorriente)
                    {
                        pago.Importe = monto;
                        monto = 0;
                    }
                }
            }


            if (monto != 0)
            {
                VentaPago pago = new VentaPago();
                pago.TipoPago = FormaPago.CuentaCorriente;
                pago.Importe = monto;
                Pagos.Add(pago);
            }

            GrillaPagos.DataSource = Pagos.ToList();
            RefrescarPagos();
        }
예제 #15
0
        private void ProcesarPagoTarjeta(VentaDataBase ventaData, VentaPago pago, CajaMovimiento cajaMovimiento)
        {
            var pagoTarjeta = pago as VentaPagoTarjeta;
            if (cajaMovimiento.Tarjeta == null)
                cajaMovimiento.Tarjeta = 0;

            cajaMovimiento.Tarjeta += pago.Importe;
            //GUARDAR TARJETA MOVIMIENTO 
            TarjetasMovimiento tarjetasMovimiento = new TarjetasMovimiento();
            tarjetasMovimiento.CajaMovimientoId = cajaMovimiento.Id;
            tarjetasMovimiento.TarjetaId = pagoTarjeta.TarjetaId ?? 0;
            tarjetasMovimiento.LoteCupon = pagoTarjeta.CuponNumero;
            tarjetasMovimiento.Fecha = _clock.Now;
            tarjetasMovimiento.Importe = (float)pago.Importe;
            tarjetasMovimiento.Estado = 1; // No se 
            tarjetasMovimiento.FechaAlta = _clock.Now;
            tarjetasMovimiento.SucursalAltaId = ventaData.SucursalId;
            tarjetasMovimiento.OperadorAltaId = ventaData.OperadorId;

            Uow.TarjetasMovimientos.Agregar(tarjetasMovimiento);
        }
예제 #16
0
        public static ResAcc<int> GenerarPagoNegativoPorNotaDeCredito(int iVentaID, decimal mImporte, int iNotaDeCreditoID)
        {
            // Se generan los datos del pago
            var oPago = new VentaPago()
            {
                VentaID = iVentaID,
                // TipoPagoID = Cat.TiposDePago.Contado,
                Fecha = DateTime.Now
            };
            var oPagoDetalle = new List<VentaPagoDetalle>();
            oPagoDetalle.Add(new VentaPagoDetalle()
            {
                TipoFormaPagoID = Cat.FormasDePago.Vale,
                Importe = (mImporte * -1),
                NotaDeCreditoID = iNotaDeCreditoID
            });

            // Se guarda el pago
            Guardar.VentaPago(oPago, oPagoDetalle);

            return new ResAcc<int>(true, oPago.VentaPagoID);
        }
예제 #17
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);
        }
예제 #18
0
        private bool VentasPorCobrar()
        {
            // Se valida que haya una venta seleccionada
            CajaVentasPorCobrar oPorCobrar = this.ctlCajaGeneral.ctlVentasPorCobrar;
            int iVentaID = oPorCobrar.VentaID;
            if (iVentaID <= 0)
            {
                UtilLocal.MensajeAdvertencia("No hay ninguna venta seleccionada.");
                return false;
            }

            // Se verifica si se debe cobrar o mostrar la pantalla de cobro
            var oCliente = Datos.GetEntity<Cliente>(q => q.ClienteID == oPorCobrar.ClienteID && q.Estatus);
            if (Util.ControlAlFrente(oPorCobrar.pnlParaDetalle) == oPorCobrar.ctlDetalle)
            {
                oPorCobrar.ctlCobro.LlenarDatosGenerales(oPorCobrar.VentaID);
                oPorCobrar.ctlCobro.Total = oPorCobrar.ImporteVenta;
                oPorCobrar.ctlCobro.EstablecerFormaDePagoPredeterminada(oCliente.TipoFormaPagoID.Valor(),
                    oPorCobrar.ctlCobro.Total, oCliente.BancoID.Valor(), oCliente.CuentaBancaria, oCliente.MenorQue2000Efectivo.Valor());
                oPorCobrar.ctlCobro.Leyenda = VentasProc.ObtenerLeyenda(iVentaID);
                oPorCobrar.ctlCobro.BringToFront();
                return false;
            }
            else
            {
                // Se pide el efectivo, si aplica
                if (!oPorCobrar.ctlCobro.CompletarCobro())
                    return false;
            }
            decimal? mEfectivoRecibido = oPorCobrar.ctlCobro.EfectivoRecibido;

            // Si la venta es a crédito y el cliente tiene personal, se muestran las firmas
            if (oPorCobrar.ctlCobro.ACredito)
            {
                var personal = Datos.GetListOf<ClientePersonal>(c => c.ClienteID == oPorCobrar.ClienteID );
                if (personal.Count > 0)
                {
                    var frmMostrarFirmas = new DetalleMostrarFirmas(oPorCobrar.ClienteID);
                    frmMostrarFirmas.ShowDialog(Principal.Instance);
                    if (frmMostrarFirmas.DialogResult != DialogResult.OK)
                        return false;

                    //Util.MensajeInformacion("Revisar la firma", "");
                }
            }

            // Se pide la orden de compra, si aplica
            var oVenta = Datos.GetEntity<Venta>(q => q.VentaID == oPorCobrar.VentaID && q.Estatus);
            if (oPorCobrar.ctlCobro.ACredito && oCliente.SiempreVale.Valor())
            {
                var oOrdenDeCompra = UtilLocal.ObtenerValor("Indica la Orden de Compra:", "", MensajeObtenerValor.Tipo.TextoLargo);
                if (oOrdenDeCompra == null)
                    return false;
                oVenta.OrdenDeCompra = Util.Cadena(oOrdenDeCompra);
            }

            // Si hay que facturar, se pregunta si se debe facturar al mismo cliente de las ventas o a otro
            int iAFClienteID = oPorCobrar.ClienteID;
            if (oPorCobrar.ctlCobro.Facturar)
            {
                // Se valida que la venta sólo tenga una artículo, en caso de que se quiera dividir
                if (oPorCobrar.ctlCobro.DividirFactura) {
                    if (oPorCobrar.ctlDetalle.ObtenerListaVenta().Count > 1) {
                        UtilLocal.MensajeAdvertencia("No se puede dividir la factura si la venta tiene más de un artículo.");
                        return false;
                    }
                }

                // Se obtiene el cliente al cual se va a facturar
                if (UtilLocal.MensajePregunta("¿Deseas hacer la factura a nombre del cliente que realizó la compra?") == 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 muestra la ventana de "Cargando.."
                Cargando.Mostrar();

                // Se validan los datos para realizar la facturación
                var ResVal = VentasLoc.ValidarDatosParaFactura(iVentaID, iAFClienteID);

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

                //
                if (!ResVal.Respuesta)
                {
                    UtilLocal.MensajeAdvertencia("Hubo un error al validar la factura.\n\n" + ResVal.Mensaje);
                    return false;
                }
            }

            // Se verifica si la venta es de un anticipo de 9500
            if (Datos.Exists<Cotizacion9500>(c => c.AnticipoVentaID == iVentaID && c.Estatus))
            {
                VentasLoc.NotificarCreacion9500();
            }
            // Se verifica si la venta pertenece a un 9500, para tomar las acciones necesarias
            var o9500 = Datos.GetEntity<Cotizacion9500>(q => q.VentaID == iVentaID && q.Estatus);
            bool b9500 = (o9500 != null);
            bool bDevolverEfectivo = false;
            decimal mSobrante = 0;
            if (b9500)
            {
                var oVentaV9500 = Datos.GetEntity<VentasView>(q => q.VentaID == o9500.VentaID);
                mSobrante = (o9500.Anticipo - oVentaV9500.Total);

                // Si el total es menor que el anticipo, se pregunta por la acción a tomar
                if (mSobrante > 0)
                {
                    var Res9500 = MessageBox.Show("El importe total es menor al anticipo que dejó el Cliente. ¿Deseas generar una notá de crédito por la diferencia?\n\n"
                        + " Si seleccionas \"No\", deberás devolver el efectivo al Cliente.", "Saldo a favor", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                    if (Res9500 == DialogResult.Cancel)
                        return false;
                    bDevolverEfectivo = (Res9500 == DialogResult.No);
                }
            }

            // Se verifica si la venta ya fue cobrada
            if (oVenta.VentaEstatusID != Cat.VentasEstatus.Realizada)
            {
                UtilLocal.MensajeAdvertencia("La venta seleccionada ya fue cobrada o ya no es posible realizar el cobro.");
                oPorCobrar.ActualizarDatos();
                return false;
            }

            // Se solicita y la validación de autorización, si aplica
            int iAutorizoID = 0;
            if (oPorCobrar.ctlCobro.AutorizacionDeCreditoRequerida || oPorCobrar.ctlCobro.AutorizacionDeNotasDeCreditoRequerida)
            {
                // Aquí falta considerar que las dos autorizaciones pueden ser requeridas, se debería pedir dos veces la autorización, para validar en cada caso
                string sPermiso = (oPorCobrar.ctlCobro.AutorizacionDeCreditoRequerida ? "Autorizaciones.Ventas.Cobro.CreditoNoAplicable" :
                    "Autorizaciones.Ventas.Cobro.NotaDeCreditoOtroCliente");
                var Res = UtilLocal.ValidarObtenerUsuario(sPermiso, "Autorización");
                iAutorizoID = (Res.Exito ? Res.Respuesta.UsuarioID : 0);
            }

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

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

            // Se cambia el estatus de la venta
            oVenta.VentaEstatusID = Cat.VentasEstatus.Cobrada;
            Datos.Guardar<Venta>(oVenta);

            // Si la venta es a crédito, se guarda el dato, si no, se generan los datos del pago
            int iVentaPagoID = 0;
            if (oPorCobrar.ctlCobro.ACredito)
            {
                oVenta.ACredito = true;
                oVenta.Vencimiento = oVenta.Fecha.AddDays(oCliente.DiasDeCredito.Valor());
                Datos.Guardar<Venta>(oVenta);
            }
            else
            {
                var oPago = new VentaPago()
                {
                    VentaID = oPorCobrar.VentaID,
                    Fecha = dAhora,
                };
                var oPagoDetalle = oPorCobrar.ctlCobro.GenerarPagoDetalle();
                // Se mandan guardar los datos del pago
                Guardar.VentaPago(oPago, oPagoDetalle);
                // Se actualiza la venta, pues pudo haber cambiado en el proceso anterior
                oVenta = Datos.GetEntity<Venta>(q => q.VentaID == oPorCobrar.VentaID && q.Estatus);
                iVentaPagoID = oPago.VentaPagoID;

                // Si hubo un pago con tarjeta de crédito se guarda la información de tarjeta y meses
                if (oPorCobrar.ctlCobro.BancoCuentaID > 0)
                {
                    var oPagoTar = oPagoDetalle.FirstOrDefault(c => c.TipoFormaPagoID == Cat.FormasDePago.Tarjeta || c.TipoFormaPagoID == Cat.FormasDePago.TarjetaDeDebito);
                    var oTarjeta = new VentaPagoConTarjeta()
                    {
                        BancoCuentaID = oPorCobrar.ctlCobro.BancoCuentaID,
                        VentaPagoDetalleID = oPagoTar.VentaPagoDetalleID,
                        MesesSinIntereses = oPorCobrar.ctlCobro.MesesSinIntereses.Value,
                        Telefono = oPorCobrar.ctlCobro.CelularTarjeta
                    };
                    Datos.Guardar<VentaPagoConTarjeta>(oTarjeta);
                    // Se actualiza el movimiento bancario, con el dato de la cuenta seleccionada
                    var oMovBanco = Datos.GetEntity<BancoCuentaMovimiento>(c => c.RelacionID == oPagoTar.VentaPagoDetalleID
                        && c.RelacionTabla == Cat.Tablas.VentaPagoDetalle);
                    oMovBanco.BancoCuentaID = oPorCobrar.ctlCobro.BancoCuentaID;
                    Datos.Guardar<BancoCuentaMovimiento>(oMovBanco);
                    // Se guarda el dato de teléfono en el registro del cliente
                    if (oCliente.ClienteID != Cat.Clientes.Mostrador)
                    {
                        if (oCliente.Celular != oPorCobrar.ctlCobro.CelularTarjeta)
                        {
                            oCliente.Celular = oPorCobrar.ctlCobro.CelularTarjeta;
                            Datos.Guardar<Cliente>(oCliente);
                        }
                    }
                }
            }

            // Si es de un 9500, se completa el 9500
            if (b9500)
                VentasProc.Completar9500(o9500, mSobrante, bDevolverEfectivo);

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

            // Para la impresión del ticket o factura
            var oAdicionales = new Dictionary<string, object>();
            oAdicionales.Add("EfectivoRecibido", mEfectivoRecibido);
            oAdicionales.Add("Cambio", (mEfectivoRecibido - oPorCobrar.ImporteVenta) ?? 0);

            // Se realiza la facturación, si aplica
            ResAcc<int> ResFactura = null;
            bool bGenerarFolio = true;
            if (oPorCobrar.ctlCobro.Facturar)
            {
                var oFormasDePago = UtilDatos.DeVentaPagoDetalleAVentasPagosDetalleView(oPorCobrar.ctlCobro.GenerarPagoDetalle());
                if (oPorCobrar.ctlCobro.FormasDePagoLibre != null && oPorCobrar.ctlCobro.FormasDePagoLibre.Count > 0)
                    oFormasDePago = oPorCobrar.ctlCobro.FormasDePagoLibre;

                // Se verifica si se debe dividir la factura
                var oProductos = oPorCobrar.ctlDetalle.ObtenerListaVenta();
                if (oPorCobrar.ctlCobro.DividirFactura)
                {
                    decimal mImporteMax = Util.Decimal(Config.Valor("Facturacion.ImporteDividir"));
                    if (oPorCobrar.ImporteVenta > mImporteMax)
                    {
                        decimal mImporteFac = (mImporteMax - 60);
                        decimal mRestante = oPorCobrar.ImporteVenta;
                        int iFactura = 0;
                        string sDescripcion = oProductos[0].NombreDeParte;
                        while (mRestante > 0)
                        {
                            if (mRestante < mImporteFac)
                                mImporteFac = mRestante;
                            // Se ajustan los datos del producto
                            oProductos[0].PrecioUnitario = UtilTheos.ObtenerPrecioSinIva(mImporteFac, 3);
                            oProductos[0].Iva = UtilTheos.ObtenerIvaDePrecio(mImporteFac, 3);
                            if (++iFactura > 1)
                                oProductos[0].NombreDeParte = string.Format("{0}\n(Complemento {1})", sDescripcion, (iFactura - 1));
                            // Se manda hacer la factura
                            ResFactura = VentasLoc.GenerarFacturaElectronica(new List<int>() { iVentaID }, iAFClienteID, oProductos, oFormasDePago, "", oAdicionales);
                            if (ResFactura.Error)
                                break;
                            //
                            mRestante -= mImporteFac;
                        }

                        // Se marca la venta como facturas divididas
                        oVenta = Datos.GetEntity<Venta>(q => q.VentaID == oPorCobrar.VentaID && q.Estatus);
                        oVenta.FacturaDividida = true;
                        Datos.Guardar<Venta>(oVenta);
                    }
                }

                if (ResFactura == null)
                    ResFactura = VentasLoc.GenerarFacturaElectronica(new List<int>() { iVentaID }, iAFClienteID, oProductos, oFormasDePago, "", oAdicionales);

                // Se obtiene la forma de pago
                /* if (oPorCobrar.ctlCobro.FormaDePagoLibre == "")
                {
                    ResFactura = VentasProc.GenerarFacturaElectronica(iVentaID, iAFClienteID
                        , oPorCobrar.ctlDetalle.ObtenerListaVenta(), oPorCobrar.ctlCobro.GenerarPagoDetalle(), "");
                }
                else
                {
                    ResFactura = VentasProc.GenerarFacturaElectronica(new List<int>() { iVentaID }, iAFClienteID
                        , oPorCobrar.ctlDetalle.ObtenerListaVenta(), oPorCobrar.ctlCobro.FormaDePagoLibre, "");
                }

                // Se manda hacer la factura electrónica
                if (oVenta.ACredito)
                    ResFactura = VentasProc.GenerarFacturaElectronica(iVentaID, iAFClienteID
                        , oPorCobrar.ctlDetalle.ObtenerListaVenta(), oPorCobrar.ctlCobro.GenerarPagoDetalle(), "");
                else
                    ResFactura = VentasProc.GenerarFacturaElectronica(iVentaID, iAFClienteID, oPorCobrar.ctlDetalle.ObtenerListaVenta(), null, "");
                */

                if (ResFactura.Exito)
                {
                    // Se escribe el folio en la venta
                    /* Siempre no, se hace dentro del procedimiento "GenerarFacturaElectronica"
                    var oFactura = General.GetEntity<VentaFactura>(q => q.VentaFacturaID == ResFactura.Respuesta);
                    oVenta.Folio = (oFactura.Serie + oFactura.Folio);
                    Datos.Guardar<Venta>(oVenta);
                    */
                    bGenerarFolio = false;

                    // Se manda a afectar contabilidad (AfeConta)
                    var oFactura = Datos.GetEntity<VentaFactura>(c => c.VentaFacturaID == ResFactura.Respuesta && c.Estatus);
                    if (oVenta.ACredito)
                        ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.VentaCredito, iVentaID, (oFactura.Serie + oFactura.Folio), oCliente.Nombre);
                    else
                        ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.VentaContadoFacturaDirecta, iVentaID, (oFactura.Serie + oFactura.Folio), oCliente.Nombre);
                }
                else
                {
                    UtilLocal.MensajeAdvertencia("Hubo un error al generar la factura.\n\n" + ResFactura.Mensaje);
                    // return true;  // Igual se sigue, porque ya se guardaron todos los datos del pago.
                }
            }

            // Se genera el folio de la venta, si no se hizo factura o hubo un error al generar la factura
            if (bGenerarFolio) {
                // Se genera el folio de venta
                string sFolio = VentasProc.GenerarFolioDeVenta();
                oVenta.Folio = sFolio;
                oVenta.FolioIni = sFolio;
                Datos.Guardar<Venta>(oVenta);

                // Se imprimen el ticket correpondiente
                // Se verifica si es una venta por Anticipo de 9500
                var o9500Ant = Datos.GetEntity<Cotizacion9500>(q => q.EstatusGenericoID == Cat.EstatusGenericos.Pendiente
                    && q.AnticipoVentaID.Value == oVenta.VentaID && q.Estatus);
                if (o9500Ant == null) {
                    VentasLoc.GenerarTicketDeVenta(oVenta.VentaID, oPorCobrar.ctlDetalle.ObtenerListaVenta(), oAdicionales);
                    // Se verifica si se debe imprimir ticket precio 1
                    if(Datos.Exists<Cliente>(c => c.ClienteID == oPorCobrar.ClienteID && c.TicketPrecio1.HasValue && c.TicketPrecio1.Value))
                        VentasLoc.GenerarTicketPrecio1(oVenta.VentaID);
                }
                else
                    VentasLoc.GenerarTicketDe9500(o9500Ant.Cotizacion9500ID);
            }

            // Se obtiene la vista de la venta actualizada, por el cambio de folio y otros cambios que pudo haber tenido
            var oVentaV = Datos.GetEntity<VentasView>(c => c.VentaID == oVenta.VentaID);

            // Si es un ticket a crédito, se genera una póliza especial de ajuste (AfeConta)
            if (oVenta.ACredito && !oPorCobrar.ctlCobro.Facturar)
            {
                ContaProc.CrearPolizaTemporalTicketCredito(iVentaID, oPorCobrar.ImporteVenta);
            }

            // Se verifica si se crearon movimientos bancarios (por pagos de banco), en cuyo caso, se completan con el folio de venta asignado
            var oPagoDet = Datos.GetListOf<VentaPagoDetalle>(c => c.VentaPagoID == iVentaPagoID && c.Estatus);
            foreach (var oReg in oPagoDet)
            {
                if (oReg.TipoFormaPagoID == Cat.FormasDePago.Cheque || oReg.TipoFormaPagoID == Cat.FormasDePago.Tarjeta
                    || oReg.TipoFormaPagoID == Cat.FormasDePago.TarjetaDeDebito || oReg.TipoFormaPagoID == Cat.FormasDePago.Transferencia)
                {
                    var oMovBanco = Datos.GetEntity<BancoCuentaMovimiento>(c => c.RelacionTabla == Cat.Tablas.VentaPagoDetalle && c.RelacionID == oReg.VentaPagoDetalleID);
                    oMovBanco.Referencia = oVentaV.Folio;
                    Datos.Guardar<BancoCuentaMovimiento>(oMovBanco);
                }
            }

            // Se manda a afectar contabilidad (AfeConta), si es vale
            // Ya no se manda hacer esta póliza porque este movimiento ya lo contempla la Factura global del Día o la Factura al
            // momento del Pago, sea crédito o contado. Si se quiciera reactivar esta póliza verificar la Función porque Moy la modificó 2015-08-26
            // if (oPagoDet.Any(c => c.FormaDePagoID == Cat.FormasDePago.Vale))
            //     ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.VentaContadoVale, iVentaID, oVentaV.Folio, oCliente.Nombre);

            // Se modifica el registro de kardex correspondiente, para completar los datos faltantes
            var oVentaDet = Datos.GetListOf<VentaDetalle>(c => c.VentaID == iVentaID && c.Estatus);
            var oPartesKardex = Datos.GetListOf<ParteKardex>(c => c.OperacionID == Cat.OperacionesKardex.Venta && c.RelacionTabla == Cat.Tablas.Venta
                && c.RelacionID == iVentaID);
            foreach (var oReg in oVentaDet)
            {
                var oKardex = oPartesKardex.FirstOrDefault(c => c.ParteID == oReg.ParteID);
                if (oKardex == null) continue;
                oKardex.Folio = oVentaV.Folio;
                oKardex.Entidad = oVentaV.Cliente;
                oKardex.Origen = oVentaV.Sucursal;
                oKardex.Destino = oVentaV.Cliente;
                oKardex.Importe = (oReg.PrecioUnitario + oReg.Iva);
                Datos.Guardar<ParteKardex>(oKardex);
            }

            // Si se pagó con vale, se verifica si se crearon nuevos vales por importes restantes. Y se mandan a imprimir
            var oValesCreados = VentasProc.ObtenerValesCreados(oPagoDet);
            foreach (var oReg in oValesCreados)
                VentasLoc.GenerarTicketNotaDeCredito(oReg.NotaDeCreditoID);

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

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

            return true;
        }
예제 #19
0
파일: Guardar.cs 프로젝트: moisesiq/aupaga
        public static ResAcc VentaPago(VentaPago oPago, List<VentaPagoDetalle> Detalle)
        {
            // Se generan datos predeterminados o globales, en caso de que apliquen
            oPago.Fecha = (oPago.Fecha != DateTime.MinValue ? oPago.Fecha : DateTime.Now);
            oPago.SucursalID = (oPago.SucursalID > 0 ? oPago.SucursalID : Theos.SucursalID);

            // Se guarda el pago
            Datos.Guardar<VentaPago>(oPago);

            // Se guarda el detalle
            var oVentaV = Datos.GetEntity<VentasView>(q => q.VentaID == oPago.VentaID);
            foreach (var PartePago in Detalle)
            {
                PartePago.VentaPagoID = oPago.VentaPagoID;
                Datos.Guardar<VentaPagoDetalle>(PartePago);

                // Se afectan las notas de crédito, si hay alguna
                if (PartePago.TipoFormaPagoID == Cat.FormasDePago.Vale && PartePago.Importe > 0)
                {
                    int iNotaID = PartePago.NotaDeCreditoID.Valor();
                    var oNota = Datos.GetEntity<NotaDeCredito>(q => q.NotaDeCreditoID == iNotaID && q.Estatus);
                    if (oNota != null)
                    {
                        // Se verifica si se usó el importe total o sólo una parte
                        if (PartePago.Importe < oNota.Importe)
                        {
                            // Se crea una nueva nota, con el importe restante
                            // 25/11/2015 - Se busca el vale original para usarlo como origen de todas las notas derivadas, en vez de el OrigenVentaID que se mandaba antes
                            int iOrigenValeID = (oNota.OrigenID == Cat.OrigenesNotaDeCredito.ImporteRestante ? oNota.RelacionID.Valor() : oNota.NotaDeCreditoID);
                            VentasProc.GenerarNotaDeCredito(oNota.ClienteID, (oNota.Importe - PartePago.Importe), "", Cat.OrigenesNotaDeCredito.ImporteRestante
                                , iOrigenValeID);
                            //
                            oNota.Importe = PartePago.Importe;
                        }
                        //
                        oNota.Valida = false;
                        oNota.FechaDeUso = DateTime.Now;
                        oNota.UsoVentaID = oPago.VentaID;
                        Datos.Guardar<NotaDeCredito>(oNota);
                    }
                }

                // Si es un pago bancario, se genera el movimiento correspondiente
                if (PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta || PartePago.TipoFormaPagoID == Cat.FormasDePago.TarjetaDeDebito
                    || PartePago.TipoFormaPagoID == Cat.FormasDePago.Transferencia || PartePago.TipoFormaPagoID == Cat.FormasDePago.Cheque)
                {
                    var oBanco = Datos.GetEntity<Banco>(c => c.BancoID == PartePago.BancoID && c.Estatus);

                    var oMovBanc = new BancoCuentaMovimiento()
                    {
                        // BancoCuentaID = (PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta ? (int?)Cat.CuentasBancarias.Banamex : null),
                        EsIngreso = true,
                        Fecha = oPago.Fecha,
                        FechaAsignado = ((PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta || PartePago.TipoFormaPagoID == Cat.FormasDePago.TarjetaDeDebito)
                            ? (DateTime?)oPago.Fecha : null),
                        SucursalID = oPago.SucursalID,
                        Importe = PartePago.Importe,
                        Concepto = oVentaV.Cliente,
                        Referencia = oVentaV.Folio,
                        TipoFormaPagoID = PartePago.TipoFormaPagoID,
                        DatosDePago = string.Format("{0}-{1}-{2}", oBanco.NombreBanco, PartePago.Folio, PartePago.Cuenta),
                        RelacionTabla = Cat.Tablas.VentaPagoDetalle,
                        RelacionID = PartePago.VentaPagoDetalleID,
                    };
                    ContaProc.RegistrarMovimientoBancario(oMovBanc);
                }
            }

            // Se verifica el estatus de la venta, por si debe cambiar según el pago
            if (oVentaV.VentaEstatusID == Cat.VentasEstatus.Cobrada)
            {
                // Se obtiene el total de los pagos
                decimal mPagado = Datos.GetListOf<VentasPagosView>(q => q.VentaID == oVentaV.VentaID).Sum(q => q.Importe);
                if (mPagado >= oVentaV.Total)
                {
                    var oVenta = Datos.GetEntity<Venta>(q => q.Estatus && q.VentaID == oPago.VentaID);
                    oVenta.VentaEstatusID = Cat.VentasEstatus.Completada;
                    // Se guarda con el nuevo estatus
                    Datos.Guardar<Venta>(oVenta);
                }
            }

            return new ResAcc(true);
        }
예제 #20
0
        private VentaPago ObtenerPago()
        {
            VentaPago ventaPago = new VentaPago();

            if (TabsFormaPago.SelectedPage == this.TabEfectivo)
            {
                ventaPago.Importe = this.Importe;
                if (ChkCajaAnterior.Checked)
                {
                    ventaPago.TipoPago    = FormaPago.EfectivoCajaAnterior;
                    ventaPago.Descripcion = "Caja Anterior";
                }
                else
                {
                    ventaPago.TipoPago = FormaPago.Efectivo;
                }
            }

            if (TabsFormaPago.SelectedPage == this.TabTarjeta)
            {
                var ventaPagoTarjeta = new VentaPagoTarjeta();
                ventaPagoTarjeta.Interes = Interes;
                //ventaPagoTarjeta.Importe = Importe;
                var interes = Importe * Interes / 100;
                ventaPagoTarjeta.Intereses   = interes;
                ventaPagoTarjeta.Importe     = Importe + interes;
                ventaPagoTarjeta.TipoPago    = FormaPago.Tarjeta;
                ventaPagoTarjeta.TarjetaId   = TarjetaId;
                ventaPagoTarjeta.CuponNumero = CuponNumero;
                ventaPagoTarjeta.Descripcion = CbxTarjeta.Text + " - " + CuponNumero;

                ventaPago = ventaPagoTarjeta;
            }

            if (TabsFormaPago.SelectedPage == this.TabCheque)
            {
                var ventaPagoCheque = new VentaPagoCheque();
                ventaPagoCheque.Importe     = Importe;
                ventaPagoCheque.TipoPago    = FormaPago.Cheque;
                ventaPagoCheque.FechaCobro  = this.ChequeFechaCobro;
                ventaPagoCheque.BancoId     = this.ChequeBancoId;
                ventaPagoCheque.Numero      = ChequeNumero;
                ventaPagoCheque.Descripcion = CbxChequeBanco.Text + " - " + ChequeNumero;
                ventaPago = ventaPagoCheque;
            }

            if (TabsFormaPago.SelectedPage == this.TabDeposito)
            {
                VentaPagoDeposito ventaPagoDeposito = new VentaPagoDeposito();
                ventaPagoDeposito.Importe     = Importe;
                ventaPagoDeposito.TipoPago    = FormaPago.Deposito;
                ventaPagoDeposito.Fecha       = DepositoFecha;
                ventaPagoDeposito.CuentaId    = DepositoCuentaId;
                ventaPagoDeposito.Numero      = DepositoNumero;
                ventaPagoDeposito.Descripcion = CbxDepositoBanco.Text + " - " + DepositoNumero;
                ventaPago = ventaPagoDeposito;
            }
            if (TabsFormaPago.SelectedPage == this.TabTransferencia)
            {
                VentaPagoTransferencia ventaPagoTransferencia = new VentaPagoTransferencia();
                ventaPagoTransferencia.Importe     = Importe;
                ventaPagoTransferencia.TipoPago    = FormaPago.Transferencia;
                ventaPagoTransferencia.Fecha       = TransferenciaFecha;
                ventaPagoTransferencia.CuentaId    = CuentaTransferencia;
                ventaPagoTransferencia.Numero      = NumeroTransferencia;
                ventaPagoTransferencia.Descripcion = CbxCuentasTransferencia.Texto;
                ventaPago = ventaPagoTransferencia;
            }

            return(ventaPago);
        }
예제 #21
0
 private void EliminarPago(VentaPago ventaPago)
 {
     Pagos.Remove(ventaPago);
     RefrescarPagos();
 }
예제 #22
0
        public static ResAcc<int> GenerarPago(int iVentaID, decimal mImporte, int iFormaDePagoID, int iBancoID, string sFolio, string sCuenta)
        {
            // Se generan los datos del pago
            var oPago = new VentaPago()
            {
                VentaID = iVentaID,
                Fecha = DateTime.Now
            };
            var oPagoDetalle = new List<VentaPagoDetalle>();
            oPagoDetalle.Add(new VentaPagoDetalle()
            {
                TipoFormaPagoID = iFormaDePagoID,
                Importe = mImporte
            });
            if (iBancoID > 0)
            {
                oPagoDetalle[0].BancoID = iBancoID;
                oPagoDetalle[0].Folio = sFolio;
                oPagoDetalle[0].Cuenta = sCuenta;
            }

            // Se guarda el pago
            Guardar.VentaPago(oPago, oPagoDetalle);

            return new ResAcc<int>(true, oPago.VentaPagoID);
        }
예제 #23
0
        private VentaPago ObtenerPago()
        {
            VentaPago ventaPago = new VentaPago();

            if (TabsFormaPago.SelectedPage == this.TabEfectivo)
            {
                ventaPago.Importe = this.Importe;
                if (ChkCajaAnterior.Checked)
                {
                    ventaPago.TipoPago = FormaPago.EfectivoCajaAnterior;
                    ventaPago.Descripcion = "Caja Anterior";
                }
                else
                    ventaPago.TipoPago = FormaPago.Efectivo;

            }

            if (TabsFormaPago.SelectedPage == this.TabTarjeta)
            {
                var ventaPagoTarjeta = new VentaPagoTarjeta();
                ventaPagoTarjeta.Interes = Interes;
                //ventaPagoTarjeta.Importe = Importe;
                var interes = Importe * Interes/100;
                ventaPagoTarjeta.Intereses = interes;
                ventaPagoTarjeta.Importe = Importe + interes;
                ventaPagoTarjeta.TipoPago = FormaPago.Tarjeta;
                ventaPagoTarjeta.TarjetaId = TarjetaId;
                ventaPagoTarjeta.CuponNumero = CuponNumero;
                ventaPagoTarjeta.Descripcion = CbxTarjeta.Text + " - " + CuponNumero;
                
                ventaPago = ventaPagoTarjeta;
            }

            if (TabsFormaPago.SelectedPage == this.TabCheque)
            {
                var ventaPagoCheque = new VentaPagoCheque();
                ventaPagoCheque.Importe = Importe;
                ventaPagoCheque.TipoPago = FormaPago.Cheque;
                ventaPagoCheque.FechaCobro = this.ChequeFechaCobro;
                ventaPagoCheque.BancoId = this.ChequeBancoId;
                ventaPagoCheque.Numero = ChequeNumero;
                ventaPagoCheque.Descripcion = CbxChequeBanco.Text + " - " + ChequeNumero;
                ventaPago = ventaPagoCheque;
            }

            if (TabsFormaPago.SelectedPage == this.TabDeposito)
            {
                VentaPagoDeposito ventaPagoDeposito = new VentaPagoDeposito();
                ventaPagoDeposito.Importe = Importe;
                ventaPagoDeposito.TipoPago = FormaPago.Deposito;
                ventaPagoDeposito.Fecha = DepositoFecha;
                ventaPagoDeposito.CuentaId = DepositoCuentaId;
                ventaPagoDeposito.Numero = DepositoNumero;
                ventaPagoDeposito.Descripcion = CbxDepositoBanco.Text + " - " + DepositoNumero;
                ventaPago = ventaPagoDeposito;
            }
            if (TabsFormaPago.SelectedPage == this.TabTransferencia)
            {
                VentaPagoTransferencia ventaPagoTransferencia = new VentaPagoTransferencia();
                ventaPagoTransferencia.Importe = Importe;
                ventaPagoTransferencia.TipoPago = FormaPago.Transferencia;
                ventaPagoTransferencia.Fecha = TransferenciaFecha;
                ventaPagoTransferencia.CuentaId = CuentaTransferencia;
                ventaPagoTransferencia.Numero = NumeroTransferencia;
                ventaPagoTransferencia.Descripcion = CbxCuentasTransferencia.Texto;
                ventaPago = ventaPagoTransferencia;
            }

            return ventaPago;
        }
예제 #24
0
        private void ProcesarPagoDeposito(VentaDataBase ventaData, VentaPago pago, CajaMovimiento cajaMovimiento, Venta venta, Caja caja)
        {
            var pagoDeposito = pago as VentaPagoDeposito;
            if (cajaMovimiento.Deposito == null)
                cajaMovimiento.Deposito = 0;

            //Guardar Cuentas Movimientos
            cajaMovimiento.Deposito += pago.Importe;

            CuentasMovimiento cuentasMovimiento = new CuentasMovimiento();
            cuentasMovimiento.CuentaId = pagoDeposito.CuentaId ?? 0;
            cuentasMovimiento.TipoMovimientoId = 2; //Deposito
            cuentasMovimiento.FechaMovimiento = pagoDeposito.Fecha;
            cuentasMovimiento.EstadoMovimientoCuentaId = 0;
            cuentasMovimiento.TipoComprobanteId = ventaData.TipoComprobanteSeleccionado;
            cuentasMovimiento.ComprobanteId = venta.Id;
            cuentasMovimiento.MonedaId = 0;
            cuentasMovimiento.CondicionVentaId = ventaData.CondicionVentaSeleccionada;
            cuentasMovimiento.NroMovimiento = pagoDeposito.Numero;
            cuentasMovimiento.Descripcion = "DEPOSITO NRO " + pagoDeposito.Numero.ToString();
            cuentasMovimiento.FechaCobro = _clock.Now;
            cuentasMovimiento.Debito = 0;
            cuentasMovimiento.Credito = pago.Importe;
            cuentasMovimiento.TipoCarga = 2;
            cuentasMovimiento.CajaId = caja.Id;
            cuentasMovimiento.FechaAlta = _clock.Now;
            cuentasMovimiento.OperadorAltaId = ventaData.OperadorId;
            cuentasMovimiento.SucursalAltaId = ventaData.SucursalId;

            Uow.CuentasMovimientos.Agregar(cuentasMovimiento);
        }
        public void GenerarPagoAuto(decimal? monto)
        {
            if (Pagos.Count==0)
            {
                VentaPago pago = new VentaPago();
                pago.TipoPago = FormaPago.Efectivo;
                pago.Importe = monto;
                Pagos.Add(pago);
            }
            else
            {
                foreach (var pago in Pagos)
                {
                    switch (pago.TipoPago)
                    {
                        case FormaPago.Efectivo:
                            pago.Importe= monto;
                            break;
                    }
                }
            }

            GrillaPagos.DataSource = Pagos.ToList();
            RefrescarPagos();
        }
예제 #26
0
        private void ProcesarPagoCheque(VentaDataBase ventaData, VentaPago pago, CajaMovimiento cajaMovimiento)
        {
            var pagoCheque = pago as VentaPagoCheque;

            if (cajaMovimiento.Cheque == null)
                cajaMovimiento.Cheque = 0;

            cajaMovimiento.Cheque += pago.Importe;

            ChequesTercero chequesTercero = new ChequesTercero();
            chequesTercero.Id = Guid.NewGuid();
            chequesTercero.CajaMovimientoId = cajaMovimiento.Id;
            chequesTercero.BancoId = pagoCheque.BancoId ?? 0;
            chequesTercero.NroCheque = pagoCheque.Numero;
            chequesTercero.Fecha = _clock.Now;
            chequesTercero.FechaCobro = _clock.Now;
            chequesTercero.Importe = (float)pago.Importe;
            chequesTercero.FechaAlta = _clock.Now;
            chequesTercero.EstadoChequeId = 0;
            chequesTercero.SucursalAltaId = ventaData.SucursalId;
            chequesTercero.OperadorAltaId = ventaData.OperadorId;

            Uow.ChequesTerceros.Agregar(chequesTercero);
        }
예제 #27
0
 private void OnPagoAgregado(VentaPago pago)
 {
     if (PagoAgregado != null)
     {
         PagoAgregado(this, pago);
     }
 }
예제 #28
0
파일: Guardar.cs 프로젝트: moisesiq/aupaga
        public static ResAcc VentaPago(VentaPago oPago, List <VentaPagoDetalle> Detalle)
        {
            // Se generan datos predeterminados o globales, en caso de que apliquen
            oPago.Fecha      = (oPago.Fecha != DateTime.MinValue ? oPago.Fecha : DateTime.Now);
            oPago.SucursalID = (oPago.SucursalID > 0 ? oPago.SucursalID : Theos.SucursalID);

            // Se guarda el pago
            Datos.Guardar <VentaPago>(oPago);

            // Se guarda el detalle
            var oVentaV = Datos.GetEntity <VentasView>(q => q.VentaID == oPago.VentaID);

            foreach (var PartePago in Detalle)
            {
                PartePago.VentaPagoID = oPago.VentaPagoID;
                Datos.Guardar <VentaPagoDetalle>(PartePago);

                // Se afectan las notas de crédito, si hay alguna
                if (PartePago.TipoFormaPagoID == Cat.FormasDePago.Vale && PartePago.Importe > 0)
                {
                    int iNotaID = PartePago.NotaDeCreditoID.Valor();
                    var oNota   = Datos.GetEntity <NotaDeCredito>(q => q.NotaDeCreditoID == iNotaID && q.Estatus);
                    if (oNota != null)
                    {
                        // Se verifica si se usó el importe total o sólo una parte
                        if (PartePago.Importe < oNota.Importe)
                        {
                            // Se crea una nueva nota, con el importe restante
                            // 25/11/2015 - Se busca el vale original para usarlo como origen de todas las notas derivadas, en vez de el OrigenVentaID que se mandaba antes
                            int iOrigenValeID = (oNota.OrigenID == Cat.OrigenesNotaDeCredito.ImporteRestante ? oNota.RelacionID.Valor() : oNota.NotaDeCreditoID);
                            VentasProc.GenerarNotaDeCredito(oNota.ClienteID, (oNota.Importe - PartePago.Importe), "", Cat.OrigenesNotaDeCredito.ImporteRestante
                                                            , iOrigenValeID);
                            //
                            oNota.Importe = PartePago.Importe;
                        }
                        //
                        oNota.Valida     = false;
                        oNota.FechaDeUso = DateTime.Now;
                        oNota.UsoVentaID = oPago.VentaID;
                        Datos.Guardar <NotaDeCredito>(oNota);
                    }
                }

                // Si es un pago bancario, se genera el movimiento correspondiente
                if (PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta || PartePago.TipoFormaPagoID == Cat.FormasDePago.TarjetaDeDebito ||
                    PartePago.TipoFormaPagoID == Cat.FormasDePago.Transferencia || PartePago.TipoFormaPagoID == Cat.FormasDePago.Cheque)
                {
                    var oBanco = Datos.GetEntity <Banco>(c => c.BancoID == PartePago.BancoID && c.Estatus);

                    var oMovBanc = new BancoCuentaMovimiento()
                    {
                        // BancoCuentaID = (PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta ? (int?)Cat.CuentasBancarias.Banamex : null),
                        EsIngreso     = true,
                        Fecha         = oPago.Fecha,
                        FechaAsignado = ((PartePago.TipoFormaPagoID == Cat.FormasDePago.Tarjeta || PartePago.TipoFormaPagoID == Cat.FormasDePago.TarjetaDeDebito)
                            ? (DateTime?)oPago.Fecha : null),
                        SucursalID      = oPago.SucursalID,
                        Importe         = PartePago.Importe,
                        Concepto        = oVentaV.Cliente,
                        Referencia      = oVentaV.Folio,
                        TipoFormaPagoID = PartePago.TipoFormaPagoID,
                        DatosDePago     = string.Format("{0}-{1}-{2}", oBanco.NombreBanco, PartePago.Folio, PartePago.Cuenta),
                        RelacionTabla   = Cat.Tablas.VentaPagoDetalle,
                        RelacionID      = PartePago.VentaPagoDetalleID,
                    };
                    ContaProc.RegistrarMovimientoBancario(oMovBanc);
                }
            }

            // Se verifica el estatus de la venta, por si debe cambiar según el pago
            if (oVentaV.VentaEstatusID == Cat.VentasEstatus.Cobrada)
            {
                // Se obtiene el total de los pagos
                decimal mPagado = Datos.GetListOf <VentasPagosView>(q => q.VentaID == oVentaV.VentaID).Sum(q => q.Importe);
                if (mPagado >= oVentaV.Total)
                {
                    var oVenta = Datos.GetEntity <Venta>(q => q.Estatus && q.VentaID == oPago.VentaID);
                    oVenta.VentaEstatusID = Cat.VentasEstatus.Completada;
                    // Se guarda con el nuevo estatus
                    Datos.Guardar <Venta>(oVenta);
                }
            }

            return(new ResAcc(true));
        }