private void UsarNotaDeCredito(DataGridViewRow oFactura)
        {
            // Se obtienen las notas de créditos ya aplicadas aquí, con sus importes correspondientes
            var oNotasUsadas = new Dictionary<int, decimal>();
            foreach (DataGridViewRow oFila in this.dgvAbonos.Rows)
            {
                if (Util.Cadena(oFila.Cells["abo_Origen"].Value) == "Nota de Crédito")
                {
                    int iNotaID = Util.Entero(oFila.Cells["abo_NotaDeCreditoID"].Value);
                    if (!oNotasUsadas.ContainsKey(iNotaID))
                        oNotasUsadas.Add(iNotaID, 0);
                    oNotasUsadas[iNotaID] += Util.Decimal(oFila.Cells["abo_Importe"].Value);
                }
            }

            // Se obtienen las notas de crédito disponibles y se restan los importes ya usados
            var oNotas = Datos.GetListOf<ProveedoresNotasDeCreditoView>(c => c.ProveedorID == this.Proveedor.ProveedorID && c.Disponible);
            // Se modifica el subtotal de la nota, para ser usada como el total restante
            foreach (var oReg in oNotas)
            {
                // oReg.Subtotal = (oReg.Subtotal + oReg.Iva);
                if (oNotasUsadas.ContainsKey(oReg.ProveedorNotaDeCreditoID))
                    oReg.Restante -= oNotasUsadas[oReg.ProveedorNotaDeCreditoID];
            }
            // Se muestra el formulario con las notas disponibles
            var frmNotas = new EdicionListadoTheos(oNotas) { Text = "Nota de crédito" };
            frmNotas.MostrarColumnas("Folio", "Facturas", "Total", "Restante");
            frmNotas.HabilitarColumnas();
            // frmNotas.dgvListado.Columns["Subtotal"].HeaderText = "Restante";
            frmNotas.AgregarColumnaEdicion("ImporteAUsar", "Usar");
            frmNotas.AgregarColumnaSeleccion("Sel");
            frmNotas.dgvListado.SelectionMode = DataGridViewSelectionMode.CellSelect;

            // Se agrega la validación para cuando se le de aceptar
            decimal mImporteFaltante = Util.Decimal(oFactura.Cells["fac_Final"].Value);
            frmNotas.Aceptado += new EventHandler<FormClosingEventArgs>((s, e) =>
            {
                DataGridView oGrid = (s as EdicionListado).dgvListado;
                decimal mTotalNotas = 0;
                foreach (DataGridViewRow oFila in oGrid.Rows)
                {
                    if (!Util.Logico(oFila.Cells["Sel"].Value)) continue;

                    decimal mAUsar = Util.Decimal(oFila.Cells["ImporteAUsar"].Value);
                    if (mAUsar > Util.Decimal(oFila.Cells["Restante"].Value))
                    {
                        oFila.Cells["ImporteAUsar"].ErrorText = "El importe a usar no puede ser mayor que el importe restante.";
                        e.Cancel = true;
                    }

                    mTotalNotas += mAUsar;
                }

                if (mTotalNotas > mImporteFaltante)
                {
                    UtilLocal.MensajeAdvertencia("El importe total indicado es mayor al restante de de la factura seleccionada.");
                    e.Cancel = true;
                }
            });

            if (frmNotas.ShowDialog(Principal.Instance) == DialogResult.OK)
            {
                var oDatos = frmNotas.ObtenerResultado();
                foreach (DataRow oFila in oDatos.Rows)
                {
                    if (Util.Logico(oFila["Sel"]) && Util.Decimal(oFila["ImporteAUsar"]) > 0)
                    {
                        this.dgvAbonos.Rows.Add(true, null, oFactura.Cells["fac_MovimientoInventarioID"].Value, Cat.OrigenesPagosAProveedores.NotaDeCredito
                            , null, oFila["ProveedorNotaDeCreditoID"], oFactura.Cells["fac_Factura"].Value, "Nota de Crédito", null, null, oFila["ImporteAUsar"]
                            , oFila["Folio"], null);
                    }
                }
            }
            frmNotas.Dispose();

            this.CalcularDescuentos();
        }
        private void AgregarPagoDeCaja(DataGridViewRow oFactura)
        {
            // Se obtiene la cuenta auxiliar correspondiente al proveedor
            var oCuentaAux = Datos.GetEntity<ContaCuentaAuxiliar>(c => c.ContaCuentaDeMayorID == Cat.ContaCuentasDeMayor.Proveedores
                && c.RelacionID == this.Proveedor.ProveedorID);
            if (oCuentaAux == null)
            {
                UtilLocal.MensajeAdvertencia("El proveedor actual no tiene una cuenta contable asignada. No se puede enlazar con los gastos de caja.");
                return;
            }

            // Se obtienen los pagos de caja ya aplicados aquí, con sus importes correspondientes
            var oUsados = new Dictionary<int, decimal>();
            foreach (DataGridViewRow oFila in this.dgvAbonos.Rows)
            {
                if (Util.Cadena(oFila.Cells["abo_Origen"].Value) == "Pago de Caja")
                {
                    int iEgresoID = Util.Entero(oFila.Cells["abo_CajaEgresoID"].Value);
                    if (!oUsados.ContainsKey(iEgresoID))
                        oUsados.Add(iEgresoID, 0);
                    oUsados[iEgresoID] += Util.Decimal(oFila.Cells["abo_Importe"].Value);
                }
            }

            // Se obtienen las notas de crédito disponibles y se restan los importes ya usados
            var oPagosCaja = Datos.GetListOf<CajaEgresosProveedoresView>(c => c.ContaCuentaAuxiliarID == oCuentaAux.ContaCuentaAuxiliarID
                && c.Facturado.HasValue && (!c.AfectadoEnProveedores.HasValue || !c.AfectadoEnProveedores.Value));
            // Se modifica el subtotal de la nota, para ser usada como el total restante
            foreach (var oReg in oPagosCaja)
            {
                // oReg.Subtotal = (oReg.Subtotal + oReg.Iva);
                if (oUsados.ContainsKey(oReg.CajaEgresoID))
                    oReg.Restante -= oUsados[oReg.CajaEgresoID];
            }
            // Se muestra el formulario con las notas disponibles
            var frmLista = new EdicionListadoTheos(oPagosCaja) { Text = "Agregar pago de caja" };
            frmLista.MostrarColumnas("Fecha", "Concepto", "Total", "Restante");
            frmLista.HabilitarColumnas();
            frmLista.AgregarColumnaEdicion("ImporteAUsar", "Usar");
            frmLista.AgregarColumnaSeleccion("Sel");
            frmLista.dgvListado.SelectionMode = DataGridViewSelectionMode.CellSelect;

            // Se agrega la validación para cuando se le de aceptar
            decimal mImporteFaltante = Util.Decimal(oFactura.Cells["fac_Final"].Value);
            frmLista.Aceptado += new EventHandler<FormClosingEventArgs>((s, e) =>
            {
                DataGridView oGrid = (s as EdicionListado).dgvListado;
                decimal mTotal = 0;
                foreach (DataGridViewRow oFila in oGrid.Rows)
                {
                    if (!Util.Logico(oFila.Cells["Sel"].Value)) continue;

                    decimal mAUsar = Util.Decimal(oFila.Cells["ImporteAUsar"].Value);
                    if (mAUsar > Util.Decimal(oFila.Cells["Restante"].Value))
                    {
                        oFila.Cells["ImporteAUsar"].ErrorText = "El importe a usar no puede ser mayor que el importe restante.";
                        e.Cancel = true;
                    }

                    mTotal += mAUsar;
                }

                if (mTotal > mImporteFaltante)
                {
                    UtilLocal.MensajeAdvertencia("El importe total indicado es mayor al restante de de la factura seleccionada.");
                    e.Cancel = true;
                }
            });

            // Se muestra el formulario
            if (frmLista.ShowDialog(Principal.Instance) == DialogResult.OK)
            {
                var oDatos = frmLista.ObtenerResultado();
                foreach (DataRow oFila in oDatos.Rows)
                {
                    if (Util.Logico(oFila["Sel"]) && Util.Decimal(oFila["ImporteAUsar"]) > 0)
                    {
                        this.dgvAbonos.Rows.Add(true, null, oFactura.Cells["fac_MovimientoInventarioID"].Value, Cat.OrigenesPagosAProveedores.PagoDeCaja
                            , oFila["CajaEgresoID"], null, oFactura.Cells["fac_Factura"].Value, "Pago de Caja", null, null, Util.Decimal(oFila["ImporteAUsar"])
                            , null, oFila["Concepto"]);
                    }
                }
            }
            frmLista.Dispose();

            this.CalcularDescuentos();
        }