changes made to property hire

This commit is contained in:
rulingcom 2024-09-04 21:03:02 +08:00
parent aa19dd1416
commit 420ce3b065
7 changed files with 181 additions and 41 deletions

View File

@ -114,6 +114,9 @@ class Admin::PropertyHiresController < OrbitAdminController
flash.now[:notice] = "Updated Fields"
property.p_hire_fields.each{|t| t.destroy if t["to_delete"] == true}
else
if @property_params["special_unavailable_dates"].nil?
@property_params["special_unavailable_dates"] = []
end
property.update_attributes(@property_params)
email = property.get_owner_emails
Admin::PropertyHiresHelper::HireMethod.send_mail('edit',email,property.id,nil,nil,current_user.id)

View File

@ -2,7 +2,7 @@ class PropertyHiresController < ApplicationController
include Admin::PropertyHiresHelper
FrontendMethods = ["hire", "view_calendar", "hire_success"]
def index
properties = Property.filter_by_categories.sort_order
properties = Property.can_display.filter_by_categories.sort_order
url = "/#{I18n.locale}#{OrbitHelper.page.get_url}"
data = index_data(properties, url)
headers = [
@ -33,11 +33,13 @@ class PropertyHiresController < ApplicationController
end
def index_data(properties, url)
ma = ModuleApp.find_by_key("property_hire")
is_user_manager = (OrbitHelper.current_user.is_admin? || OrbitHelper.current_user.is_manager?(ma) || OrbitHelper.current_user.is_sub_manager?(ma))
data = properties.collect do |property|
actions = []
url_to_show = "#{url}/#{property.to_param}?method=hire"
hire_url = nil
if property.can_be_hired_frontend && property.can_reserve
if (property.can_be_hired_frontend && property.can_reserve) || is_user_manager
hire_url = url_to_show
actions << {
"text" => t("property_hire.hire"),
@ -45,7 +47,7 @@ class PropertyHiresController < ApplicationController
"link" => hire_url
}
end
if !property.disable_view_calendar_page && property.can_be_show_frontend && property.can_reserve
if (!property.disable_view_calendar_page && property.can_be_show_frontend && property.can_reserve) || is_user_manager
actions << {
"text" => t("property_hire.view_calendar"),
"btn-class" => "btn-info",
@ -331,10 +333,13 @@ class PropertyHiresController < ApplicationController
end
allow_no_logins_user = PropertyHireSetting.first.allow_no_logins_user
all_day_settings = property.all_day_settings.map{|d,settings| [d,settings.map{|s| [s.id.to_s,s.title]}]}.to_h
ma = ModuleApp.find_by_key("property_hire")
is_user_manager = (OrbitHelper.current_user.is_admin? || OrbitHelper.current_user.is_manager?(ma) || OrbitHelper.current_user.is_sub_manager?(ma))
{
"hire" => hire,
"property" => property,
"page" => page.url,
"is_user_manager" => is_user_manager,
"current_user" => OrbitHelper.current_user,
"allow_no_logins_user" => allow_no_logins_user,
"carousel_display_style" => "width: #{property.carousel_image_width};",
@ -352,7 +357,7 @@ class PropertyHiresController < ApplicationController
def get_bookings
events =[]
allevents = []
property = Property.find(params[:property_id]) rescue nil
property = @property = Property.find(params[:property_id]) rescue nil
unless property.nil?
if params[:start].present? && params[:end].present?
sdt = Time.at(params[:start].to_i)
@ -362,9 +367,10 @@ class PropertyHiresController < ApplicationController
events = events.map{|e| e.as_json}
allevents = events.inject(re, :<<)
allevents = allevents.sort_by{|e| e[:start]}
Rails.logger.info allevents
@need_check_events = allevents.map{|e| [e[:date],e[:s_id]]}
@special_unavailable_dates = property.special_unavailable_dates.map{|dt| Date.parse(dt)}
ma = ModuleApp.find_by_key("property_hire")
is_user_manager = (OrbitHelper.current_user.is_admin? || OrbitHelper.current_user.is_manager?(ma) || OrbitHelper.current_user.is_sub_manager?(ma))
if property.set_availability && params[:display_hire_event] == "true"
check_setting = property.set_unavailibility && (property.property_day_settings.where(:enable=>false).count != 0)
@ -380,14 +386,19 @@ class PropertyHiresController < ApplicationController
all_day_settings = property.all_day_settings.map{|d,settings| [d,settings.map{|s| [s.start_time,s.end_time,s.id.to_s,s.title,s.reservation_limit,s.enable]}]}.to_h
if all_day_settings.count != 0
time_now = Time.zone.now
get_start_time = [sdt,time_now].max
get_end_time = edt
if is_user_manager
get_start_time = property.p_open_start_time
get_end_time = property.p_open_end_time
else
get_start_time = [sdt,time_now].max
get_end_time = edt
end
if property.set_unavailibility
if property.can_hire_before_months != 0
get_end_time = [time_now + (property.can_hire_before_months).send("month"),edt].min
end
end
if property.can_reserve
if property.can_reserve || is_user_manager
allevents += generate_all_reserve_buttons(get_start_time,get_end_time,all_day_settings,check_setting)
end
@ -417,15 +428,57 @@ class PropertyHiresController < ApplicationController
if @special_unavailable_dates.include?(date)
available = false
end
if DateTime.now >= @property.start_date && DateTime.now <= @property.end_date
if @property.hours_restriction > 0 && @is_user_manager === false
check = false
sd = nil
ed = nil
case @property.hours_restriction_duration
when "week"
weeknumber = date.strftime("%U").to_i
if @weeknumber != weeknumber
sd = date - date.wday
ed = date + (6 - date.wday)
@weeknumber = weeknumber
check = true
end
when "month"
if @monthnumber != date.month
sd = Date.new(date.year, date.month, 1)
ed = sd.next_month.prev_day
@monthnumber = date.month
check = true
end
end
if check === true
@user_total_hired_hours = @property.get_user_total_user_hired_hours(OrbitHelper.current_user.id.to_s, sd, ed)
end
if @user_total_hired_hours >= @property.hours_restriction
available = false
end
end
end
if available
if DateTime.now >= @property.start_date && DateTime.now <= @property.end_date
available = date > (DateTime.now + (@property.need_hire_before).send(@property.need_hire_before_unit))
end
end
if @check_setting && allow_times.select{|a| !a[5]}.count != 0
available = (date > @check_end_date rescue false) || (date < @check_start_date rescue false)
if available
available = @property.weekdays.include?(date.wday.to_s) ? false : true
end
unless available
allow_times = allow_times.select do |allow_time|
if allow_time[5]
true
elsif (allow_time[0] > @check_end_time || allow_time[1] < @check_start_time)
true
else
elsif
false
end
end
@ -453,6 +506,10 @@ class PropertyHiresController < ApplicationController
@all_day_settings = all_day_settings
@startt = startt
@endt = endt
@weeknumber = 0
@monthnumber = 0
ma = ModuleApp.find_by_key("property_hire")
@is_user_manager = (OrbitHelper.current_user.is_admin? || OrbitHelper.current_user.is_manager?(ma) || OrbitHelper.current_user.is_sub_manager?(ma))
def generate_events(start_wday,end_wday,type=0,start_validate=false)
if type == 0
(start_wday..end_wday).each_with_index do |wday,i|

View File

@ -41,7 +41,7 @@ module Admin::PropertyHiresHelper
return {"success" => false, "msg" => I18n.t("property_hire.starting_time_cannot_be_greater_than_ending_time")}
end
end
available_flag = property.is_available_for_hire?(stime, etime, interval, recurring_end_date, time_setting_id)
available_flag = property.is_available_for_hire?(stime, etime, interval, recurring_end_date, time_setting_id, OrbitHelper.current_user.member_profile)
if available_flag == 1
if property.not_yet_hired?(stime, etime, interval, recurring_end_date,params[:phire_id], time_setting_id)
data = {"success" => true}

View File

@ -31,6 +31,8 @@ class Property
field :p_hire_end_time, type: DateTime
field :p_open_start_time, type: DateTime
field :p_open_end_time, type: DateTime
field :p_display_start_time, type: DateTime
field :p_display_end_time, type: DateTime
field :recurring_enable, type: Boolean, :default => false
mount_uploader :image, ImageUploader
@ -46,6 +48,8 @@ class Property
field :special_unavailable_dates_title, type: Array, default: []
field :start_date, type: DateTime
field :end_date, type: DateTime
field :hours_restriction, type: Integer, default: 0
field :hours_restriction_duration, type: String
field :description, :localize => true
field :unavailibility_note, :localize => true
field :hiring_person_email, type: Hash, default: {"enable"=>"1","required"=>"true"}
@ -86,7 +90,7 @@ class Property
has_many :property_links, :autosave => true, :dependent => :destroy
accepts_nested_attributes_for :property_links, :allow_destroy => true
scope :sort_order, ->{order_by([:created_at,:desc],[:order_position,:asc])}
scope :can_display, ->{any_of({:p_hire_start_time.lt=>Time.now, :p_hire_end_time.gt=>Time.now},{:p_hire_start_time.lt=>Time.now, :p_hire_end_time=>nil},{:p_hire_start_time=>nil, :p_hire_end_time=>nil})}
scope :can_display, ->{any_of({:p_display_start_time.lt=>Time.now, :p_display_end_time.gt=>Time.now},{:p_display_start_time.lt=>Time.now, :p_display_end_time=>nil},{:p_display_start_time=>nil, :p_display_end_time=>nil})}
WEEKDAYS = [
"Sunday",
"Monday",
@ -288,6 +292,9 @@ class Property
default_msg = "This property is unavaliable to reserved before #{property.can_hire_before_months} month ago."
message += I18n.t("property_hire.unavailable_hint2",{:month=>property.can_hire_before_months,:default=>default_msg})
end
if property.hours_restriction > 0
message += "<br />" + I18n.t("property_hire.hours_restriction_message", {:no_of_hours => property.hours_restriction, :duration => I18n.t("property_hire._#{property.hours_restriction_duration}") })
end
end
return message.html_safe
end
@ -299,8 +306,22 @@ class Property
MemberProfile.find(self.owners) rescue []
end
def is_available_for_hire?(stime, etime, interval = nil, recurring_end_date = nil, time_setting_id = nil)
def get_user_total_user_hired_hours(member_profile_id, start_time, end_time)
hires = self.p_hires.where(:hiring_person_id => member_profile_id, :start_time.gte => start_time, :end_time.lte => end_time)
total_hours = 0.0
hires.each do |hire|
diff = hire.end_time - hire.start_time
total_hours += diff * 24.0
end
return total_hours
end
def is_available_for_hire?(stime, etime, interval = nil, recurring_end_date = nil, time_setting_id = nil, member_profile)
available = 0
ma = ModuleApp.find_by_key("property_hire")
user = member_profile.user
is_user_manager = (user.is_admin? || user.is_manager?(ma) || user.is_sub_manager?(ma))
return 1 if is_user_manager == true
return 1 if self.set_unavailibility == false
return 1 if self.weekdays.empty? && self.can_hire_before_months == 0
time_now = Time.now.to_datetime
@ -317,6 +338,24 @@ class Property
return 0
end
end
if DateTime.now > self.start_date && DateTime.now < self.end_date
if self.hours_restriction > 0 && !user.nil?
sd = nil
edd = nil
case self.hours_restriction_duration
when "week"
sd = stime - stime.wday
edd = stime + (6 - stime.wday)
when "month"
sd = Date.new(stime.year, stime.month, 1)
edd = sd.next_month.prev_day
end
if self.get_user_total_user_hired_hours(member_profile.id.to_s, sd, edd) >= self.hours_restriction
return 0
end
end
end
startt = self.start_date.nil? ? stime : self.start_date
endt = self.end_date.nil? ? etime : self.end_date
available = 1 if (startt > stime && endt > etime)

View File

@ -125,15 +125,33 @@
<%= f.text_field :other_location %>
</div>
</div>
<div class="control-group">
<%
=begin%>
<div class="control-group">
<%= f.label :property_number, t("property_hire.property_number"), :class => "control-label muted" %>
<div class="controls">
<%= f.text_field :property_number %>
</div>
</div>
<%
=end%>
<div class="control-group">
<%= f.label :p_display_start_time, t("property_hire.p_display_start_time"), :class => "control-label muted" %>
<div class="controls">
<%= f.datetime_picker :p_display_start_time, :picker_type => "date", :no_label => true, :new_record => @property.new_record?, :data=>{"picker-type" => "range", "range" => "start"}, :format => "yyyy/MM/dd hh:mm" %>
</div>
</div>
<div class="control-group">
<%= f.label :p_display_end_time, t("property_hire.p_display_end_time"), :class => "control-label muted" %>
<div class="controls">
<%= f.datetime_picker :p_display_end_time, :picker_type => "date", :no_label => true, :new_record => @property.new_record?, :data=>{"picker-type" => "range", "range" => "end"}, :format => "yyyy/MM/dd hh:mm" %>
</div>
</div>
<div class="control-group">
<%= f.label :p_hire_start_time, t("property_hire.p_hire_start_time"), :class => "control-label muted" %>
<div class="controls">
<div class="muted"><%= t("property_hire.time_period_note") %></div>
<%= f.datetime_picker :p_hire_start_time, :picker_type => "date", :no_label => true, :new_record => @property.new_record?, :data=>{"picker-type" => "range", "range" => "start"}, :format => "yyyy/MM/dd hh:mm" %>
</div>
</div>
@ -153,6 +171,7 @@
<div class="control-group">
<%= f.label :p_open_start_time, t("property_hire.p_open_start_time"), :class => "control-label muted" %>
<div class="controls">
<div class="muted"><%= t("property_hire.available_time_note") %></div>
<%= f.datetime_picker :p_open_start_time, :picker_type => "date", :no_label => true, :new_record => @property.new_record?, :data=>{"picker-type" => "range", "range" => "start"}, :format => "yyyy/MM/dd" %>
</div>
</div>
@ -163,12 +182,16 @@
</div>
</div>
</div>
<div class="control-group">
<%
=begin%>
<div class="control-group">
<%= f.label :purchase_date, t("property_hire.purchase_date"), :class => "control-label muted" %>
<div class="controls">
<%= f.datetime_picker :purchase_date, :no_label => true, :new_record => @property.new_record?, :picker_type => "date", :format => "yyyy/MM/dd" %>
</div>
</div>
<%
=end%>
<div class="control-group">
<%= f.label :owners, t("property_hire.owners"), :class => "control-label muted" %>
<div class="controls">
@ -199,12 +222,16 @@
<%= f.text_field :owner_phone %>
</div>
</div>
<div class="control-group">
<%
=begin%>
<div class="control-group">
<%= f.label :price, t("property_hire.price"), :class => "control-label muted" %>
<div class="controls">
<%= f.text_field :price %>
</div>
</div>
<%
=end%>
</div>
<!-- page_setting -->
<div class="tab-pane fade" id="page_setting">
@ -378,20 +405,13 @@
<% else %>
<div id="set_unavailibility_div" style="display: none;">
<% end %>
<div class="control-group">
<div class="control-group">
<%= f.label :can_hire_before_months, t("property_hire.how_many_months_ago_can_be_hired"), :class => "control-label muted" %>
<div class="controls">
<%= f.select :can_hire_before_months, options_for_select([[t("property_hire.no_limit"),0]] + (1..12).to_a.map{|month| [t("property_hire.month", month: month), month]},f.object.can_hire_before_months) %>
</div>
</div>
<div class="control-group">
<%= f.label :need_hire_before, t("property_hire.need_hire_before"), :class => "control-label muted" %>
<div class="controls">
<% units = ['month', 'day', 'hour', 'minute'] %>
<%= f.number_field :need_hire_before, :min=>0 %>
<%= f.select :need_hire_before_unit, options_for_select(units.map{|unit| [t("property_hire._#{unit}"), unit]},f.object.need_hire_before_unit) %>
</div>
</div>
<div class="control-group">
<label class="control-label muted"><%=t("property_hire.weekdays").html_safe%></label>
<div class="controls">
@ -432,6 +452,22 @@
<button class="primary" id="add_special_unavailable_date">Add</button>
</div>
</div>
<div class="control-group">
<%= f.label :need_hire_before, t("property_hire.need_hire_before"), :class => "control-label muted" %>
<div class="controls">
<% units = ['month', 'day', 'hour', 'minute'] %>
<%= f.number_field :need_hire_before, :min=>0 %>
<%= f.select :need_hire_before_unit, options_for_select(units.map{|unit| [t("property_hire._#{unit}"), unit]},f.object.need_hire_before_unit) %>
</div>
</div>
<div class="control-group">
<label class="control-label muted"><%=t("property_hire.hours_restriction") %></label>
<div class="controls">
<% units = ['week', 'month'] %>
<%= f.number_field :hours_restriction, :min=>0, :max=>24 %>
<%= f.select :hours_restriction_duration, options_for_select(units.map{|unit| [t("property_hire._#{unit}"), unit]},f.object.need_hire_before_unit) %>
</div>
</div>
<div class="control-group">
<%= f.label :start_date, t("property_hire.start_date"), :class => "control-label muted" %>
<div class="controls">
@ -836,6 +872,11 @@
})
var setting_count = <%=setting_count%>;
var default_time_settings = <%= PropertyHireSetting.first.default_time_settings.map{|s| s.attributes.except("_id","created_at","updated_at")}.to_s.gsub("=>",": ").html_safe rescue "[]" %>
<% property_day_setting = f.object.property_day_settings.new(:id=>nil) %>
<%= f.fields_for :property_day_settings,property_day_setting,:child_index => "new_index" do |f| %>
var template_html = "<%= escape_javascript(render(:partial=>"time_form",:locals=>{:f=>f})) %>";
console.log(template_html);
<%end%>
$(".apply_default_time_settings").click(function(){
var target = $($(this).data("target"));
var key = $(this).data("count");
@ -844,21 +885,20 @@
var old_key = new RegExp("new_key", "g");
var new_day = day;
var old_day = new RegExp("new_day", "g");
var new_key = key;
target.empty();
default_time_settings.forEach(function(setting){
var old_index = new RegExp("new_index", "g");
var new_index = setting_count;
var new_key = key;
setting_count += 1;
<% property_day_setting = f.object.property_day_settings.new(:id=>nil) %>
<%= f.fields_for :property_day_settings,property_day_setting,:child_index => "new_index" do |f| %>
var template_html = "<%= escape_javascript(render(:partial=>"time_form",:locals=>{:f=>f})) %>";
<%end%>
var tmp = $(template_html.replace(old_index,new_index).replace(old_key,new_key).replace(old_day,new_day));
Object.keys(setting).forEach(function(k){
if(tmp.find("[name*='["+k+"]'").length != 0){
tmp.find("[name*='["+k+"]']").val(setting[k]);
console.log([k,setting[k]])
if(k != "day" && k != "key"){
if(tmp.find("[name*='["+k+"]'").length != 0){
tmp.find("[name*='["+k+"]']").val(setting[k]);
console.log([k,setting[k]])
}
}
});
target.append(tmp);

View File

@ -33,8 +33,8 @@
<%= f.datetime_picker :end_time, :picker_type => "time", :no_label => true, :new_record => (@property.new_record? rescue true) %>
</div>
</div>
<%= f.hidden_field :key, :value => key %>
<%= f.hidden_field :day, :value => day %>
<%= f.hidden_field :key, :value => key, :data => {"type" => "key"} %>
<%= f.hidden_field :day, :value => day, :data => {"type" => "day"} %>
<div class="control-group">
<%= f.label "reservation_limit_#{key}_#{day}", t("property_hire.reservation_limit"), :class => "control-label muted" %>
<div class="controls">

View File

@ -8,6 +8,7 @@
data = action_data
hire = data["hire"]
property = data["property"]
is_user_manager = data["is_user_manager"]
url = data["page"]
current_user = data["current_user"]
allow_no_logins_user = data["allow_no_logins_user"]
@ -451,9 +452,9 @@
</script>
<% end %>
<div class="col-lg-<%=right_col%>">
<% if property.can_reserve === true %>
<% if property.can_reserve === true || is_user_manager %>
<%= form_for hire, :url => "/xhr/property_hires/make_booking", html: { class: "form-horizontal", id: "hire_form" } do |f| %>
<% if property.set_availability %>
<% if property.set_availability || is_user_manager %>
<div class="form-group">
<%= f.label :date, "*"+t("property_hire.date"), :class => "col-sm-#{label_col} control-label" %>
<div class="col-sm-<%=input_col%>" id="date_target_block">