133 lines
5.4 KiB
Ruby
133 lines
5.4 KiB
Ruby
class PHire
|
|
include Mongoid::Document
|
|
include Mongoid::Timestamps
|
|
|
|
INTERVALS = ["week", "month"]
|
|
|
|
field :start_time, type: DateTime
|
|
field :end_time, type: DateTime
|
|
field :hiring_person_email
|
|
field :hiring_person_number
|
|
field :hiring_person_id
|
|
field :hiring_person_name
|
|
field :reason_for_hire
|
|
field :note_for_hire
|
|
field :passed, type: Boolean, default: false
|
|
field :recurring, type: Boolean, :default => false
|
|
field :recurring_end_date, type: DateTime
|
|
field :recurring_interval
|
|
field :organization
|
|
field :person_in_charge
|
|
field :tel_of_person_in_charge
|
|
field :department
|
|
field :contact_person
|
|
field :tel_of_contact_person
|
|
field :mobile_phone_of_contact_person
|
|
field :contact_person_Email
|
|
field :contact_person_department
|
|
belongs_to :property
|
|
|
|
def as_json(options = {})
|
|
{
|
|
:id => self.id.to_s,
|
|
:title => self.reason_for_hire,
|
|
:hiring_person_id => self.hiring_person_id,
|
|
:hiring_person_name => self.hiring_person_name,
|
|
:note => self.note_for_hire || "",
|
|
:start => self.start_time.rfc822,
|
|
:end => self.end_time.rfc822,
|
|
:allDay => false,
|
|
:color => "#FC4040"
|
|
}
|
|
end
|
|
|
|
def period
|
|
return self.start_time.strftime("%y-%m-%d %H:%M") + " ~ " + self.end_time.strftime("%y-%m-%d %H:%M")
|
|
end
|
|
|
|
def hirer_name
|
|
return self.hiring_person_name.nil? ? self.hiring_person_profile.name : self.hiring_person_name
|
|
end
|
|
|
|
def hiring_person_profile
|
|
return MemberProfile.find(self.hiring_person_id) rescue nil
|
|
end
|
|
|
|
def self.monthly_event(start_date,end_date,property_id)
|
|
self.where(:property_id => property_id, :recurring => false).any_of(:start_time.gte => start_date, :end_time.gte => start_date).and(:start_time.lte => end_date).asc(:start_time)
|
|
end
|
|
|
|
def self.recurring_event(start_date,end_date,property_id)
|
|
@property = Property.find(property_id) rescue nil
|
|
@recurring = []
|
|
if @property != nil
|
|
unavailable = @property.set_unavailibility && !@property.weekdays.empty? && !@property.start_date.nil? && !@property.end_date.nil?
|
|
unavailable_start_date = @property.start_date
|
|
unavailable_end_date = @property.end_date
|
|
unavailable_start_time = @property.start_time.to_s
|
|
unavailable_end_time = @property.end_time.to_s
|
|
unavailable_start_date = DateTime.parse(unavailable_start_date.strftime("%Y-%m-%d " + unavailable_start_time.to_s + Time.zone.to_s)) rescue nil
|
|
unavailable_end_date = DateTime.parse(unavailable_end_date.strftime("%Y-%m-%d " + unavailable_end_time.to_s + Time.zone.to_s)) rescue nil
|
|
unavailable_weekdays = @property.weekdays.collect{|w| w.to_i}
|
|
@recurring_events = self.where(:property_id => property_id, :recurring_end_date.gte => start_date)
|
|
@recurring_events.each do |re|
|
|
case re.recurring_interval
|
|
when "week"
|
|
@start_date = re.start_time
|
|
@end_date = re.end_time
|
|
@i = TimeDifference.between(re.start_time,end_date).in_weeks.to_i
|
|
(0..@i).each do |i|
|
|
if i > 0
|
|
@start_date += 7
|
|
@end_date += 7
|
|
end
|
|
if unavailable && (unavailable_start_date <= @start_date) && (unavailable_end_date >= @end_date) && !((@start_date.strftime("%w").to_i .. @end_date.strftime("%w").to_i).to_a & unavailable_weekdays).empty?
|
|
startt = DateTime.parse(@start_date.strftime("%Y-%m-%d " + unavailable_start_time + Time.zone.to_s))
|
|
endt = DateTime.parse(@end_date.strftime("%Y-%m-%d " + unavailable_end_time + Time.zone.to_s))
|
|
next if !((startt..endt) & (@start_date..@end_date)).blank?
|
|
end
|
|
if @start_date < re.recurring_end_date
|
|
@recurring << {:id => re.id.to_s, :hiring_person_name => re.hirer_name ,:title=>re.reason_for_hire, :note=>re.reason_for_hire, :start=>@start_date, :end => @end_date, :allDay => false, :recurring => re.recurring, :color => "#FC4040"}
|
|
end
|
|
end
|
|
when "month"
|
|
# if !(start_date..end_date).cover?(re.start_time)
|
|
sd = re.start_time
|
|
ed = re.end_time
|
|
@i = TimeDifference.between(re.start_time,end_date).in_months.to_i
|
|
@start_date = sd
|
|
# debugger
|
|
sd = sd + @i.month
|
|
ed = ed + @i.month
|
|
if unavailable && !(unavailable_start_date > ed) && !(unavailable_end_date < sd) && !((sd.strftime("%w") .. ed.strftime("%w")).to_a & unavailable_weekdays).empty?
|
|
startt = DateTime.parse(sd.strftime("%Y-%m-%d " + unavailable_start_time + Time.zone.to_s))
|
|
endt = DateTime.parse(ed.strftime("%Y-%m-%d " + unavailable_end_time + Time.zone.to_s))
|
|
next if !((startt..endt) & (sd..ed)).blank?
|
|
end
|
|
if sd < re.recurring_end_date
|
|
@recurring << {:id => re.id.to_s, :title=>re.reason_for_hire, :note=>re.reason_for_hire, :start=>sd, :end => ed, :allDay => false, :recurring => re.recurring, :color => "#FC4040"}
|
|
end
|
|
# end
|
|
end
|
|
end
|
|
end
|
|
@recurring
|
|
end
|
|
|
|
def time_iterate(&block)
|
|
start_time = self.start_time
|
|
end_time = self.end_time
|
|
recurring_end_date = self.recurring_end_date
|
|
case self.recurring_interval
|
|
when "week"
|
|
step_interval = 1.week
|
|
when "month"
|
|
step_interval = 1.month
|
|
end
|
|
begin
|
|
yield(start_time, end_time)
|
|
end_time += step_interval
|
|
end while (start_time += step_interval) <= recurring_end_date
|
|
end
|
|
|
|
end |