Add MaxVideos and MaxGames RentablePolicies
[cs356-p2-videostore.git] / app / controllers / purchase_controller.rb
1 class PurchaseController < ApplicationController
2
3   def index
4     redirect_to :action => :begin
5   end
6
7   def list
8     @purchase_pages, @purchase = paginate :purchases, :per_page => 100
9   end
10
11   def begin
12     # enter a customer id here
13     render :action => 'begin'
14     session[:total] = 0.00
15     session[:items] = []
16   end
17
18   def customer_ok
19     if Customer.find_by_id(params[:customer_id])
20       session[:customer_id] = params[:customer_id]
21       redirect_to :action => :menu
22     else
23       flash[:error] = "Customer ID is invalid"
24       redirect_to :action => :begin
25     end
26   end
27
28   def menu
29     @customer = Customer.find_by_id(session[:customer_id])
30     @total_price = session[:total]
31     @items = session[:items]
32     render :action => 'menu'
33   end
34
35   def rent_begin
36     render :action => 'rent_begin'
37   end
38
39   def rent_validate
40     @customer = Customer.find_by_id(session[:customer_id])
41     @rentable = Rentable.find_by_id(params[:rentable_id])
42
43     if @customer.nil?
44       flash[:error] = "Customer ID is invalid"
45       redirect_to :action => :begin
46       return
47     end
48
49     if @rentable.nil?
50       flash[:error] = "Rentable ID is invalid"
51       redirect_to :action => :rent_begin
52       return
53     end
54
55     if @rentable.checkedout?
56       flash[:error] = "This #{@rentable.type} is already checked out!"
57       redirect_to :action => :rent_begin
58       return
59     end
60
61     # Check Rentable Policies
62     @maxvideos = RentablePolicy.find_by_name("MaxVideos")
63     if @rentable.class == Video and @customer.checked_out_videos >= @maxvideos.value
64       flash[:error] = "#{@maxvideos.description} LIMIT REACHED"
65       redirect_to :action => :rent_begin
66       return
67     end
68
69     @maxgames = RentablePolicy.find_by_name("MaxGames")
70     if @rentable.class == Game and @customer.checked_out_games >= @maxgames.value
71       flash[:error] = "#{@maxgames.description} LIMIT REACHED"
72       redirect_to :action => :rent_begin
73       return
74     end
75
76     # Check out the item
77     checkout = Coitem.new
78     checkout.customer = @customer
79     checkout.rentable = @rentable
80     checkout.out_date = Time.now.to_date
81     checkout.due_date = @rentable.due_date
82     checkout.save!
83
84     # Actually record the purchase
85     purchase = RentablePurchase.new
86     purchase.customer_id = session[:customer_id]
87     purchase.date = Time.now.to_date
88     purchase.price = @rentable.calculated_price
89     purchase.rentable = @rentable
90     purchase.save!
91
92     # Add te session variables
93     session[:total] += @rentable.calculated_price
94     session[:items].push @rentable
95
96     flash[:notice] = "Successfully made purchase"
97     redirect_to :action => :menu
98   end
99
100   def buy_begin
101     render :action => 'buy_begin'
102   end
103
104   def buy_validate
105     @customer = Customer.find_by_id(session[:customer_id])
106     @merchandise = Merchandise.find_by_id(params[:merchandise_id])
107   
108     if @customer.nil?
109       flash[:error] = "Customer ID is invalid"
110       redirect_to :action => :begin
111       return
112     end
113
114     if @merchandise.nil?
115       flash[:error] = "Merchandise ID is invalid"
116       redirect_to :action => :buy_begin
117       return
118     end
119
120     if @merchandise.quantity < 1
121       flash[:error] = "The system thinks we are out of this merchandise item!"
122       redirect_to :action => :buy_begin
123       return
124     end
125
126     # Actually record the purchase
127     purchase = MerchandisePurchase.new
128     purchase.customer_id = session[:customer_id]
129     purchase.date = Time.now.to_date
130     purchase.price = @merchandise.price
131     purchase.merchandise = @merchandise
132     purchase.quantity = 1
133     @merchandise.quantity -= 1
134
135     # Add to session variables
136     session[:total] += @merchandise.price
137     session[:items].push @merchandise
138
139     # Save both the merchandise (we changed the quantity) and the purchase to the log
140     @merchandise.save!
141     purchase.save!
142
143     flash[:notice] = "Successfully made purchase"
144     redirect_to :action => :menu
145   end
146 end