lib/extenso_pt.rb in extenso_pt-0.6.6 vs lib/extenso_pt.rb in extenso_pt-0.6.7

- old
+ new

@@ -1,43 +1,85 @@ # frozen_string_literal: true require 'bigdecimal/util' -require 'extenso_pt/version' require 'extenso_pt/constantes' +require 'extenso_pt/variaveis' require 'extenso_pt/extenso' require 'extenso_pt/romana' +require 'extenso_pt/version' # @author Hernani Rodrigues Vaz module ExtensoPt class Error < StandardError; end - # Produz extenso em portugues de portugal ou brasil # (valor numerico pode ser uma string digitos) # # @param [Hash] moeda as opcoes para parametrizar moeda/fracao # @option moeda [Symbol] :lc locale do extenso - # portugues de portugal (:pt) portugues do brasil (:br) - # @option moeda [String] :msingular moeda no singular - # @option moeda [String] :fsingular fracao no singular - # @option moeda [String] :mplural moeda no plural - # @option moeda [String] :fplural fracao no plural - # @return [String, Array, Hash] string extenso - # se objecto for (String, Float, Integer), + # @option moeda [String] :moeda_singular moeda no singular + # @option moeda [String] :fracao_singular fracao no singular + # @option moeda [String] :moeda_plural moeda no plural + # @option moeda [String] :fracao_plural fracao no plural + # @return [String, Array, Hash] + # string<extenso> se objecto for (String, Float, Integer), # array<extensos> se objecto for (Array, Range), - # hash<extensos> se objecto for (Hash) - def extenso(moeda = { lc: :pt, msingular: 'EURO', fsingular: 'CÊNTIMO' }) - # parametrizacao por defeito para :br - if moeda[:lc] == :br && !moeda[:msingular] && !moeda[:mplural] - moeda.merge!(msingular: 'REAL', mplural: 'REAIS', fsingular: 'CENTAVO') + # hash<extensos> se objecto for (Hash) + def extenso(moeda = { lc: :pt }) + # parametrizar moeda + ExtensoPt.epmo(moeda.parametrizar) + + processa + end + + # Processa objeto criando extenso(s) em portugues de portugal ou brasil + # + # @return [String, Array, Hash] + # string<extenso> se objecto for (String, Float, Integer), + # array<extensos> se objecto for (Array, Range), + # hash<extensos> se objecto for (Hash) + def processa + # converte valores do Hash nos seus extensos + if is_a?(Hash) then map { |k, v| [k, v.processa] }.to_h + # converte objecto num Array com os valores convertidos nos seus extensos + elsif respond_to?(:to_a) then to_a.map(&:processa) + else + # converte objeto em string digitos utilizando bigdecimal para + # evitar problemas com aritmetica virgula flutuante em valores >1e12 + # parametrizar parte inteira/fracionaria (@ai, @nf) da string digitos + ExtensoPt.epif(to_d.to_s('F')) + + # processar extenso - valores >1e24 sao ignorados + ExtensoPt.ivai.count > 8 ? '' : ExtensoPt.ejun(0, '') end + end - # parametrizar moeda - ExtensoPt.epsi(moeda) - ExtensoPt.eppl(moeda) + # Parametrizacao por defeito para :br + # + # @return [Hash] parametrizacao moeda + def parametrizar + if value?(:br) && + %i[moeda_singular moeda_plural].all? { |e| !keys.include?(e) } + { lc: :br, moeda_singular: 'REAL', moeda_plural: 'REAIS', + fracao_singular: 'CENTAVO', fracao_plural: 'CENTAVOS' } + else + inferir_singular + end + end - # cria extenso em portugues de portugal ou brasil - ExtensoPt.eo2e(self) + # Parametrizacao singular inferindo do plural + # + # @return [Hash] parametrizacao moeda + def inferir_singular + self[:moeda_singular] ||= if fetch(:moeda_plural, '')[-1] == 'S' + fetch(:moeda_plural, '')[0..-2] + end + self[:fracao_singular] ||= if fetch(:fracao_plural, '')[-1] == 'S' + fetch(:fracao_plural, '')[0..-2] + end + # eliminar parametros errados + keep_if { |k, v| MOEDA.include?(k) && (k != :lc || EXTLC.include?(v)) } end # Testa se contem numeracao romana # # @return [true, false] sim ou nao numeracao romana @@ -62,29 +104,15 @@ else RO_RE.match?(to_s) ? ExtensoPt.rr2i(upcase, 0) : '' end end end -# permite obter um Hash com valores convertidos -class Hash - include ExtensoPt -end - -# permite obter um Array com valores convertidos -class Array - include ExtensoPt -end - -# permite obter um Array com valores do Range convertidos -class Range - include ExtensoPt -end - -# permite obter Float ou Integer convertidos -class Numeric - include ExtensoPt -end - -# permite obter strings convertidas -class String - include ExtensoPt -end +# converter Hash +class Hash; include ExtensoPt; end +# converter Array +class Array; include ExtensoPt; end +# converter Range +class Range; include ExtensoPt; end +# converter Float, Integer +class Numeric; include ExtensoPt; end +# converter Strings +class String; include ExtensoPt; end