public void custom_algorithm(Personalizacion personalizacion, List<Producto> products, Usuario user, string tiendaID) { Assembly ddl = Assembly.Load(personalizacion.algoritmo); var t = ddl.GetType("Chebay.AlgorithmDLL.ChebayAlgorithm"); dynamic c = Activator.CreateInstance(t); DataRecomendacion dr = new DataRecomendacion { UsuarioID = user.UsuarioID }; Thread timeThread = new Thread(() => { try { dr.productos = (List<DataProducto>)c.getProducts(products, user); IDALUsuario udal = new DALUsuarioEF(); udal.AgregarRecomendacionesUsuario(tiendaID, dr); } catch (Exception e) { //si falla entonces default default_recomendation_algorithm(products, user, tiendaID); } }); timeThread.Start(); bool finished = timeThread.Join(5000); if (!finished) { Debug.WriteLine("ALGORITMO PERSONALIZADO SUSPENDIDO... EXCESO TIEMPO"); timeThread.Abort(); default_recomendation_algorithm(products,user,tiendaID); } }
//default algorithm return the mosts visited product public void default_recomendation_algorithm(List<Producto> products, Usuario user, String tiendaID) { IDALUsuario udal = new DALUsuarioEF(); var query = from p in products orderby (p.visitas.Count) descending select p; DataRecomendacion dr = new DataRecomendacion { UsuarioID = user.UsuarioID, productos = new List<DataProducto>() }; foreach (var p in query.ToList()) { dr.productos.Add(new DataProducto(p)); } udal.AgregarRecomendacionesUsuario(tiendaID, dr); }
public void Run(string tiendaID) { IDALUsuario udal = new DALUsuarioEF(); IDALTienda tdal = new DALTiendaEF(); IDALSubasta sdat = new DALSubastaEF(); Tienda tienda = tdal.ObtenerTienda(tiendaID); List<Producto> productos = sdat.ObtenerTodosProductos(tienda.TiendaID); //obtengo algoritmo Personalizacion pers = tdal.ObtenerPersonalizacionTienda(tienda.TiendaID); List<Usuario> usuarios = udal.ObtenerTodosUsuariosFull(tienda.TiendaID); bool defaultalgorithm = false; if (pers.algoritmo == null || pers.algoritmo.Length == 0) { defaultalgorithm = true; } //creo indice Task index = udal.InicializarColeccionRecomendaciones(tienda.TiendaID); index.Wait(); foreach (var user in usuarios) { if (defaultalgorithm) { Algorithms def = new Algorithms(); def.default_recomendation_algorithm(productos, user, tienda.TiendaID); } else { Algorithms a = new Algorithms(); a.custom_algorithm(pers, productos, user, tienda.TiendaID); } }//IF tienda es de instancia... }
//--COMPRAS-- public void AgregarCompra(Compra c, string idTienda) { try { if (c == null) throw new Exception("Debe pasar una Compra."); chequearTienda(idTienda); using (var context = ChebayDBContext.CreateTenant(idTienda)) { //Chequea que no haya otras compras para ese producto. var qCompra = from cmp in context.compras where cmp.ProductoID == c.ProductoID select cmp; if (qCompra.Count() > 0) throw new Exception("El producto " + c.ProductoID + " ya fue comprado."); //Para que no se puedan hacer más ofertas sobre el producto. var qProducto = from prd in context.productos where prd.ProductoID == c.ProductoID select prd; Producto p = qProducto.FirstOrDefault(); p.fecha_cierre = DateTime.UtcNow; //Obtengo el usuario que esta comprando. var qUsuario = from usr in context.usuarios where usr.UsuarioID == c.UsuarioID select usr; Usuario u = qUsuario.FirstOrDefault(); //Actualizo el balance monteario del comprador. u.compras_valor += c.monto; //Obtengo el usuario que esta vendiendo. var qVendedor = from vnd in context.usuarios where vnd.UsuarioID == p.UsuarioID select vnd; Usuario v = qVendedor.FirstOrDefault(); //Actualizo el balance monteario del comprador. v.ventas_valor += c.monto; //Vinculo la compra con el producto y el usuario. p.compra = c; if (u.compras == null) u.compras = new HashSet<Compra>(); u.compras.Add(c); context.compras.Add(c); context.SaveChanges(); //Notifico inmediatamente al comprador Thread t = new Thread(delegate() { String linkTienda = "http://chebuynow.azurewebsites.net/"+ idTienda; BLNotificaciones bl = new BLNotificaciones(); { string asuntou = "Chebay: Compra de producto!"; String dest = ""; String linkCalif = "http://chebuynow.azurewebsites.net/" + idTienda + "/Usuario/CalificarUsuario?prodId=" + p.ProductoID; if (u.Email != null) { dest = u.Email; } else if (IsValidMail(u.UsuarioID)) { dest = u.UsuarioID; } if (dest != "") { string bodyMensaje = getBodyMailHTML(idTienda + ": Subasta ganada!", "Has ganado una nueva subasta!", u, p, c.monto, true, linkCalif, linkTienda); bl.sendEmailNotification(dest, asuntou, bodyMensaje); } } //mail a vendedor //obtengo vendedor IDALUsuario udal = new DALUsuarioEF(); Usuario vendedor = udal.ObtenerUsuario(p.UsuarioID, idTienda); string asunto = "Chebay: Venta de producto!"; string bodyMensajeVendedor = getBodyMailHTML(idTienda + ": Producto vendido!", "Has vendido un nuevo producto!", u, p, c.monto, false, "", linkTienda); if (vendedor.Email != null) { bl.sendEmailNotification(vendedor.Email, asunto, bodyMensajeVendedor); } else { if (IsValidMail(vendedor.UsuarioID)) { bl.sendEmailNotification(vendedor.UsuarioID, asunto, bodyMensajeVendedor); } //else... por algun error no tiene mail } }); //asincronismo Debug.WriteLine("Empieza envio mail..."); t.Start(); Debug.WriteLine("Termina envio de mail..."); } } catch (Exception e) { Debug.WriteLine(e.Message); throw e; } }
private void procesarSubasta(DataProductoQueue p) { IDALSubasta ip = new DALSubastaEF(); BLNotificaciones bl = new BLNotificaciones(); IDALUsuario ubl = new DALUsuarioEF(); //obtengo producto Producto prod = ip.ObtenerProducto(p.ProductoID, p.TiendaID); //Si no fue comprado por CompraDirecta if (!ip.ExisteCompra(p.ProductoID, p.TiendaID)) { //vendedor Usuario vendedor = ubl.ObtenerUsuario(p.OwnerProducto, p.TiendaID); if (ip.TieneOfertas(p.ProductoID, p.TiendaID)) { //Obtengo la oferta ganadora. Oferta o = ip.ObtenerOfertaGanadora(p.ProductoID, p.TiendaID); //Creo una compra entre el Producto y el Usuario. Compra c = new Compra { fecha_compra = p.fecha_cierre, monto = o.monto, ProductoID = o.ProductoID, UsuarioID = o.UsuarioID }; //se envia mensaje al vendedor en AgregarCompra ip.AgregarCompraPostSubasta(c, p.TiendaID); //obtengo mail ganador Usuario u = ubl.ObtenerUsuario(c.UsuarioID, p.TiendaID); //Notifico al ganador. String linkTienda = "http://chebuynow.azurewebsites.net/" + p.TiendaID; String linkCalif = "http://chebuynow.azurewebsites.net/" + p.TiendaID + "/Usuario/CalificarUsuario?prodId=" + p.ProductoID; string bodyMensaje = getBodyMailHTML(p.TiendaID + ": Subasta ganada!", "Has ganado una nueva subasta!", u, prod, c.monto, true, linkCalif, linkTienda); string asunto = "Chebay: Subasta de producto!"; bl.sendEmailNotification(u.Email, asunto, bodyMensaje); //en agregar compra se notifica al vendedor. //mail a vendedor //obtengo vendedor IDALUsuario udal = new DALUsuarioEF(); string asuntovendedor = "Chebay: Venta de producto!"; string bodyMensajeVendedor = getBodyMailHTML(p.TiendaID + ": Producto vendido!", "Has vendido un nuevo producto!", vendedor, prod, c.monto, false, "", linkTienda); if (vendedor.Email != null) { bl.sendEmailNotification(vendedor.Email, asuntovendedor, bodyMensajeVendedor); } else { if (IsValidMail(vendedor.UsuarioID)) { bl.sendEmailNotification(vendedor.UsuarioID, asuntovendedor, bodyMensajeVendedor); } //else... por algun error no tiene mail } } else { //no fue comprado Debug.WriteLine("NO TIENE COMPRAS MAIL AL VENDEDOR"); String linkTienda = "http://chebuynow.azurewebsites.net/" + p.TiendaID; string asunto = "Chebay: Producto no vendido..."; string bodyMensajeVendedor = getBodyMailHTML(p.TiendaID + ": Producto no vendido...", "No se ha logrado subastar su producto.", vendedor, prod, 0, false, "", linkTienda); bl.sendEmailNotification(vendedor.Email, asunto, bodyMensajeVendedor); } }//si fue comprado se descarta el mensaje. }
public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl) { if (User.Identity.IsAuthenticated) { return RedirectToAction("Index", "Manage"); } if (ModelState.IsValid) { // Get the information about the user from the external login provider var info = await AuthenticationManager.GetExternalLoginInfoAsync(); if (info == null) { return View("ExternalLoginFailure"); } var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user); if (result.Succeeded) { result = await UserManager.AddLoginAsync(user.Id, info.Login); if (result.Succeeded) { IDALUsuario dalU = new DALUsuarioEF(); Usuario userNuevo = new Usuario {UsuarioID = model.Email, Email = model.EmailNotification }; dalU.AgregarUsuario(userNuevo, Session["Tienda_Nombre"].ToString()); await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); return RedirectToLocal(returnUrl); } } AddErrors(result); } ViewBag.ReturnUrl = returnUrl; return View(model); }
public async Task<ActionResult> ExternalLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } // Sign in the user with this external login provider if the user already has a login var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); switch (result) { case SignInStatus.Success: IDALUsuario dalU = new DALUsuarioEF(); Usuario userChebay; try { userChebay = dalU.ObtenerUsuario(loginInfo.Email, Session["Tienda_Nombre"].ToString()); Session["Usuario"] = userChebay; } catch (Exception e) { userChebay = new Usuario { UsuarioID = loginInfo.Email, Email = loginInfo.Email }; try { Debug.WriteLine(e.Message); dalU.AgregarUsuario(userChebay, Session["Tienda_Nombre"].ToString()); Session["Usuario"] = userChebay; } catch (Exception e2) { Debug.WriteLine(e2.Message); ViewBag.ErrorMessage = e2.Message; return View("Error"); } } if (userChebay != null) { } return RedirectToLocal(returnUrl); case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false }); case SignInStatus.Failure: default: // If the user does not have an account, then prompt the user to create an account ViewBag.ReturnUrl = returnUrl; ViewBag.LoginProvider = loginInfo.Login.LoginProvider; return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email }); } }