Esempio n. 1
0
        private void DevolverControlCasco(int iDevolucionDetalleID, int iUsuarioID)
        {
            // Se obtiene el registro del control de casco
            var oDevDet = Datos.GetEntity <VentaDevolucionDetalle>(c => c.VentaDevolucionDetalleID == iDevolucionDetalleID && c.Estatus);
            var oDev    = Datos.GetEntity <VentaDevolucion>(c => c.VentaDevolucionID == oDevDet.VentaDevolucionID && c.Estatus);

            for (int i = 0; i < oDevDet.Cantidad; i++)
            {
                int iCancelarVentaID = 0;
                var oCascoReg        = Datos.GetEntity <CascoRegistro>(c => c.VentaID == oDev.VentaID && c.ParteID == oDevDet.ParteID);
                // Acción si no se recibió ningún casco
                if (oCascoReg.RecibidoCascoID == null)
                {
                    iCancelarVentaID = oCascoReg.CobroVentaID.Valor();
                }
                else
                {
                    var oParte = Datos.GetEntity <Parte>(c => c.ParteID == oCascoReg.ParteID && c.Estatus);

                    // Se registra la salida del inventario
                    var oVentaV = Datos.GetEntity <VentasView>(c => c.VentaID == oDev.VentaID);
                    var oCascoRecibidoPrecio = Datos.GetEntity <PartePrecio>(c => c.ParteID == oCascoReg.RecibidoCascoID.Value && c.Estatus);
                    AdmonProc.AfectarExistenciaYKardex(oCascoReg.RecibidoCascoID.Valor(), GlobalClass.SucursalID, Cat.OperacionesKardex.SalidaInventario
                                                       , oCascoReg.CascoRegistroID.ToString(), iUsuarioID, oVentaV.Cliente, "CONTROL DE CASCOS", oVentaV.Sucursal, -1, oCascoRecibidoPrecio.Costo.Valor()
                                                       , Cat.Tablas.CascoRegistro, oCascoReg.CascoRegistroID);

                    // Acciones si no se recibió el casco adecuado
                    if (oCascoReg.RecibidoCascoID != oParte.RequiereCascoDe)
                    {
                        // Acción si hubo diferencia de importe entre el casco recibido y el esperado
                        iCancelarVentaID = oCascoReg.CobroVentaID.Valor();  // Por si se realizó un cobro
                        // Por si se generó un vale
                        var oVale = Datos.GetEntity <NotaDeCredito>(c => c.OrigenID == Cat.OrigenesNotaDeCredito.CascoDeMayorValor &&
                                                                    c.RelacionID == oCascoReg.CascoRegistroID);
                        if (oVale != null)
                        {
                            VentasProc.CancelarNotaDeCredito(oVale.NotaDeCreditoID, "POR CANCELACIÓN DE VENTA CON CASCO");
                        }
                        // Si se utilizarn importes de caso a favor, se liberan
                        var oUsados = Datos.GetListOf <CascoRegistroImporte>(c => c.CascoRegistroID == oCascoReg.CascoRegistroID);
                        foreach (var oReg in oUsados)
                        {
                            var oCascoImp = Datos.GetEntity <CascoImporte>(c => c.CascoImporteID == oReg.CascoImporteID);
                            oCascoImp.ImporteUsado -= oReg.Importe.Valor();
                            Datos.Guardar <CascoImporte>(oCascoImp);
                            Datos.Eliminar <CascoRegistroImporte>(oReg);
                        }
                        // Si se creó un importe de caso a favor, se cancela
                        var oCascoImporte = Datos.GetEntity <CascoImporte>(c => c.OrigenID == oCascoReg.CascoRegistroID && c.Importe > 0);
                        if (oCascoImporte != null)
                        {
                            // Se verifica si ha sido usado
                            if (Datos.Exists <CascoRegistroImporte>(c => c.CascoImporteID == oCascoImporte.CascoImporteID))
                            {
                                // Se mete un Casco Importe negativo, porque ya fue usado
                                Datos.Guardar <CascoImporte>(new CascoImporte()
                                {
                                    Fecha    = DateTime.Now,
                                    OrigenID = oCascoReg.CascoRegistroID,
                                    Importe  = (oCascoImporte.Importe * -1)
                                });
                            }
                            else
                            {
                                // Se elimina el importe a favor
                                Datos.Eliminar <CascoImporte>(oCascoImporte);
                            }
                        }
                    }
                }

                // Se cancela la venta del cobro de la diferencia (sólo lo correspondiente al cobro), si aplica
                if (iCancelarVentaID > 0)
                {
                    int iDevParteID = Cat.Partes.DiferenciaDeCascos;
                    if (oCascoReg.RecibidoCascoID == null)
                    {
                        var oParte = Datos.GetEntity <Parte>(c => c.ParteID == oCascoReg.ParteID && c.Estatus);
                        iDevParteID = oParte.RequiereDepositoDe.Valor();
                        if (iDevParteID <= 0)
                        {
                            UtilLocal.MensajeError("El Artículo registrado en Control de Cascos no tiene un depósito asignado.");
                            break;
                        }
                    }

                    var oVentaDet = Datos.GetListOf <VentaDetalle>(c => c.VentaID == iCancelarVentaID && c.Estatus);
                    if (oVentaDet.Count > 0)
                    {
                        var oParteDet = oVentaDet.FirstOrDefault(c => c.ParteID == iDevParteID);
                        // Se obtiene la forma de pago
                        var oPagoDetV      = Datos.GetEntity <VentasPagosDetalleView>(c => c.VentaID == iCancelarVentaID);
                        int iFormaDePagoID = (oPagoDetV.Fecha.Valor().Date == DateTime.Now.Date ? oPagoDetV.FormaDePagoID : Cat.FormasDePago.Efectivo);
                        // Se general el registro de devolución
                        var oDevolucion = new VentaDevolucion()
                        {
                            VentaID          = iCancelarVentaID,
                            Fecha            = DateTime.Now,
                            SucursalID       = GlobalClass.SucursalID,
                            MotivoID         = Cat.VentaDevolucionMotivos.Otro,
                            Observacion      = "POR CANCELACIÓN DE VENTA CON CASCO",
                            RealizoUsuarioID = iUsuarioID,
                            TipoFormaPagoID  = iFormaDePagoID,
                            EsCancelacion    = (oVentaDet.Count == 1)
                        };
                        // Se genera el detalle de la devolución
                        var oDetDev = new VentaDevolucionDetalle()
                        {
                            ParteID           = iDevParteID,
                            Cantidad          = oParteDet.Cantidad,
                            PrecioUnitario    = oParteDet.PrecioUnitario,
                            Iva               = oParteDet.Iva,
                            Costo             = oParteDet.Costo,
                            CostoConDescuento = oParteDet.CostoConDescuento
                        };
                        // Se guarda la devolución
                        int iValeClienteID = 0;
                        if (iFormaDePagoID == Cat.FormasDePago.Vale)
                        {
                            var oVale = Datos.GetEntity <NotaDeCredito>(c => c.NotaDeCreditoID == oPagoDetV.NotaDeCreditoID && c.Estatus);
                            iValeClienteID = oVale.ClienteID;
                        }
                        this.GuardarDevolucion(oDevolucion, new List <VentaDevolucionDetalle>()
                        {
                            oDetDev
                        }, iValeClienteID);
                    }
                }
            }
        }
Esempio n. 2
0
        private void GuardarDevolucion(VentaDevolucion oDevolucion, List <VentaDevolucionDetalle> oDetalle, int?iValeClienteID)
        {
            // Se obtiene el importe total de la venta antes de la devolución
            var oVentaV = Datos.GetEntity <VentasView>(c => c.VentaID == oDevolucion.VentaID);
            // decimal mTotalAntes = oVentaV.Total;

            // Se calcula el total de lo devuelto
            decimal mImporteDev = 0;

            foreach (var oParte in oDetalle)
            {
                mImporteDev += ((oParte.PrecioUnitario + oParte.Iva) * oParte.Cantidad);
            }
            // Se guarda la devolución
            Guardar.VentaDevolucion(oDevolucion, oDetalle);

            // Se verifica cuánto se ha pagado de la venta, por si fue a crédito
            if (oVentaV.Pagado < mImporteDev)
            {
                mImporteDev = oVentaV.Pagado;
            }

            // Se genera nota de crédito o devolución de efectivo, u otro, según aplique
            int iVentaID = oDevolucion.VentaID;

            if (mImporteDev > 0)
            {
                ResAcc <int> oResPagoNeg = null;
                switch (this.ctlBusqueda.FormaDeDevolucion)
                {
                case Cat.FormasDePago.Efectivo:
                    oResPagoNeg = VentasProc.GenerarDevolucionDeEfectivo(iVentaID, mImporteDev);
                    break;

                case Cat.FormasDePago.Vale:
                    // var oVenta = General.GetEntity<Venta>(q => q.Estatus && q.VentaID == iVentaID);
                    var oResVale = VentasProc.GenerarNotaDeCredito(iValeClienteID.Value, mImporteDev, "", Cat.OrigenesNotaDeCredito.Devolucion
                                                                   , oDevolucion.VentaDevolucionID);
                    // Se genera el pago negativo por la nota de crédito generada
                    oResPagoNeg = VentasProc.GenerarPagoNegativoPorNotaDeCredito(iVentaID, mImporteDev, oResVale.Respuesta);
                    break;

                case Cat.FormasDePago.Cheque:
                case Cat.FormasDePago.Tarjeta:
                case Cat.FormasDePago.TarjetaDeDebito:
                case Cat.FormasDePago.Transferencia:
                    int iFormaDePagoID = this.ctlBusqueda.FormaDeDevolucion;
                    var oVentaPago     = Datos.GetEntity <VentaPago>(q => q.VentaID == iVentaID && q.Estatus);
                    var oFormaPago     = Datos.GetEntity <VentaPagoDetalle>(q => q.VentaPagoID == oVentaPago.VentaPagoID &&
                                                                            q.TipoFormaPagoID == iFormaDePagoID && q.Estatus);
                    // Se genera un pago negativo con la misma forma del pago a contrarestar
                    oResPagoNeg = VentasProc.GenerarPago(iVentaID, (oFormaPago.Importe * -1), iFormaDePagoID, oFormaPago.BancoID.Valor(), oFormaPago.Folio, oFormaPago.Cuenta);
                    break;
                }

                // Se guarda el dato del pago negativo correspondiente a la devolución, si aplica
                if (oResPagoNeg != null)
                {
                    // Se obtiene el primer registro de VentaPagoDetalle, y ese es el que se relaciona con la devolución, pues se supone que siempre habrá sólo uno
                    var oPagoDet = Datos.GetEntity <VentaPagoDetalle>(c => c.VentaPagoID == oResPagoNeg.Respuesta && c.Estatus);
                    oDevolucion.VentaPagoDetalleID = oPagoDet.VentaPagoDetalleID;
                    Datos.Guardar <VentaDevolucion>(oDevolucion);
                }
            }

            // Se revisa si la venta pertenece a un 9500, para realizar operaciones especiales
            var o9500 = Datos.GetEntity <Cotizacion9500>(c => c.VentaID == iVentaID && c.Estatus);

            // Si es 9500, se cambia el estatus del 9500
            if (o9500 != null)
            {
                o9500.EstatusGenericoID = Cat.EstatusGenericos.CanceladoDespuesDeVendido;
                Datos.Guardar <Cotizacion9500>(o9500);
            }

            // Se verifica si la venta generó un movimiento bancario, para borrarlo si éste no ha sido asignado
            if (oDevolucion.EsCancelacion)
            {
                var oPagoDetV = Datos.GetListOf <VentasPagosDetalleView>(c => c.VentaID == iVentaID);
                foreach (var oReg in oPagoDetV)
                {
                    if (oReg.FormaDePagoID == Cat.FormasDePago.Cheque || oReg.FormaDePagoID == Cat.FormasDePago.Tarjeta || oReg.FormaDePagoID == Cat.FormasDePago.Transferencia)
                    {
                        var oMov = Datos.GetEntity <BancoCuentaMovimiento>(c => c.RelacionTabla == Cat.Tablas.VentaPagoDetalle && c.RelacionID == oReg.VentaPagoDetalleID);
                        if (oMov != null && !oMov.FechaAsignado.HasValue)
                        {
                            Datos.Eliminar <BancoCuentaMovimiento>(oMov);
                        }
                    }
                }
            }
        }
Esempio n. 3
0
        public override bool Ejecutar()
        {
            // Se verifica si ya se hizo el cierre de caja
            if (UtilDatos.VerCierreDeDaja())
            {
                UtilLocal.MensajeAdvertencia("Ya se hizo el Corte de Caja. No se puede continuar.");
                return(false);
            }

            // Se valida la parte de detalle
            if (!this.ctlDetalle.Validar())
            {
                return(false);
            }
            // Se valida la parte de búsqueda
            if (!this.ctlBusqueda.Validar())
            {
                return(false);
            }

            int iVentaID = this.ctlBusqueda.VentaID;

            // Se valida que no sea una venta usada para cobro de Control de Cascos
            if (Datos.Exists <CascosRegistrosView>(c => c.CobroVentaID == iVentaID &&
                                                   (c.VentaEstatusID != Cat.VentasEstatus.Cancelada && c.VentaEstatusID != Cat.VentasEstatus.CanceladaSinPago)))
            {
                UtilLocal.MensajeAdvertencia("La venta seleccionado fue utilizada para un cobro de Control de Cascos. No se puede cancelar.");
                return(false);
            }

            //
            bool bCancelacion = this.ctlDetalle.TodosMarcados();
            var  oVentaV      = Datos.GetEntity <VentasView>(q => q.VentaID == iVentaID);

            // Se verifica si es una cancelación de otra sucursal
            if (oVentaV.SucursalID != GlobalClass.SucursalID)
            {
                if (UtilLocal.MensajePregunta("La Venta seleccionada es de otra Sucursal. ¿Deseas continuar?") != DialogResult.Yes)
                {
                    return(false);
                }
            }

            // Se verifica si es una cancelación de factura de varios tickets
            int  iVentaFacturaID        = 0;
            bool bFacturaMultiple       = false;
            bool bCancelarTodaLaFactura = this.ctlBusqueda.CancelarTodaLaFactura;
            List <VentaFacturaDetalle> oVentasFactura = null;

            if (oVentaV.Facturada)
            {
                iVentaFacturaID  = Datos.GetEntity <VentaFacturaDetalle>(q => q.VentaID == oVentaV.VentaID && q.Estatus).VentaFacturaID;
                oVentasFactura   = Datos.GetListOf <VentaFacturaDetalle>(q => q.VentaFacturaID == iVentaFacturaID && q.Estatus);
                bFacturaMultiple = (oVentasFactura.Count > 1);

                // Se muestran los datos de detalle de todas las ventas de la factura
                if (bCancelarTodaLaFactura && bFacturaMultiple)
                {
                    if (!this.MostrarDetalleVentasFactura(oVentasFactura))
                    {
                        return(false);
                    }
                }
            }

            // Se verifica si se creará vale, para pedir el cliente en caso de que no haya
            int iValeClienteID = oVentaV.ClienteID;

            if (this.ctlBusqueda.FormaDeDevolucion == Cat.FormasDePago.Vale && iValeClienteID == Cat.Clientes.Mostrador)
            {
                var frmValor = new MensajeObtenerValor("Selecciona el cliente para crear el Vale:", "", 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)
                {
                    iValeClienteID = Util.Entero(frmValor.Valor);
                }
                frmValor.Dispose();
                if (iValeClienteID == 0)
                {
                    return(false);
                }
            }

            // Se pregunta el usuario que realiza la devolución
            int iUsuarioID = 0;
            var ResU       = UtilLocal.ValidarObtenerUsuario("Ventas.Devolucion.Agregar");

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

            // Se solicita la autorización
            int iAutorizoID = 0;

            ResU = UtilLocal.ValidarObtenerUsuario("Autorizaciones.Ventas.Devoluciones.Agregar", "Autorización");
            if (ResU.Exito)
            {
                iAutorizoID = ResU.Respuesta.UsuarioID;
            }

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

            // Si es factura múltiple, se cancelan todas las ventas de la factura, si no, sólo la venta seleccionada
            var oIdsDev    = new List <int>();
            var oIdsCascos = new List <int>();

            if (bFacturaMultiple && bCancelarTodaLaFactura)
            {
                var oDevGeneral = this.ctlBusqueda.GenerarDevolucion();
                foreach (var oVentaFac in oVentasFactura)
                {
                    // Se genera la devolución
                    var oDev = new VentaDevolucion()
                    {
                        VentaID          = oVentaFac.VentaID,
                        Fecha            = dAhora,
                        RealizoUsuarioID = iUsuarioID,
                        EsCancelacion    = true,
                        MotivoID         = oDevGeneral.MotivoID,
                        Observacion      = oDevGeneral.Observacion,
                        TipoFormaPagoID  = oDevGeneral.TipoFormaPagoID
                    };
                    // Se genera el detalle de la devolución
                    var oDevDet       = new List <VentaDevolucionDetalle>();
                    var oVentaDetalle = Datos.GetListOf <VentaDetalle>(c => c.VentaID == oVentaFac.VentaID && c.Estatus);
                    foreach (var oParte in oVentaDetalle)
                    {
                        oDevDet.Add(new VentaDevolucionDetalle()
                        {
                            ParteID           = oParte.ParteID,
                            Costo             = oParte.Costo,
                            CostoConDescuento = oParte.CostoConDescuento,
                            Cantidad          = oParte.Cantidad,
                            PrecioUnitario    = oParte.PrecioUnitario,
                            Iva = oParte.Iva
                        });
                    }
                    // Se manda guardar la devolución
                    this.GuardarDevolucion(oDev, oDevDet, iValeClienteID);
                    // Se agrega a la lisa de devoluciones
                    oIdsDev.Add(oDev.VentaDevolucionID);

                    // Se verifica si requiere un casco
                    foreach (var oReg in oDevDet)
                    {
                        if (Datos.Exists <Parte>(c => c.ParteID == oReg.ParteID && c.RequiereCascoDe > 0 && c.Estatus))
                        {
                            oIdsCascos.Add(oReg.VentaDevolucionDetalleID);
                        }
                    }
                }
            }
            else
            {
                // Se genera la devolución
                var oDevolucion = this.ctlBusqueda.GenerarDevolucion();
                oDevolucion.Fecha            = dAhora;
                oDevolucion.EsCancelacion    = bCancelacion;
                oDevolucion.RealizoUsuarioID = iUsuarioID;
                // Se genera el detalle de la devolución
                var oDevDetalle = new List <VentaDevolucionDetalle>();
                var oProductos  = this.ctlDetalle.ProductosSel();
                foreach (var oProducto in oProductos)
                {
                    oDevDetalle.Add(new VentaDevolucionDetalle()
                    {
                        ParteID           = oProducto.ParteID,
                        Costo             = oProducto.Costo,
                        CostoConDescuento = oProducto.CostoConDescuento,
                        Cantidad          = oProducto.Cantidad,
                        PrecioUnitario    = oProducto.PrecioUnitario,
                        Iva = oProducto.Iva
                    });
                }
                // Se guarda la devolución
                this.GuardarDevolucion(oDevolucion, oDevDetalle, iValeClienteID);
                //
                oIdsDev.Add(oDevolucion.VentaDevolucionID);

                // Se verifica si requiere un casco
                foreach (var oReg in oDevDetalle)
                {
                    if (Datos.Exists <Parte>(c => c.ParteID == oReg.ParteID && c.RequiereCascoDe > 0 && c.Estatus))
                    {
                        oIdsCascos.Add(oReg.VentaDevolucionDetalleID);
                    }
                }
            }

            // Se verifica si es factura, en cuyo caso, se cancela la factura o se genera nota de crédito, según aplique
            if (oVentaV.Facturada)
            {
                if (bCancelacion && (!bFacturaMultiple || (bFacturaMultiple && bCancelarTodaLaFactura)))
                {
                    var ResFactura = VentasLoc.GenerarFacturaCancelacion(iVentaFacturaID, oIdsDev);
                    if (ResFactura.Error)
                    {
                        UtilLocal.MensajeAdvertencia("Hubo un error al cancelar la factura.\n\n" + ResFactura.Mensaje);
                    }
                }
                else
                {
                    var ResFactura = VentasLoc.GenerarFacturaDevolucionPorDevolucion(oIdsDev[0]);
                    if (ResFactura.Error)
                    {
                        UtilLocal.MensajeAdvertencia("Hubo un error al generar la factura de la devolución.\n\n" + ResFactura.Mensaje);
                    }
                }
            }

            // Se verifica si hay una cancelación de control de cascos
            foreach (int iDevDetID in oIdsCascos)
            {
                this.DevolverControlCasco(iDevDetID, iUsuarioID);
            }

            // Se manda a afectar contabilidad (AfeConta)
            foreach (int iDevID in oIdsDev)
            {
                var oDevV = Datos.GetEntity <VentasDevolucionesView>(c => c.VentaDevolucionID == iDevID);
                if (oDevV.Facturada)
                {
                    if (oDevV.VentaACredito)
                    {
                        if (oDevV.FormaDePagoID == Cat.FormasDePago.Vale)
                        {
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.DevolucionVentaCreditoFacturadaVale, iDevID, oDevV.FolioDeVenta, oDevV.Observacion);
                        }
                        else
                        {
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.DevolucionVentaCreditoFacturadaPago, iDevID, oDevV.FolioDeVenta, oDevV.Observacion);
                        }
                    }
                    else
                    {
                        if (oDevV.FormaDePagoID == Cat.FormasDePago.Vale)
                        {
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.DevolucionVentaValeFactura, iDevID, oDevV.FolioDeVenta, oDevV.Observacion);
                        }
                        else
                        {
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.DevolucionVentaPago, iDevID, oDevV.FolioDeVenta, oDevV.Observacion);
                        }
                    }
                }
                else
                {
                    if (oDevV.FormaDePagoID == Cat.FormasDePago.Vale)
                    {
                        ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.DevolucionVentaValeTicket, iDevID, oDevV.FolioDeVenta, oDevV.Observacion);
                    }

                    // Si es tiecket a crédito, se hace ajuste temporal de pólizas
                    if (oDevV.VentaACredito)
                    {
                        ContaProc.BorrarPolizaTemporalTicketCredito(oDevV.VentaID);
                        if (!bCancelacion)
                        {
                            var oVentaVi = Datos.GetEntity <VentasView>(c => c.VentaID == oDevV.VentaID);
                            ContaProc.CrearPolizaTemporalTicketCredito(oDevV.VentaID, (oVentaVi.Total - oVentaVi.Pagado));
                        }
                    }
                }
            }

            //
            foreach (int iDevID in oIdsDev)
            {
                // Se guarda la autorización, si aplica
                VentasProc.GenerarAutorizacion(Cat.AutorizacionesProcesos.DevolucionCancelacion, Cat.Tablas.VentaDevolucion, iDevID, iAutorizoID);
                // Se genera el ticket correspondiente
                VentasLoc.GenerarTicketDevolucion(iDevID);

                // Se agrega al Kardex

                /* Ahora se hace desde que se guarda la devolución - Guardar.VentaDevolucion()
                 * var oDevV = General.GetEntity<VentasDevolucionesView>(c => c.VentaDevolucionID == iDevID);
                 * var oDet = General.GetListOf<VentaDevolucionDetalle>(c => c.VentaDevolucionID == iDevID && c.Estatus);
                 * foreach (var oReg in oDet)
                 * {
                 *  AdmonProc.RegistrarKardex(new ParteKardex()
                 *  {
                 *      ParteID = oReg.ParteID,
                 *      OperacionID = Cat.OperacionesKardex.VentaCancelada,
                 *      SucursalID = oDevV.SucursalID,
                 *      Folio = oDevV.FolioDeVenta,
                 *      Fecha = DateTime.Now,
                 *      RealizoUsuarioID = oDevV.RealizoUsuarioID,
                 *      Entidad = oVentaV.Cliente,
                 *      Origen = oVentaV.ClienteID.ToString(),
                 *      Destino = oDevV.Sucursal,
                 *      Cantidad = oReg.Cantidad,
                 *      Importe = (oReg.PrecioUnitario + oReg.Iva),
                 *      RelacionTabla = Cat.Tablas.VentaDevolucion,
                 *      RelacionID = oDevV.VentaDevolucionID
                 *  });
                 * }
                 */
            }

            // Se manda aviso de cancelación de factura a crédito de días anteriores, si aplica
            if (oVentaV.Facturada && oVentaV.ACredito && oVentaV.Fecha < DateTime.Now.Date)
            {
                var oUsuarios = Datos.GetListOf <Usuario>(c => c.AlertaDevFacturaCreditoAnt == true && c.Estatus);
                foreach (var oReg in oUsuarios)
                {
                    Proc.EnviarMensajeTcp(oReg.Ip, Proc.MensajesTcp.DevolucionFacturaCreditoAnt, oIdsDev[0].ToString());
                }
            }

            // Se muestra una notifiación con el resultado
            UtilLocal.MostrarNotificacion((bCancelacion ? "Cancelación" : "Devolución") + " guardada correctamente.");

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

            return(true);
        }
Esempio n. 4
0
        public static ResAcc VentaDevolucion(VentaDevolucion oDevolucion, List<VentaDevolucionDetalle> oDetalle)
        {
            // Se generan datos predeterminados o globales, en caso de que apliquen
            oDevolucion.Fecha = (oDevolucion.Fecha != DateTime.MinValue ? oDevolucion.Fecha : DateTime.Now);
            oDevolucion.SucursalID = (oDevolucion.SucursalID > 0 ? oDevolucion.SucursalID : Theos.SucursalID);

            // Se guarda la devolución
            Datos.Guardar<VentaDevolucion>(oDevolucion);

            // Se guarda el detalle
            VentaDetalle oParteVenta;
            foreach (var ParteDetalle in oDetalle)
            {
                ParteDetalle.VentaDevolucionID = oDevolucion.VentaDevolucionID;
                Datos.Guardar<VentaDevolucionDetalle>(ParteDetalle);

                // Se quita el producto de la venta
                oParteVenta = Datos.GetEntity<VentaDetalle>(q => q.Estatus
                    && q.VentaID == oDevolucion.VentaID
                    && q.ParteID == ParteDetalle.ParteID
                    && q.Cantidad == ParteDetalle.Cantidad
                    && q.PrecioUnitario == ParteDetalle.PrecioUnitario
                    && q.Iva == ParteDetalle.Iva);

                oParteVenta.Estatus = false;
                Datos.Guardar<VentaDetalle>(oParteVenta, false);

                // Se afecta la existencia
                // AdmonProc.AgregarExistencia(ParteDetalle.ParteID, GlobalClass.SucursalID, ParteDetalle.Cantidad, Cat.Tablas.VentaDevolucion, oDevolucion.VentaDevolucionID);
                var oDevV = Datos.GetEntity<VentasDevolucionesView>(c => c.VentaDevolucionID == oDevolucion.VentaDevolucionID);
                AdmonProc.AfectarExistenciaYKardex(ParteDetalle.ParteID, Theos.SucursalID, Cat.OperacionesKardex.VentaCancelada, oDevV.FolioDeVenta
                    , oDevV.RealizoUsuarioID, oDevV.Cliente, oDevV.ClienteID.ToString(), oDevV.Sucursal, ParteDetalle.Cantidad
                    , (ParteDetalle.PrecioUnitario + ParteDetalle.Iva), Cat.Tablas.VentaDevolucion, oDevolucion.VentaDevolucionID);
            }

            // Si es cancelación, se cambia el estatus de la venta
            var oVenta = Datos.GetEntity<Venta>(c => c.VentaID == oDevolucion.VentaID && c.Estatus);
            if (oDevolucion.EsCancelacion)
            {
                // Se verifica si la venta ha tenido pagos
                var oVentaV = Datos.GetEntity<VentasView>(c => c.VentaID == oDevolucion.VentaID);
                oVenta.VentaEstatusID = (oVentaV.Pagado > 0 ? Cat.VentasEstatus.Cancelada : Cat.VentasEstatus.CanceladaSinPago);
                Datos.Guardar<Venta>(oVenta);
            }

            // Se verifican notas de crédito que pudieran cancelarse, por cliente comisionista
            if (oVenta.ComisionistaClienteID > 0)
            {
                // Se calcula el importe de la comisión que se debe quitar
                var oComisionista = Datos.GetEntity<Cliente>(q => q.ClienteID == oVenta.ComisionistaClienteID && q.Estatus);
                decimal mComision = 0;
                PreciosParte oPrecios;
                foreach (var ParteD in oDetalle)
                {
                    oPrecios = new PreciosParte(ParteD.ParteID);
                    mComision += (((ParteD.PrecioUnitario + ParteD.Iva) - oPrecios.ObtenerPrecio(oComisionista.ListaDePrecios)) * ParteD.Cantidad);
                }
                // Se genera una nota de crédito negativa
                if (mComision > 0)
                    VentasProc.GenerarNotaDeCredito(oComisionista.ClienteID, (mComision * -1), "", Cat.OrigenesNotaDeCredito.Devolucion, oVenta.VentaID);
            }

            return new ResAcc(true);
        }
Esempio n. 5
0
        private void GuardarDevolucion(VentaDevolucion oDevolucion, List<VentaDevolucionDetalle> oDetalle, int? iValeClienteID)
        {
            // Se obtiene el importe total de la venta antes de la devolución
            var oVentaV = Datos.GetEntity<VentasView>(c => c.VentaID == oDevolucion.VentaID);
            // decimal mTotalAntes = oVentaV.Total;

            // Se calcula el total de lo devuelto
            decimal mImporteDev = 0;
            foreach (var oParte in oDetalle)
                mImporteDev += ((oParte.PrecioUnitario + oParte.Iva) * oParte.Cantidad);
            // Se guarda la devolución
            Guardar.VentaDevolucion(oDevolucion, oDetalle);

            // Se verifica cuánto se ha pagado de la venta, por si fue a crédito
            if (oVentaV.Pagado < mImporteDev)
                mImporteDev = oVentaV.Pagado;

            // Se genera nota de crédito o devolución de efectivo, u otro, según aplique
            int iVentaID = oDevolucion.VentaID;
            if (mImporteDev > 0)
            {
                ResAcc<int> oResPagoNeg = null;
                switch (this.ctlBusqueda.FormaDeDevolucion)
                {
                    case Cat.FormasDePago.Efectivo:
                        oResPagoNeg = VentasProc.GenerarDevolucionDeEfectivo(iVentaID, mImporteDev);
                        break;
                    case Cat.FormasDePago.Vale:
                        // var oVenta = General.GetEntity<Venta>(q => q.Estatus && q.VentaID == iVentaID);
                        var oResVale = VentasProc.GenerarNotaDeCredito(iValeClienteID.Value, mImporteDev, "", Cat.OrigenesNotaDeCredito.Devolucion
                            , oDevolucion.VentaDevolucionID);
                        // Se genera el pago negativo por la nota de crédito generada
                        oResPagoNeg = VentasProc.GenerarPagoNegativoPorNotaDeCredito(iVentaID, mImporteDev, oResVale.Respuesta);
                        break;
                    case Cat.FormasDePago.Cheque:
                    case Cat.FormasDePago.Tarjeta:
                    case Cat.FormasDePago.TarjetaDeDebito:
                    case Cat.FormasDePago.Transferencia:
                        int iFormaDePagoID = this.ctlBusqueda.FormaDeDevolucion;
                        var oVentaPago = Datos.GetEntity<VentaPago>(q => q.VentaID == iVentaID && q.Estatus);
                        var oFormaPago = Datos.GetEntity<VentaPagoDetalle>(q => q.VentaPagoID == oVentaPago.VentaPagoID
                            && q.TipoFormaPagoID == iFormaDePagoID && q.Estatus);
                        // Se genera un pago negativo con la misma forma del pago a contrarestar
                        oResPagoNeg = VentasProc.GenerarPago(iVentaID, (oFormaPago.Importe * -1), iFormaDePagoID, oFormaPago.BancoID.Valor(), oFormaPago.Folio, oFormaPago.Cuenta);
                        break;
                }

                // Se guarda el dato del pago negativo correspondiente a la devolución, si aplica
                if (oResPagoNeg != null)
                {
                    // Se obtiene el primer registro de VentaPagoDetalle, y ese es el que se relaciona con la devolución, pues se supone que siempre habrá sólo uno
                    var oPagoDet = Datos.GetEntity<VentaPagoDetalle>(c => c.VentaPagoID == oResPagoNeg.Respuesta && c.Estatus);
                    oDevolucion.VentaPagoDetalleID = oPagoDet.VentaPagoDetalleID;
                    Datos.Guardar<VentaDevolucion>(oDevolucion);
                }
            }

            // Se revisa si la venta pertenece a un 9500, para realizar operaciones especiales
            var o9500 = Datos.GetEntity<Cotizacion9500>(c => c.VentaID == iVentaID && c.Estatus);
            // Si es 9500, se cambia el estatus del 9500
            if (o9500 != null)
            {
                o9500.EstatusGenericoID = Cat.EstatusGenericos.CanceladoDespuesDeVendido;
                Datos.Guardar<Cotizacion9500>(o9500);
            }

            // Se verifica si la venta generó un movimiento bancario, para borrarlo si éste no ha sido asignado
            if (oDevolucion.EsCancelacion)
            {
                var oPagoDetV = Datos.GetListOf<VentasPagosDetalleView>(c => c.VentaID == iVentaID);
                foreach (var oReg in oPagoDetV)
                {
                    if (oReg.FormaDePagoID == Cat.FormasDePago.Cheque || oReg.FormaDePagoID == Cat.FormasDePago.Tarjeta || oReg.FormaDePagoID == Cat.FormasDePago.Transferencia)
                    {
                        var oMov = Datos.GetEntity<BancoCuentaMovimiento>(c => c.RelacionTabla == Cat.Tablas.VentaPagoDetalle && c.RelacionID == oReg.VentaPagoDetalleID);
                        if (oMov != null && !oMov.FechaAsignado.HasValue)
                            Datos.Eliminar<BancoCuentaMovimiento>(oMov);
                    }
                }
            }
        }
Esempio n. 6
0
        public override bool Ejecutar()
        {
            // Se verifica si ya se hizo el cierre de caja
            if (UtilDatos.VerCierreDeDaja())
            {
                UtilLocal.MensajeAdvertencia("Ya se hizo el Corte de Caja. No se puede continuar.");
                return false;
            }

            // Se valida la parte de detalle
            if (!this.ctlDetalle.Validar())
                return false;
            // Se valida la parte de búsqueda
            if (!this.ctlBusqueda.Validar())
                return false;

            int iVentaID = this.ctlBusqueda.VentaID;

            // Se valida que no sea una venta usada para cobro de Control de Cascos
            if (Datos.Exists<CascosRegistrosView>(c => c.CobroVentaID == iVentaID
                && (c.VentaEstatusID != Cat.VentasEstatus.Cancelada && c.VentaEstatusID != Cat.VentasEstatus.CanceladaSinPago)))
            {
                UtilLocal.MensajeAdvertencia("La venta seleccionado fue utilizada para un cobro de Control de Cascos. No se puede cancelar.");
                return false;
            }

            //
            bool bCancelacion = this.ctlDetalle.TodosMarcados();
            var oVentaV = Datos.GetEntity<VentasView>(q => q.VentaID == iVentaID);

            // Se verifica si es una cancelación de otra sucursal
            if (oVentaV.SucursalID != GlobalClass.SucursalID)
            {
                if (UtilLocal.MensajePregunta("La Venta seleccionada es de otra Sucursal. ¿Deseas continuar?") != DialogResult.Yes)
                    return false;
            }

            // Se verifica si es una cancelación de factura de varios tickets
            int iVentaFacturaID = 0;
            bool bFacturaMultiple = false;
            bool bCancelarTodaLaFactura = this.ctlBusqueda.CancelarTodaLaFactura;
            List<VentaFacturaDetalle> oVentasFactura = null;
            if (oVentaV.Facturada)
            {
                iVentaFacturaID = Datos.GetEntity<VentaFacturaDetalle>(q => q.VentaID == oVentaV.VentaID && q.Estatus).VentaFacturaID;
                oVentasFactura = Datos.GetListOf<VentaFacturaDetalle>(q => q.VentaFacturaID == iVentaFacturaID && q.Estatus);
                bFacturaMultiple = (oVentasFactura.Count > 1);

                // Se muestran los datos de detalle de todas las ventas de la factura
                if (bCancelarTodaLaFactura && bFacturaMultiple)
                {
                    if (!this.MostrarDetalleVentasFactura(oVentasFactura))
                        return false;
                }
            }

            // Se verifica si se creará vale, para pedir el cliente en caso de que no haya
            int iValeClienteID = oVentaV.ClienteID;
            if (this.ctlBusqueda.FormaDeDevolucion == Cat.FormasDePago.Vale && iValeClienteID == Cat.Clientes.Mostrador)
            {
                var frmValor = new MensajeObtenerValor("Selecciona el cliente para crear el Vale:", "", 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)
                    iValeClienteID = Util.Entero(frmValor.Valor);
                frmValor.Dispose();
                if (iValeClienteID == 0)
                    return false;
            }

            // Se pregunta el usuario que realiza la devolución
            int iUsuarioID = 0;
            var ResU = UtilLocal.ValidarObtenerUsuario("Ventas.Devolucion.Agregar");
            if (ResU.Error)
                return false;
            iUsuarioID = ResU.Respuesta.UsuarioID;

            // Se solicita la autorización
            int iAutorizoID = 0;
            ResU = UtilLocal.ValidarObtenerUsuario("Autorizaciones.Ventas.Devoluciones.Agregar", "Autorización");
            if (ResU.Exito)
                iAutorizoID = ResU.Respuesta.UsuarioID;

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

            // Si es factura múltiple, se cancelan todas las ventas de la factura, si no, sólo la venta seleccionada
            var oIdsDev = new List<int>();
            var oIdsCascos = new List<int>();
            if (bFacturaMultiple && bCancelarTodaLaFactura)
            {
                var oDevGeneral = this.ctlBusqueda.GenerarDevolucion();
                foreach (var oVentaFac in oVentasFactura)
                {
                    // Se genera la devolución
                    var oDev = new VentaDevolucion()
                    {
                        VentaID = oVentaFac.VentaID,
                        Fecha = dAhora,
                        RealizoUsuarioID = iUsuarioID,
                        EsCancelacion = true,
                        MotivoID = oDevGeneral.MotivoID,
                        Observacion = oDevGeneral.Observacion,
                        TipoFormaPagoID = oDevGeneral.TipoFormaPagoID
                    };
                    // Se genera el detalle de la devolución
                    var oDevDet = new List<VentaDevolucionDetalle>();
                    var oVentaDetalle = Datos.GetListOf<VentaDetalle>(c => c.VentaID == oVentaFac.VentaID && c.Estatus);
                    foreach (var oParte in oVentaDetalle) {
                        oDevDet.Add(new VentaDevolucionDetalle()
                        {
                            ParteID = oParte.ParteID,
                            Costo = oParte.Costo,
                            CostoConDescuento = oParte.CostoConDescuento,
                            Cantidad = oParte.Cantidad,
                            PrecioUnitario = oParte.PrecioUnitario,
                            Iva = oParte.Iva
                        });
                    }
                    // Se manda guardar la devolución
                    this.GuardarDevolucion(oDev, oDevDet, iValeClienteID);
                    // Se agrega a la lisa de devoluciones
                    oIdsDev.Add(oDev.VentaDevolucionID);

                    // Se verifica si requiere un casco
                    foreach (var oReg in oDevDet) {
                        if (Datos.Exists<Parte>(c => c.ParteID == oReg.ParteID && c.RequiereCascoDe > 0 && c.Estatus))
                            oIdsCascos.Add(oReg.VentaDevolucionDetalleID);
                    }
                }
            }
            else
            {
                // Se genera la devolución
                var oDevolucion = this.ctlBusqueda.GenerarDevolucion();
                oDevolucion.Fecha = dAhora;
                oDevolucion.EsCancelacion = bCancelacion;
                oDevolucion.RealizoUsuarioID = iUsuarioID;
                // Se genera el detalle de la devolución
                var oDevDetalle = new List<VentaDevolucionDetalle>();
                var oProductos = this.ctlDetalle.ProductosSel();
                foreach (var oProducto in oProductos)
                {
                    oDevDetalle.Add(new VentaDevolucionDetalle()
                    {
                        ParteID = oProducto.ParteID,
                        Costo = oProducto.Costo,
                        CostoConDescuento = oProducto.CostoConDescuento,
                        Cantidad = oProducto.Cantidad,
                        PrecioUnitario = oProducto.PrecioUnitario,
                        Iva = oProducto.Iva
                    });
                }
                // Se guarda la devolución
                this.GuardarDevolucion(oDevolucion, oDevDetalle, iValeClienteID);
                //
                oIdsDev.Add(oDevolucion.VentaDevolucionID);

                // Se verifica si requiere un casco
                foreach (var oReg in oDevDetalle) {
                    if (Datos.Exists<Parte>(c => c.ParteID == oReg.ParteID && c.RequiereCascoDe > 0 && c.Estatus))
                        oIdsCascos.Add(oReg.VentaDevolucionDetalleID);
                }
            }

            // Se verifica si es factura, en cuyo caso, se cancela la factura o se genera nota de crédito, según aplique
            if (oVentaV.Facturada)
            {
                if (bCancelacion && (!bFacturaMultiple || (bFacturaMultiple && bCancelarTodaLaFactura)))
                {
                    var ResFactura = VentasLoc.GenerarFacturaCancelacion(iVentaFacturaID, oIdsDev);
                    if (ResFactura.Error)
                        UtilLocal.MensajeAdvertencia("Hubo un error al cancelar la factura.\n\n" + ResFactura.Mensaje);
                }
                else
                {
                    var ResFactura = VentasLoc.GenerarFacturaDevolucionPorDevolucion(oIdsDev[0]);
                    if (ResFactura.Error)
                        UtilLocal.MensajeAdvertencia("Hubo un error al generar la factura de la devolución.\n\n" + ResFactura.Mensaje);
                }
            }

            // Se verifica si hay una cancelación de control de cascos
            foreach (int iDevDetID in oIdsCascos)
            {
                this.DevolverControlCasco(iDevDetID, iUsuarioID);
            }

            // Se manda a afectar contabilidad (AfeConta)
            foreach (int iDevID in oIdsDev)
            {
                var oDevV = Datos.GetEntity<VentasDevolucionesView>(c => c.VentaDevolucionID == iDevID);
                if (oDevV.Facturada)
                {
                    if (oDevV.VentaACredito)
                    {
                        if (oDevV.FormaDePagoID == Cat.FormasDePago.Vale)
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.DevolucionVentaCreditoFacturadaVale, iDevID, oDevV.FolioDeVenta, oDevV.Observacion);
                        else
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.DevolucionVentaCreditoFacturadaPago, iDevID, oDevV.FolioDeVenta, oDevV.Observacion);
                    }
                    else
                    {
                        if (oDevV.FormaDePagoID == Cat.FormasDePago.Vale)
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.DevolucionVentaValeFactura, iDevID, oDevV.FolioDeVenta, oDevV.Observacion);
                        else
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.DevolucionVentaPago, iDevID, oDevV.FolioDeVenta, oDevV.Observacion);
                    }
                }
                else
                {
                    if (oDevV.FormaDePagoID == Cat.FormasDePago.Vale)
                        ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.DevolucionVentaValeTicket, iDevID, oDevV.FolioDeVenta, oDevV.Observacion);

                    // Si es tiecket a crédito, se hace ajuste temporal de pólizas
                    if (oDevV.VentaACredito)
                    {
                        ContaProc.BorrarPolizaTemporalTicketCredito(oDevV.VentaID);
                        if (!bCancelacion)
                        {
                            var oVentaVi = Datos.GetEntity<VentasView>(c => c.VentaID == oDevV.VentaID);
                            ContaProc.CrearPolizaTemporalTicketCredito(oDevV.VentaID, (oVentaVi.Total - oVentaVi.Pagado));
                        }
                    }
                }
            }

            //
            foreach (int iDevID in oIdsDev)
            {
                // Se guarda la autorización, si aplica
                VentasProc.GenerarAutorizacion(Cat.AutorizacionesProcesos.DevolucionCancelacion, Cat.Tablas.VentaDevolucion, iDevID, iAutorizoID);
                // Se genera el ticket correspondiente
                VentasLoc.GenerarTicketDevolucion(iDevID);

                // Se agrega al Kardex
                /* Ahora se hace desde que se guarda la devolución - Guardar.VentaDevolucion()
                var oDevV = General.GetEntity<VentasDevolucionesView>(c => c.VentaDevolucionID == iDevID);
                var oDet = General.GetListOf<VentaDevolucionDetalle>(c => c.VentaDevolucionID == iDevID && c.Estatus);
                foreach (var oReg in oDet)
                {
                    AdmonProc.RegistrarKardex(new ParteKardex()
                    {
                        ParteID = oReg.ParteID,
                        OperacionID = Cat.OperacionesKardex.VentaCancelada,
                        SucursalID = oDevV.SucursalID,
                        Folio = oDevV.FolioDeVenta,
                        Fecha = DateTime.Now,
                        RealizoUsuarioID = oDevV.RealizoUsuarioID,
                        Entidad = oVentaV.Cliente,
                        Origen = oVentaV.ClienteID.ToString(),
                        Destino = oDevV.Sucursal,
                        Cantidad = oReg.Cantidad,
                        Importe = (oReg.PrecioUnitario + oReg.Iva),
                        RelacionTabla = Cat.Tablas.VentaDevolucion,
                        RelacionID = oDevV.VentaDevolucionID
                    });
                }
                */
            }

            // Se manda aviso de cancelación de factura a crédito de días anteriores, si aplica
            if (oVentaV.Facturada && oVentaV.ACredito && oVentaV.Fecha < DateTime.Now.Date)
            {
                var oUsuarios = Datos.GetListOf<Usuario>(c => c.AlertaDevFacturaCreditoAnt == true && c.Estatus);
                foreach (var oReg in oUsuarios)
                    Proc.EnviarMensajeTcp(oReg.Ip, Proc.MensajesTcp.DevolucionFacturaCreditoAnt, oIdsDev[0].ToString());
            }

            // Se muestra una notifiación con el resultado
            UtilLocal.MostrarNotificacion((bCancelacion ? "Cancelación" : "Devolución") + " guardada correctamente.");

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

            return true;
        }
Esempio n. 7
0
        private void DevolverControlCasco(int iDevolucionDetalleID, int iUsuarioID)
        {
            // Se obtiene el registro del control de casco
            var oDevDet = Datos.GetEntity<VentaDevolucionDetalle>(c => c.VentaDevolucionDetalleID == iDevolucionDetalleID && c.Estatus);
            var oDev = Datos.GetEntity<VentaDevolucion>(c => c.VentaDevolucionID == oDevDet.VentaDevolucionID && c.Estatus);
            for (int i = 0; i < oDevDet.Cantidad; i++)
            {
                int iCancelarVentaID = 0;
                var oCascoReg = Datos.GetEntity<CascoRegistro>(c => c.VentaID == oDev.VentaID && c.ParteID == oDevDet.ParteID);
                // Acción si no se recibió ningún casco
                if (oCascoReg.RecibidoCascoID == null)
                {
                    iCancelarVentaID = oCascoReg.CobroVentaID.Valor();
                }
                else
                {
                    var oParte = Datos.GetEntity<Parte>(c => c.ParteID == oCascoReg.ParteID && c.Estatus);

                    // Se registra la salida del inventario
                    var oVentaV = Datos.GetEntity<VentasView>(c => c.VentaID == oDev.VentaID);
                    var oCascoRecibidoPrecio = Datos.GetEntity<PartePrecio>(c => c.ParteID == oCascoReg.RecibidoCascoID.Value && c.Estatus);
                    AdmonProc.AfectarExistenciaYKardex(oCascoReg.RecibidoCascoID.Valor(), GlobalClass.SucursalID, Cat.OperacionesKardex.SalidaInventario
                        , oCascoReg.CascoRegistroID.ToString(), iUsuarioID, oVentaV.Cliente, "CONTROL DE CASCOS", oVentaV.Sucursal, -1, oCascoRecibidoPrecio.Costo.Valor()
                        , Cat.Tablas.CascoRegistro, oCascoReg.CascoRegistroID);

                    // Acciones si no se recibió el casco adecuado
                    if (oCascoReg.RecibidoCascoID != oParte.RequiereCascoDe)
                    {
                        // Acción si hubo diferencia de importe entre el casco recibido y el esperado
                        iCancelarVentaID = oCascoReg.CobroVentaID.Valor();  // Por si se realizó un cobro
                        // Por si se generó un vale
                        var oVale = Datos.GetEntity<NotaDeCredito>(c => c.OrigenID == Cat.OrigenesNotaDeCredito.CascoDeMayorValor
                            && c.RelacionID == oCascoReg.CascoRegistroID);
                        if (oVale != null)
                        {
                            VentasProc.CancelarNotaDeCredito(oVale.NotaDeCreditoID, "POR CANCELACIÓN DE VENTA CON CASCO");
                        }
                        // Si se utilizarn importes de caso a favor, se liberan
                        var oUsados = Datos.GetListOf<CascoRegistroImporte>(c => c.CascoRegistroID == oCascoReg.CascoRegistroID);
                        foreach (var oReg in oUsados)
                        {
                            var oCascoImp = Datos.GetEntity<CascoImporte>(c => c.CascoImporteID == oReg.CascoImporteID);
                            oCascoImp.ImporteUsado -= oReg.Importe.Valor();
                            Datos.Guardar<CascoImporte>(oCascoImp);
                            Datos.Eliminar<CascoRegistroImporte>(oReg);
                        }
                        // Si se creó un importe de caso a favor, se cancela
                        var oCascoImporte = Datos.GetEntity<CascoImporte>(c => c.OrigenID == oCascoReg.CascoRegistroID && c.Importe > 0);
                        if (oCascoImporte != null)
                        {
                            // Se verifica si ha sido usado
                            if (Datos.Exists<CascoRegistroImporte>(c => c.CascoImporteID == oCascoImporte.CascoImporteID))
                            {
                                // Se mete un Casco Importe negativo, porque ya fue usado
                                Datos.Guardar<CascoImporte>(new CascoImporte()
                                {
                                    Fecha = DateTime.Now,
                                    OrigenID = oCascoReg.CascoRegistroID,
                                    Importe = (oCascoImporte.Importe * -1)
                                });
                            }
                            else
                            {
                                // Se elimina el importe a favor
                                Datos.Eliminar<CascoImporte>(oCascoImporte);
                            }
                        }
                    }
                }

                // Se cancela la venta del cobro de la diferencia (sólo lo correspondiente al cobro), si aplica
                if (iCancelarVentaID > 0)
                {
                    int iDevParteID = Cat.Partes.DiferenciaDeCascos;
                    if (oCascoReg.RecibidoCascoID == null)
                    {
                        var oParte = Datos.GetEntity<Parte>(c => c.ParteID == oCascoReg.ParteID && c.Estatus);
                        iDevParteID = oParte.RequiereDepositoDe.Valor();
                        if (iDevParteID <= 0)
                        {
                            UtilLocal.MensajeError("El Artículo registrado en Control de Cascos no tiene un depósito asignado.");
                            break;
                        }
                    }

                    var oVentaDet = Datos.GetListOf<VentaDetalle>(c => c.VentaID == iCancelarVentaID && c.Estatus);
                    if (oVentaDet.Count > 0)
                    {
                        var oParteDet = oVentaDet.FirstOrDefault(c => c.ParteID == iDevParteID);
                        // Se obtiene la forma de pago
                        var oPagoDetV = Datos.GetEntity<VentasPagosDetalleView>(c => c.VentaID == iCancelarVentaID);
                        int iFormaDePagoID = (oPagoDetV.Fecha.Valor().Date == DateTime.Now.Date ? oPagoDetV.FormaDePagoID : Cat.FormasDePago.Efectivo);
                        // Se general el registro de devolución
                        var oDevolucion = new VentaDevolucion()
                        {
                            VentaID = iCancelarVentaID,
                            Fecha = DateTime.Now,
                            SucursalID = GlobalClass.SucursalID,
                            MotivoID = Cat.VentaDevolucionMotivos.Otro,
                            Observacion = "POR CANCELACIÓN DE VENTA CON CASCO",
                            RealizoUsuarioID = iUsuarioID,
                            TipoFormaPagoID = iFormaDePagoID,
                            EsCancelacion = (oVentaDet.Count == 1)
                        };
                        // Se genera el detalle de la devolución
                        var oDetDev = new VentaDevolucionDetalle()
                        {
                            ParteID = iDevParteID,
                            Cantidad = oParteDet.Cantidad,
                            PrecioUnitario = oParteDet.PrecioUnitario,
                            Iva = oParteDet.Iva,
                            Costo = oParteDet.Costo,
                            CostoConDescuento = oParteDet.CostoConDescuento
                        };
                        // Se guarda la devolución
                        int iValeClienteID = 0;
                        if (iFormaDePagoID == Cat.FormasDePago.Vale)
                        {
                            var oVale = Datos.GetEntity<NotaDeCredito>(c => c.NotaDeCreditoID == oPagoDetV.NotaDeCreditoID && c.Estatus);
                            iValeClienteID = oVale.ClienteID;
                        }
                        this.GuardarDevolucion(oDevolucion, new List<VentaDevolucionDetalle>() { oDetDev }, iValeClienteID);
                    }
                }
            }
        }
Esempio n. 8
0
        public static ResAcc VentaDevolucion(VentaDevolucion oDevolucion, List <VentaDevolucionDetalle> oDetalle)
        {
            // Se generan datos predeterminados o globales, en caso de que apliquen
            oDevolucion.Fecha      = (oDevolucion.Fecha != DateTime.MinValue ? oDevolucion.Fecha : DateTime.Now);
            oDevolucion.SucursalID = (oDevolucion.SucursalID > 0 ? oDevolucion.SucursalID : Theos.SucursalID);

            // Se guarda la devolución
            Datos.Guardar <VentaDevolucion>(oDevolucion);

            // Se guarda el detalle
            VentaDetalle oParteVenta;

            foreach (var ParteDetalle in oDetalle)
            {
                ParteDetalle.VentaDevolucionID = oDevolucion.VentaDevolucionID;
                Datos.Guardar <VentaDevolucionDetalle>(ParteDetalle);

                // Se quita el producto de la venta
                oParteVenta = Datos.GetEntity <VentaDetalle>(q => q.Estatus &&
                                                             q.VentaID == oDevolucion.VentaID &&
                                                             q.ParteID == ParteDetalle.ParteID &&
                                                             q.Cantidad == ParteDetalle.Cantidad &&
                                                             q.PrecioUnitario == ParteDetalle.PrecioUnitario &&
                                                             q.Iva == ParteDetalle.Iva);

                oParteVenta.Estatus = false;
                Datos.Guardar <VentaDetalle>(oParteVenta, false);

                // Se afecta la existencia
                // AdmonProc.AgregarExistencia(ParteDetalle.ParteID, GlobalClass.SucursalID, ParteDetalle.Cantidad, Cat.Tablas.VentaDevolucion, oDevolucion.VentaDevolucionID);
                var oDevV = Datos.GetEntity <VentasDevolucionesView>(c => c.VentaDevolucionID == oDevolucion.VentaDevolucionID);
                AdmonProc.AfectarExistenciaYKardex(ParteDetalle.ParteID, Theos.SucursalID, Cat.OperacionesKardex.VentaCancelada, oDevV.FolioDeVenta
                                                   , oDevV.RealizoUsuarioID, oDevV.Cliente, oDevV.ClienteID.ToString(), oDevV.Sucursal, ParteDetalle.Cantidad
                                                   , (ParteDetalle.PrecioUnitario + ParteDetalle.Iva), Cat.Tablas.VentaDevolucion, oDevolucion.VentaDevolucionID);
            }

            // Si es cancelación, se cambia el estatus de la venta
            var oVenta = Datos.GetEntity <Venta>(c => c.VentaID == oDevolucion.VentaID && c.Estatus);

            if (oDevolucion.EsCancelacion)
            {
                // Se verifica si la venta ha tenido pagos
                var oVentaV = Datos.GetEntity <VentasView>(c => c.VentaID == oDevolucion.VentaID);
                oVenta.VentaEstatusID = (oVentaV.Pagado > 0 ? Cat.VentasEstatus.Cancelada : Cat.VentasEstatus.CanceladaSinPago);
                Datos.Guardar <Venta>(oVenta);
            }

            // Se verifican notas de crédito que pudieran cancelarse, por cliente comisionista
            if (oVenta.ComisionistaClienteID > 0)
            {
                // Se calcula el importe de la comisión que se debe quitar
                var          oComisionista = Datos.GetEntity <Cliente>(q => q.ClienteID == oVenta.ComisionistaClienteID && q.Estatus);
                decimal      mComision     = 0;
                PreciosParte oPrecios;
                foreach (var ParteD in oDetalle)
                {
                    oPrecios   = new PreciosParte(ParteD.ParteID);
                    mComision += (((ParteD.PrecioUnitario + ParteD.Iva) - oPrecios.ObtenerPrecio(oComisionista.ListaDePrecios)) * ParteD.Cantidad);
                }
                // Se genera una nota de crédito negativa
                if (mComision > 0)
                {
                    VentasProc.GenerarNotaDeCredito(oComisionista.ClienteID, (mComision * -1), "", Cat.OrigenesNotaDeCredito.Devolucion, oVenta.VentaID);
                }
            }

            return(new ResAcc(true));
        }