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