| Class | Contract |
| In: |
app/models/contract.rb
|
| Parent: | ActiveRecord::Base |
Class to get calendar data
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)
# 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
# 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
# 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