Class: Brcobranca::Retorno::Cnab240::Itau

Inherits:
Base
  • Object
show all
Defined in:
lib/brcobranca/retorno/cnab240/itau.rb

Defined Under Namespace

Classes: Line

Constant Summary collapse

REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U =

Regex para remocao de headers/trailers e registros diferentes de T ou U.

/^((?!^.{7}3.{5}[TU].*$).)*$/

Instance Attribute Summary

Attributes inherited from Base

#abatimento_nao_aproveitado, #agencia_com_dv, #agencia_recebedora_com_dv, #agencia_sem_dv, #arquivo, #banco_recebedor, #carteira, #carteira_variacao, #cedente_com_dv, #codigo_chave_dict, #codigo_ocorrencia, #codigo_registro, #comando, #convenio, #data_credito, #data_liquidacao, #data_ocorrencia, #data_vencimento, #desconto, #desconto_concedito, #documento_numero, #especie_documento, #indicador_valor, #indicativo_lancamento, #iof, #iof_desconto, #juros_desconto, #juros_mora, #motivo_ocorrencia, #natureza_recebimento, #nosso_numero, #outras_despesas, #outros_recebimento, #sequencial, #tipo_chave_dict, #tipo_cobranca, #tipo_cobranca_anterior, #txid, #valor_abatimento, #valor_ajuste, #valor_lancamento, #valor_recebido, #valor_tarifa, #valor_titulo

Class Method Summary collapse

Methods inherited from Base

codigo_banco_do_arquivo

Class Method Details

.generate_retorno_based_on_cnab_lines(cnab_lines) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/brcobranca/retorno/cnab240/itau.rb', line 44

def self.generate_retorno_based_on_cnab_lines(cnab_lines)
  retorno = new
  cnab_lines.each do |line|
    if line.tipo_registro == "T"
      Line::REGISTRO_T_FIELDS.each do |attr|
        retorno.send(:"#{attr}=", line.send(attr))
      end
    else
      Line::REGISTRO_U_FIELDS.each do |attr|
        retorno.send(:"#{attr}=", line.send(attr))
      end
    end
  end
  retorno
end

.load_lines(file, options = {}) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/brcobranca/retorno/cnab240/itau.rb', line 12

def self.load_lines(file, options = {})
  default_options = {
    except: REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U
  }
  options = default_options.merge(options)

  lines = Line.load_lines(file, options)
  lines.each_slice(2).inject([]) do |retornos, cnab_lines|
    validate_par_t_u!(cnab_lines)
    retornos << generate_retorno_based_on_cnab_lines(cnab_lines)
  end
end

.validate_par_t_u!(cnab_lines) ⇒ Object

Garante que cada grupo de linhas T/U produzido por .load_lines esta completo e na ordem esperada antes de virar um retorno.

Um arquivo corrompido ou truncado pode gerar um grupo com so a linha T (sem a U correspondente) ou fora de ordem; sem essa checagem, generate_retorno_based_on_cnab_lines trataria silenciosamente qualquer linha que nao seja T como se fosse U, produzindo um retorno com dados de liquidacao incorretos/parciais.

Raises:

  • (ArgumentError)


33
34
35
36
37
38
39
40
41
42
# File 'lib/brcobranca/retorno/cnab240/itau.rb', line 33

def self.validate_par_t_u!(cnab_lines)
  return if cnab_lines.size == 2 &&
            cnab_lines[0].tipo_registro == "T" &&
            cnab_lines[1].tipo_registro == "U"

  sequencial = cnab_lines.first&.sequencial
  raise ArgumentError,
        "Par de registros T/U invalido ou incompleto no retorno " \
        "do Itau (sequencial: #{sequencial.inspect})"
end