Mostrar ventas del comercial logado
Antes de nada, algunos links interesantes:
- http://www.asp.net/identity
- Customizing profile information in ASP.NET Identity in VS 2013 templates
- Introducing ASP.NET Identity – A membership system for ASP.NET applications
- AspnetIdentitySample
- Building a simple ToDo application with ASP.NET Identity and associating Users with ToDoes
En este apartado vamos a ver cómo hacemos un volcado de las ventas pertenecientes al comercial logado en la aplicación.
Ya comenté que cada comercial tiene asignadas unas zonas y cada venta están asociada a una zona (y no directamente a un comercial). Esto quizás suene un poco raro, pero es como lo tenemos en mi empresa… Por lo tanto, tenemos una relación N a M entre comerciales y ventas a través de las zonas. He creado una nueva tabla AspNetUsers_Zonas que relaciona los comerciales (a través del User_Id) con las ventas (a través del ZonaId):
CREATE TABLE [dbo].[AspNetUsers_Zonas](
[User_Id] [nvarchar](128) NOT NULL,
[ZonaId] [nvarchar](10) NOT NULL,
CONSTRAINT [PK_dbo.AspNetUsers_ZonasNeumalia] PRIMARY KEY CLUSTERED
(
[User_Id] ASC,
[ZonaId] ASC
)
En el explorador de soluciones de VS, sobre la carpeta Models clicar botón derecho y Agregar Nuevo elemento. Seleccionar ADO.NET Entity Data Model y en nombre escribir Zona.
Utilizaremos Codefirst (para más info ver codefirst reverse ingeniering)
Se ha generado la nueva entidad Zona. Abrir el fichero y modificarlo tal como se muestra a continuación:
namespace NeumaliaCRM.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
[Table("AspNetUsers_ZonasNeumalia")]
public partial class Zona
{
//[Key]
//[Column("MiCRM_User_Id", Order = 0)]
//public string UserId { get; set; }
[Key]
[Column(Order = 1)]
[StringLength(10)]
public string ZonaId { get; set; }
[Key]
[Column("NeumaliaCRM_User_Id", Order = 0)]
public virtual NeumaliaCRM_User User { get; set; }
}
}
Y modificar también el fichero IdentityModels:
using Microsoft.AspNet.Identity.EntityFramework;
using System.Data.Entity;
using NeumaliaCRM.Models;
using System.Collections.Generic;
namespace NeumaliaCRM.Models
{
// You can add profile data for the user by adding more properties to your ApplicationUser class (NeumaliaCRM_User), please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class NeumaliaCRM_User : IdentityUser
{
public virtual IList<Zona> Zonas { get; set; }
}
public class MyDbContext : IdentityDbContext<NeumaliaCRM_User>
{
public MyDbContext()
: base("AESQL2008ConnectionString")
{
}
public DbSet<Venta> Ventas { get; set; }
}
}
A continuación creamos mediante scaffolding un nuevo controlador y nueva vista para las ventas: botón derecho sobre Controllers, Agregar Controller. Abrir el nuevo controlador y añadir el código necesario que se muestra a continuación:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using NeumaliaCRM.Models;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
namespace NeumaliaCRM.Controllers
{
[Authorize]
public class VentasController : Controller
{
private MyDbContext _ctx;
private UserManager<NeumaliaCRM_User> _userManager;
public VentasController()
{
_ctx = new MyDbContext();
_userManager = new UserManager<NeumaliaCRM_User>(new UserStore<NeumaliaCRM_User>(_ctx));
}
//
// GET: /CuadroDeMando/Ventas/
public ActionResult Index()
{
var currentUserId = User.Identity.GetUserId();
var currentUser = _userManager.FindById(User.Identity.GetUserId());
var currentUserZonas = currentUser.Zonas.Select(z => z.ZonaId);
var ventas = _ctx.Ventas.Where(v => currentUserZonas.Contains(v.ZonaId)).Select(v => v);
return View(ventas);
}
No hay comentarios:
Publicar un comentario