# -*- encoding: utf-8 -*- # module Bbrcobranca module Boleto class Unicred < Base # Banco Unicred # REQUERIDO: Código do posto da cooperativa de crédito attr_accessor :posto # REQUERIDO: Byte de identificação do cedente do bloqueto utilizado para compor o nosso número. attr_accessor :byte_idt validates_length_of :agencia, maximum: 4, message: 'deve ser menor ou igual a 4 dígitos.' validates_length_of :nosso_numero, maximum: 5, message: 'deve ser menor ou igual a 5 dígitos.' validates_length_of :conta_corrente, maximum: 5, message: 'deve ser menor ou igual a 5 dígitos.' # Carteira # 1 – Com Registro # 3 – Sem Registro # Obs.: O Unicred não validará este campo. validates_length_of :carteira, maximum: 1, message: 'deve ser menor ou igual a 1 dígitos.' validates_length_of :posto, maximum: 2, message: 'deve ser menor ou igual a 2 dígitos.' validates_length_of :byte_idt, is: 1, message: 'deve ser 1 se o numero foi gerado pela agencia ou 2-9 se foi gerado pelo beneficiário' validates_length_of :convenio, maximum: 5, message: 'deve ser menor ou igual a 5 dígitos.' # Nova instancia do Unicred # @param (see Bbrcobranca::Boleto::Base#initialize) def initialize(campos = {}) campos = { carteira: '3', especie_documento: 'DM', local_pagamento: 'PAGÁVEL PREFERENCIALMENTE NAS AGÊNCIAS DA UNICRED' }.merge!(campos) super(campos) end # Codigo do banco emissor (3 dígitos sempre) # # @return [String] 3 caracteres numéricos. def banco '748' end # Carteira # # @return [String] 2 caracteres numéricos. def carteira=(valor) @carteira = valor.to_s.rjust(1, '0') if valor end # Posto # # @return [String] 2 caracteres numéricos. def posto=(valor) @posto = valor.to_s.rjust(2, '0') if valor end # Número da conta corrente # @return [String] 5 caracteres numéricos. def conta_corrente=(valor) @conta_corrente = valor.to_s.rjust(5, '0') if valor end # Código Beneficiário # @return [String] 5 caracteres numéricos. def convenio=(valor) @convenio = valor.to_s.rjust(5, '0') if valor end # Dígito verificador do banco # @return [String] 1 caractere. def banco_dv 'X' end # Nosso número para exibir no boleto. # O campo Nosso Número deve ser apresentado no formato AA/BXXXXX-D, onde: # AA = Ano atual # B = Byte que pode ser de 2 a 9. Somente será 1 se forem boletos pré-impressos. # XXXXX = número sequencial # D = dígito verificador calculado # @return [String] # @example # boleto.nosso_numero_boleto #=> "14/200022-5" def nosso_numero_boleto "#{nosso_numero_with_byte_idt[0..1]}/#{nosso_numero_with_byte_idt[2..-1]}-#{nosso_numero_dv}" end def nosso_numero_codigo_barra nosso_numero_boleto.gsub(/\D/, '') end def nosso_numero_with_byte_idt "#{data_processamento.strftime('%y')}#{byte_idt}#{nosso_numero}" end # Número seqüencial utilizado para identificar o boleto. # @return [String] 5 caracteres numéricos. def nosso_numero=(valor) @nosso_numero = valor.to_s.rjust(5, '0') if valor end # Dígito verificador do nosso número # @return [Integer] 1 caracteres numéricos. def nosso_numero_dv "#{agencia_posto_conta}#{nosso_numero_with_byte_idt}" .modulo11(mapeamento: mapeamento_para_modulo_11) end def agencia_conta_boleto "#{agencia}.#{posto}.#{convenio}" end def agencia_posto_conta "#{agencia}#{posto}#{convenio}" end # Segunda parte do código de barras. # Posição Tamanho Conteúdo # 20 – 20 01 Código numérico correspondente ao tipo de cobrança: “1” – Com Registro “3 – Sem Registro”. Obs.: O SICREDI não validará este campo. # 21 – 21 01 Código numérico correspondente ao tipo de carteira: “1” - carteira simples # 22 – 30 09 Nosso número # 31 – 34 # 04 # Cooperativa de crédito/agência beneficiária # 35 – 36 # 02 # Posto da cooperativa de crédito/agência beneficiária # 37 – 41 # 05 # Código do beneficiário # 42 – 42 # 01 # Será 1 (um) quando houver valor expresso no campo “valor do documento” # 43 – 43 # 01 # Filler – zeros “0” # 44 – 44 # 01 # DV do campo livre calculado por módulo 11 com aproveitamento total (resto igual a 0 ou 1 DV cai para 0) def codigo_barras_segunda_parte campo_livre = "#{carteira}1#{nosso_numero_codigo_barra}#{agencia_posto_conta}10" campo_livre + campo_livre.modulo11(mapeamento: mapeamento_para_modulo_11).to_s end private def mapeamento_para_modulo_11 { 10 => 0, 11 => 0 } end end end end