# -*- encoding: utf-8 -*- module Brcobranca module Boleto class Unibanco < Base # Banco UNIBANCO # Com Registro 4 # Sem Registro 5 validates_inclusion_of :carteira, :in => %w( 5 4 ), :message => "não existente para este banco." validates_length_of :agencia, :maximum => 4, :message => "deve ser menor ou igual a 4 dígitos." validates_length_of :convenio, :maximum => 7, :message => "deve ser menor ou igual a 7 dígitos." validates_length_of :conta_corrente, :maximum => 7, :message => "deve ser menor ou igual a 7 dígitos." validates_each :numero_documento do |record, attr, value| record.errors.add attr, 'deve ser menor ou igual a 14 dígitos.' if (value.to_s.size > 14) && (record.carteira.to_i == 5) record.errors.add attr, 'deve ser menor ou igual a 11 dígitos.' if (value.to_s.size > 11) && (record.carteira.to_i == 4) end # Nova instancia do Unibanco # @param (see Brcobranca::Boleto::Base#initialize) def initialize(campos={}) campos = {:carteira => "5"}.merge!(campos) super(campos) end # Codigo do banco emissor (3 dígitos sempre) # # @return [String] 3 caracteres numéricos. def banco "409" end # Número do convênio/contrato do cliente junto ao banco. # @return [String] 7 caracteres numéricos. def convenio=(valor) @convenio = valor.to_s.rjust(7,'0') unless valor.nil? end # Número seqüencial utilizado para identificar o boleto. # # Carteira 5 = 14 caracteres numéricos.
# Carteira 4 = 11 caracteres numéricos. # # @return [String] def numero_documento case self.carteira.to_i when 5 @numero_documento.to_s.rjust(14,'0') else #4 @numero_documento.to_s.rjust(11,'0') end end # Dígito verificador do nosso número. # @return [String] 1 caracteres numéricos. def nosso_numero_dv self.numero_documento.modulo11_2to9 end # Nosso número para exibir no boleto. # @return [String] # @example # boleto.nosso_numero_boleto #=> "00085068014982-9" def nosso_numero_boleto "#{self.numero_documento}-#{self.nosso_numero_dv}" end # Número do convênio/contrato do cliente para exibir no boleto. # @return [String] # @example # boleto.agencia_conta_boleto #=> "0123 / 0100618-5" def agencia_conta_boleto "#{self.agencia} / #{self.conta_corrente}-#{self.conta_corrente_dv}" end # Segunda parte do código de barras. # # Cobrança sem registro (CÓDIGO DE BARRAS)
# Posição | Tamanho | Descrição
# 1 a 3 | 3 | número de identificação do Unibanco: 409 (número FIXO)
# 4 | 1 | código da moeda. Real (R$)=9 (número FIXO)
# 5 | 1 | dígito verificador do CÓDIGO DE BARRAS
# 6 a 9 | 4 | fator de vencimento
# 10 a 19 | 10 | valor do título com zeros à esquerda
# 20 | 1 | código para transação CVT: 5 (número FIXO)(5=7744-5)
# 21 a 27 | 7 | número do cliente no CÓDIGO DE BARRAS + dígito verificador
# 28 a 29 | 2 | vago. Usar 00 (número FIXO)
# 30 a 43 | 14 | Número de referência do cliente
# 44 | 1 | Dígito verificador
# # Cobrança com registro (CÓDIGO DE BARRAS)
# Posição | Tamanho | Descrição
# 1 a 3 | 3 | Número de identificação do Unibanco: 409 (número FIXO)
# 4 | 1 | Código da moeda. Real (R$)=9 (número FIXO)
# 5 | 1 | dígito verificador do CÓDIGO DE BARRAS
# 6 a 9 | 4 | fator de vencimento em 4 algarismos, conforme tabela da página 14
# 10 a 19 | 10 | valor do título com zeros à esquerda
# 20 a 21 | 2 | Código para transação CVT: 04 (número FIXO) (04=5539-5)
# 22 a 27 | 6 | data de vencimento (AAMMDD)
# 28 a 32 | 5 | Código da agência + dígito verificador
# 33 a 43 | 11 | “Nosso Número” (NNNNNNNNNNN)
# 44 | 1 Super dígito do “Nosso Número” (calculado com o MÓDULO 11 (de 2 a 9))
# # @return [String] 25 caracteres numéricos. def codigo_barras_segunda_parte case self.carteira.to_i when 5 "#{self.carteira}#{self.convenio}00#{self.numero_documento}#{self.nosso_numero_dv}" else # 4 data = self.data_vencimento.strftime('%y%m%d') "0#{self.carteira}#{data}#{self.agencia}#{self.agencia_dv}#{self.numero_documento}#{self.nosso_numero_dv}" end end end end end