# encoding: utf-8
module BoletoBancario
module Core
# Implementação de emissão de boleto bancário pelo Banco Real.
#
# === Documentação Implementada
#
# A documentação na qual essa implementação foi baseada está localizada na pasta
# 'documentacoes_dos_boletos/real' dentro dessa biblioteca.
#
# Cobrança sem registro:
# Nosso número: 13 dígitos
# Código da Agência: 4 dígitos
# Número da Conta: 7 dígitos
#
# === Código da Carteira
#
# '00' - Carteira do convênio
# '20' - Cobrança Simples
# '31' - Cobrança Câmbio
# '42' - Cobrança Caucionada
# '47' - Cobr. Caucionada Crédito Imobiliário
# '85' - Cobrança Partilhada
#
class Real < Boleto
# Tamanho máximo de uma agência no Banco Real.
# Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.
#
# @return [Fixnum] 4
#
def self.tamanho_maximo_agencia
4
end
# Tamanho máximo da conta corrente no Boleto.
# Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.
#
# @return [Fixnum] 7
#
def self.tamanho_maximo_conta_corrente
7
end
# Tamanho máximo do numero do documento no Boleto.
# Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.
#
# @return [Fixnum] 13
#
def self.tamanho_maximo_numero_documento
13
end
# Carteiras suportadas.
#
# Método criado para validar se a carteira informada é suportada.
#
# @return [Array]
#
def self.carteiras_suportadas
%w[00 20 31 42 47 85]
end
# Validações para os campos abaixo:
#
# * Agencia
# * Conta Corrente
# * Número do documento
#
# Se você quiser sobrescrever os metodos, ficará a sua responsabilidade.
# Basta você sobrescrever os métodos de validação:
#
# class Real < BoletoBancario::Core::Real
# def self.tamanho_maximo_agencia
# 6
# end
#
# def self.tamanho_maximo_conta_corrente
# 9
# end
#
# def self.tamanho_maximo_numero_documento
# 10
# end
# end
#
# Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
# Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
# sobreescritos também).
#
validates :agencia, :conta_corrente, presence: true
validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
validates :conta_corrente, length: { maximum: tamanho_maximo_conta_corrente }, if: :deve_validar_conta_corrente?
validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
# @return [String] 4 caracteres
#
def agencia
@agencia.to_s.rjust(4, '0') if @agencia.present?
end
# @return [String] 7 caracteres
#
def conta_corrente
@conta_corrente.to_s.rjust(7, '0') if @conta_corrente.present?
end
# @return [String] 13 caracteres
#
def numero_documento
@numero_documento.to_s.rjust(13, '0') if @numero_documento.present?
end
# @return [String] 2 caracteres
#
def carteira
@carteira.to_s.rjust(2, '0') if @carteira.present?
end
# @return [String] Código do Banco descrito na documentação.
#
def codigo_banco
'356'
end
# @return [String] Dígito do código do banco descrito na documentação.
#
def digito_codigo_banco
'5'
end
# Campo Agência/Código Cedente
#
# @return [String] Campo descrito na documentação.
#
def agencia_codigo_cedente
"#{agencia}/#{conta_corrente}/#{cobranca_dv}"
end
# Cálculo do Digito verificador da Cobrança
# Nosso Número + Agência + Conta Corrente
# Calculado atravez do modulo 10
#
# @return [String]
#
def cobranca_dv
Modulo10.new("#{nosso_numero}#{agencia}#{conta_corrente}")
end
# O nosso numero é o mesmo numero que o cliente informa para o numero do documento
#
# @return [String]
#
def nosso_numero
"#{numero_documento}"
end
# === Código de barras do banco
# ____________________________________________________
# | Posição | Tamanho | Descrição |
# |---------|---------|--------------------------------|
# | 20 – 23 | 04 | Agencia |
# | 24 – 30 | 07 | Conta corrente |
# | 31 – 31 | 01 | Digito verificador da cobrança |
# | 32 – 44 | 13 | Nosso numero |
# |____________________________________________________|
#
# @return [String]
#
def codigo_de_barras_do_banco
"#{agencia}#{conta_corrente}#{cobranca_dv}#{nosso_numero}"
end
end
end
end