171 lines
5.5 KiB
Ruby
Executable File
171 lines
5.5 KiB
Ruby
Executable File
class DiningFacility < ApplicationRecord
|
|
belongs_to :zone
|
|
has_many :dining_charges
|
|
has_many :in_juties
|
|
|
|
has_many :bookings
|
|
has_many :current_bookings, -> { left_joins(:sale).assign.within_time_limit.merge(Booking.where(checkout_at: nil).or(Booking.merge(Sale.where(sale_status: ['new', nil])))) }, class_name: "Booking"
|
|
has_one :current_checkin_booking, -> { assign.within_time_limit.where(checkout_at: nil) }, class_name: "Booking"
|
|
has_one :current_checkout_booking, -> { left_joins(:sale).assign.within_time_limit.where.not(checkout_at: nil).merge(Sale.where(sale_status: ['new', nil])) }, class_name: "Booking"
|
|
has_one :current_reserved_booking, -> { left_joins(:sale).assign.within_time_limit.where.not(reserved_at: nil).merge(Sale.where(sale_status: nil)) }, class_name: "Booking"
|
|
|
|
TABLE_TYPE = "Table"
|
|
ROOM_TYPE = "Room"
|
|
|
|
default_scope { order('order_by asc') }
|
|
|
|
scope :active, -> {where(is_active: true)}
|
|
|
|
def make_available
|
|
self.status = 'available'
|
|
self.save
|
|
end
|
|
|
|
def make_occupied
|
|
self.status = 'occupied'
|
|
self.save
|
|
end
|
|
|
|
def get_booking
|
|
booking = self.current_checkin_booking
|
|
if booking
|
|
if booking.dining_facility_id.to_i == self.id
|
|
if booking.booking_status == 'assign'
|
|
return booking
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def get_current_booking
|
|
checkin_time_lookup = Lookup.get_checkin_time_limit
|
|
Booking.where(dining_facility_id: self.id, booking_status: 'assign', checkout_at: nil).where("checkin_at > ?", checkin_time_lookup.hours.ago).first #and checkout_at is null
|
|
end
|
|
|
|
def get_checkout_booking
|
|
booking = self.current_reserved_booking
|
|
if booking
|
|
lookup_checkout_time = Lookup.collection_of("checkout_alert_time")
|
|
free_time_min = 0
|
|
if !lookup_checkout_time.empty?
|
|
now = Time.now.utc
|
|
lookup_checkout_time.each do |checkout_time|
|
|
arr_time = checkout_time[0].split("-")
|
|
start_time = Time.parse(arr_time[0].strip).utc.strftime("%H:%M%p")
|
|
end_time = Time.parse(arr_time[1].strip).utc.strftime("%H:%M%p")
|
|
if start_time <= now && now <= end_time
|
|
free_time_min = checkout_time[1].to_i
|
|
end
|
|
end
|
|
end
|
|
|
|
now = Time.now.utc
|
|
hr = (now.strftime("%H").to_i).to_int
|
|
min = (now.strftime("%M").to_i).to_int
|
|
if !booking.checkout_at.nil?
|
|
checkout_at = booking.checkout_at.utc
|
|
checkout_at_hr = (checkout_at.strftime("%H").to_i).to_int
|
|
checkout_at_min = (checkout_at.strftime("%M").to_i).to_int
|
|
checkout_at_min -= min
|
|
if (checkout_at_hr < hr)
|
|
return booking
|
|
elsif (checkout_at_hr == hr && checkout_at_min <= free_time_min)
|
|
return booking
|
|
else
|
|
return nil
|
|
end
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.get_checkin_booking
|
|
checkin_time_lookup = Lookup.get_checkin_time_limit
|
|
bookings = self.current_checkin_booking
|
|
arr_booking = Array.new
|
|
if bookings
|
|
lookup_checkout_time = Lookup.collection_of("checkout_alert_time")
|
|
free_time_min = 0
|
|
if !lookup_checkout_time.empty?
|
|
now = Time.now.utc
|
|
lookup_checkout_time.each do |checkout_time|
|
|
arr_time = checkout_time[0].split("-")
|
|
start_time = Time.parse(arr_time[0].strip).utc.strftime("%H:%M%p")
|
|
end_time = Time.parse(arr_time[1].strip).utc.strftime("%H:%M%p")
|
|
if start_time <= now && now <= end_time
|
|
free_time_min = checkout_time[1].to_i
|
|
end
|
|
end
|
|
end
|
|
|
|
bookings.each do |booking|
|
|
now = Time.now.utc
|
|
hr = (now.strftime("%H").to_i).to_int
|
|
min = (now.strftime("%M").to_i).to_int
|
|
if !booking.checkout_at.nil?
|
|
checkout_at = booking.checkout_at.utc
|
|
checkout_at_hr = (checkout_at.strftime("%H").to_i).to_int
|
|
checkout_at_min = (checkout_at.strftime("%M").to_i).to_int
|
|
checkout_at_min -= min
|
|
if (checkout_at_hr < hr)
|
|
arr_booking.push({'table_id' => booking.dining_facility_id})
|
|
elsif (checkout_at_hr == hr && checkout_at_min <= free_time_min)
|
|
arr_booking.push({'table_id' => booking.dining_facility_id})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return arr_booking
|
|
end
|
|
|
|
#send order items and send to order queue
|
|
def self.check_in_booking(table_id)
|
|
table = DiningFacility.find(table_id)
|
|
#Send to background job for processing
|
|
# CheckInBookingJob.perform_later(table)
|
|
#if ENV["SERVER_MODE"] != 'cloud'
|
|
if ENV["SERVER_MODE"] == 'cloud'
|
|
from = request.subdomain + "." + request.domain
|
|
else
|
|
from = ""
|
|
end
|
|
ActionCable.server.broadcast "check_in_booking_channel",table: table,from:from
|
|
#end
|
|
end
|
|
|
|
def self.checkin_time
|
|
table = DiningFacility.get_checkin_booking
|
|
if table.length > 0
|
|
if ENV["SERVER_MODE"] == 'cloud'
|
|
from = request.subdomain + "." + request.domain
|
|
else
|
|
from = ""
|
|
end
|
|
if ENV["SERVER_MODE"] != 'cloud'
|
|
ActionCable.server.broadcast "checkin_channel",table: table,from:from
|
|
end
|
|
end
|
|
end
|
|
|
|
def check_time(time, booking = nil, type)
|
|
status = true
|
|
today = Time.now.utc.strftime("%Y-%m-%d %H:%M")
|
|
check_time = time.strftime("%Y-%m-%d %H:%M")
|
|
if type.downcase == "checkin"
|
|
if check_time < today
|
|
status = false
|
|
end
|
|
else
|
|
if !booking.nil?
|
|
checkin_at = booking.checkin_at.utc.strftime("%Y-%m-%d %H:%M")
|
|
if check_time <= checkin_at
|
|
status = false
|
|
end
|
|
end
|
|
end
|
|
return status
|
|
end
|
|
|
|
end
|