Class: HhPackage::ReservationPackages::VoucherCalculator

Inherits:
Object
  • Object
show all
Defined in:
app/my_lib/hh_package/reservation_packages/voucher_calculator.rb

Overview

VoucherCalculator - Calculates voucher deductions from prices

This calculator works entirely in cents internally for precision. Amounts are only converted to displayable format (amount) at the final output.

Example usage:

calc = HhPackage::ReservationPackages::VoucherCalculator.new([voucher], distance, user_id: user.id)
calc.set_package_price_cents(100000)  # 1000 THB in cents
calc.set_delivery_price_cents(5000)   # 50 THB in cents

final_price_cents = calc.final_total_price_cents # get final price in cents
final_delivery_fee_cents = calc.final_delivery_fee_cents # get final delivery fee in cents
voucher_amount_cents = calc.voucher_amount_cents_by_hungryhub + calc.voucher_amount_cents_by_restaurant

Constant Summary collapse

PERCENTAGE_DIVISOR =

Constant for percentage to decimal conversion (100% = 1.0)

100

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(vouchers = [], delivery_distance = 0, user_id: nil) ⇒ VoucherCalculator

Returns a new instance of VoucherCalculator.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 28

def initialize(vouchers = [], delivery_distance = 0, user_id: nil)
  @vouchers                              = vouchers
  @delivery_distance                     = delivery_distance
  @voucher_amount_cents_by_hungryhub     = 0
  @voucher_amount_cents_by_restaurant    = 0
  @arr_data                              = {}
  @user_id                               = user_id
  @deductible_remain_amount              = []
  @voucher_deductibles                   = []
  @used_vouchers                         = []

  build_package_vouchers
  build_delivery_fee_package_vouchers
  build_delivery_fee_vouchers
end

Instance Attribute Details

#arr_dataObject

Returns the value of attribute arr_data.



23
24
25
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 23

def arr_data
  @arr_data
end

#delivery_distanceObject

Returns the value of attribute delivery_distance.



23
24
25
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 23

def delivery_distance
  @delivery_distance
end

#delivery_fee_centsObject

Returns the value of attribute delivery_fee_cents.



23
24
25
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 23

def delivery_fee_cents
  @delivery_fee_cents
end

#package_price_centsObject

Returns the value of attribute package_price_cents.



23
24
25
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 23

def package_price_cents
  @package_price_cents
end

#used_vouchersObject

Returns the value of attribute used_vouchers.



23
24
25
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 23

def used_vouchers
  @used_vouchers
end

#voucher_amount_cents_by_hungryhubObject (readonly)

Returns the value of attribute voucher_amount_cents_by_hungryhub.



26
27
28
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 26

def voucher_amount_cents_by_hungryhub
  @voucher_amount_cents_by_hungryhub
end

#voucher_amount_cents_by_restaurantObject (readonly)

Returns the value of attribute voucher_amount_cents_by_restaurant.



26
27
28
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 26

def voucher_amount_cents_by_restaurant
  @voucher_amount_cents_by_restaurant
end

#voucher_deductiblesObject

Returns the value of attribute voucher_deductibles.



23
24
25
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 23

def voucher_deductibles
  @voucher_deductibles
end

#vouchersObject

Returns the value of attribute vouchers.



23
24
25
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 23

def vouchers
  @vouchers
end

Instance Method Details

#final_delivery_fee_centsObject

Raises:

  • (ArgumentError)


65
66
67
68
69
70
71
72
73
74
75
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 65

def final_delivery_fee_cents
  raise ArgumentError, 'Invalid total delivery fee' if delivery_fee_cents.blank?
  return delivery_fee_cents if vouchers.blank?

  @delivery_fee_cents = decrease_with_vouchers(:delivery_fee_vouchers, delivery_fee_cents, 'hungryhub')
  @delivery_fee_cents = decrease_with_vouchers(:delivery_fee_package_vouchers, delivery_fee_cents, 'hungryhub')
  @delivery_fee_cents = decrease_with_vouchers(:delivery_fee_vouchers, delivery_fee_cents, 'restaurant')
  @delivery_fee_cents = decrease_with_vouchers(:delivery_fee_package_vouchers, delivery_fee_cents, 'restaurant')

  @delivery_fee_cents
end

#final_total_price_centsObject

Raises:

  • (ArgumentError)


52
53
54
55
56
57
58
59
60
61
62
63
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 52

def final_total_price_cents
  raise ArgumentError, 'Invalid total price' if package_price_cents.blank?

  return package_price_cents if vouchers.blank?

  @package_price_cents = decrease_with_vouchers(:package_vouchers, package_price_cents, 'hungryhub')
  @package_price_cents = decrease_with_vouchers(:delivery_fee_package_vouchers, package_price_cents, 'hungryhub')
  @package_price_cents = decrease_with_vouchers(:package_vouchers, package_price_cents, 'restaurant')
  @package_price_cents = decrease_with_vouchers(:delivery_fee_package_vouchers, package_price_cents, 'restaurant')

  @package_price_cents
end

#set_delivery_price_cents(delivery_fee_cents) ⇒ Object



48
49
50
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 48

def set_delivery_price_cents(delivery_fee_cents)
  @delivery_fee_cents = delivery_fee_cents
end

#set_package_price_cents(package_price_cents) ⇒ Object



44
45
46
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 44

def set_package_price_cents(package_price_cents)
  @package_price_cents = package_price_cents
end

#used_voucher_include_package?Boolean

Returns:

  • (Boolean)

Raises:

  • (ArgumentError)


77
78
79
80
81
# File 'app/my_lib/hh_package/reservation_packages/voucher_calculator.rb', line 77

def used_voucher_include_package?
  raise ArgumentError, 'Invalid package price' if package_price_cents.blank?

  used_vouchers.select { |v| v[:for_package] }.present?
end