module Brcobranca
module Boleto
# Classe base para todas as classes de boletos
class Base
# REQUERIDO: Codigo do banco emissor (3 dígitos sempre)
attr_accessor :banco
# REQUERIDO: Número do convênio/contrato do cliente junto ao banco emissor
attr_accessor :convenio
# REQUERIDO: Tipo de moeda utilizada (Real(R$) e igual a 9)
attr_accessor :moeda
# REQUERIDO: Carteira utilizada
attr_accessor :carteira
# OPCIONAL: Variacao da carteira(opcional para a maioria dos bancos)
attr_accessor :variacao
# OPCIONAL: Data de processamento do boleto, geralmente igual a data_documento
attr_accessor :data_processamento
# REQUERIDO: Número de dias a vencer
attr_accessor :dias_vencimento
# REQUERIDO: Quantidade de boleto(padrão = 1)
attr_accessor :quantidade
# REQUERIDO: Valor do boleto
attr_accessor :valor
# REQUERIDO: Número da agencia
attr_accessor :agencia
# REQUERIDO: Número da conta corrente
attr_accessor :conta_corrente
# REQUERIDO: Nome do proprietario da conta corrente
attr_accessor :cedente
# REQUERIDO: Documento do proprietario da conta corrente (CPF ou CNPJ)
attr_accessor :documento_cedente
# OPCIONAL: Número sequencial utilizado identificar o boleto
attr_accessor :numero_documento
# REQUERIDO: Símbolo da moeda utilizada (R$ no brasil)
attr_accessor :especie
# REQUERIDO: Tipo do documento (Geralmente DM que quer dizer Duplicata Mercantil)
attr_accessor :especie_documento
# REQUERIDO: Data em que foi emitido o boleto
attr_accessor :data_documento
# OPCIONAL: Código utilizado para identificar o tipo de serviço cobrado
attr_accessor :codigo_servico
# OPCIONAL: Utilizado para mostrar alguma informação ao sacado
attr_accessor :instrucao1
# OPCIONAL: Utilizado para mostrar alguma informação ao sacado
attr_accessor :instrucao2
# OPCIONAL: Utilizado para mostrar alguma informação ao sacado
attr_accessor :instrucao3
# OPCIONAL: Utilizado para mostrar alguma informação ao sacado
attr_accessor :instrucao4
# OPCIONAL: Utilizado para mostrar alguma informação ao sacado
attr_accessor :instrucao5
# OPCIONAL: Utilizado para mostrar alguma informação ao sacado
attr_accessor :instrucao6
# OPCIONAL: Utilizado para mostrar alguma informação ao sacado
attr_accessor :instrucao7
# REQUERIDO: Informação sobre onde o sacado podera efetuar o pagamento
attr_accessor :local_pagamento
# REQUERIDO: Informa se o banco deve aceitar o boleto após o vencimento ou não( S ou N, quase sempre S)
attr_accessor :aceite
# REQUERIDO: Nome da pessoa que receberá o boleto
attr_accessor :sacado
# OPCIONAL: Endereco da pessoa que receberá o boleto
attr_accessor :sacado_endereco
# REQUERIDO: Documento da pessoa que receberá o boleto
attr_accessor :sacado_documento
# Responsável por definir dados iniciais quando se cria uma nova intância da classe Base.
def initialize(campos={})
padrao = { :moeda => "9", :data_documento => Date.today, :dias_vencimento => 1, :quantidade => 1,
:especie_documento => "DM", :especie => "R$", :aceite => "S", :valor => 0.0,
:local_pagamento => "QUALQUER BANCO ATÉ O VENCIMENTO"}
campos = padrao.merge!(campos)
campos.each do |campo, valor|
instance_variable_set "@#{campo}", valor if self.respond_to?(campo)
end
end
# Retorna dígito verificador do banco, calculado com modulo11 de 9 para 2
def banco_dv
self.banco.modulo11_9to2
end
# Retorna dígito verificador da agência, calculado com modulo11 de 9 para 2
def agencia_dv
self.agencia.modulo11_9to2
end
# Retorna dígito verificador da conta corrente, calculado com modulo11 de 9 para 2
def conta_corrente_dv
self.conta_corrente.modulo11_9to2
end
# Retorna dígito verificador do nosso número, calculado com modulo11 de 9 para 2
def nosso_numero_dv
self.numero_documento.modulo11_9to2
end
# Número sequencial utilizado para distinguir os boletos na agência
def nosso_numero
self.numero_documento
end
# Campo usado apenas na exibição no boleto
# Deverá ser sobreescrito para cada banco
def nosso_numero_boleto
"Sobreescreva este método na classe referente ao banco que você esta criando"
end
# Campo usado apenas na exibição no boleto
# Deverá ser sobreescrito para cada banco
def agencia_conta_boleto
"Sobreescreva este método na classe referente ao banco que você esta criando"
end
# Retorna o valor total do documento: quantidate * valor ou zero(0) caso não consiga efetuar o cálculo.
def valor_documento
return 0 unless self.quantidade.kind_of?(Numeric) && self.valor.kind_of?(Numeric)
self.quantidade * self.valor.to_f
end
# Retorna data de vencimento baseado na data_documento + dias_vencimento ou false caso não consiga efetuar o cálculo.
def data_vencimento
return nil unless self.data_documento.kind_of?(Date) && self.dias_vencimento.kind_of?(Numeric)
(self.data_documento + self.dias_vencimento.to_i)
end
# Retorna uma String com 44 caracteres representando o codigo de barras do boleto
# O código de barra para cobrança contém 44 posições dispostas da seguinte forma:
# Posição Tamanho Conteúdo
# 01 a 03 3 Identificação do Banco
# 04 a 04 1 Código da Moeda (Real = 9, Outras=0)
# 05 a 05 1 Dígito verificador do Código de Barras
# 06 a 09 4 Fator de Vencimento (Vide Nota)
# 10 a 19 10 Valor
# 20 a 44 25 Campo Livre
# As posições do campo livre ficam a critério de cada Banco arrecadador.
def codigo_barras
codigo = monta_codigo_43_digitos
return unless codigo
return if codigo.size != 43
codigo_dv = codigo.modulo11_2to9
"#{codigo[0..3]}#{codigo_dv}#{codigo[4..42]}"
end
# Responsável por montar uma String com 43 caracteres que será usado na criação do código de barras
# Este metodo precisa ser reescrito para cada classe de boleto a ser criada.
def monta_codigo_43_digitos
"Sobreescreva este método na classe referente ao banco que você esta criando"
end
end
end
end