room charges

This commit is contained in:
Nweni
2017-08-15 11:14:38 +06:30
parent 1f892fdd3d
commit e5a685f36e
3 changed files with 119 additions and 61 deletions

View File

@@ -2,40 +2,75 @@ class DiningCharge < ApplicationRecord
belongs_to :table
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?
minutes = ((checkin - checkout) * 24 * 60).to_i # stay minutes
dining_minutes = minutes - dining_charges_obj.minimum_free_time # stayminutes - free minutes
price = 0
minutes = DiningCharge.time_diff(checkout, checkin)
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
if charge_type == 'hr'
price = DiningCharge.charges(dining_charges_obj, dining_minutes, 'hr')
elsif charge_type == 'day'
price = charge_by_day
price = charges(dining_charges_obj, dining_minutes, 'day')
end
return price
else
puts "<<<<<<<< NO"
end
end
def charge_by_hour
end
def charge_by_day(chargesObj, dining_minutes)
minues_per_day = 12 * 60
result = dining_minutes / minues_per_day
if result < 1
def self.charges(chargesObj, dining_minutes, type)
solid_price = 0
block = DiningCharge.convert_to_minutes(chargesObj.charge_block.strftime('%H:%M'))
result = dining_minutes / block
if result.to_i < 1
return chargesObj.unit_price
elsif result > 1
elsif result.to_i >= 1
solid_price = result * chargesObj.unit_price
remain_value = dining_minutes % minues_per_day
roundingblock = remain_value / chargesObj.time_rounding_block
if roundingblock > 1
remain_value = dining_minutes % block
rounding_block = DiningCharge.convert_to_minutes(chargesObj.time_rounding_block.strftime('%H:%M'))
roundingblock = remain_value / rounding_block
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
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

View File

@@ -109,6 +109,14 @@ class Sale < ApplicationRecord
booking.checkout_by = requested_by.name
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
end
@@ -162,6 +170,20 @@ class Sale < ApplicationRecord
self.sale_items << sale_item
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)
#save sale_audit

View File

@@ -10,6 +10,7 @@ class CreateDiningCharges < ActiveRecord::Migration[5.1]
t.time :charge_block
t.string :time_rounding, :default => "down"
t.time :time_rounding_block
t.integer :time_rounding_block_price, :default => 0
t.timestamps
end
end