room charges
This commit is contained in:
@@ -2,40 +2,75 @@ class DiningCharge < ApplicationRecord
|
|||||||
belongs_to :table
|
belongs_to :table
|
||||||
belongs_to :room
|
belongs_to :room
|
||||||
|
|
||||||
def amount_calculate(dining_charges_obj, checkin , checkout)
|
def self.amount_calculate(dining_charges_obj, checkin , checkout)
|
||||||
|
|
||||||
if !checkin.nil? && !checkout.nil? && !dining_charges_obj.nil?
|
if !checkin.nil? && !checkout.nil? && !dining_charges_obj.nil?
|
||||||
|
price = 0
|
||||||
minutes = ((checkin - checkout) * 24 * 60).to_i # stay minutes
|
minutes = DiningCharge.time_diff(checkout, checkin)
|
||||||
dining_minutes = minutes - dining_charges_obj.minimum_free_time # stayminutes - free minutes
|
free_time = DiningCharge.convert_to_minutes(dining_charges_obj.minimum_free_time.strftime('%H:%M'))
|
||||||
|
dining_minutes = minutes - free_time # stayminutes - free minutes
|
||||||
charge_type = dining_charges_obj.charge_type
|
charge_type = dining_charges_obj.charge_type
|
||||||
if charge_type == 'hr'
|
if charge_type == 'hr'
|
||||||
|
price = DiningCharge.charges(dining_charges_obj, dining_minutes, 'hr')
|
||||||
elsif charge_type == 'day'
|
elsif charge_type == 'day'
|
||||||
price = charge_by_day
|
price = charges(dining_charges_obj, dining_minutes, 'day')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return price
|
||||||
|
else
|
||||||
|
puts "<<<<<<<< NO"
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def charge_by_hour
|
def self.charges(chargesObj, dining_minutes, type)
|
||||||
|
solid_price = 0
|
||||||
end
|
block = DiningCharge.convert_to_minutes(chargesObj.charge_block.strftime('%H:%M'))
|
||||||
|
result = dining_minutes / block
|
||||||
def charge_by_day(chargesObj, dining_minutes)
|
if result.to_i < 1
|
||||||
minues_per_day = 12 * 60
|
|
||||||
result = dining_minutes / minues_per_day
|
|
||||||
if result < 1
|
|
||||||
return chargesObj.unit_price
|
return chargesObj.unit_price
|
||||||
elsif result > 1
|
elsif result.to_i >= 1
|
||||||
solid_price = result * chargesObj.unit_price
|
solid_price = result * chargesObj.unit_price
|
||||||
|
remain_value = dining_minutes % block
|
||||||
remain_value = dining_minutes % minues_per_day
|
rounding_block = DiningCharge.convert_to_minutes(chargesObj.time_rounding_block.strftime('%H:%M'))
|
||||||
roundingblock = remain_value / chargesObj.time_rounding_block
|
roundingblock = remain_value / rounding_block
|
||||||
if roundingblock > 1
|
if roundingblock.to_i < 1
|
||||||
|
return DiningCharge.check_rounding(chargesObj, solid_price)
|
||||||
|
else
|
||||||
|
solid_price += roundingblock * chargesObj.time_rounding_block_price
|
||||||
|
remain_rounding = dining_minutes % block
|
||||||
|
if remain_rounding.to_i < 1
|
||||||
|
return DiningCharge.check_rounding(chargesObj, solid_price)
|
||||||
|
else
|
||||||
|
return solid_price
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.check_rounding(chargesObj)
|
||||||
|
if chargesObj.time_rounding == "down"
|
||||||
|
return solid_price
|
||||||
|
else
|
||||||
|
return solid_price += chargesObj.time_rounding_block_price
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.time_diff(start_time, end_time)
|
||||||
|
seconds_diff = (start_time - end_time).to_i.abs
|
||||||
|
hours = seconds_diff / 3600
|
||||||
|
seconds_diff -= hours * 3600
|
||||||
|
|
||||||
|
minutes = seconds_diff / 60
|
||||||
|
seconds_diff -= minutes * 60
|
||||||
|
|
||||||
|
seconds = seconds_diff
|
||||||
|
return hours * 60 + minutes
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.convert_to_minutes(time)
|
||||||
|
arr = time.split(":")
|
||||||
|
hour = arr[0].to_i * 60
|
||||||
|
return hour + arr[1].to_i
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -109,6 +109,14 @@ class Sale < ApplicationRecord
|
|||||||
booking.checkout_by = requested_by.name
|
booking.checkout_by = requested_by.name
|
||||||
booking.save
|
booking.save
|
||||||
|
|
||||||
|
# dining charges
|
||||||
|
charges = DiningCharge.where('dining_facility_id=?',booking.dining_facility_id).take
|
||||||
|
if !charges.nil?
|
||||||
|
diningprice = DiningCharge.amount_calculate(charges, booking.checkin_at, booking.checkout_at)
|
||||||
|
dining_time = booking.checkin_at.strftime('%H:%M %p').to_s + " - " + booking.checkout_at.strftime('%H:%M %p').to_s
|
||||||
|
create_saleitem_diningcharges(charges, diningprice, booking.dining_facility.name, dining_time)
|
||||||
|
end
|
||||||
|
|
||||||
return true, self.id
|
return true, self.id
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -162,6 +170,20 @@ class Sale < ApplicationRecord
|
|||||||
self.sale_items << sale_item
|
self.sale_items << sale_item
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_saleitem_diningcharges(chargeObj, diningprice, dining_name, dining_time)
|
||||||
|
sale_item = SaleItem.new
|
||||||
|
sale_item.product_code = chargeObj.item_code
|
||||||
|
sale_item.product_name = dining_name.to_s + " ( " + dining_time.to_s + " )"
|
||||||
|
# sale_item.account_id = item.account_id
|
||||||
|
sale_item.product_alt_name = "-"
|
||||||
|
sale_item.qty = 1
|
||||||
|
sale_item.unit_price = chargeObj.unit_price
|
||||||
|
sale_item.taxable_price = diningprice
|
||||||
|
sale_item.is_taxable = chargeObj.taxable
|
||||||
|
sale_item.sale_id = self.id
|
||||||
|
sale_item.price = diningprice
|
||||||
|
sale_item.save
|
||||||
|
end
|
||||||
|
|
||||||
def update_item (item)
|
def update_item (item)
|
||||||
#save sale_audit
|
#save sale_audit
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ class CreateDiningCharges < ActiveRecord::Migration[5.1]
|
|||||||
t.time :charge_block
|
t.time :charge_block
|
||||||
t.string :time_rounding, :default => "down"
|
t.string :time_rounding, :default => "down"
|
||||||
t.time :time_rounding_block
|
t.time :time_rounding_block
|
||||||
|
t.integer :time_rounding_block_price, :default => 0
|
||||||
t.timestamps
|
t.timestamps
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user