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 string UpdateVenta(int id_estado, int id_venta, char isLocal = '0') { ServiceVentas sv = new ServiceVentas(); ServiceUsuarios su = new ServiceUsuarios(); var venta = sv.GetVentas().Where(x => x.id == id_venta).FirstOrDefault(); var email = su.GetUsuarios().Where(x => x.Username == venta.username).FirstOrDefault().Email; string r = string.Empty; try { Connection c = new Connection(); OracleDataAdapter adapter = new OracleDataAdapter(); OracleCommand comm = new OracleCommand(); comm.Connection = c.Conn; // retorna usuario y perfil OracleParameter param = new OracleParameter(); if (isLocal != '1') { comm.CommandText = "pkg_historico_estado_ventas.insert_hev"; comm.CommandType = System.Data.CommandType.StoredProcedure; comm.Parameters.Add("in_id_estado", OracleDbType.Int32, 38, "id_estado").Value = id_estado; comm.Parameters.Add("in_id_venta", OracleDbType.Int32, 38, "id_venta").Value = id_venta; comm.Parameters.Add("in_fecha", OracleDbType.Date, 100, "fecha").Value = DateTime.Now; param = comm.Parameters.Add("response", OracleDbType.Int32, ParameterDirection.Output); } else { comm.CommandText = "pkg_historico_estado_ventas.insert_hev_local"; comm.CommandType = System.Data.CommandType.StoredProcedure; comm.Parameters.Add("in_id_estado", OracleDbType.Int32, 38, "id_estado").Value = id_estado; comm.Parameters.Add("in_id_venta", OracleDbType.Int32, 38, "id_venta").Value = id_venta; comm.Parameters.Add("in_fecha", OracleDbType.Date, 100, "fecha").Value = DateTime.Now; comm.Parameters.Add("in_islocal", OracleDbType.Char, 1, "islocal").Value = isLocal; param = comm.Parameters.Add("response", OracleDbType.Int32, ParameterDirection.Output); } comm.ExecuteNonQuery(); var responseQuery = param.Value.ToString(); if (responseQuery == "1") { r = "La venta ha sido actualizada"; if (id_estado == 1) { //Cuerpo del correo 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} fue ingresada para iniciar el proceso de ofertas 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 ingresada", mensaje.ToString(), img); } } else { r = "No se ha actualizado ninguna venta"; } c.Close(); } catch (Exception e) { r = "Ha ocurrido un error"; Debug.WriteLine(e.ToString()); } return(f.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; }
/// <summary> /// La lógica es similar a la adjudicación de productor /// Se podría incorporar otro criterio por capacidad, pero se omite para el caso, para simplicar el problema. /// </summary> /// <param name="idVenta"></param> /// <returns>Retorna el usuario que se ha adjudicado la oferta/venta</returns> /// [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public Usuario AdjudicarTransportista(int idVenta) { Usuario usuario = new Usuario(); ServiceSubasta ss = new ServiceSubasta(); ServiceVentas sv = new ServiceVentas(); ServiceUsuarios su = new ServiceUsuarios(); var venta = sv.GetVentas().Where(x => x.id == idVenta).FirstOrDefault(); var email = su.GetUsuarios().Where(x => x.Username == venta.username).FirstOrDefault().Email; var subastas = ss.GetSubastas(); int idSubastaGanadora = 0; // validamos si ya está en un proceso posterior. var estadoVenta = sv.GetHistóricoEstadoVentas().Where(x => x.Id_venta == venta.id && x.Activo).FirstOrDefault(); if (estadoVenta.TipoEstado != "en subasta") { return usuario; } if (subastas.Count == 0) { 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} no ha tenido subastas de transporte, se realizará un nuevo proceso de subasta, agradecemos su comprensión</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, "Reinicio de subastas", mensaje.ToString(), img); } else { // ITEM1: IdSubasta: // ITEM2: Total de la subasta // ITEM3: calidad // ITEM4: capacidad // ITEM5: fecha inicio de la subasta // ITEM6: nombre de usuario List<Tuple<int, int, int, int, DateTime?, string>> subastasMenorPrecio = new List<Tuple<int, int, int, int, DateTime?, string>>(); foreach (var subasta in subastas) { var total = subasta.Precio; var calidad = subasta.IsCertificado ? 1 : 0; calidad += subasta.IsRefrigerado ? 1 : 0; var capacidad = subasta.CapacidadCarga; // Caso inicial, en donde no se tiene una ninguna subasta para comparar if (subastasMenorPrecio.Count == 0) { Tuple<int, int, int, int, DateTime?, string> primeraSubasta = new Tuple<int, int, int, int, DateTime?, string>(subasta.Id_subasta, total, calidad, capacidad, subasta.Fecha_inicio, subasta.Username); subastasMenorPrecio.Add(primeraSubasta); } else { Tuple<int, int, int, int, DateTime?, string> menorSubasta = new Tuple<int, int, int, int, DateTime?, string>(-1, -1, -1, -1, null, string.Empty); foreach (var smp in subastasMenorPrecio) { if (smp.Item2 >= total) { if (smp.Item2 >= total) { menorSubasta = new Tuple<int, int, int, int, DateTime?, string>(subasta.Id_subasta, total, calidad, capacidad, subasta.Fecha_inicio, subasta.Username); break; } } if (menorSubasta.Item1 != -1 && menorSubasta.Item2 != -1) { if (menorSubasta.Item1 != -1 && menorSubasta.Item2 != -1) { if (subastasMenorPrecio.FirstOrDefault().Item2 > total) { subastasMenorPrecio.Clear(); } subastasMenorPrecio.Add(menorSubasta); } } } // único ganador if (subastasMenorPrecio.Count == 1) { usuario = su.GetUsuarios().Where(x => x.Username == subastasMenorPrecio.FirstOrDefault().Item6).FirstOrDefault(); idSubastaGanadora = subastasMenorPrecio.FirstOrDefault().Item1; } // buscamos por el siguiente criterio else { var subastasMejorCalidad = subastasMenorPrecio.OrderByDescending(x => x.Item3).Where(y => y.Item3 == subastasMenorPrecio.Max(z => z.Item3)).ToList(); if (subastasMejorCalidad.Count == 1) { usuario = su.GetUsuarios().Where(x => x.Username == subastasMejorCalidad.FirstOrDefault().Item6).FirstOrDefault(); idSubastaGanadora = subastasMejorCalidad.FirstOrDefault().Item1; } else { var primeraSubasta = subastasMejorCalidad.OrderBy(x => x.Item5).FirstOrDefault(); usuario = su.GetUsuarios().Where(x => x.Username == primeraSubasta.Item6).FirstOrDefault(); idSubastaGanadora = primeraSubasta.Item1; } } //Cuerpo del correo 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 transportista, cuyos datos son. Nombre: {1}, Apellido: {2}. Ahora su solicitud ha pasado al estado <b>En camino</b>.</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 camino", mensaje.ToString(), img); sv.UpdateVenta(3, idVenta); ss.UpdateSubastaGanadora(idSubastaGanadora); } return usuario; }