Create note on discontinued development
[merb_mart.git] / app / models / customers / cart.rb
blob35ccc26889f23dddaec8ca413d5551935b756c9b
1 require "bigdecimal"
3 module Mart
4   module Customers
5     class Cart
7       attr_reader :items, :shipping_cost, :tax, :total
9       # Initializes the shopping cart
10       def initialize
11         empty!
12       end
14       # Empties or initializes the cart
15       def empty!
16         @items = []
17         @tax = 0.0
18         @total = 0.0
19         @shipping_cost = 0.0
20       end
22       def tax_cost
23         @tax * @total
24       end
26       def empty?
27         @items.length == 0
28       end
30       # Returns the total price of our cart
31       def total
32         @total = 0.0
33         for item in @items
34           @total += (item.quantity * item.unit_price)
35         end
36         return @total
37       end
39       # Defined here because in order we have a line_items_total
40       # That number is the total of items - shipping costs.
41       def line_items_total
42         total
43       end
45       # Adds a product to our shopping cart
46       def add_product(product, quantity=1)
47         item = @items.find { |i| i.product_id == product.id }
48          if item
49            item.quantity += quantity
50            # Always set price, as it might have changed...
51            item.price = product.price
52          else
53            item = OrderLineItem.for_product(product)
54            item.quantity = quantity
55            @items << item
56          end
57       end
59       # Removes all quantities of product from our cart
60       def remove_product(product, quantity=nil)
61         item = @items.find { |i| i.product_id == product.id }
62         if quantity.nil?
63           quantity = item.quantity
64         end
65         if item
66           if item.quantity > quantity then
67             item.quantity -= quantity
68           else
69             @items.delete(item)
70           end
71         end
72       end
74       # Checks inventory of products, and removes them if
75       # they're out of stock.
76       #
77       # Returns an array of items that have been removed.
78       #
79       def check_inventory
80         removed_items = []
81         for oli in @items do
82           # Find the item in the db, because oli.item
83           # is cached.
84           db_item = Item[oli.item_id]
86           if oli.quantity > db_item.quantity
87             removed_items << oli.name.clone
88             @items.delete(oli)
89           end
90         end
91         return removed_items
92       end
94     end
95   end
96 end