# -*- encoding: utf-8 -*-
#
# @author Kivanio Barbosa
module Bbrcobranca
# Métodos auxiliares de formatação
module Formatacao
# Formata como CPF
#
# @return [String]
# @example
# "12345678901".to_br_cpf #=> 123.456.789-01
def to_br_cpf
somente_numeros.gsub(/^(.{3})(.{3})(.{3})(.{2})$/, '\1.\2.\3-\4')
end
# Formata como CEP
#
# @return [String]
# @example
# "85253100".to_br_cep #=> "85253-100"
# 85253100.to_br_cep #=> "85253-100"
def to_br_cep
somente_numeros.gsub(/^(.{5})(.{3})$/, '\1-\2')
end
# Formata como CNPJ
#
# @return [String]
# @example
# "12345678000901".to_br_cnpj #=> 12.345.678/0009-01
def to_br_cnpj
somente_numeros.gsub(/^(.{2})(.{3})(.{3})(.{4})(.{2})$/, '\1.\2.\3/\4-\5')
end
# Gera formatação automática do documento baseado no tamanho do campo.
#
# @return [String] Retorna a mesma caso não encontre o formato adequado.
# @example
# "12345678000901".formata_documento #=> 12.345.678/0009-01
# "85253100".formata_documento #=> "85253-100"
# "12345678901".formata_documento #=> 123.456.789-01
# "12345".formata_documento #=> 12345
def formata_documento
case somente_numeros.size
when 8 then to_br_cep
when 11 then to_br_cpf
when 14 then to_br_cnpj
else
self
end
end
# Remove caracteres que não sejam numéricos.
#
# @return [String]
# @example
# 1a23e45+".somente_numeros #=> 12345
def somente_numeros
to_s.gsub(/\D/, '')
end
# Monta a linha digitável padrão para todos os bancos segundo a BACEN.
#
# A linha digitável será composta por cinco campos:
# 1º campo:
# Composto pelo código de Banco, código da moeda, as cinco primeiras posições do campo livre
# e o dígito verificador deste campo.
# 2º campo:
# Composto pelas posições 6ª a 15ª do campo livre e o dígito verificador deste campo.
# 3º campo:
# Composto pelas posições 16ª a 25ª do campo livre e o dígito verificador deste campo.
# 4º campo:
# Composto pelo dígito verificador do código de barras, ou seja, a 5ª posição do código de barras.
# 5º campo:
# Composto pelo fator de vencimento com 4(quatro) caracteres e o valor do documento com
# 10(dez) caracteres, sem separadores e sem edição.
#
# @return [String]
# @raise [ArgumentError] Caso não seja um número de 44 dígitos.
# @example
# "00192376900000135000000001238798777770016818".linha_digitavel #=> "00190.00009 01238.798779 77700.168188 2 37690000013500"
def linha_digitavel
if self =~ /^(\d{4})(\d{1})(\d{14})(\d{5})(\d{10})(\d{10})$/
linha = Regexp.last_match[1]
linha << Regexp.last_match[4]
linha << linha.modulo10.to_s
linha << Regexp.last_match[5]
linha << Regexp.last_match[5].modulo10.to_s
linha << Regexp.last_match[6]
linha << Regexp.last_match[6].modulo10.to_s
linha << Regexp.last_match[2]
linha << Regexp.last_match[3]
linha.gsub(/^(.{5})(.{5})(.{5})(.{6})(.{5})(.{6})(.{1})(.{14})$/, '\1.\2 \3.\4 \5.\6 \7 \8')
else
raise ArgumentError, "#{self} Precisa conter 44 caracteres numéricos."
end
end
end
end
[String, Numeric].each do |klass|
klass.class_eval { include Bbrcobranca::Formatacao }
end