# encoding: utf-8 module BoletoBancario module Core # Implementação de emissão de boleto bancário pelo Banco Sicoob. # # === Documentação Implementada # # A documentação na qual essa implementação foi baseada está localizada na pasta # 'documentacoes_dos_boletos/sicoob' dentro dessa biblioteca. # # === Código da Carteira # # '1' - Cobrança SEM registro # '9' - Cobrança COM registro # class Sicoob < Boleto # Tamanho máximo de uma agência no Banco Sicoob. # 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 codigo cedente no Banco Sicoob. # Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente. # # @return [Fixnum] 7 # def self.tamanho_maximo_codigo_cedente 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] 6 # def self.tamanho_maximo_numero_documento 6 end # Carteiras suportadas. # # Método criado para validar se a carteira informada é suportada. # # @return [Array] # def self.carteiras_suportadas %w[1 9] end # Validações para os campos abaixo: # # * Agencia # * Codigo Cedente # * Número do documento # # Se você quiser sobrescrever os metodos, ficará a sua responsabilidade. # Basta você sobrescrever os métodos de validação: # # class Sicoob < BoletoBancario::Core::Sicoob # def self.tamanho_maximo_agencia # 6 # end # # def self.tamanho_maximo_codigo_cedente # 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, :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] 7 caracteres # def codigo_cedente @codigo_cedente.to_s.rjust(7, '0') if @codigo_cedente.present? end # @return [String] 6 caracteres # def numero_documento @numero_documento.to_s.rjust(6, '0') if @numero_documento.present? end # @return [String] Código do Banco descrito na documentação. # def codigo_banco '756' 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 # # @return [String] # def agencia_codigo_cedente "#{agencia} / #{codigo_cedente}" end # O nosso número descrino na documentação é formado pelo dois ultimos digitos do ano autal e # por outros 6 digitos que o clinte usara para numerar os documentos, assim sendo composto por 8 dígitos. # # @return [String] # def nosso_numero "#{ano}#{numero_documento}" end # Ano atual usado para os calculos # # @return [String] # def ano Date.today.strftime('%y') end # === Código de barras do banco # # ___________________________________________________________ # | Posição | Tamanho | Descrição | # |---------|---------|---------------------------------------| # | 20 - 20 | 01 | Código da carteira | # | 21 - 24 | 04 | Código da agência | # | 25 - 26 | 02 | Código da modalidade de cobrança (01) | # | 27 - 33 | 07 | Código do Cedente | # | 34 - 41 | 08 | Nosso Número do título | # | 42 - 44 | 03 | Número da Parcela do Título (001) | # |___________________________________________________________| # # @return [String] # def codigo_de_barras_do_banco "#{carteira}#{agencia}#{modalidade_cobranca}#{codigo_cedente}#{nosso_numero}#{parcelas}" end def modalidade_cobranca '01' end def parcelas '001' end end end end