class Febraban150

Constants

VERSAO
VersaoDisponivel

Public Class Methods

new(file = '', versao = '') click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 35
def initialize(file = '', versao = '')
  @sections = []
  @versao = versao

  self.valida_arquivo(file)
end

Public Instance Methods

compara_resultado(outro_layout) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 395
def compara_resultado outro_layout
  if self.layout_empresa?
    raise "Layout de comparação deve ser de Banco" unless outro_layout.layout_banco?

  elsif self.layout_banco?
    raise "Layout de comparação deve ser de Empresa" unless outro_layout.layout_empresa?

  else
    raise "Tipo de Layout não definido!"
  end
end
create_alteracao_id(id_cliente_empresa_old, agencia_debito, id_cliente_banco, id_cliente_empresa_new, ocorrencia, cod_movimento) click to toggle source

Seção D

# File lib/formatos/febraban150/febraban_150.rb, line 132
def create_alteracao_id(id_cliente_empresa_old, agencia_debito, id_cliente_banco,
                        id_cliente_empresa_new, ocorrencia, cod_movimento)

  self.valida_existe_header

  section = self.get_new_section("D")

  section.set_id_cliente_empresa_old id_cliente_empresa_old
  section.set_agencia_debito         agencia_debito
  section.set_id_cliente_banco       id_cliente_banco
  section.set_id_cliente_empresa_new id_cliente_empresa_new
  section.set_ocorrencia             ocorrencia
  section.set_reservado              ""
  section.set_cod_movimento          cod_movimento

  self.add_section_from_business section
end
create_confirmacao_processo(data_processamento) click to toggle source

Seção J

# File lib/formatos/febraban150/febraban_150.rb, line 208
def create_confirmacao_processo data_processamento
  self.valida_existe_header
  self.valida_existe_trailler

  raise "Confirmação do processo já executada" if self.get_section("J").length > 0

  header = self.get_header
  trailler = self.get_trailler

  section = self.get_new_section("J")

  section.set_numero_sequencial  header.get_numero_sequencial
  section.set_data_geracao       header.get_data_geracao
  section.set_total_processados  trailler.get_total_registros
  section.set_valor_total        trailler.get_valor_total
  section.set_data_processamento data_processamento
  section.set_reservado          ""

  self.add_section_from_business section
end
create_cronograma_faturamento(data_faturamento, data_vencimento, data_remessa_banco, data_remessa_fisica) click to toggle source

Seção L

# File lib/formatos/febraban150/febraban_150.rb, line 271
def create_cronograma_faturamento(data_faturamento, data_vencimento,
                                  data_remessa_banco, data_remessa_fisica)

  self.valida_existe_header

  section = self.get_new_section("L")

  section.set_data_faturamento       data_faturamento
  section.set_data_vencimento_fatura data_vencimento
  section.set_data_remessa_banco     data_remessa_banco
  section.set_data_remessa_fisica    data_remessa_fisica
  section.set_reservado              ""

  self.add_section_from_business section
end
create_debito_conta(id_cliente_empresa, agencia_debito, id_cliente_banco, data_vencimento, valor_debito, codigo_moeda, obs_empresa, tipo_id_cliente, id_cliente, cod_movimento) click to toggle source

Seção E

# File lib/formatos/febraban150/febraban_150.rb, line 151
def create_debito_conta(id_cliente_empresa, agencia_debito, id_cliente_banco,
                        data_vencimento, valor_debito, codigo_moeda,
                        obs_empresa, tipo_id_cliente, id_cliente,
                        cod_movimento)

  self.valida_existe_header

  section = self.get_new_section("E")

  case @versao
    when '04'
      section.set_id_cliente_empresa id_cliente_empresa
      section.set_agencia_debito     agencia_debito
      section.set_id_cliente_banco   id_cliente_banco
      section.set_data_vencimento    data_vencimento
      section.set_valor_debito       valor_debito
      section.set_codigo_moeda       codigo_moeda
      section.set_obs_empresa        obs_empresa
      section.set_reservado          ''
      section.set_cod_movimento      cod_movimento
    when '05'
      section.set_id_cliente_empresa id_cliente_empresa
      section.set_agencia_debito     agencia_debito
      section.set_id_cliente_banco   id_cliente_banco
      section.set_data_vencimento    data_vencimento
      section.set_valor_debito       valor_debito
      section.set_codigo_moeda       codigo_moeda
      section.set_obs_empresa        obs_empresa
      section.set_tipo_id_cliente    tipo_id_cliente
      section.set_id_cliente         id_cliente
      section.set_reservado          ''
      section.set_cod_movimento      cod_movimento
  end

  self.add_section_from_business section
end
create_header(codigo_remessa, codigo_convenio, nome_empresa, codigo_banco, nome_banco, numero_sequencial) click to toggle source

Seção A

# File lib/formatos/febraban150/febraban_150.rb, line 88
def create_header(codigo_remessa, codigo_convenio, nome_empresa,
                  codigo_banco, nome_banco, numero_sequencial)

  if self.get_header.nil?
    section = self.get_new_section('A')

    section.set_codigo_remessa        codigo_remessa
    section.set_codigo_convenio       codigo_convenio
    section.set_nome_empresa          nome_empresa
    section.set_codigo_banco          codigo_banco
    section.set_nome_banco            nome_banco
    section.set_data_geracao          Time.new
    section.set_numero_sequencial     numero_sequencial
    section.set_versao_layout         @versao
    section.set_identificacao_servico Febraban150A::ID_SERVICO
    section.set_reservado             ''

    self.add_section_from_business section

  else
    raise 'Header já declarado!'
  end
end
create_incentivo_debito(id_cliente_empresa, tipo_id_cliente, id_cliente, nome, cidade, estado) click to toggle source

Seção I

# File lib/formatos/febraban150/febraban_150.rb, line 189
def create_incentivo_debito(id_cliente_empresa, tipo_id_cliente, id_cliente,
                            nome, cidade, estado)

  self.valida_existe_header

  section = self.get_new_section("I")

  section.set_id_cliente_empresa id_cliente_empresa
  section.set_tipo_id_cliente    tipo_id_cliente
  section.set_id_cliente         id_cliente
  section.set_nome               nome
  section.set_cidade             cidade
  section.set_estado             estado
  section.set_reservado          ""

  self.add_section_from_business section
end
create_lei_10883(id_cliente_empresa, agencia_debito, id_cliente_banco, tipo_tratamento, valor_debito, codigo_receita, tipo_id_cliente, id_cliente) click to toggle source

Seção K

# File lib/formatos/febraban150/febraban_150.rb, line 248
def create_lei_10883(id_cliente_empresa, agencia_debito, id_cliente_banco,
                     tipo_tratamento, valor_debito, codigo_receita,
                     tipo_id_cliente, id_cliente)

  self.valida_existe_header
  valida_existe_section "E"

  section = self.get_new_section("K")

  section.set_id_cliente_empresa id_cliente_empresa
  section.set_agencia_debito     agencia_debito
  section.set_id_cliente_banco   id_cliente_banco
  section.set_tipo_tratamento    tipo_tratamento
  section.set_valor_debitado     valor_debito
  section.set_codigo_receita     codigo_receita
  section.set_tipo_id_cliente    tipo_id_cliente
  section.set_id_cliente         id_cliente
  section.set_reservado          ""

  self.add_section_from_business section
end
create_occorencias(id_cliente_empresa, agencia_debito, id_cliente_banco, ocorrencia_1, ocorrencia_2, cod_movimento) click to toggle source

Seção C

# File lib/formatos/febraban150/febraban_150.rb, line 113
def create_occorencias(id_cliente_empresa, agencia_debito, id_cliente_banco,
                       ocorrencia_1, ocorrencia_2, cod_movimento)

  self.valida_existe_header

  section = self.get_new_section("C")

  section.set_id_cliente_empresa id_cliente_empresa
  section.set_agencia_debito     agencia_debito
  section.set_id_cliente_banco   id_cliente_banco
  section.set_ocorrencia_1       ocorrencia_1
  section.set_ocorrencia_2       ocorrencia_2
  section.set_reservado          ""
  section.set_cod_movimento      cod_movimento

  self.add_section_from_business section
end
create_trailler() click to toggle source

Seção Z

# File lib/formatos/febraban150/febraban_150.rb, line 288
def create_trailler
  self.valida_existe_header

  if self.get_trailler.nil?
    if self.get_section("E").length > 0
      section = self.get_new_section("Z")
      section.set_reservado ""

      self.sections << section
      self.update_trailler
    else
      raise "Nenhum valor declarado (Seções E)!"
    end
  else
    raise "Trailler já declarado!"
  end
end
get_confirmacao() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 439
def get_confirmacao
  self.get_section("J").first()
end
get_header() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 431
def get_header
  self.get_section("A").first()
end
get_section(section) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 419
def get_section section
  self.sections.select {|c| c.is_section?(section) == true }
end
get_trailler() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 435
def get_trailler
  self.get_section("Z").first()
end
get_valor_total() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 443
def get_valor_total
  self.get_trailler.get_valor_total
end
has_section(section) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 415
def has_section section
  self.get_section(section).length > 0
end
identificacao_servico() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 451
def identificacao_servico
  self.get_header.get_identificacao_servico
end
is_sections_valid?() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 423
def is_sections_valid?
  self.sections.select {|b| b.is_valid? == false }.length == 0
end
is_valid?() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 377
def is_valid?
  if self.layout_empresa?
    raise "Layout de Empresa inválido!" unless self.is_empresa_valid?

  elsif self.layout_banco?
    raise "Layout de Banco inválido!" unless self.is_banco_valid?

  else
    raise "Código de Remessa desconhecido: #{codigo_remessa}"
  end

  result = self.is_sections_valid?
end
layout_banco?() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 455
def layout_banco?
  self.get_header.get_codigo_remessa == 2
end
layout_empresa?() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 459
def layout_empresa?
  self.get_header.get_codigo_remessa == 1
end
save(path) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 467
def save (path)
  raise "Layout atual inválido!" unless self.is_valid?
  raise "Caminho para salvamento inválido!" if path.length < 0

  if path.end_with?('/')
    header = self.get_header
    path += "#{header.get_data_geracao}_#{header.get_codigo_remessa}_#{header.get_codigo_banco}_#{self.versao_layout}.bat"
  end

  puts "Salvando arquivo: '#{path}'..."
  content = self.to_s

  File.open(path, 'w') do |file|
    file.truncate(0)
    file.write(content)
  end
  puts "Arquivo '#{path}' salvo!"

  self
end
sections() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 411
def sections
  @sections.to_a
end
to_s() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 427
def to_s
  self.sections.map {|a| a.to_s}.join("\r\n")
end
update_confirmacao_processo(data_processamento) click to toggle source

Seção J

# File lib/formatos/febraban150/febraban_150.rb, line 230
def update_confirmacao_processo data_processamento
  self.valida_existe_header
  self.valida_existe_trailler
  self.valida_existe_confirmacao

  header = self.get_header
  trailler = self.get_trailler

  section = self.get_confirmacao

  section.set_numero_sequencial  header.get_numero_sequencial
  section.set_data_geracao       header.get_data_geracao
  section.set_total_processados  trailler.get_total_registros
  section.set_valor_total        trailler.get_valor_total
  section.set_data_processamento data_processamento
end
update_trailler() click to toggle source

Seção Z

# File lib/formatos/febraban150/febraban_150.rb, line 307
def update_trailler
  self.valida_existe_trailler

  if self.get_section("E").length > 0
    section = self.get_trailler
    section.set_total_registros self.sections.length
    section.set_valor_total     self.calculate_valor_total
  else
    raise "Nenhum valor declarado (Seções E)!"
  end
end
versao_layout() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 447
def versao_layout
  self.get_header.get_versao_layout
end

Protected Instance Methods

add_section(section) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 63
def add_section section
  if section.is_valid?
    self.sections << section
  else
    raise "Seção #{section.get_id} está inválida:
            #{section.errors.inspect}
            #{section.to_s}"
  end
end
add_section_from_business(section) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 73
def add_section_from_business section
  if section.is_empresa?
    self.add_section section
    self
  else
    raise "Seção #{section.get_id} não pode ser criada pela Empresa"
  end
end
calculate_valor_total() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 489
def calculate_valor_total
  self.get_section("E").inject(0) do |sum, section|
    sum += section.get_valor_debito
  end
end
get_new_section(section_type) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 518
def get_new_section section_type
  case section_type
    when "A"
      Febraban150A.new(self, @versao)
    when "B"
      Febraban150B.new(self, @versao)
    when "C"
      Febraban150C.new(self, @versao)
    when "D"
      Febraban150D.new(self, @versao)
    when "E"
      Febraban150E.new(self, @versao)
    when "F"
      Febraban150F.new(self, @versao)
    when "H"
      Febraban150H.new(self, @versao)
    when "I"
      Febraban150I.new(self, @versao)
    when "J"
      Febraban150J.new(self, @versao)
    when "K"
      Febraban150K.new(self, @versao)
    when "L"
      Febraban150L.new(self, @versao)
    when "T"
      Febraban150T.new(self, @versao)
    when "X"
      Febraban150X.new(self, @versao)
    when "Z"
      Febraban150Z.new(self, @versao)
  end
end
is_banco_valid?() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 363
def is_banco_valid?
  self.valida_existe_header
  self.valida_existe_section "F"
  self.valida_lei_10833
  self.valida_existe_trailler

  raise "Seção C inválida para Bancos" if self.get_section("C").length > 0
  raise "Seção D inválida para Bancos" if self.get_section("D").length > 0
  raise "Seção E inválida para Bancos" if self.get_section("E").length > 0

  true
end
is_empresa_valid?() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 350
def is_empresa_valid?
  self.valida_existe_header
  self.valida_existe_section "E"
  self.valida_lei_10833
  self.valida_existe_trailler

  raise "Seção B inválida para Empresas" if self.get_section("B").length > 0
  raise "Seção F inválida para Empresas" if self.get_section("F").length > 0
  raise "Seção H inválida para Empresas" if self.get_section("H").length > 0

  true
end
process_file(location) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 499
def process_file location
  file = File.new(location, 'r')

  while (line = file.gets)
    process_string line
  end

  file.close
end
process_string(file) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 509
def process_string file
    section_type = file[0,1]

    section = get_new_section(section_type)
    section.process_section(file)

    self.add_section section
end
valida_arquivo(file = '') click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 52
def valida_arquivo(file = '')
  if file.size > 0
    self.valida_versao(file)
    self.process_file file
  end
end
valida_existe_confirmacao() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 331
def valida_existe_confirmacao
  raise "Confirmação (Seção J) ainda não declarada" if self.get_confirmacao.nil?
end
valida_existe_header() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 323
def valida_existe_header
  raise "Header (Seção A) ainda não declarado" if self.get_header.nil?
end
valida_existe_section(section) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 335
def valida_existe_section section
  raise "nenhum Registro da Seção #{section} foi declarado" if self.get_section(section).length <= 0
end
valida_existe_trailler() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 327
def valida_existe_trailler
  raise "Header (Seção Z) ainda não declarado" if self.get_trailler.nil?
end
valida_lei_10833() click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 339
def valida_lei_10833
  secaoK = self.get_section("K")

  if secaoK.length > 0
    secaoE = self.get_section("E")

    raise "Deve haver um registro da Seção K para registro da Seção E.
           Existem #{secaoK.length} registros para K e #{secaoE.length} para a seção E" if secaoK.length == secaoE.length
  end
end
valida_versao(file) click to toggle source
# File lib/formatos/febraban150/febraban_150.rb, line 43
def valida_versao(file)
  @versao = (!@versao.nil? && !@versao.empty?) ? @versao : IO.readlines(file)[0][79..80]

  unless Febraban150::VersaoDisponivel.include?(@versao)
    raise "Versão #{@versao} não suportada.
          Utilizar versões #{Febraban150::VersaoDisponivel.inspect}"
  end
end