Example #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;
        }
Example #2
0
        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));
        }
Example #3
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;
        }
Example #4
0
        /// <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;
        }