require 'rubygems'
require 'builder'
require 'csv'

class Contabilidade::ArquivoMsc < ApplicationRecord
  has_paper_trail

  belongs_to :periodo_matriz_de_saldo_contabil, class_name: "Contabilidade::PeriodoMatrizDeSaldoContabil"

  validates_uniqueness_of :periodo_matriz_de_saldo_contabil_id, scope: [:formato]

  enum formato: { xml: 1, csv: 2 }

  before_create :gerar_arquivo_xml, if: Proc.new { self.formato == 'xml'}
  before_create :gerar_arquivo_csv, if: Proc.new { self.formato == 'csv'}

  def gerar_arquivo_xml
    # content = ::Builder::XmlMarkup.new(encoding: "ISO88591") do er ano_refere|xml|
    #   xml.xbrli:xbrl(:'xmlns:xbrli' => 'http://www.xbrl.org/2003/instance', :'xmlns:glbus' => 'http://www.xbrl.org/int/gl/bus/20150325'){
    #     # 'xmlns' "http://www.xbrl.org/2003/instance"
    #     # xml.xmlns:glbus "http://www.xbrl.org/int/gl/bus/20150325"
    #     # xml.xmlns:glcor "http://www.xbrl.org/int/gl/cor/20150325"
    #     # xml.xmlns:iso4217 "http://www.xbrl.org/2003/iso4217"
    #     # xml.xmlns:link "http://www.xbrl.org/2003/linkbase"
    #     # xml.xmlns:xlink "http://www.w3.org/1999/xlink"
    #     # xml.xmlns:xsi "http://www.w3.org/2001/XMLSchemainstance"
    #   }
    # end
    #
  end

  def gerar_arquivo_csv(exibir_progresso = false)
    periodo = "#{self.periodo_matriz_de_saldo_contabil.ano_referencia}-#{Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[self.periodo_matriz_de_saldo_contabil.mes_referencia].to_s.rjust(2, '0')}"
    configuracao = Configuracao.last
    orcamento = Orcamento.where(exercicio: self.periodo_matriz_de_saldo_contabil.ano_referencia).first
    if self.periodo_matriz_de_saldo_contabil.encerramento?
      data_inicial = Date.new(orcamento.exercicio, 12, 31)
    else
      data_inicial = Date.new(orcamento.exercicio, Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[self.periodo_matriz_de_saldo_contabil.mes_referencia], 1)
    end
    data_final = data_inicial.end_of_month

    movimentacoes_do_mes = self.periodo_matriz_de_saldo_contabil.carrega_dados_da_tabela_de_movimentacoes(data_inicial.strftime('%Y-%m-%d'), data_final.strftime('%Y-%m-%d'))

    csv_string = CSV.generate(col_sep: ";", quote_char: '"', force_quotes: true) do |csv|
      csv << ["#{configuracao.cidade.codigo_ibge}EX", "#{periodo}"]
      csv << ["CONTA", "IC1", "TIPO1", "IC2", "TIPO2", "IC3", "TIPO3", "IC4", "TIPO4", "IC5", "TIPO5", "IC6", "TIPO6", "Valor", "Tipo_valor", "Natureza_valor"]
      
      movimentacoes_mensais = Contabilidade::SaldoMensalDaContaPorInformacao
        .where(mes_referencia: Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[self.periodo_matriz_de_saldo_contabil.mes_referencia], orcamento: orcamento)
        .order(:codigo_da_conta, :ic_po, :ic_fp, :ic_dc, :ic_fr, :ic_co, :ic_cf, :ic_nr, :ic_nd, :ic_fs, :ic_es, :ic_ai, :tipo_de_saldo).all

      movimentacoes_mensais.each do |movimentacao_mensal|

        if movimentacao_mensal.valor > 0
          dados = carrega_tipo_e_ics_saldo(movimentacao_mensal)
          csv << ["#{movimentacao_mensal.codigo_da_conta}", "#{dados[:ic1]}", "#{dados[:tp1]}", "#{dados[:ic2]}", "#{dados[:tp2]}", "#{dados[:ic3]}", "#{dados[:tp3]}", "#{dados[:ic4]}", "#{dados[:tp4]}", "#{dados[:ic5]}", "#{dados[:tp5]}", "#{dados[:ic6]}", "#{dados[:tp6]}", "#{movimentacao_mensal.valor}", "#{dados[:tipo_valor]}", "#{dados[:natureza_valor]}"]
        end

        if movimentacao_mensal.saldo_inicial?
          #movimentacoes_debito = self.periodo_matriz_de_saldo_contabil.pesquisa_movimentacaoes(movimentacao_mensal.codigo_da_conta, data_inicial.strftime('%Y-%m-%d'), data_final.strftime('%Y-%m-%d'), :debito, movimentacao_mensal.ic_po, movimentacao_mensal.ic_fp, movimentacao_mensal.ic_dc, movimentacao_mensal.ic_fr, movimentacao_mensal.ic_co, movimentacao_mensal.ic_cf, movimentacao_mensal.ic_nr, movimentacao_mensal.ic_nd, movimentacao_mensal.ic_fs, movimentacao_mensal.ic_es, movimentacao_mensal.ic_ai)
          movimentacoes_debito = movimentacoes_do_mes.select{ |i| 
            i[:codigo_da_conta] == movimentacao_mensal.codigo_da_conta && 
            i[:tipo_de_lancamento] == "debito" &&
            i[:ic_po] == movimentacao_mensal.ic_po &&
            i[:ic_fp] == movimentacao_mensal.ic_fp &&
            i[:ic_dc] == movimentacao_mensal.ic_dc &&
            i[:ic_fr] == movimentacao_mensal.ic_fr &&
            i[:ic_co] == movimentacao_mensal.ic_co &&
            i[:ic_cf] == movimentacao_mensal.ic_cf &&
            i[:ic_nr] == movimentacao_mensal.ic_nr &&
            i[:ic_nd] == movimentacao_mensal.ic_nd &&
            i[:ic_fs] == movimentacao_mensal.ic_fs &&
            i[:ic_es] == movimentacao_mensal.ic_es &&
            i[:ic_ai] == movimentacao_mensal.ic_ai
          }.map{ |i| i[:valor] }.sum.to_d

          if movimentacoes_debito > 0

            movimentacao_mensal_debito = movimentacao_mensal.dup
            movimentacao_mensal_debito.natureza_do_saldo = :debito
            dados = carrega_tipo_e_ics_saldo(movimentacao_mensal_debito)
            csv << ["#{movimentacao_mensal.codigo_da_conta}", "#{dados[:ic1]}", "#{dados[:tp1]}", "#{dados[:ic2]}", "#{dados[:tp2]}", "#{dados[:ic3]}", "#{dados[:tp3]}", "#{dados[:ic4]}", "#{dados[:tp4]}", "#{dados[:ic5]}", "#{dados[:tp5]}", "#{dados[:ic6]}", "#{dados[:tp6]}", "#{movimentacoes_debito}", "period_change", "#{dados[:natureza_valor]}"]
          end

          #movimentacoes_credito = self.periodo_matriz_de_saldo_contabil.pesquisa_movimentacaoes(movimentacao_mensal.codigo_da_conta, data_inicial.strftime('%Y-%m-%d'), data_final.strftime('%Y-%m-%d'), :credito, movimentacao_mensal.ic_po, movimentacao_mensal.ic_fp, movimentacao_mensal.ic_dc, movimentacao_mensal.ic_fr, movimentacao_mensal.ic_co, movimentacao_mensal.ic_cf, movimentacao_mensal.ic_nr, movimentacao_mensal.ic_nd, movimentacao_mensal.ic_fs, movimentacao_mensal.ic_es, movimentacao_mensal.ic_ai)
          movimentacoes_credito = movimentacoes_do_mes.select{ |i| 
            i[:codigo_da_conta] == movimentacao_mensal.codigo_da_conta && 
            i[:tipo_de_lancamento] == "credito" &&
            i[:ic_po] == movimentacao_mensal.ic_po &&
            i[:ic_fp] == movimentacao_mensal.ic_fp &&
            i[:ic_dc] == movimentacao_mensal.ic_dc &&
            i[:ic_fr] == movimentacao_mensal.ic_fr &&
            i[:ic_co] == movimentacao_mensal.ic_co &&
            i[:ic_cf] == movimentacao_mensal.ic_cf &&
            i[:ic_nr] == movimentacao_mensal.ic_nr &&
            i[:ic_nd] == movimentacao_mensal.ic_nd &&
            i[:ic_fs] == movimentacao_mensal.ic_fs &&
            i[:ic_es] == movimentacao_mensal.ic_es &&
            i[:ic_ai] == movimentacao_mensal.ic_ai
          }.map{ |i| i[:valor] }.sum.to_d

          if movimentacoes_credito > 0
            movimentacao_mensal_credito = movimentacao_mensal.dup
            movimentacao_mensal_credito.natureza_do_saldo = :credito
            dados = carrega_tipo_e_ics_saldo(movimentacao_mensal_credito)
            csv << ["#{movimentacao_mensal.codigo_da_conta}", "#{dados[:ic1]}", "#{dados[:tp1]}", "#{dados[:ic2]}", "#{dados[:tp2]}", "#{dados[:ic3]}", "#{dados[:tp3]}", "#{dados[:ic4]}", "#{dados[:tp4]}", "#{dados[:ic5]}", "#{dados[:tp5]}", "#{dados[:ic6]}", "#{dados[:tp6]}", "#{movimentacoes_credito}", "period_change", "#{dados[:natureza_valor]}"]
          end
        end

      end

    end

    self.conteudo = csv_string
    self.nome_do_arquivo = "MSC_#{configuracao.cidade.codigo_ibge}EX_#{periodo}.CSV"
  end

  # def gerar_arquivo_csv_bck
  #   unless self.periodo_matriz_de_saldo_contabil.encerramento?
  #     inicio_periodo = Date.new(self.periodo_matriz_de_saldo_contabil.ano_referencia.to_i, Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[self.periodo_matriz_de_saldo_contabil.mes_referencia], 1)
  #     fim_periodo = inicio_periodo.end_of_month
  #   end

  #   orcamento = Orcamento.where(exercicio: self.periodo_matriz_de_saldo_contabil.ano_referencia).first
  #   periodo = "#{self.periodo_matriz_de_saldo_contabil.ano_referencia}-#{Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[self.periodo_matriz_de_saldo_contabil.mes_referencia].to_s.rjust(2, '0')}"
  #   configuracao = Configuracao.last
  #   contas_pcasp = Contabilidade::Conta.where(importada_do_pcasp: true, orcamento_id: orcamento.id).possui_saldos_mensais

  #   csv_string = CSV.generate(col_sep: ";", quote_char: '"', force_quotes: true) do |csv|
  #     csv << ["#{configuracao.cidade.codigo_ibge}EX", "#{periodo}"]
  #     csv << ["CONTA", "IC1", "TIPO1", "IC2", "TIPO2", "IC3", "TIPO3", "IC4", "TIPO4", "IC5", "TIPO5", "IC6", "TIPO6", "Valor", "Tipo_valor", "Natureza_valor"]
  #     contas_pcasp.each do |conta|

  #       saldos_mensais_da_conta = conta.saldo_mensal_da_conta_por_informacoes.where(mes_referencia: Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[self.periodo_matriz_de_saldo_contabil.mes_referencia], tipo_de_saldo: 'saldo_inicial')

  #       saldos_mensais_da_conta.each do |saldo_mensal|
  #         if saldo_mensal.valor > 0 
  #           dados = carrega_tipo_e_ics_saldo(saldo_mensal)

  #           csv << ["#{conta.codigo}", "#{dados[:ic1]}", "#{dados[:tp1]}", "#{dados[:ic2]}", "#{dados[:tp2]}", "#{dados[:ic3]}", "#{dados[:tp3]}", "#{dados[:ic4]}", "#{dados[:tp4]}", "#{dados[:ic5]}", "#{dados[:tp5]}", "#{dados[:ic6]}", "#{dados[:tp6]}", "#{saldo_mensal.valor}", "#{dados[:tipo_valor]}", "#{dados[:natureza_valor]}"]
  #         end

  #         if self.periodo_matriz_de_saldo_contabil.encerramento?
  #           movimentacoes_por_informacao = conta.movimentacoes_do_plano_de_contas.encerramento.where(ic_po: saldo_mensal.ic_po, ic_fp: saldo_mensal.ic_fp, 
  #             ic_dc: saldo_mensal.ic_dc, ic_fr: saldo_mensal.ic_fr, ic_co: saldo_mensal.ic_co, ic_cf: saldo_mensal.ic_cf, ic_nr: saldo_mensal.ic_nr, 
  #             ic_nd: saldo_mensal.ic_nd, ic_fs: saldo_mensal.ic_fs, ic_es: saldo_mensal.ic_es, ic_ai: saldo_mensal.ic_ai)
  #         else
  #           movimentacoes_por_informacao = conta.movimentacoes_do_plano_de_contas.where('coalesce(lancamento_manual, 0) != 1000').where('data_de_lancamento >= ? and data_de_lancamento <= ?', inicio_periodo, 
  #             fim_periodo).where(ic_po: saldo_mensal.ic_po, ic_fp: saldo_mensal.ic_fp, ic_dc: saldo_mensal.ic_dc, ic_fr: saldo_mensal.ic_fr, ic_co: saldo_mensal.ic_co, 
  #             ic_cf: saldo_mensal.ic_cf, ic_nr: saldo_mensal.ic_nr, ic_nd: saldo_mensal.ic_nd, ic_fs: saldo_mensal.ic_fs, ic_es: saldo_mensal.ic_es, ic_ai: saldo_mensal.ic_ai)
  #         end
          
  #         saldo_final = saldo_mensal.natureza_do_saldo == 'credito' ? saldo_mensal.valor : saldo_mensal.valor * -1

  #         movimentacoes_por_informacao.each do |movimentacao|
  #           valor = movimentacao.tipo_de_lancamento == 'credito' ? movimentacao.valor : movimentacao.valor * -1
  #           saldo_final = saldo_final + valor
  #           natureza_valor = movimentacao.tipo_de_lancamento == 'debito' ? 'D' : 'C'
  #           dados = carrega_tipo_e_ics_movimentacao(movimentacao)
  #           csv << ["#{conta.codigo}", "#{dados[:ic1]}", "#{dados[:tp1]}", "#{dados[:ic2]}", "#{dados[:tp2]}", "#{dados[:ic3]}", "#{dados[:tp3]}", "#{dados[:ic4]}", "#{dados[:tp4]}", "#{dados[:ic5]}", "#{dados[:tp5]}", "#{dados[:ic6]}", "#{dados[:tp6]}", "#{movimentacao.valor}", "period_change", "#{natureza_valor}"]
  #         end

  #         registro_saldo_final = conta.saldo_mensal_da_conta_por_informacoes.new(
  #           mes_referencia: self.periodo_matriz_de_saldo_contabil.mes_referencia,
  #           orcamento_id: conta.orcamento.id,
  #           tipo_de_saldo: 'saldo_final',
  #           natureza_do_saldo: saldo_final < 0 ? 'debito' : 'credito',
  #           valor: saldo_final >= 0 ? saldo_final : saldo_final * -1,
  #           ic_po: saldo_mensal.ic_po,
  #           ic_fp: saldo_mensal.ic_fp,
  #           ic_dc: saldo_mensal.ic_dc,
  #           ic_fr: saldo_mensal.ic_fr,
  #           ic_co: saldo_mensal.ic_co,
  #           ic_cf: saldo_mensal.ic_cf,
  #           ic_nr: saldo_mensal.ic_nr,
  #           ic_nd: saldo_mensal.ic_nd,
  #           ic_fs: saldo_mensal.ic_fs,
  #           ic_es: saldo_mensal.ic_es,
  #           ic_ai: saldo_mensal.ic_ai
  #         )

  #         if registro_saldo_final.save! && registro_saldo_final.valor > 0
  #           dados = carrega_tipo_e_ics_saldo(registro_saldo_final)

  #           csv << ["#{conta.codigo}", "#{dados[:ic1]}", "#{dados[:tp1]}", "#{dados[:ic2]}", "#{dados[:tp2]}", "#{dados[:ic3]}", "#{dados[:tp3]}", "#{dados[:ic4]}", "#{dados[:tp4]}", "#{dados[:ic5]}", "#{dados[:tp5]}", "#{dados[:ic6]}", "#{dados[:tp6]}", "#{registro_saldo_final.valor}", "#{dados[:tipo_valor]}", "#{dados[:natureza_valor]}"]
  #         end

  #       end
  #     end
  #   end

  #   self.conteudo = csv_string
  #   self.nome_do_arquivo = "MSC_#{configuracao.cidade.codigo_ibge}EX_#{periodo}.CSV"
  # end

  # def carrega_tipo_e_ics_lancamento(movimentacao, lancamento)
  #   conjunto_ici = {}
  #   codigo_superavit_financeiro_numerico = movimentacao.codigo_superavit_financeiro == 'F' ? '1' : '2'
  #   codigo_fonte_de_recursos_formatado = lancamento.orcamento_da_receita.fonte_de_recursos.codigo_completo.first(4)

  #   case movimentacao.conta_por_evento_contabil.conta.informacao_complementar
  #   when 'po_fp_fr'
  #     conjunto_ici = { tp1: 'PO', tp2: 'FP', tp3: 'FR', tp4: nil, tp5: nil, tp6: nil, ic1: movimentacao.poder_ou_orgao_formatado, ic2: codigo_superavit_financeiro_numerico, ic3: codigo_fonte_de_recursos_formatado, ic4: nil, ic5: nil, ic6: nil}
  #   when 'po_fp_dc_fr'
  #     conjunto_ici = { tp1: 'PO', tp2: 'FP', tp3: 'DC', tp4: 'FR', tp5: nil, tp6: nil, ic1: movimentacao.poder_ou_orgao_formatado, ic2: codigo_superavit_financeiro_numerico, ic3: nil, ic4: codigo_fonte_de_recursos_formatado, ic5: nil, ic6: nil }
  #   when 'po_fr'
  #     conjunto_ici = { tp1: 'PO', tp2: 'FR', tp3: nil, tp4: nil, tp5: nil, tp6: nil, ic1: movimentacao.poder_ou_orgao_formatado, ic2: codigo_fonte_de_recursos_formatado, ic3: nil, ic4: nil, ic5: nil, ic6: nil }
  #   when 'po_fr_cf_nr'
  #     conjunto_ici = { tp1: 'PO', tp2: 'FR', tp3: 'CF', tp4: 'NR', tp5: nil, tp6: nil, ic1: movimentacao.poder_ou_orgao_formatado, ic2: codigo_fonte_de_recursos_formatado, ic3: nil, ic4: nil, ic5: nil, ic6: nil  }
  #   when 'po_fp_fr_co'
  #     conjunto_ici = { tp1: 'PO', tp2: 'FP', tp3: 'FR', tp4: 'CO', tp5: nil, tp6: nil, ic1: movimentacao.poder_ou_orgao_formatado, ic2: codigo_superavit_financeiro_numerico, ic3: codigo_fonte_de_recursos_formatado, ic4: movimentacao.codigo_acompanhamento_formatado, ic5: nil, ic6: nil  }
  #   when 'po_fr_co_nr'
  #     conjunto_ici = { tp1: 'PO', tp2: 'FR', tp3: 'CO', tp4: 'NR', tp5: nil, tp6: nil, ic1: movimentacao.poder_ou_orgao_formatado, ic2: codigo_fonte_de_recursos_formatado, ic3: movimentacao.codigo_acompanhamento_formatado, ic4: movimentacao.codigo_natureza_da_receita_formatada, ic5: nil, ic6: nil }
  #   when 'po_fs_fr_co_nd'
  #     conjunto_ici = { tp1: 'PO', tp2: 'FS', tp3: 'FR', tp4: 'CO', tp5: 'ND', tp6: nil, ic1: movimentacao.poder_ou_orgao_formatado, ic2: nil, ic3: codigo_fonte_de_recursos_formatado, ic4: movimentacao.codigo_acompanhamento_formatado, ic5: movimentacao.codigo_natureza_da_despesa_formatada, ic6: nil }
  #   when 'po_fs_fr_co_nd_ai'
  #     conjunto_ici = { tp1: 'PO', tp2: 'FS', tp3: 'FR', tp4: 'CO', tp5: 'ND', tp6: 'AI', ic1: movimentacao.poder_ou_orgao_formatado, ic2: nil, ic3: codigo_fonte_de_recursos_formatado, ic4: movimentacao.codigo_acompanhamento_formatado, ic5: movimentacao.codigo_natureza_da_despesa_formatada, ic6: nil}
  #   end

  #   conjunto_ici
  # end

  def carrega_tipo_e_ics_movimentacao(movimentacao)
    conjunto_ici = {}
    ics = []

    if movimentacao.ic_po.present?
      ics << {tp: "PO", ic: "#{movimentacao.ic_po}"}
    end

    if movimentacao.ic_fp.present?
      ics << {tp: "FP", ic: "#{movimentacao.ic_fp}"}  
    end

    if movimentacao.ic_dc.present?
      ics << {tp: "DC", ic: "#{movimentacao.ic_dc}"}
    end

    if movimentacao.ic_fr.present?
      ics << {tp: "FR", ic: "#{movimentacao.ic_fr}"}
    end

    if movimentacao.ic_co.present?
      ics << {tp: "CO", ic: "#{movimentacao.ic_co}"}
    end

    if movimentacao.ic_cf.present?
      ics << {tp: "CF", ic: "#{movimentacao.ic_cf}"}
    end

    if movimentacao.ic_nr.present?
      ics << {tp: "NR", ic: "#{movimentacao.ic_nr}"}
    end

    if movimentacao.ic_nd.present?
      ics << {tp: "ND", ic: "#{movimentacao.ic_nd}"}
    end

    if movimentacao.ic_fs.present?
      ics << {tp: "FS", ic: "#{movimentacao.ic_fs}"}
    end

    if movimentacao.ic_ai.present?
      ics << {tp: "AI", ic: "#{movimentacao.ic_ai}"}
    end

    tp1 = ics[0][:tp] rescue nil
    tp2 = ics[1][:tp] rescue nil
    tp3 = ics[2][:tp] rescue nil
    tp4 = ics[3][:tp] rescue nil
    tp5 = ics[4][:tp] rescue nil
    tp6 = ics[5][:tp] rescue nil
    ic1 = ics[0][:ic] rescue nil
    ic2 = ics[1][:ic] rescue nil
    ic3 = ics[2][:ic] rescue nil
    ic4 = ics[3][:ic] rescue nil
    ic5 = ics[4][:ic] rescue nil
    ic6 = ics[5][:ic] rescue nil

    conjunto_ici = { tp1: tp1, tp2: tp2, tp3: tp3, tp4: tp4, tp5: tp5, tp6: tp6, ic1: ic1, ic2: ic2, ic3: ic3, ic4: ic4, ic5: ic5, ic6: ic6 }

    conjunto_ici
  end

  def carrega_tipo_e_ics_saldo(registro_saldo)
    conjunto_ici = {}
    ics = []

    tipo_valor = registro_saldo.tipo_de_saldo == 'saldo_inicial' ? 'beginning_balance' : 'ending_balance'
    natureza_valor = registro_saldo.natureza_do_saldo == 'debito' ? 'D' : 'C'

    if registro_saldo.ic_po.present?
      ics << {tp: "PO", ic: "#{registro_saldo.ic_po}"}
    end

    if registro_saldo.ic_fp.present?
      ics << {tp: "FP", ic: "#{registro_saldo.ic_fp}"}  
    end

    if registro_saldo.ic_dc.present?
      ics << {tp: "DC", ic: "#{registro_saldo.ic_dc}"}
    end

    if registro_saldo.ic_fr.present?
      ics << {tp: "FR", ic: "#{registro_saldo.ic_fr}"}
    end

    if registro_saldo.ic_co.present?
      ics << {tp: "CO", ic: "#{registro_saldo.ic_co}"}
    end

    if registro_saldo.ic_cf.present?
      ics << {tp: "CF", ic: "#{registro_saldo.ic_cf}"}
    end

    if registro_saldo.ic_nr.present?
      ics << {tp: "NR", ic: "#{registro_saldo.ic_nr}"}
    end

    if registro_saldo.ic_nd.present?
      ics << {tp: "ND", ic: "#{registro_saldo.ic_nd}"}
    end

    if registro_saldo.ic_fs.present?
      ics << {tp: "FS", ic: "#{registro_saldo.ic_fs}"}
    end

    if registro_saldo.ic_ai.present?
      ics << {tp: "AI", ic: "#{registro_saldo.ic_ai}"}
    end

    tp1 = ics[0][:tp] rescue nil
    tp2 = ics[1][:tp] rescue nil
    tp3 = ics[2][:tp] rescue nil
    tp4 = ics[3][:tp] rescue nil
    tp5 = ics[4][:tp] rescue nil
    tp6 = ics[5][:tp] rescue nil
    ic1 = ics[0][:ic] rescue nil
    ic2 = ics[1][:ic] rescue nil
    ic3 = ics[2][:ic] rescue nil
    ic4 = ics[3][:ic] rescue nil
    ic5 = ics[4][:ic] rescue nil
    ic6 = ics[5][:ic] rescue nil

    conjunto_ici = { tp1: tp1, tp2: tp2, tp3: tp3, tp4: tp4, tp5: tp5, tp6: tp6, ic1: ic1, ic2: ic2, ic3: ic3, ic4: ic4, ic5: ic5, ic6: ic6, tipo_valor: tipo_valor, natureza_valor: natureza_valor }

    conjunto_ici
  end

end
