# encoding: utf-8
module BoletoBancario
module Core
# Implementação de emissão de boleto bancário pela Caixa Econômica Federal.
#
# === Documentação Implementada
#
# A documentação na qual essa implementação foi baseada está localizada na pasta
# 'documentacoes_dos_boletos/caixa' dentro dessa biblioteca.
# === Carteiras suportadas
#
# Segue abaixo as carteiras suportadas da Caixa Econômica Federal seguindo a documentação:
#
# _________________________________________________________________________
# | Carteira | Descrição | Testada/Homologada no banco |
# | 14 | Cobrança Simples com registro | Esperando Contribuição |
# | 24 | Cobrança Simples sem registro | Esperando Contribuição |
# |_________________________________________________________________________|
#
class Caixa < Boleto
# Tamanho máximo de uma agência na Caixa Econômica Federal.
# 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 do código do cedente emitido no Boleto.
# Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.
#
# @return [Fixnum] 6
#
def self.tamanho_maximo_codigo_cedente
6
end
# Carteiras suportadas.
# Método criado para validar se a carteira informada é suportada.
#
# @return [Array]
#
def self.carteiras_suportadas
%w[14 24]
end
# Tamanho máximo do número do documento emitido no Boleto.
# Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.
#
# @return [Fixnum] 15
#
def self.tamanho_maximo_numero_documento
15
end
# Tamanho maximo do valor do documento do boleto.
# O valor maximo descrito na decumentação é de 9999999.99
#
# @return [Float] 9999999.99
#
def self.valor_documento_tamanho_maximo
9999999.99
end
# Validações para os campos abaixo:
#
# * Agencia
# * Conta Corrente
# * Carteira
# * Número do documento
#
# Se você quiser sobrescrever os metodos, ficará a sua responsabilidade.
# Basta você sobrescrever os métodos de validação:
#
# class Santander < BoletoBancario::Core::Santander
# def self.tamanho_maximo_agencia
# 5
# end
#
# def self.tamanho_maximo_codigo_cedente
# 7
# end
#
# def self.tamanho_maximo_numero_documento
# 10
# end
#
# def self.carteiras_suportadas
# %w[10 53]
# 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, :codigo_cedente, presence: true
validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
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] 6 caracteres
#
def codigo_cedente
@codigo_cedente.to_s.rjust(6, '0') if @codigo_cedente.present?
end
# @return [String] 15 caracteres
#
def numero_documento
@numero_documento.to_s.rjust(15, '0') if @numero_documento.present?
end
# Formata a carteira dependendo se ela é registrada ou não.
#
# Para cobrança COM registro usar: RG
# Para Cobrança SEM registro usar: SR
#
# @return [String]
#
def carteira_formatada
if @carteira.to_s.in?(carteiras_com_registro)
"RG"
else
'SR'
end
end
# Retorna as carteiras com registro da Caixa Econômica Federal.
# Você pode sobrescrever esse método na subclasse caso exista mais
# carteiras com registro na Caixa Econômica Federal.
#
# @return [Array]
#
def carteiras_com_registro
%w(14)
end
def tipo_cobranca
carteira.first if carteira.present?
end
def identificador_de_emissao
carteira.last if carteira.present?
end
# @return [String] Código do Banco descrito na documentação.
#
def codigo_banco
'104'
end
# @return [String] Dígito do código do banco descrito na documentação.
#
def digito_codigo_banco
'0'
end
# Campo Agência / Código do Cedente (Número fornecido pelo Banco)
#
# @return [String]
#
def agencia_codigo_cedente
"#{agencia} / #{codigo_cedente}-#{codigo_cedente_dv}"
end
def codigo_cedente_dv
Modulo11FatorDe2a9RestoZero.new(codigo_cedente)
end
# Mostra o campo nosso número calculando o dígito verificador do nosso número.
#
# @return [String]
#
def nosso_numero
"#{carteira}#{numero_documento}-#{nosso_numero_dv}"
end
def nosso_numero_dv
Modulo11FatorDe2a9RestoZero.new("#{carteira}#{numero_documento}")
end
def nosso_numero_de3a5
nosso_numero[2..4] if nosso_numero.present?
end
def nosso_numero_de6a8
nosso_numero[5..7] if nosso_numero.present?
end
def nosso_numero_de9a17
nosso_numero[8..16] if nosso_numero.present?
end
# === Código de barras do banco
#
# ________________________________________________________________________________________
# | Posição | Tamanho | Descrição |
# |----------|---------|------------------------------------------------------------------|
# | 20 - 25 | 06 | Código do Beneficiário |
# | 26 - 26 | 01 | DV do Código do Beneficiário |
# | 27 – 29 | 03 | Nosso Número - 3ª a 5ª posição do Nosso Número |
# | 30 – 30 | 01 | Constante 1, tipo de cobrança (1-Registrada / 2-Sem Registro) |
# | 31 – 33 | 03 | Nosso Número - 6ª a 8ª posição do Nosso Número |
# | 34 – 34 | 01 | Constante 2, identificador de emissão do boleto (4-Beneficiário) |
# | 35 – 43 | 09 | Nosso Número - 9ª a 17ª posição do Nosso Número |
# | 44 – 44 | 01 | DV do Campo Livre |
# -----------------------------------------------------------------------------------------
#
# @return [String]
#
def codigo_de_barras_do_banco
codigo = "#{codigo_cedente}#{codigo_cedente_dv}#{nosso_numero_de3a5}#{tipo_cobranca}#{nosso_numero_de6a8}"
codigo << "#{identificador_de_emissao}#{nosso_numero_de9a17}"
codigo_dv = Modulo11FatorDe2a9RestoZero.new(codigo)
"#{codigo}#{codigo_dv}"
end
end
end
end