property_hire/app/models/property.rb

150 lines
4.9 KiB
Ruby
Raw Normal View History

2017-01-20 09:02:50 +00:00
class Property
include Mongoid::Document
include Mongoid::Timestamps
include OrbitTag::Taggable
include OrbitCategory::Categorizable
include Slug
field :title, as: :slug_title, :localize => true
field :property_usage, :localize => true
field :note, :localize => true
field :property_number
field :can_be_hired, type: Boolean, default: true
field :purchase_date, type: DateTime
2018-01-03 05:47:55 +00:00
field :owners, type: Array, :default => []
2017-01-20 09:02:50 +00:00
field :other_owner
field :owner_email
field :owner_phone
field :price
field :other_location
mount_uploader :image, ImageUploader
# unavailibility fields
field :set_unavailibility, type: Boolean, default: false
field :start_time
field :end_time
field :weekdays, type: Array, default: []
field :start_date, type: DateTime
field :end_date, type: DateTime
field :description, :localize => true
field :unavailibility_note, :localize => true
belongs_to :property_location
has_many :p_hires
2020-03-23 17:26:52 +00:00
has_many :hire_email_sets, :autosave => true, :dependent => :destroy, :inverse_of => :property
accepts_nested_attributes_for :hire_email_sets, :allow_destroy => true
2017-01-20 09:02:50 +00:00
WEEKDAYS = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
]
def get_location_name
return self.property_location.nil? ? self.other_location : self.property_location.title
end
def owner_profiles
MemberProfile.find(self.owners) rescue []
end
def is_available_for_hire?(stime, etime)
return true if self.set_unavailibility == false
return true if self.weekdays.empty?
return true if !self.start_date.nil? && (self.start_date > stime && self.start_date > etime)
return true if !self.end_date.nil? && self.end_date < stime
startt = self.start_date.nil? ? self.created_at : self.start_date
endt = self.end_date.nil? && !startt.nil? ? (startt + 5.years) : self.end_date
weekdays = self.weekdays.collect{|w| w.to_i}
if !startt.nil?
common_dates = (startt..endt) & (stime..etime)
return true if common_dates.nil?
time_weekdays = []
Property.time_iterate(common_dates.min, common_dates.max, 1.day) do |t|
time_weekdays << t.wday
end
time_weekdays.uniq!
weekdays = weekdays & time_weekdays
return true if weekdays.blank?
startt = DateTime.parse(stime.strftime("%Y-%m-%d " + self.start_time + Time.zone.to_s))
endt = DateTime.parse(etime.strftime("%Y-%m-%d " + self.end_time + Time.zone.to_s))
common_dates = (startt..endt) & (stime..etime)
if common_dates.nil?
return true
else
return false
end
end
end
2018-01-24 08:29:28 +00:00
def is_already_hired?(stime, etime, interval, recurring_end_date)
2020-05-19 14:50:45 +00:00
bookings = self.p_hires.where(:start_time.lte => stime,:end_time.gte => stime,:recurring => false)
.or(:start_time.gte => stime,:end_time.lte => etime,:recurring => false)
.or(:start_time.lte => etime,:end_time.gte => etime,:recurring => false)
2017-01-20 09:02:50 +00:00
available = true
2020-05-19 14:50:45 +00:00
if bookings.count != 0
available = false
2017-01-20 09:02:50 +00:00
end
2018-01-24 08:29:28 +00:00
if available
bookings = self.p_hires.where(:recurring_end_date.gte => stime, :recurring => true)
2020-05-19 15:07:06 +00:00
case interval
when 'week'
d_step = 1.week
2020-05-19 15:17:25 +00:00
when 'month'
d_step = 1.month
2020-05-19 15:07:06 +00:00
else
d_step = 0
end
2018-01-24 08:29:28 +00:00
bookings.each do |booking|
2020-05-19 15:17:25 +00:00
stime_tp = stime
etime_tp = etime
2020-05-19 15:07:06 +00:00
b_interval = booking.recurring_interval
if b_interval == 'month'
2020-05-19 14:50:45 +00:00
b_sdata = booking.start_time.day*10000 + booking.start_time.hour*100 + booking.start_time.minute
b_edata = booking.end_time.day*10000 + booking.end_time.hour*100 + booking.end_time.minute
2020-05-19 15:07:06 +00:00
elsif b_interval == 'week'
2020-05-19 14:50:45 +00:00
b_sdata = booking.start_time.wday*10000 + booking.start_time.hour*100 + booking.start_time.minute
b_edata = booking.end_time.wday*10000 + booking.end_time.hour*100 + booking.end_time.minute
end
2020-05-19 15:08:52 +00:00
while true
2020-05-19 15:07:06 +00:00
if b_interval == 'month'
2020-05-19 15:17:25 +00:00
sdata = stime_tp.day*10000 + stime_tp.hour*100 + stime_tp.minute
edata = etime_tp.day*10000 + etime_tp.hour*100 + etime_tp.minute
2020-05-19 15:07:06 +00:00
elsif b_interval == 'week'
2020-05-19 15:17:25 +00:00
sdata = stime_tp.wday*10000 + stime_tp.hour*100 + stime_tp.minute
edata = etime_tp.wday*10000 + etime_tp.hour*100 + etime_tp.minute
2020-05-19 15:07:06 +00:00
end
2020-05-19 15:24:00 +00:00
if (sdata <= b_sdata && edata >= b_sdata) || (sdata >= b_sdata && edata <= b_edata) || (sdata <= b_edata && edata >= b_edata)
2020-05-19 15:07:06 +00:00
available = false
end
2020-05-19 15:17:25 +00:00
stime_tp = stime_tp + d_step
etime_tp = etime_tp + d_step
break if recurring_end_date.nil? || recurring_end_date < stime_tp
2018-01-24 08:29:28 +00:00
end
2020-05-19 14:50:45 +00:00
break if available == false
2018-01-24 08:29:28 +00:00
end
end
2017-01-20 09:02:50 +00:00
return available
end
def self.time_iterate(start_time, end_time, step, &block)
begin
2018-01-24 08:29:28 +00:00
yield(start_time, end_time)
2017-01-20 09:02:50 +00:00
end while (start_time += step) <= end_time
end
end