# -*- encoding: utf-8 -*-
#
# Sicredi
# Documentação: http://www.shapeness.net.br/upload//Sicredi_240.pdf
#
module Brcobranca
module Boleto
class Sicredi < Base # Banco SICREDI
# 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 :numero_documento, 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.'
validates_length_of :carteira, maximum: 2, message: 'deve ser menor ou igual a 2 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'
# Nova instancia do Bradesco
# @param (see Brcobranca::Boleto::Base#initialize)
def initialize(campos = {})
campos = { carteira: '03', especie_documento: 'A' }.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(2, '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
# Dígito verificador do banco
# @return [String] 1 caractere.
def banco_dv
'X'
end
# Nosso número para exibir no boleto.
# @return [String]
# @example
# boleto.nosso_numero_boleto #=> "14/200022-5"
def nosso_numero_boleto
"#{numero_documento_with_byte_idt[0..1]}/#{numero_documento_with_byte_idt[2..-1]}-#{nosso_numero_dv}"
end
def numero_documento_with_byte_idt
"#{data_documento.strftime('%y')}#{byte_idt}#{numero_documento}"
end
# Número seqüencial utilizado para identificar o boleto.
# @return [String] 5 caracteres numéricos.
def numero_documento=(valor)
@numero_documento = valor.to_s.rjust(5, '0') if valor
end
# Codigo referente ao tipo de cobrança
# @return [String]: 1 caractere numérico
def tipo_cobranca
'3'
end
# Codigo referente ao tipo de carteira
# @return [String]: 1 caractere numérico
def tipo_carteira
'1' if carteira == '03'
end
# Dígito verificador do nosso número
# @return [Integer] 1 caracteres numéricos.
def nosso_numero_dv
"#{agencia_posto_conta}#{numero_documento_with_byte_idt}"
.modulo11(mapeamento: mapeamento_para_modulo_11)
end
def agencia_conta_boleto
"#{agencia}.#{posto}.#{conta_corrente}"
end
def agencia_posto_conta
"#{agencia}#{posto}#{conta_corrente}"
end
# Segunda parte do código de barras.
def codigo_barras_segunda_parte
campo_livre = "#{tipo_cobranca}#{tipo_carteira}#{nosso_numero_boleto.gsub(/\D/, '')}#{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