예제 #1
0
        public string ComenzarProcesoLocal(int idVentaFinalizada) {
            string r = "invalido";

            ServiceVentas serviceVentas = new ServiceVentas();
            ServiceDetalleVenta serviceDetalles = new ServiceDetalleVenta();
            ServiceOfertas serviceOferta = new ServiceOfertas();
            ServiceDetalleOferta serviceDetalleOferta = new ServiceDetalleOferta();
            
            Ventas venta = serviceVentas.GetVentas().Where(x => x.id == idVentaFinalizada).FirstOrDefault();
            var estadoVenta = serviceVentas.GetHistóricoEstadoVentas().Where(x => x.Id_venta == venta.id && x.Activo).FirstOrDefault();
            if (estadoVenta.TipoEstado != "recepcionado" || estadoVenta.Islocal)
            {
                return r;
            }

            List<DetalleVenta> detalles = serviceDetalles.GetDetalleVentaCompleta(idVentaFinalizada);
            //List<DetalleVentaDB> nuevoDetalleVenta = new List<DetalleVentaDB>();
            Ofertas ofertaGanadora = serviceOferta.GetOfertas().Where(x => x.Id_venta == idVentaFinalizada && x.IsGanador).FirstOrDefault();
            List<DetalleOferta> detalleOferta = serviceDetalleOferta.GetDetalleOfertas(ofertaGanadora.Id_oferta);

            serviceVentas.InsertVenta(1, DateTime.Now, 1);
            Ventas ventaNueva = serviceVentas.GetVentas().OrderByDescending(x => x.id).FirstOrDefault();
            foreach (var det in detalles)
            {
                DetalleOferta specOferta = detalleOferta.Where(x => x.IdProducto == det.IdProducto).FirstOrDefault();
                int idProducto = det.IdProducto;
                int nuevaCantidad = specOferta.Cantidad - det.Cantidad;
                if (nuevaCantidad <= 0) {
                    continue;
                }
                serviceDetalles.InsertDetalleVenta(idProducto, ventaNueva.id, nuevaCantidad);
            }
            serviceVentas.UpdateVenta(4, idVentaFinalizada, '1');

            return r;
        }
예제 #2
0
        public Usuario AdjudicarProductor(int idVenta) {
            Usuario usuario = new Usuario();

            ServiceOfertas so = new ServiceOfertas();
            ServiceVentas sv = new ServiceVentas();
            ServiceUsuarios su = new ServiceUsuarios();
            ServiceDetalleOferta sdo = new ServiceDetalleOferta();
            int idOfertaGanadora = 0;
            var ofertas = so.GetOfertas();
            ofertas.Where(x => x.Id_venta == idVenta);
            var tieneOfertas = ofertas.Where(x => x.Id_venta == idVenta).ToList();
            var venta = sv.GetVentas().Where(x => x.id == idVenta).FirstOrDefault();
            var email = su.GetUsuarios().Where(x => x.Username == venta.username).FirstOrDefault().Email;
            
            // validamos si ya está en un proceso posterior.
            var estadoVenta = sv.GetHistóricoEstadoVentas().Where(x => x.Id_venta == venta.id && x.Activo).FirstOrDefault().TipoEstado;
            if (estadoVenta != "abierto") {
                return usuario;
            }

            if (tieneOfertas.Count == 0)
            {
                // Notificar al cliente que no tiene adjudicaciones
                LinkedResource img =
                new LinkedResource(System.AppDomain.CurrentDomain.BaseDirectory + @"\IMAGENES\Frutas.jpg", MediaTypeNames.Image.Jpeg);
                StringBuilder mensaje = new StringBuilder();
                img.ContentId = "imagen";

                mensaje.AppendFormat("<table style = 'max-width: 600px; padding: 10px; margin:0 auto; border-collapse: collapse;'>");
                mensaje.AppendFormat("<tr>");
                mensaje.AppendFormat("<td style='padding: 0'>");
                mensaje.AppendFormat("<img style='padding: 0; display: block' src='cid:imagen' width='600px' height='100px'>");
                mensaje.AppendFormat("</td>");
                mensaje.AppendFormat("</tr>");
                mensaje.AppendFormat("<tr>");
                mensaje.AppendFormat("<td style='background - color: #ecf0f1'>");
                mensaje.AppendFormat("<div style='color: #34495e; margin: 4% 10% 2%; text-align: justify;font-family: sans-serif'>");
                mensaje.AppendFormat("<h2 style='color: #e67e22; margin: 0 0 7px'>Hola!</h2>");
                mensaje.AppendFormat("<p style='margin: 2px; font - size: 15px'>Su solicitud número {0} ha sido <b style='color: #FF0000'>cancelada</b>, debido a que no se recibieron ofertas por parte de productores.</p>", venta.id);
                mensaje.AppendFormat("<p style='color: #b3b3b3; font-size: 12px; text-align: center;margin: 30px 0 0'>Maipo Grande 2019</p>");
                mensaje.AppendFormat("</div>");
                mensaje.AppendFormat("</td>");
                mensaje.AppendFormat("</tr>");
                mensaje.AppendFormat("</table>");
                EnviarCorreo(email, "Solicitud Cancelada", mensaje.ToString(), img);
                sv.UpdateVenta(5, idVenta);
                
                
            }
            else {
                // Aquí empezamos el algoritmo para adjudicar al productor ganador
                // Esta tupla va a contener un consolidado de la oferta, que nos permitirá encontrar al ganador de forma eficiente
                // Y que iremos poblando a medida que encuentre el criterio
                // Primer criterio -> menor precio. Segundo Criterio -> Mejor calidad. Tercer criterio: " Oferta más temprana".
                // ITEM1: Id de la oferta
                // ITEM2: Precio total de la oferta
                // ITEM3: Username de la oferta
                // ITEM4: total de la calidad
                // ITEM5: fecha que se ingresó la oferta
                List<Tuple<int, int, string, int, DateTime?>> ofertasMenorPrecio = new List<Tuple<int, int, string, int, DateTime?>>();
                foreach (var oferta in ofertas)
                {

                    List<DetalleOferta> detallesFiltrados = sdo.GetDetalleOfertas(oferta.Id_oferta);
                    var total = -1;
                    // Guardamos el total de la oferta por todos los productos dentro de la oferta del productor.
                    foreach (var detalle in detallesFiltrados)
                    {
                        total += detalle.Precio * detalle.Cantidad;
                    }

                    // Aprovechamos de guardar los parámetros de calidad y su fecha.
                    var calidad = 0;
                    calidad = oferta.IsCertificado ? 1 : 0;
                    calidad += oferta.IsEnvasado ? 1 : 0;

                    // Este es para el primer caso (no hay ofertas ganadoras)
                    if (ofertasMenorPrecio.Count == 0)
                    {
                        Tuple<int, int, string, int, DateTime?> ofertaMenor = new Tuple<int, int, string, int, DateTime?>(oferta.Id_oferta, total, oferta.Username, calidad, oferta.Fecha_inicio);
                        ofertasMenorPrecio.Add(ofertaMenor);
                    }
                    else
                    {
                        Tuple<int, int, string, int, DateTime?> ofertaMenor = new Tuple<int, int, string, int, DateTime?>(-1, -1, string.Empty, -1, null);
                        foreach (var omp in ofertasMenorPrecio)
                        {
                            if (total != -1 && omp.Item2 >= total)
                            {
                                ofertaMenor = new Tuple<int, int, string, int, DateTime?>(oferta.Id_oferta, total, oferta.Username, calidad, oferta.Fecha_inicio);
                                break;
                            }
                        }

                        if (ofertaMenor.Item1 != -1 && ofertaMenor.Item2 != -1) {
                            if (ofertasMenorPrecio.FirstOrDefault().Item2 > total) {

                        if (ofertaMenor.Item1 != -1 && ofertaMenor.Item2 != -1)
                        {
                            if (ofertasMenorPrecio.FirstOrDefault().Item2 > total)
                            {

                                // vaciar las ofertas ya que hemos encontrado una con menor precio
                                ofertasMenorPrecio.Clear();
                            }
                            ofertasMenorPrecio.Add(ofertaMenor);
                        }
                    }

                }
                // Único ganador
                if (ofertasMenorPrecio.Count == 1)
                {
                    usuario = su.GetUsuarios().Where(x => x.Username == ofertasMenorPrecio.FirstOrDefault().Item3).FirstOrDefault();
                    idOfertaGanadora = ofertasMenorPrecio.FirstOrDefault().Item1;
                }
                // En caso de que hayan 2 o más ofertas con el mismo precio, seguimos con el siguiente criterio de selección
                else
                {
                    // Buscamos la oferta con mayores parámetros de calidad
                    // la lígica es ordernar bajo el item4 (total de calidad) de forma descendiente y escoger aquellos que sean igual al máximo
                    var ofertasMejorCalidad = ofertasMenorPrecio.OrderByDescending(x => x.Item4).Where(y => y.Item4 == ofertasMenorPrecio.Max(z => z.Item4)).ToList();
                    // Si hay uno sólo con este criterio
                    if (ofertasMejorCalidad.Count == 1)
                    {
                        usuario = su.GetUsuarios().Where(x => x.Username == ofertasMejorCalidad.FirstOrDefault().Item3).FirstOrDefault();
                        idOfertaGanadora = ofertasMejorCalidad.FirstOrDefault().Item1;
                    }
                    // Caso último que tengamos más de una oferta con la misma calidad, entonces escogemos por la oferta más temprana
                    else {
                        var primeraOferta = ofertasMejorCalidad.OrderBy(x => x.Item5).FirstOrDefault();
                        usuario = su.GetUsuarios().Where(x => x.Username == primeraOferta.Item3).FirstOrDefault();
                        idOfertaGanadora = primeraOferta.Item1;
                    }
                }

                LinkedResource img =
                new LinkedResource(System.AppDomain.CurrentDomain.BaseDirectory + @"\IMAGENES\Frutas.jpg", MediaTypeNames.Image.Jpeg);
                img.ContentId = "imagen";
                StringBuilder mensaje = new StringBuilder();

                mensaje.AppendFormat("<table style = 'max-width: 600px; padding: 10px; margin:0 auto; border-collapse: collapse;'>");
                mensaje.AppendFormat("<tr>");
                mensaje.AppendFormat("<td style='padding: 0'>");
                mensaje.AppendFormat("<img style='padding: 0; display: block' src='cid:imagen' width='600px' height='100px'>");
                mensaje.AppendFormat("</td>");
                mensaje.AppendFormat("</tr>");
                mensaje.AppendFormat("<tr>");
                mensaje.AppendFormat("<td style='background - color: #ecf0f1'>");
                mensaje.AppendFormat("<div style='color: #34495e; margin: 4% 10% 2%; text-align: justify;font-family: sans-serif'>");
                mensaje.AppendFormat("<h2 style='color: #e67e22; margin: 0 0 7px'>Hola!</h2>");
                mensaje.AppendFormat("<p style='margin: 2px; font - size: 15px'>Su solicitud número {0} ya tiene un productor ganador, cuyos datos son. Nombre: {1}, Apellido: {2}. Ahora su solicitud ha pasado al estado <b>En subasta</b>, para la subasta de transporte.</p>", venta.id, usuario.Nombre, usuario.Apellido);
                mensaje.AppendFormat("<p style='color: #b3b3b3; font-size: 12px; text-align: center;margin: 30px 0 0'>Maipo Grande 2019</p>");
                mensaje.AppendFormat("</div>");
                mensaje.AppendFormat("</td>");
                mensaje.AppendFormat("</tr>");
                mensaje.AppendFormat("</table>");
                EnviarCorreo(email, "Solicitud se encuentra en subasta", mensaje.ToString(), img);
                sv.UpdateVenta(2, idVenta);
                so.UpdateOfertaGanadora(idOfertaGanadora);
            }

            return usuario;
        }