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); }
public 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 el cliente if (this.oControlVentas.Cliente == null) { UtilLocal.MensajeAdvertencia("No hay ningún cliente seleccionado o cliente inválido."); return(false); } // Se validan los productos if (!this.oControlVentas.Validar()) { return(false); } // Se validan si hay una parte de cobro de diferencia de casco, sea la única en la venta var oVentaDet = this.oControlVentas.GenerarVentaDetalle(); foreach (var oReg in oVentaDet) { if (Datos.Exists <Parte>(c => c.ParteID == oReg.ParteID && c.EsCascoPara > 0) || oReg.ParteID == Cat.Partes.DiferenciaDeCascos) { if (oVentaDet.Count > 1) { UtilLocal.MensajeAdvertencia("La venta contiene un artículo Casco, por lo cual no puede contener otros artículos."); return(false); } } } // Se verifica si se debe mostrar la opción de cobro if (!this.oControlVentas.CobroAlFrente) { if (this.oControlVentas.ctlCobro == null) { this.oControlVentas.ctlCobro = new Cobro() { Dock = DockStyle.Fill }; this.oControlVentas.pnlContenidoDetalle.Controls.Add(this.oControlVentas.ctlCobro); // Se configura el evento Click para el botón de cotización this.oControlVentas.ctlCobro.Cotizacion_Click += new EventHandler((s, e) => { this.GenerarCotizacion(); }); } this.oControlVentas.ctlCobro.CambiarCliente(this.oControlVentas.Cliente.ClienteID); this.oControlVentas.ctlCobro.Total = this.oControlVentas.Total; // Sólo se permite cambiar el vendedor, no cobrar this.oControlVentas.ctlCobro.HabilitarTipoDePago = false; this.oControlVentas.ctlCobro.MostrarFacturar = false; this.oControlVentas.ctlCobro.MostrarFacturarDividir = false; this.oControlVentas.ctlCobro.HabilitarCotizacion = true; this.oControlVentas.ctlCobro.HabilitarFormasDePago = false; this.oControlVentas.ctlCobro.Total = 0; this.oControlVentas.ctlCobro.BringToFront(); return(false); } // Se verifica si es cotización if (this.oControlVentas.EsCotizacion) { UtilLocal.MensajeAdvertencia("No se puede realizar la venta porque esta es sólo una cotización."); return(false); } // Se intenta completar if (!this.oControlVentas.ctlCobro.CompletarCobro()) { return(false); } //decimal mImportePato = Util.Decimal(Config.Valor("Ventas.ImportePato")); //bool esPato = false; //if (this.oControlVentas.Total >= mImportePato) //{ // var hunt = new Duck(UtilLocal.RutaRecursos() + "huntduck2.wmv"); // hunt.Show(Principal.Instance); // esPato = true; //} else // Se muestra la ventana de "Cargando.." Cargando.Mostrar(); // Se procede a guardar la venta DateTime dAhora = DateTime.Now; // Se crea el objeto de la nueva venta Venta oVenta = new Venta() { Fecha = dAhora, ClienteID = this.oControlVentas.Cliente.ClienteID, VentaEstatusID = Cat.VentasEstatus.Realizada, RealizoUsuarioID = this.oControlVentas.ctlCobro.VendodorID, RepartidorID = (this.oControlVentas.ctlCobro.RepartidorID > 0 ? (int?)this.oControlVentas.ctlCobro.RepartidorID : null), ComisionistaClienteID = this.oControlVentas.ctlCobro.ComisionistaID, ClienteVehiculoID = this.oControlVentas.ctlCobro.ClienteVehiculoID, Kilometraje = this.oControlVentas.ctlCobro.Kilometraje }; // Se manda a guardar la venta var oVentaDetalle = this.oControlVentas.GenerarVentaDetalle(); Guardar.Venta(oVenta, oVentaDetalle); // Se agrega al Kardex // ** Se hace al momento de cobrar :\ // Se generan los datos de pago (no en la primer versión) /* var oPago = this.ctlCobro.GenerarPago(); * oPago.VentaID = oVenta.VentaID; * oPago.Fecha = dAhora; * var oPagoDetalle = this.ctlCobro.GenerarPagoDetalle(); * // Se mandan guardar los datos del pago * Guardar.VentaPago(oPago, oPagoDetalle); */ // Se imprimen los tickets correspondientes // .. aquí no hay tickets, sino hasta que se paga, creo // Se guarda la leyenda, para usarla en el ticket, después de cobrar if (this.oControlVentas.ctlCobro.Leyenda != "") { VentasProc.AgregarLeyenda(oVenta.VentaID, this.oControlVentas.ctlCobro.Leyenda); } // Se hace verificación para control de cascos foreach (var oReg in oVentaDetalle) { if (Datos.Exists <Parte>(c => c.ParteID == oReg.ParteID && c.RequiereCascoDe > 0 && c.Estatus)) { // Se agrega el registro para casco, uno por cada casco según la cantidad for (int i = 0; i < oReg.Cantidad; i++) { var oCascoReg = new CascoRegistro() { Fecha = dAhora, VentaID = oVenta.VentaID, ParteID = oReg.ParteID }; Datos.Guardar <CascoRegistro>(oCascoReg); } } } // Se guardan los datos de la aplicación, si hubiera if (this.oControlVentas.oAplicaciones != null && this.oControlVentas.oAplicaciones.Count > 0) { foreach (var oReg in this.oControlVentas.oAplicaciones) { var oRegVentaD = oVentaDetalle.FirstOrDefault(c => c.ParteID == oReg.ParteID); oReg.VentaID = oVenta.VentaID; oReg.Cantidad = oRegVentaD.Cantidad; Datos.Guardar <VentaParteAplicacion>(oReg); } } // Se cierra la ventana de "Cargando.." //if(!esPato) Cargando.Cerrar(); // Se muestra notificación y se limpia el formulario UtilLocal.MostrarNotificacion("La Venta ha sido guardada correctamente."); return(true); }
private bool Agregar9500() { // Se valida la parte de "Partes" if (!this.ctlPartes.Validar()) { return(false); } // Se pide el efectivo, si aplica if (!this.ctlCobro.CompletarCobro()) { return(false); } // Se valida que exista una Medida genérica, para las nuevas partes if (Datos.GetEntity <Medida>(q => q.MedidaID == Cat.Medidas.Pieza && q.Estatus) == null) { UtilLocal.MensajeAdvertencia("No existe una Medida genérica para asignarle a las partes nuevas. No se puede continuar."); return(false); } // Se solicitan la autorizaciones, si se requiere int iAutorizoID = 0; if (this.ctlPartes.AutorizacionRequeridaPrecio || this.ctlPartes.AutorizacionRequeridaAnticipo) { string sPermiso = (this.ctlPartes.AutorizacionRequeridaPrecio ? "Autorizaciones.Ventas.9500.PrecioFueraDeRango" : "Autorizaciones.Ventas.9500.NoAnticipo"); var Res = UtilLocal.ValidarObtenerUsuario(sPermiso, "Autorización"); iAutorizoID = (Res.Respuesta == null ? 0 : Res.Respuesta.UsuarioID); } // Se procede a guardar los datos DateTime dAhora = DateTime.Now; // Se genera la Cotización 9500 var o9500 = this.ctlPartes.Generar9500(); o9500.Fecha = dAhora; o9500.RealizoUsuarioID = this.ctlCobro.VendodorID; if (this.ctlCobro.ComisionistaID > 0) { o9500.ComisionistaClienteID = this.ctlCobro.ComisionistaID; } // Se genera el detalle del 9500 var oParteGanancia = this.ctlPartes.ObtenerParteGanancia(null); var o9500Detalle = new List <Cotizacion9500Detalle>(); foreach (var Parte9500 in this.ctlPartes.Detalle) { // Si la parte no existe, se agrega if (Parte9500.Value.ParteID <= 0) { int iFila = UtilLocal.findRowIndex(this.ctlPartes.dgvPartes, "Llave", Parte9500.Key); string sNumeroDeParte = Util.Cadena(this.ctlPartes.dgvPartes["NumeroDeParte", iFila].Value); string sDescripcion = Util.Cadena(this.ctlPartes.dgvPartes["Descripcion", iFila].Value); var oLinea = Datos.GetEntity <Linea>(q => q.LineaID == Parte9500.Value.LineaID && q.Estatus); Parte oParte = new Parte() { NumeroParte = sNumeroDeParte, LineaID = Parte9500.Value.LineaID, MarcaParteID = Parte9500.Value.MarcaParteID, ProveedorID = Parte9500.Value.ProveedorID, NombreParte = sDescripcion, Es9500 = true, SubsistemaID = oLinea.SubsistemaID.Valor() }; // Se agregan los precios PartePrecio oPartePrecio = null; if (oParteGanancia != null) { oPartePrecio = new PartePrecio() { Costo = Parte9500.Value.Costo, PorcentajeUtilidadUno = oParteGanancia.PorcentajeDeGanancia1, PorcentajeUtilidadDos = oParteGanancia.PorcentajeDeGanancia2, PorcentajeUtilidadTres = oParteGanancia.PorcentajeDeGanancia3, PorcentajeUtilidadCuatro = oParteGanancia.PorcentajeDeGanancia4, PorcentajeUtilidadCinco = oParteGanancia.PorcentajeDeGanancia5, PrecioUno = UtilTheos.AplicarRedondeo(Parte9500.Value.Costo * oParteGanancia.PorcentajeDeGanancia1), PrecioDos = UtilTheos.AplicarRedondeo(Parte9500.Value.Costo * oParteGanancia.PorcentajeDeGanancia2), PrecioTres = UtilTheos.AplicarRedondeo(Parte9500.Value.Costo * oParteGanancia.PorcentajeDeGanancia3), PrecioCuatro = UtilTheos.AplicarRedondeo(Parte9500.Value.Costo * oParteGanancia.PorcentajeDeGanancia4), PrecioCinco = UtilTheos.AplicarRedondeo(Parte9500.Value.Costo * oParteGanancia.PorcentajeDeGanancia5) }; } // Se guarda Guardar.Parte(oParte, oPartePrecio); Parte9500.Value.ParteID = oParte.ParteID; } // Se agrega la parte al detalle del 9500 o9500Detalle.Add(Parte9500.Value); } // Se guardan los datos de 9500 Guardar.c9500(o9500, o9500Detalle); // Se genera la venta con el anticipo var oVenta = new Venta() { ClienteID = o9500.ClienteID, RealizoUsuarioID = o9500.RealizoUsuarioID }; var oPrecioAnticipo = Datos.GetEntity <PartePrecio>(c => c.ParteID == Cat.Partes.AnticipoClientes && c.Estatus); var oVentaDetalle = new VentaDetalle() { ParteID = Cat.Partes.AnticipoClientes, Cantidad = 1, PrecioUnitario = o9500.Anticipo, Costo = oPrecioAnticipo.Costo.Valor(), CostoConDescuento = (oPrecioAnticipo.CostoConDescuento ?? oPrecioAnticipo.Costo.Valor()) }; Guardar.Venta(oVenta, new List <VentaDetalle>() { oVentaDetalle }); // Se guarda el dato de la venta con el anticipo en el registro de 9500 o9500.AnticipoVentaID = oVenta.VentaID; Datos.Guardar <Cotizacion9500>(o9500); // Se guardan las autorizaciones, si hubiera if (this.ctlPartes.AutorizacionRequeridaPrecio) { VentasProc.GenerarAutorizacion(Cat.AutorizacionesProcesos.c9500PrecioFueraDeRango, Cat.Tablas.Tabla9500, o9500.Cotizacion9500ID, iAutorizoID); } if (this.ctlPartes.AutorizacionRequeridaAnticipo) { VentasProc.GenerarAutorizacion(Cat.AutorizacionesProcesos.c9500SinAnticipo, Cat.Tablas.Tabla9500, o9500.Cotizacion9500ID, iAutorizoID); } // Se muestra una notifiación con el resultado UtilLocal.MostrarNotificacion("Cotización 9500 guardada correctamente."); return(true); }