Module: HrLite::AmountInWords

Defined in:
lib/hr_lite/amount_in_words.rb

Overview

Indian-system amount in words (crore/lakh/thousand). A PORO — not a view helper — because the slip PDF template is rendered by HOST code (config.render_pdf), where engine helper modules are not in scope.

Constant Summary collapse

ONES =
%w[zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen
fifteen sixteen seventeen eighteen nineteen].freeze
TENS =
%w[zero ten twenty thirty forty fifty sixty seventy eighty ninety].freeze
SCALES =
[ [ 10_000_000, "crore" ], [ 100_000, "lakh" ], [ 1000, "thousand" ], [ 100, "hundred" ] ].freeze

Class Method Summary collapse

Class Method Details

.two_digit(number) ⇒ Object



28
29
30
31
32
# File 'lib/hr_lite/amount_in_words.rb', line 28

def two_digit(number)
  return ONES[number] if number < 20

  [ TENS[number / 10], number % 10 == 0 ? nil : ONES[number % 10] ].compact.join("-")
end

.words(amount) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/hr_lite/amount_in_words.rb', line 13

def words(amount)
  rupees = Money.round_rupee(amount).to_i
  return "Zero rupees" if rupees.zero?

  parts = []
  SCALES.each do |divisor, label|
    next unless rupees >= divisor

    parts << "#{two_digit(rupees / divisor)} #{label}"
    rupees %= divisor
  end
  parts << two_digit(rupees) if rupees.positive?
  "#{parts.join(' ').capitalize} rupees"
end