示例#1
0
文件: Master.cs 项目: moisesiq/aupaga
 private void AplicarCombo(string sColumna, string sCampoValor, string sCampoTexto, object oDatos)
 {
     var frmValor = new MensajeObtenerValor("Selecciona la opción deseada:", -1, MensajeObtenerValor.Tipo.Combo);
     frmValor.CargarCombo(sCampoValor, sCampoTexto, oDatos);
     if (frmValor.ShowDialog(Principal.Instance) == DialogResult.OK)
     {
         this.AplicarCambio(sColumna, frmValor.Valor);
     }
     frmValor.Dispose();
 }
示例#2
0
文件: MaxMin.cs 项目: moisesiq/aupaga
 private void btnEquCopiarDe_Click(object sender, EventArgs e)
 {
     var frmValor = new MensajeObtenerValor("¿De cuál sucursal quieres copiar?", "", MensajeObtenerValor.Tipo.Combo);
     frmValor.CargarCombo("SucursalID", "NombreSucursal", Datos.GetListOf<Sucursal>(c => c.Estatus));
     frmValor.Combo.DropDownStyle = ComboBoxStyle.DropDownList;
     if (frmValor.ShowDialog(Principal.Instance) == DialogResult.OK)
     {
         this.CopiarEquivalentesDeSucursal(Util.Entero(frmValor.Valor));
     }
     frmValor.Dispose();
 }
示例#3
0
        private void PolizasCambiarFecha()
        {
            if (this.dgvDetalle.SelectedRows.Count <= 0)
            {
                UtilLocal.MensajeAdvertencia("No hay ninguna póliza seleccionada.");
                return;
            }

            if (UtilLocal.MensajePregunta(string.Format("Se han seleccionado {0} pólizas. ¿Estás seguro que deseas cambiar la fecha de todas esas pólizas?"
                , this.dgvDetalle.SelectedRows.Count)) != DialogResult.Yes)
                return;

            // Se pide la nueva sucursal
            var frmValor = new MensajeObtenerValor("Selecciona la nueva fecha:", DateTime.Now, MensajeObtenerValor.Tipo.Fecha);
            if (frmValor.ShowDialog(Principal.Instance) == DialogResult.OK)
            {
                DateTime dNueva = Util.FechaHora(frmValor.Valor).Date;
                foreach (DataGridViewRow oFila in this.dgvDetalle.SelectedRows)
                {
                    int iPolizaID = Util.Entero(oFila.Cells["ContaPolizaID"].Value);
                    var oPoliza = Datos.GetEntity<ContaPoliza>(c => c.ContaPolizaID == iPolizaID);
                    oPoliza.Fecha = (dNueva.Add(oPoliza.Fecha - oPoliza.Fecha.Date));
                    Datos.Guardar<ContaPoliza>(oPoliza);
                }
                this.LlenarArbol();
            }
            frmValor.Dispose();
        }
示例#4
0
        private void btnPolizaCambiarSucursal_Click(object sender, EventArgs e)
        {
            if (this.dgvDetalle.CurrentRow == null) return;

            // Se pide la nueva sucursal
            var frmValor = new MensajeObtenerValor("Selecciona la nueva sucursal:", "", MensajeObtenerValor.Tipo.Combo);
            frmValor.CargarCombo("SucursalID", "NombreSucursal", Datos.GetListOf<Sucursal>(c => c.Estatus));
            if (frmValor.ShowDialog(Principal.Instance) == DialogResult.OK)
            {
                int iPolizaID = Util.Entero(this.dgvDetalle.CurrentRow.Cells["ContaPolizaID"].Value);
                var oPoliza = Datos.GetEntity<ContaPoliza>(c => c.ContaPolizaID == iPolizaID);
                oPoliza.SucursalID = Util.Entero(frmValor.Valor);
                Datos.Guardar<ContaPoliza>(oPoliza);
                this.LlenarArbol();
            }
            frmValor.Dispose();
        }
示例#5
0
 private void btnCuentaMover_Click(object sender, EventArgs e)
 {
     var oCuentas = Datos.GetListOf<ContaCuentasAuxiliaresView>().Select(c =>
         new { c.ContaCuentaDeMayorID, Nombre = (c.Cuenta + " - " + c.Subcuenta + " - " + c.CuentaDeMayor) }).Distinct().OrderBy(o => o.Nombre).ToList();
     var frmValor = new MensajeObtenerValor("Indica la Cuenta de Mayor a donde quieres mover la Cuenta seleccionada:", 0, MensajeObtenerValor.Tipo.Combo);
     frmValor.CargarCombo("ContaCuentaDeMayorID", "Nombre", oCuentas);
     frmValor.Width += 100;
     if (frmValor.ShowDialog(Principal.Instance) == DialogResult.OK)
     {
         int iCuentaID = Util.Entero(this.tgvCuentas.CurrentNode.Cells["Cuentas_Id"].Value);
         var oCuentaAux = Datos.GetEntity<ContaCuentaAuxiliar>(c => c.ContaCuentaAuxiliarID == iCuentaID);
         oCuentaAux.ContaCuentaDeMayorID = Util.Entero(frmValor.Valor);
         Datos.Guardar<ContaCuentaAuxiliar>(oCuentaAux);
         this.LlenarArbol();
     }
     frmValor.Dispose();
 }
示例#6
0
 private void dgvGanancias_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
 {
     try
     {
         if (this.dgvGanancias.Columns[e.ColumnIndex].Name == "PCT1"
             || this.dgvGanancias.Columns[e.ColumnIndex].Name == "PCT2"
             || this.dgvGanancias.Columns[e.ColumnIndex].Name == "PCT3"
             || this.dgvGanancias.Columns[e.ColumnIndex].Name == "PCT4"
             || this.dgvGanancias.Columns[e.ColumnIndex].Name == "PCT5")
         {
             if (e.Button == MouseButtons.Right)
             {
                 var frmCantidad = new MensajeObtenerValor("Porcentaje", "0", MensajeObtenerValor.Tipo.Decimal);
                 if (frmCantidad.ShowDialog(Principal.Instance) == DialogResult.OK)
                 {
                     var valor = Util.Decimal(frmCantidad.Valor);
                     foreach (DataGridViewRow row in this.dgvGanancias.Rows)
                     {
                         var oCell = row.Cells["X"] as DataGridViewCheckBoxCell;
                         if (Util.Logico(oCell.Value).Equals(true))
                             row.Cells[e.ColumnIndex].Value = valor;
                     }
                 }
                 frmCantidad.Dispose();
             }
         }
     }
     catch (Exception ex)
     {
         Util.MensajeError(ex.Message, GlobalClass.NombreApp);
     }
 }
示例#7
0
        private void Asignar()
        {
            // Se obtiene la cuenta correspondiente
            var frmCuenta = new MensajeObtenerValor("Selecciona la cuenta a la cual se le van a asignar los movimientos seleccionados:", Cat.CuentasBancarias.Scotiabank, MensajeObtenerValor.Tipo.Combo);
            frmCuenta.CargarCombo("BancoCuentaID", "NombreDeCuenta", Datos.GetListOf<BancoCuenta>(c => c.UsoClientes));
            int iBancoCuentaID = 0;
            if (frmCuenta.ShowDialog(Principal.Instance) == DialogResult.OK)
                iBancoCuentaID = Util.Entero(frmCuenta.Valor);
            else
                return;

            Cargando.Mostrar();

            foreach (DataGridViewRow oFila in this.dgvAsignacion.Rows)
            {
                if (Util.Logico(oFila.Cells["asi_Sel"].Value))
                {
                    int iMovID = Util.Entero(oFila.Cells["asi_BancoCuentaMovimientoID"].Value);
                    ContaProc.AsignarMovimientoBancario(iMovID, iBancoCuentaID);
                }
            }

            Cargando.Cerrar();

            this.LlenarAsignaciones();
        }
示例#8
0
文件: MaxMin.cs 项目: moisesiq/aupaga
        private void btnReglasCopiar_Click(object sender, EventArgs e)
        {
            if (this.dgvReglas.CurrentRow == null) return;

            int iSucursalID = Util.Entero(this.cmbSucursal.SelectedValue);
            var frmValor = new MensajeObtenerValor("¿A qué sucursal deseas copiar la regla seleccionada?", 0, MensajeObtenerValor.Tipo.Combo);
            frmValor.CargarCombo("SucursalID", "NombreSucursal", Datos.GetListOf<Sucursal>(q => q.SucursalID != iSucursalID));
            frmValor.Combo.DropDownStyle = ComboBoxStyle.DropDownList;
            frmValor.Combo.SelectedIndex = 0;
            if (frmValor.ShowDialog(Principal.Instance) == DialogResult.OK)
            {
                // Se obtiene el orden correspondiente
                int iCopiaSucID = Util.Entero(frmValor.Valor);
                int iOrden = 1;
                var oReglasSuc = Datos.GetListOf<ParteMaxMinRegla>(q => q.SucursalID == iCopiaSucID && q.Estatus);
                if (oReglasSuc.Count > 0)
                    iOrden = (oReglasSuc.Max(q => q.Orden) + 1);
                // Se inserta la nueva regla
                var oRegla = new ParteMaxMinRegla()
                {
                    SucursalID = iCopiaSucID,
                    Orden = iOrden,
                    Regla = Util.Cadena(this.dgvReglas.CurrentRow.Cells["Reglas_Regla"].Value),
                    Condicion = Util.Cadena(this.dgvReglas.CurrentRow.Cells["Reglas_Condicion"].Value),
                    Maximo = Util.Cadena(this.dgvReglas.CurrentRow.Cells["Reglas_Maximo"].Value),
                    Minimo = Util.Cadena(this.dgvReglas.CurrentRow.Cells["Reglas_Minimo"].Value)
                };
                Datos.Guardar<ParteMaxMinRegla>(oRegla);
                UtilLocal.MostrarNotificacion("Regla copiada correctamente.");
            }
            frmValor.Dispose();
        }
示例#9
0
        private void dgvProductos_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.dgvProductos.CurrentRow == null) return;

            var Fila = this.dgvProductos.CurrentRow;

            switch (e.KeyCode)
            {
                case Keys.Add:
                    this.AgregarQuitarCantidad(Fila, 1);
                    break;
                case Keys.Subtract:
                    this.AgregarQuitarCantidad(Fila, -1);
                    break;
                case Keys.Enter:
                    var ProdCantidad = (Fila.DataBoundItem as ProductoVenta);
                    var frmCantidad = new MensajeObtenerValor("Indica la cantidad que deseas aplicar.", (ProdCantidad.Cantidad + 1).ToString(), MensajeObtenerValor.Tipo.Entero);
                    if (frmCantidad.ShowDialog(Principal.Instance) == DialogResult.OK)
                        this.ModificarCantidad(this.dgvProductos.SelectedRows[0], Util.Entero(frmCantidad.Valor));
                    frmCantidad.Dispose();
                    e.Handled = true;
                    break;
            }
        }
示例#10
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;
        }
示例#11
0
文件: Ventas.cs 项目: moisesiq/aupaga
 private void CambiarPrecio(ProductoVenta oParteVenta)
 {
     string sMensaje = string.Format("Lista de precios:\n\nPrecio 1: {0}\nPrecio 2: {1}\nPrecio 3: {2}\nPrecio 4: {3}\nPrecio 5: {4}\n"
         , oParteVenta.Precios[0].ToString(GlobalClass.FormatoMoneda)
         , oParteVenta.Precios[1].ToString(GlobalClass.FormatoMoneda)
         , oParteVenta.Precios[2].ToString(GlobalClass.FormatoMoneda)
         , oParteVenta.Precios[3].ToString(GlobalClass.FormatoMoneda)
         , oParteVenta.Precios[4].ToString(GlobalClass.FormatoMoneda));
     var frmPrecio = new MensajeObtenerValor(sMensaje, oParteVenta.PrecioConIva.ToString(), MensajeObtenerValor.Tipo.Decimal);
     if (frmPrecio.ShowDialog(Principal.Instance) == DialogResult.OK)
     {
         decimal mPrecio = Util.Decimal(frmPrecio.Valor);
         // Se valida el precio especificado, cuando aplique
         if (UtilLocal.ValidarPermiso("Ventas.Venta.EditarPreciosLibre"))
         {
             this.AplicarPrecioProducto(oParteVenta, mPrecio);
         }
         else
         {
             if (mPrecio > oParteVenta.Precios[0])
                 UtilLocal.MensajeAdvertencia("El Precio especificado no puede ser mayor que el Precio 1.");
             else if (mPrecio < oParteVenta.Precios[this.Cliente.ListaDePrecios - 1])
                 UtilLocal.MensajeAdvertencia("El Precio especificado no puede ser menor que el precio asignado al Cliente.");
             else
                 this.AplicarPrecioProducto(oParteVenta, mPrecio);
         }
     }
     frmPrecio.Dispose();
 }
示例#12
0
文件: Ventas.cs 项目: moisesiq/aupaga
        private void lblTotal_DoubleClick(object sender, EventArgs e)
        {
            if (this.ListaVenta.Count <= 0) return;

            var frmPrecio = new MensajeObtenerValor("Indica el importe total a cobrar:", this.lblTotal.Text.SoloNumeric(), MensajeObtenerValor.Tipo.Decimal);
            if (frmPrecio.ShowDialog(Principal.Instance) == DialogResult.OK)
                this.AplicarImporteTotal(Util.Decimal(frmPrecio.Valor));
            frmPrecio.Dispose();
        }
示例#13
0
        private void btnImprimirTicket_Click(object sender, EventArgs e)
        {
            if (!EsNuevo && oParte != null)
            {
                int copias = 0;
                var frmCantidad = new MensajeObtenerValor("Número de etiquetas", "1", MensajeObtenerValor.Tipo.Entero);
                if (frmCantidad.ShowDialog(Principal.Instance) == DialogResult.OK)
                {
                    copias = Util.Entero(frmCantidad.Valor);
                }
                frmCantidad.Dispose();

                if (copias > 0)
                {
                    var etiquetas = new List<Etiquetas>();
                    for (int x = 0; x < copias; x++)
                    {
                        var etiqueta = new Etiquetas()
                        {
                            ParteID = oParte.ParteID,
                            NumeroParte = oParte.NumeroParte,
                            NombreParte = oParte.NombreParte,
                            CodigoBarra = oParte.CodigoBarra,
                            NumeroEtiquetas = copias
                        };
                        etiquetas.Add(etiqueta);
                    }

                    IEnumerable<Etiquetas> listaEtiquetas = etiquetas;
                    using (FastReport.Report report = new FastReport.Report())
                    {
                        report.Load(string.Format("{0}{1}", GlobalClass.ConfiguracionGlobal.pathReportes, "ReporteEtiquetas.frx"));
                        report.RegisterData(etiquetas, "etiquetas", 3);
                        report.GetDataSource("etiquetas").Enabled = true;
                        // report.FindObject("Text1").Delete();
                        // report.Show(true);
                        UtilLocal.EnviarReporteASalida("Reportes.Partes.Etiqueta", report);
                    }
                }
            }
        }
示例#14
0
文件: Ventas.cs 项目: moisesiq/aupaga
 public static int ObtenerClienteID(string sMensaje, bool bVentasMostrador)
 {
     int iClienteID = 0;
     var frmValor = new MensajeObtenerValor(sMensaje, "", MensajeObtenerValor.Tipo.Combo);
     frmValor.CargarCombo("ClienteID", "Nombre", Datos.GetListOf<Cliente>(c => (bVentasMostrador || c.ClienteID != Cat.Clientes.Mostrador) && c.Estatus));
     if (frmValor.ShowDialog(Principal.Instance) == DialogResult.OK)
         iClienteID = Util.Entero(frmValor.Valor);
     frmValor.Dispose();
     return iClienteID;
 }
示例#15
0
 private void dgvDiferencia_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
 {
     try
     {
         //Porcentajes y Precios
         if (e.ColumnIndex > 6 && e.ColumnIndex < 17 && e.Button == MouseButtons.Right)
         {
             var msj = string.Empty;
             if (e.ColumnIndex > 6 && e.ColumnIndex < 12)
                 msj = "Indica la cantidad que deseas aplicar a %";
             else
                 msj = "Indica la cantidad que deseas aplicar a Precios.";
             var frmCantidad = new MensajeObtenerValor(msj, "0.0", MensajeObtenerValor.Tipo.Decimal);
             if (frmCantidad.ShowDialog(Principal.Instance) == DialogResult.OK)
             {
                 var valor = Util.Decimal(frmCantidad.Valor);
                 if (valor > 0)
                     foreach (DataGridViewRow row in this.dgvDiferencia.Rows)
                         row.Cells[e.ColumnIndex].Value = valor;
             }
             frmCantidad.Dispose();
         }
     }
     catch (Exception ex)
     {
         Util.MensajeError(ex.Message, GlobalClass.NombreApp);
     }
 }
示例#16
0
        public override bool Ejecutar()
        {
            // Se valida la opción
            if (!this.ctlFacturar.Validar())
                return false;

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

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

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

            //
            DateTime dAhora = DateTime.Now;

            // Se obtienen los datos de los productos, por si se cambió la descripción
            List<ProductoVenta> oPartes = null;
            if (this.ctlFacturar.MostrarTodasLasPartes)
                oPartes = this.ctlDetalle.ObtenerListaVenta();

            // Se procede a generar la factura
            var oVentasAF = this.ctlFacturar.GenerarListaDeVentas();
            var oFormasDePago = this.ctlFacturar.FormasDePagoLibre;
            var ResFe = VentasLoc.GenerarFacturaElectronica(oVentasAF, iAFClienteID, oPartes, oFormasDePago, this.ctlFacturar.Observacion, null);
            if (ResFe.Error)
            {
                UtilLocal.MensajeAdvertencia(ResFe.Mensaje);
                return false;
            }

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

            var oFactura = Datos.GetEntity<VentaFactura>(q => q.VentaFacturaID == ResFe.Respuesta && q.Estatus);
            oFactura.Convertida = true;
            oFactura.RealizoUsuarioID = iUsuarioID;
            Datos.Guardar<VentaFactura>(oFactura);

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

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

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

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

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

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

            return true;
        }
示例#17
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;
        }