viernes, 10 de setiembre de 2010

ASP.NET - Carrito de compras - I

mini-shopping-carts-detail Vamos a implementar un carrito de compras aprovechando las bondades de Collections.Generics.
Alguien me dirá: pero si ya existen soluciones robustas de carritos de compras!! Yo diré: Sí pues, pero a veces sólo necesitamos algo muy ligero y simple y no las tremendas aplicaciones que ya existen.
Y como siempre, vamos a tratar de hacer las cosas simples.
Empecemos. Qué necesitamos en un carrito de compras? Primero que nada necesitamos productos o servicios que vender, entonces vamos a crear una clase llamada Product, entonces añadimos una clase llamada Product.vb y pegamos allí el sgte código:

Public Class Product

Sub New()
End Sub

Sub New(ByVal ProductID As Integer, ByVal ProductName As String, ByVal Price As Decimal)
_ProductID = ProductID
_ProductName = ProductName
_Price = Price
End Sub

Public Property ProductID() As Integer
Public Property ProductName() As String
Public Property Price() As Decimal

End Class

Luego, voy a añadir una nueva clase llamada ProductOfTheShoppingCart (ProductOfTheShoppingCart.vb), la cual es parecida a la clase Product recién creada, pero ésta añade la propiedad Quantity (cantidad) y SubTotal… esta clase la usaremos para capturar los datos de cada producto que voy eligiendo para comprar:

Public Class ProductOfTheShoppingCart
Inherits Product

Sub New()
End Sub

Sub New(ByVal _ProductID As Integer, ByVal _ProductName As String, ByVal _Price As Decimal, ByVal Quantity As Integer)
MyBase.New(_ProductID, _ProductName, _Price)
_Quantity = Quantity
End Sub

Private _Quantity As Decimal = 1
Public Property Quantity() As Decimal
Get
Return _Quantity
End Get
Set(ByVal value As Decimal)
_Quantity = value
End Set
End Property

Private _SubTotal As Decimal = 0.0
Public ReadOnly Property SubTotal() As Decimal
Get
Return _Quantity * Price
End Get

End Property

End Class

Luego que tenemos los productos, necesitamos algún mecanismo que me permita almacenar aquellos productos que voy eligiendo, asimismo el precio y la cantidad de lo que voy añadiendo a mi carrito de compras, pero también debería poder borrar aquellos productos que ya no quiero, y opcionalmente la opción de ordenar por precio. Para gestionar los productos que voy añadiendo a mi carrito añado una nueva clase llamada ShoppingCart.vb y pego el sgte código:

Public Class ShoppingCart

Private Shared MyShoppingCart As String = "MyShoppingCart"

    Public Shared Function GetAll() As List(Of ProductOfTheShoppingCart)
Dim sc As New List(Of ProductOfTheShoppingCart)

'recupero el carrito desde la variable Session
If Not IsNothing(HttpContext.Current.Session(MyShoppingCart)) Then
sc = DirectCast(HttpContext.Current.Session(MyShoppingCart), List(Of ProductOfTheShoppingCart))
End If

Return sc

End Function

Public Shared Sub Remove(ByVal id As Integer)
Dim sc As New List(Of ProductOfTheShoppingCart)

'recupero el carrito desde la variable Session
If Not IsNothing(HttpContext.Current.Session(MyShoppingCart)) Then
sc = DirectCast(HttpContext.Current.Session(MyShoppingCart), List(Of ProductOfTheShoppingCart))
End If

'quito el producto, si existe
sc.Remove(sc.Find(Function(Prod As ProductOfTheShoppingCart) Prod.ProductID = id))

'guardo el carrito en la sesión
HttpContext.Current.Session(MyShoppingCart) = sc

End Sub

Public Shared Sub Sort()
Dim sc As New List(Of ProductOfTheShoppingCart)

'recupero el carrito desde la variable Session
If Not IsNothing(HttpContext.Current.Session(MyShoppingCart)) Then
sc = DirectCast(HttpContext.Current.Session(MyShoppingCart), List(Of ProductOfTheShoppingCart))
End If

'ordena x precio
sc.Sort(Function(p1 As ProductOfTheShoppingCart, p2 As ProductOfTheShoppingCart) p1.Price.CompareTo(p2.Price))

'guarda el carrito en la sesión
HttpContext.Current.Session(MyShoppingCart) = sc
End Sub

Public Shared Sub Add(ByVal Prod As ProductOfTheShoppingCart)
Dim sc As New List(Of ProductOfTheShoppingCart)

'recupero el carrito desde la variable Session
If Not IsNothing(HttpContext.Current.Session(MyShoppingCart)) Then
sc = DirectCast(HttpContext.Current.Session(MyShoppingCart), List(Of ProductOfTheShoppingCart))
End If

'añade el producto
sc.Add(Prod)

'guarda el carrito en la sesión
HttpContext.Current.Session(MyShoppingCart) = sc
End Sub

Public Shared ReadOnly Property Total() As Decimal
Get
Dim sc As New List(Of ProductOfTheShoppingCart)
Dim _Total As Decimal = 0.0
If Not IsNothing(HttpContext.Current.Session(MyShoppingCart)) Then
sc = DirectCast(HttpContext.Current.Session(MyShoppingCart), List(Of ProductOfTheShoppingCart))
For Each Prod As ProductOfTheShoppingCart In sc
_Total += Prod.SubTotal
Next

End If
Return _Total

End Get
End Property

End Class

Esto va para más, así que la seguimos en el sgte post ;)

No hay comentarios.: