module BoletoBancario
module Core
# Implementação de emissão de boleto bancário do Banrisul.
#
# === Documentação Implementada
#
# A documentação na qual essa implementação foi baseada está localizada na pasta
# 'documentacoes_dos_boletos/banrisul' dentro dessa biblioteca.
#
# === Contrato das classes de emissão de boletos
#
# Para ver o "contrato" da Emissão de Boletos (geração de código de barras, linha digitável, etc) veja
# a classe BoletoBancario::Core::Boleto.
#
# === Carteiras Suportadas
#
# 00 - CCB sem registro
# 08 - CCB com registro
#
# === Usage
#
# class BoletoBanrisul < BoletoBancario::Banrisul
# end
#
# boleto = BoletoBanrisul.new do |boleto|
# boleto.numero_documento = 22832563
# boleto.agencia = 100
# boleto.data_vencimento = Date.parse('2004-07-04')
# boleto.codigo_cedente = "0000001"
# boleto.valor_documento = 5.0
# end
#
class Banrisul < Boleto
# Tamanho máximo de uma agência no Banrisul (sem número de controle).
# Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.
#
# @return [Fixnum] 3
#
def self.maximo_agencia
3
end
# Tamanho máximo do código cedente.
# Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.
#
# @return [Fixnum] 4
#
def self.maximo_codigo_cedente
7
end
# Tamanho máximo do número do documento.
# Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.
#
# @return [Fixnum] 8
#
def self.maximo_numero_documento
8
end
# Carteiras suportadas.
#
# Método criado para validar se a carteira informada é suportada.
#
# @return [Array]
#
def self.carteiras_suportadas
%w[00 08]
end
validates :agencia, :digito_agencia, :codigo_cedente, :digito_codigo_cedente, presence: true
validates :agencia, length: { maximum: maximo_agencia }, if: :deve_validar_agencia?
validates :codigo_cedente, length: { maximum: maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
validates :numero_documento, length: { maximum: maximo_numero_documento }, if: :deve_validar_numero_documento?
validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
# @return [String] 3 caracteres
#
def agencia
@agencia.to_s.rjust(3, '0') if @agencia.present?
end
# @return [String] 8 caracteres
#
def numero_documento
@numero_documento.to_s.rjust(8, '0') if @numero_documento.present?
end
# @return [String] 7 caracteres
#
def codigo_cedente
@codigo_cedente.to_s.rjust(7, '0') if @codigo_cedente.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
'041'
end
# Dígito do código do banco. Precisa mostrar esse dígito no boleto.
#
# @return [String] Dígito do código do banco descrito na documentação.
#
def digito_codigo_banco
'8'
end
# Dígito do código da agência. Precisa mostrar esse dígito no boleto.
#
# @return [String] Dígito da agência calculado apartir do ModuloNumeroDeControle.
#
def digito_agencia
ModuloNumeroDeControle.new(agencia)
end
# Dígito do código do cedente. Precisa mostrar esse dígito no boleto.
#
# @return [String] Dígito do código do cedente calculado apartir do ModuloNumeroDeControle.
#
def digito_codigo_cedente
ModuloNumeroDeControle.new(codigo_cedente)
end
# Retorna a Agencia, digito da agencia, código do cedente e o dígito do código do cedente.
#
# @return [String]
#
def agencia_codigo_cedente
"#{agencia}.#{digito_agencia} #{codigo_cedente}.#{digito_codigo_cedente}"
end
# Retorna o número do documento com seu número de controle.
#
# Para mais detalhes do cálculo, veja a classe ModuloNumeroDeControle.
#
# @return [String]
#
def nosso_numero
"#{numero_documento}.#{ModuloNumeroDeControle.new(numero_documento)}"
end
# === Código de barras do banco
#
# ________________________________________________________________________________________________
# | Posição | Tamanho | Descrição |
# |---------|---------|---------------------------------------------------------------------------|
# | 20 | 01 | Tipo da cobrança do produto (mais detalhes veja #tipo_da_cobranca) |
# | 21 | 01 | Constante '1' |
# | 22-24 | 03 | Agência (sem número de controle) |
# | 25-31 | 07 | Código do Cedente (sem número de controle) |
# | 32-39 | 08 | Nosso número (número do documento sem número de controle) |
# | 40-42 | 03 | Constante '041' |
# | 43-44 | 02 | Duplo Dígito referente às posições 20 a 42 (módulo do numero de controle) |
# ------------------------------------------------------------------------------------------------|
#
def codigo_de_barras_do_banco
codigo = "#{tipo_da_cobranca}1#{agencia}#{codigo_cedente}#{numero_documento}041"
"#{codigo}#{ModuloNumeroDeControle.new(codigo)}"
end
# Tipo da cobranca do boleto
#
# "1" Cobrança Normal, Fichário emitido pelo BANRISUL.
# "2" Cobrança Direta, Fichário emitido pelo CLIENTE.
#
# @return [String]
#
def tipo_da_cobranca
"2"
end
end
end
end