Class Contract
In: app/models/contract.rb
Parent: ActiveRecord::Base

Class to get calendar data

Methods

Public Class methods

Get an 2D array of rooms each with an array of integers assining free (0) or blocked(1) ARRAY[room_id][day_of_month] room - room objects belonging to a specific property month - month to display year - year to display month_end - last day of month to display (31 for january)

[Source]

    # File app/models/contract.rb, line 28
28:   def self.get_calendar_data(rooms, month, year, month_end)
29: 
30:     @data = Array.new
31:     rooms.each do |room|
32:       @days = Array.new(month_end)
33:       @days.fill(0)
34:       calendar_date_start = year.to_i * 10000 + month.to_i * 100 + 01;
35:       calendar_date_end = year.to_i * 10000 + month.to_i * 100 + 31;
36: 
37:       #Get all contracts that are beginning AND ending in actual month
38:       contracts = Contract.find(:all, :conditions => ["room_id = ? && ((YEAR(departure) = ? && MONTH(departure) = ?) && (YEAR(arrival) "+
39:                                                                         "= ? && MONTH(arrival) = ?))",room.id, year, month, year, month])
40: 
41: 
42:       contracts.each do |contract|
43:        (contract.arrival.day-1 .. contract.departure.day-1).each do |days|
44:           if days==contract.arrival.day-1
45:             @days[days.to_i] = 2
46:           elsif days==contract.departure.day-1
47:             @days[days.to_i] = 3
48:           else
49:             @days[days.to_i] = 1
50:           end
51:         end
52:       end
53: 
54:       #Get all contracts that are ONLY beginning in actual month
55:       contracts = Contract.find(:all, :conditions => ["room_id = ? && ((YEAR(departure) != ? || MONTH(departure) != ?) && YEAR(arrival) "+
56:                                                                         "= ? && MONTH(arrival) = ?)",room.id, year, month, year, month])
57: 
58: 
59:       contracts.each do |contract|
60:        (contract.arrival.day-1 .. month_end-1).each do |days|
61:           if days==contract.arrival.day-1
62:             @days[days.to_i] = 2
63:           else
64:             @days[days.to_i] = 1
65:           end
66:         end
67:       end
68: 
69:       #Get all contracts that are ONLY ending in actual month
70:       contracts = Contract.find(:all, :conditions => ["room_id = ? && ((YEAR(departure) = ? && MONTH(departure) = ?) && (YEAR(arrival) "+
71:                                                                         "!= ? || MONTH(arrival) != ?))",room.id, year, month, year, month])
72: 
73: 
74:       contracts.each do |contract|
75:        (0 .. contract.departure.day-1).each do |days|
76:           if days==contract.departure.day-1
77:             @days[days.to_i] = 3
78:           else
79:             @days[days.to_i] = 1
80:           end
81:         end
82:       end
83: 
84:       #Check,if a contract is over full month
85:       contracts = Contract.count(["room_id = ? && (arrival < ? && "+
86:                                                                         "departure > ?)",room.id, calendar_date_start, calendar_date_end])
87:       if contracts > 0
88: 
89:          (0 .. month_end-1).each do |days|
90:           @days[days.to_i] = 1
91:         end
92: 
93:       end
94:       room_id = room.id.to_i
95:       @data[room_id] = @days
96:     end
97:     return @data
98:   end

Get an 2D array of integers assining free (0) or blocked(1) ARRAY[month][day] room - ONE room object year - year to display

[Source]

     # File app/models/contract.rb, line 104
104:   def self.get_calendar_data_by_year(room, year)
105: 
106:     @data = Array.new
107: 
108:      (1 .. 12).each do |month|
109:       months = Array.new(31)
110:       months.fill(0)
111:       @data[month] = months
112:     end
113: 
114:     calendar_date_start = ::Date.new(year.to_i,1,1)
115:     calendar_date_end = ::Date.new(year.to_i,12,31)
116: 
117:     #Get all contracts that are beginning AND ending in actual year
118:     contracts = Contract.find(:all, :conditions => ["room_id = ? && YEAR(departure) = ? && YEAR(arrival) = ?",room.id, year, year])
119: 
120: 
121:     contracts.each do |contract|
122:       contract.arrival.upto(contract.departure){|date|
123:         if date==contract.arrival
124:           @data[date.month][date.day] = 2
125:         elsif date==contract.departure
126:           @data[date.month][date.day] = 3
127:         else
128:           @data[date.month][date.day] = 1
129:         end
130:       }
131:     end
132: 
133:     #Get all contracts that are ONLY beginning in actual year
134:     contracts = Contract.find(:all, :conditions => ["room_id = ? && YEAR(departure) != ? && YEAR(arrival) = ?",room.id, year, year])
135: 
136: 
137:     contracts.each do |contract|
138:       contract.arrival.upto(calendar_date_end){|date|
139:         if date==contract.arrival
140:           @data[date.month][date.day] = 2
141:         else
142:           @data[date.month][date.day] = 1
143:         end
144:       }
145: 
146:     end
147: 
148:     #Get all contracts that are ONLY ending in actual year
149:     contracts = Contract.find(:all, :conditions => ["room_id = ? && YEAR(departure) = ? && YEAR(arrival) != ?",room.id, year, year])
150: 
151: 
152:     contracts.each do |contract|
153:       calendar_date_start.upto(contract.departure){|date|
154:         if date==contract.departure
155:           @data[date.month][date.day] = 3
156:         else
157:           @data[date.month][date.day] = 1
158:         end
159:       }
160: 
161:     end
162: 
163:     #Check,if a contract is over full year
164:     contracts = Contract.count(["room_id = ? && (arrival < ? && "+
165:                                                                         "departure > ?)",room.id, calendar_date_start, calendar_date_end])
166:     if contracts > 0
167: 
168:       calendar_date_start.upto(calendar_date_end){|date|
169:         @data[date.month][date.day] = 1}
170: 
171: 
172:     end
173: 
174: 
175: 
176:     return @data
177:   end

Public Instance methods

[Source]

     # File app/models/contract.rb, line 179
179:   def is_possible
180: 
181:     arrival = self.arrival
182:     departure = self.departure
183:     room_id = self.room_id
184: 
185:     if (departure < arrival || arrival < ::Date.today || departure < ::Date.today)
186:       return false
187:     end
188: 
189:     if Contract.count(["room_id = ? && (arrival < ? AND ? < departure) || (arrival < ? AND ? < departure) || (arrival < ? && departure > ?)",room_id, arrival, arrival, departure, departure, arrival, departure]) >= 1
190:       return false
191:     else
192:       return true
193:     end
194: 
195: 
196:   end

[Validate]