private void Cancelar9500(int i9500ID) { var o9500 = Datos.GetEntity <Cotizacion9500>(q => q.Cotizacion9500ID == i9500ID && q.Estatus); // Se valida que ya se haya cobrado la venta del anticipo var oVenta = Datos.GetEntity <Venta>(q => q.VentaID == o9500.AnticipoVentaID && q.Estatus); if (oVenta.VentaEstatusID == Cat.VentasEstatus.Realizada) { UtilLocal.MensajeAdvertencia("El 9500 seleccionado no ha sido cobrado. Para cancelarlo, cancela la Venta del anticipo desde Ventas por Cobrar."); return; } if (UtilLocal.MensajePregunta("¿Estás seguro que deseas cancelar el 9500 seleccionado?") == DialogResult.Yes) { var oMotivo = UtilLocal.ObtenerValor("¿Cuál es el motivo de la baja?", "", MensajeObtenerValor.Tipo.TextoLargo); if (oMotivo == null) { return; } var oResU = UtilLocal.ValidarObtenerUsuario(); if (oResU.Error) { return; } Cargando.Mostrar(); // Se cancela el 9500 VentasProc.Cancelar9500(i9500ID, Util.Cadena(oMotivo), oResU.Respuesta.UsuarioID); Cargando.Cerrar(); this.CargarLista9500(); } }
private void dgvConceptos_KeyDown(object sender, KeyEventArgs e) { if (this.dgvConceptos.CurrentRow == null) { return; } if (e.KeyCode == Keys.Delete) { if (UtilLocal.MensajePregunta("¿Estás seguro que deseas eliminar el concepto seleccionado?") == DialogResult.Yes) { if (!Util.Logico(this.dgvConceptos.CurrentRow.Cells["EsNuevo"].Value)) { if (Util.Cadena(this.dgvConceptos.CurrentRow.Cells["Tipo"].Value).ToLower() == "ingreso") { this.IngresosBorrados.Add(Util.Entero(this.dgvConceptos.CurrentRow.Cells["ID"].Value)); } else { this.EgresosBorrados.Add(Util.Entero(this.dgvConceptos.CurrentRow.Cells["ID"].Value)); } } this.dgvConceptos.Rows.Remove(this.dgvConceptos.CurrentRow); } } }
private void dgvAutorizaciones_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { if (this.dgvAutorizaciones.CurrentRow == null) { return; } if (UtilLocal.MensajePregunta("¿Estás seguro que deseas autorizar la tarea seleccionada?") == DialogResult.Yes) { int iAutorizacionID = Util.Entero(this.dgvAutorizaciones.CurrentRow.Cells["AutorizacionID"].Value); this.AutorizarAutorizacion(iAutorizacionID); this.AplicarFiltro(); } }
protected override void btnEliminar_Click(object sender, EventArgs e) { int iRegistroID = Util.Entero(this.dgvDatos.CurrentRow.Cells["ContaConsumibleID"].Value); var oRegistro = Datos.GetEntity <ContaConsumible>(c => c.ContaConsumibleID == iRegistroID); string sPregunta = string.Format("¿Estás seguro que deseas eliminar el {0}: \"{1}\"?", "Consumible", oRegistro.Consumible); if (UtilLocal.MensajePregunta(sPregunta) != DialogResult.Yes) { return; } Datos.Eliminar <ContaConsumible>(oRegistro); this.ActualizarDatos(); }
protected override void btnEliminar_Click(object sender, EventArgs e) { int iBancoID = Util.Entero(this.dgvDatos.CurrentRow.Cells["BancoID"].Value); var oBanco = Datos.GetEntity <Banco>(q => q.BancoID == iBancoID && q.Estatus); string sPregunta = string.Format("¿Estás seguro que deseas eliminar el {0}: \"{1}\"?", "Banco", oBanco.NombreBanco); if (UtilLocal.MensajePregunta(sPregunta) != DialogResult.Yes) { return; } Datos.Eliminar <Banco>(oBanco, true); this.ActualizarDatos(); }
private void dgvNotasDeCredito_KeyDown(object sender, KeyEventArgs e) { if (this.dgvNotasDeCredito.CurrentRow == null) { return; } if (e.KeyCode == Keys.Delete) { // Se verifica la nota de crédito seleccionada int iNotaDeCreditoID = Util.Entero(this.dgvNotasDeCredito.CurrentRow.Cells["ncNotaDeCreditoID"].Value); var oNota = Datos.GetEntity <NotaDeCredito>(q => q.NotaDeCreditoID == iNotaDeCreditoID && q.Estatus); if (oNota.Valida == false) { UtilLocal.MensajeAdvertencia("La nota de crédito seleccionada ya no es válida. No se puede continuar."); return; } if (UtilLocal.MensajePregunta("¿Estás seguro que deseas dar de baja la nota de crédito seleccionada?") == DialogResult.Yes) { // Se solicita el motivo var oMotivo = UtilLocal.ObtenerValor("Indica el motivo de la baja", "", MensajeObtenerValor.Tipo.TextoLargo); if (oMotivo != null) { // Se solicita la validación de usuario var ResU = UtilLocal.ValidarObtenerUsuario("Ventas.NotasDeCredito.Baja"); if (ResU.Exito) { oNota.Valida = false; oNota.MotivoBaja = Util.Cadena(oMotivo); Datos.Guardar <NotaDeCredito>(oNota); this.NcAplicarFiltro(); } else { if (ResU.Respuesta != null) { UtilLocal.MensajeAdvertencia("No tienes permisos para realizar la operación solicitada."); } } } } } }
private void btnGuardar_Click(object sender, EventArgs e) { if (UtilLocal.MensajePregunta("¿Estás seguro que deseas autorizar los registros seleccionados?") == DialogResult.Yes) { Cargando.Mostrar(); foreach (DataGridViewRow oFila in this.dgvAutorizaciones.Rows) { if (Util.Logico(oFila.Cells["Autorizado"].Value)) { int iAutorizacionID = Util.Entero(oFila.Cells["AutorizacionID"].Value); this.AutorizarAutorizacion(iAutorizacionID); } } this.AplicarFiltro(); Cargando.Cerrar(); } }
private void BorrarVenta(int iVentaID) { // Para ver si la venta es un anticipo de 9500 var o9500Ant = Datos.GetEntity <Cotizacion9500>(q => q.AnticipoVentaID == iVentaID && q.EstatusGenericoID == Cat.EstatusGenericos.Pendiente && q.Estatus); // Para ver si la venta es de un 9500 Cotizacion9500 o9500 = null; if (o9500Ant == null) { o9500 = Datos.GetEntity <Cotizacion9500>(q => q.VentaID == iVentaID && q.Estatus); } string sPregunta = "¿Estás seguro que deseas eliminar la venta seleccionada?"; if (o9500Ant != null) { sPregunta = "La venta seleccionada pertenece a un anticipo de 9500. ¿Estás seguro que deseas eliminarla?"; } else if (o9500 != null) { sPregunta = "La venta seleccionada pertenece a un 9500. ¿Estás seguro que deseas eliminarla?"; } if (UtilLocal.MensajePregunta(sPregunta) == DialogResult.Yes) { // Si es un anticipo de 9500, éste se cancela y se borran las partes, si no han sido usadas if (o9500Ant != null) { VentasProc.Cancelar9500(o9500Ant.Cotizacion9500ID, "POR BORRAR VENTA SIN COBRAR", GlobalClass.UsuarioGlobal.UsuarioID); } // Si es un 9500, éste se regresa a los 9500 pendientes else if (o9500 != null) { VentasProc.Regresar9500DeCompletar(o9500); } // Se elimina la venta VentasProc.EliminarVenta(iVentaID); this.ActualizarDatos(); } }
public static void EnviarReporteASalida(string sParametro, Report oReporte, bool bUsarPreparado) { // Se abre el xml correspondiente al reporte var oXmlRep = new XmlDocument(); oXmlRep.Load(oReporte.FileName); // Se obtiene el tipo de salida, primero del xml del reporte, si no, de la base de datos string sTipoDeSalida = ""; if (oXmlRep.DocumentElement.Attributes["Cr_Salida"] == null) { sTipoDeSalida = Config.Valor(sParametro); } else { sTipoDeSalida = oXmlRep.DocumentElement.Attributes["Cr_Salida"].Value; } switch (sTipoDeSalida.ToLower()) { case "d": oReporte.Design(); break; case "p": if (bUsarPreparado) { oReporte.ShowPrepared(); } else { oReporte.Show(); } break; case "i": bool bDialogo = (oReporte.PrintSettings.Printer == ""); oReporte.PrintSettings.ShowDialog = bDialogo; // Se intenta mandar a imprimir try { if (bUsarPreparado) { oReporte.PrintPrepared(); } else { oReporte.Print(); } if (bDialogo) { if (UtilLocal.MensajePregunta("¿Deseas guardar los datos de impresión especificados como predeterminados para este reporte?") == DialogResult.Yes) { oReporte.PrintSettings.SavePrinterWithReport = true; oReporte.Save(oReporte.FileName); } } } catch (Exception e) { UtilLocal.MensajeError(e.Message); } break; } }
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 override bool Ejecutar() { // Se valida que el importe a pagar sea mayor que cero if (this.ctlCobranza.Total <= 0) { UtilLocal.MensajeAdvertencia("No hay ningún importe a pagar."); return(false); } // Se valida el cobro if (!this.ctlCobro.Validar()) { return(false); } // Se valida que el pago sea en la misma sucursal que el primer abono, si hubiera var oVentasACobrar = this.ctlCobranza.ObtenerVentasMarcadas(); string sVentasOt = ""; foreach (var oReg in oVentasACobrar) { if (Datos.Exists <VentaPago>(c => c.VentaID == oReg.VentaID && c.Estatus && c.SucursalID != GlobalClass.SucursalID)) { sVentasOt += (", " + oReg.Folio); } } if (sVentasOt != "" && oVentasACobrar[0].VentaID != 270157) // Modificaciòn temporal para no evaluar esa venta - 2015-08-24 { UtilLocal.MensajeAdvertencia("Las siguientes ventas ya fueron abonadas en otra sucursal, por lo tanto aquí no se pueden cobrar.\n\n" + sVentasOt.Substring(2)); return(false); } // Si se quiere pagar con Vales, se valida que sólo sea una venta var oFormasDePago = this.ctlCobro.GenerarPagoDetalle(); if (oFormasDePago.Any(c => c.TipoFormaPagoID == Cat.FormasDePago.Vale) && oVentasACobrar.Count > 1) { UtilLocal.MensajeAdvertencia("En selecciones múltiples no se puede usar vales. Es necesario seleccionar sólo una venta."); return(false); } // Confirmación if (UtilLocal.MensajePregunta("¿Estás seguro que deseas realizar el abono indicado?") != DialogResult.Yes) { return(false); } // Se completa el cobro, por si fue pago en efectivo if (!this.ctlCobro.CompletarCobro()) { return(false); } // Se solicita la validación de autorización, si aplica int iAutorizoID = 0; if (this.ctlCobro.AutorizacionDeNotasDeCreditoRequerida) { var Res = UtilLocal.ValidarObtenerUsuario("Autorizaciones.Ventas.Cobro.NotaDeCreditoOtroCliente", "Autorización"); iAutorizoID = (Res.Exito ? Res.Respuesta.UsuarioID : 0); } // Se procede a guardar los datos DateTime dAhora = DateTime.Now; // Se generan los pagos para las ventas marcadas, hasta donde alcance el importe decimal mPago = this.ctlCobro.Suma; var oVentasAfectadas = new List <VentasACreditoView>(); var oPagosDetalleGen = new List <VentaPagoDetalle>(); var oIdsPago = new List <int>(); foreach (var oVentaACobrar in oVentasACobrar) { // Si la venta no tiene saldo, se salta if (oVentaACobrar.Restante <= 0) { continue; } var oPago = new VentaPago() { VentaID = oVentaACobrar.VentaID, Fecha = dAhora, }; var oPagoDetalle = new List <VentaPagoDetalle>(); decimal mPagoForma = 0; oVentaACobrar.Pagado = 0; // Se hace cero para que sólo sume lo pagado en esta ocasión foreach (var oFormaDePago in oFormasDePago) { mPagoForma = (oFormaDePago.Importe > oVentaACobrar.Restante ? oVentaACobrar.Restante : oFormaDePago.Importe); if (oFormaDePago.Importe > 0) { oPagoDetalle.Add(new VentaPagoDetalle() { TipoFormaPagoID = oFormaDePago.TipoFormaPagoID, Importe = mPagoForma, BancoID = oFormaDePago.BancoID, Folio = oFormaDePago.Folio, Cuenta = oFormaDePago.Cuenta, NotaDeCreditoID = oFormaDePago.NotaDeCreditoID }); mPago -= mPagoForma; oFormaDePago.Importe -= mPagoForma; oVentaACobrar.Pagado += mPagoForma; oVentaACobrar.Restante -= mPagoForma; if (oVentaACobrar.Restante <= 0) { break; } } } Guardar.VentaPago(oPago, oPagoDetalle); // Se agrega la venta actual a las ventas afectadas oVentasAfectadas.Add(oVentaACobrar); oIdsPago.Add(oPago.VentaPagoID); oPagosDetalleGen.AddRange(oPagoDetalle); if (mPago <= 0) { break; } } // Se manda a generar la póliza contable (AfeConta) foreach (int iPagoID in oIdsPago) { var oPagoV = Datos.GetEntity <VentasPagosView>(c => c.VentaPagoID == iPagoID); if (oPagoV.Facturada) { ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.PagoVentaCredito, iPagoID , (oPagoV.Folio + " / " + UtilDatos.VentaPagoFormasDePago(iPagoID)), oPagoV.Cliente); } // Si es tiecket a crédito, se hace ajuste de pólizas if (!oPagoV.Facturada) { ContaProc.BorrarPolizaTemporalTicketCredito(oPagoV.VentaID); var oVentaV = Datos.GetEntity <VentasView>(c => c.VentaID == oPagoV.VentaID); if (oVentaV.VentaEstatusID == Cat.VentasEstatus.Cobrada) { ContaProc.CrearPolizaTemporalTicketCredito(oPagoV.VentaID, (oVentaV.Total - oVentaV.Pagado)); } } } // Se guardan la autorizaciones aplicables if (this.ctlCobro.AutorizacionDeNotasDeCreditoRequerida) { // Se agrega una autorización por cada nota de otro cliente var oNotasOC = this.ctlCobro.NotasDeCreditoOtrosClientes(); foreach (var oNotaOC in oNotasOC) { VentasProc.GenerarAutorizacion(Cat.AutorizacionesProcesos.NotaDeCreditoOtroClienteUsar, Cat.Tablas.NotaDeCredito, oNotaOC, iAutorizoID); } } // Se guardan los datos del cobro, para reimpresión de tickets string sFolioCob = VentasProc.GenerarFolioDeCobranza(); int iCuenta = 0; foreach (var oVentaAf in oVentasAfectadas) { Datos.Guardar <CobranzaTicket>(new CobranzaTicket() { Ticket = sFolioCob, VentaID = oVentaAf.VentaID, ClienteID = this.Cliente.ClienteID, Folio = oVentaAf.Folio, Fecha = oVentaAf.Fecha, Vencimiento = oVentaAf.Vencimiento, Total = oVentaAf.Total, Pagado = oVentaAf.Pagado, Restante = oVentaAf.Restante, VentaPagoID = oIdsPago[iCuenta++] }); } // Se genera el ticket correspondiente VentasLoc.GenerarTicketCobranza(sFolioCob); // Si se pagó con vale, se verifica si se crearon nuevos vales por importes restantes. Y se mandan a imprimir var oValesCreados = VentasProc.ObtenerValesCreados(oPagosDetalleGen); foreach (var oReg in oValesCreados) { VentasLoc.GenerarTicketNotaDeCredito(oReg.NotaDeCreditoID); } // Se muestra una notifiación con el resultado UtilLocal.MostrarNotificacion("Procedimiento completado correctamente."); // Se limpia después de haberse guardado this.Limpiar(); return(true); }
private void CambioSesion() { Control oControlAc = Util.ControlAlFrente(this.panelContenedor); // Se ocultan todos los controles del formulario principal foreach (Control oControl in this.panelContenedor.Controls) { oControl.Hide(); } this.panelContenedor.Tag = null; // bool bSesionNueva = false; while (true) { // Se muestra la ventana de inicio de sesion bool bInicio = this.MostrarInicioDeSesion(); if (!bInicio) { if (UtilLocal.MensajePregunta("Existe una sesión abierta. Si continúas, el programa se cerrará y la información se perderá. ¿Estás seguro que deseas continuar?") == DialogResult.Yes) { this.Close(); return; } else { continue; } } // Se verifica si es otro usuario if (this.oUsuario.UsuarioID != GlobalClass.UsuarioGlobal.UsuarioID) { if (UtilLocal.MensajePregunta("Existe una sesión abierta con otro Usuario. Si continúas, la información se perderá. ¿Estás seguro que deseas continuar?") == DialogResult.Yes) { bSesionNueva = true; } else { continue; } } // Se verifica si se inicia sesión con otra sucursal if (this.SucursalID != GlobalClass.SucursalID) { if (UtilLocal.MensajePregunta("Existe una sesión abierta con otra Sucursal. Si continúas, la información se perderá. ¿Estás seguro que deseas continuar?") == DialogResult.Yes) { bSesionNueva = true; } else { continue; } } // break; } // Se inicia o continúa la sesión if (bSesionNueva) { // Se cierran las opciones abiertas while (this.panelContenedor.Controls.Count > 0) { Control oControl = this.panelContenedor.Controls[0]; this.panelContenedor.Controls.Remove(oControl); oControl.Dispose(); oControl = null; } // Proc.InicializarSesion(this.SucursalID, this.oUsuario); } else { if (oControlAc != null) { this.CargarControl(oControlAc.Name); } } }
private bool Completar9500() { // Se validan las partes if (!this.ctlComDetalle.Validar()) { return(false); } //if (Util.ControlAlFrente(this.pnlCompletar) == this.ctlComDetalle) //{ //} // Se verifica que se haya hecho el pago del anticipo Cotizacion9500 o9500 = this.ctlPartes.oCotizacion9500; if (!Datos.Exists <Venta>(c => c.VentaID == o9500.AnticipoVentaID && (c.VentaEstatusID == Cat.VentasEstatus.Completada || c.VentaEstatusID == Cat.VentasEstatus.Cobrada))) { UtilLocal.MensajeAdvertencia("Al parecer no se ha realizado el pago correspondiente al Anticipo. No se puede continuar."); return(false); } // Se confirma la operación if (UtilLocal.MensajePregunta(string.Format("¿Estás seguro que deseas completar el 9500 con el folio {0}?\n\n{1}" , this.ctlPartes.oCotizacion9500.Cotizacion9500ID, this.ctlPartes.o9500Sel["lisDescripcion"])) != DialogResult.Yes) { return(false); } // Se guardan los datos DateTime dAhora = DateTime.Now; // Se cancela la venta del anticipo /* Ya no. Ahora todo esto se hace al cobrar la venta final * oVenta.VentaEstatusID = Cat.VentasEstatus.Cancelada; * Datos.Guardar<Venta>(oVenta); * // Se genera una devolución de efectivo (si se realizó un pago) de la venta cancelada, pues se generará una nueva venta con el importe total * if (oVentaPago != null) * VentasProc.GenerarDevolucionDeEfectivo(o9500.AnticipoVentaID.Valor(), o9500.Anticipo); */ // Se genera la venta correspondiente al 9500 // var o9500Detalle = General.GetListOf<Cotizacion9500Detalle>(q => q.Estatus && q.Cotizacion9500ID == oCotizacion9500.Cotizacion9500ID); var oCliente = Datos.GetEntity <Cliente>(q => q.ClienteID == o9500.ClienteID && q.Estatus); var oDetalle = this.ctlComDetalle.ProductosSel(); var oVenta = new Venta() { Fecha = dAhora, ClienteID = o9500.ClienteID, VentaEstatusID = Cat.VentasEstatus.Realizada, RealizoUsuarioID = o9500.RealizoUsuarioID, ComisionistaClienteID = o9500.ComisionistaClienteID }; var oVentaDetalle = new List <VentaDetalle>(); foreach (var oParte in oDetalle) { // Se toma el precio de la tabla "PartePrecio", pues pudo haber sido cambiado por el encargado de Compras var oPartePrecio = Datos.GetEntity <PartePrecio>(q => q.ParteID == oParte.ParteID); decimal mPrecio = UtilDatos.PartePrecioDeVenta(oPartePrecio, oCliente.ListaDePrecios); // Se agrega la parte al detalle de la venta oVentaDetalle.Add(new VentaDetalle() { ParteID = oParte.ParteID, Costo = oPartePrecio.Costo.Valor(), CostoConDescuento = (oPartePrecio.CostoConDescuento ?? oPartePrecio.Costo.Valor()), Cantidad = oParte.Cantidad, PrecioUnitario = UtilTheos.ObtenerPrecioSinIva(mPrecio, 3), Iva = UtilTheos.ObtenerIvaDePrecio(mPrecio, 3) }); } // Se guarda la venta Guardar.Venta(oVenta, oVentaDetalle); // Se modifica el dato de la venta correspondiente al 9500 o9500.VentaID = oVenta.VentaID; o9500.EstatusGenericoID = Cat.EstatusGenericos.PorCompletar; Datos.Guardar <Cotizacion9500>(o9500); // Se restaura this.ctlPartes.ComCliente = null; this.pnlEnTotales.Controls.Remove(this.pnlCompletar); this.pnlCompletar.Dispose(); this.pnlCompletar = null; this.CambiarOpcion(eOpcion.Agregar); this.ctlPartes.tab9500.SelectedIndex = 0; // Se muestra una notifiación con el resultado UtilLocal.MostrarNotificacion("Cotización 9500 guardada correctamente."); // Se retorna falso para que no se quite la opción de 9500 return(false); }