viernes, mayo 02, 2014

Mini-CRM en ASP.Net (III)

Mostrar ventas del comercial logado

Antes de nada, algunos links interesantes:

 

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… Guiño 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.


image


 


Utilizaremos Codefirst (para más info ver codefirst reverse ingeniering)


 


image


image


 


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