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(); }
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(); }
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; }
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; }
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(); }
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(); }
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(); }
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); } }
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); } }
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; } }
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; }
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(); }
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(); }
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); } } } }
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(); }
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; }