class Contabilidade::PeriodoMatrizDeSaldoContabil < ApplicationRecord
  has_paper_trail

  attr_accessor :exibir_progresso
  attr_default :exibir_progresso, false

  has_many :arquivos_msc, class_name: 'Contabilidade::ArquivoMsc'
  has_many :mapeamentos_manuais, class_name: 'Contabilidade::MapeamentoManual'

  accepts_nested_attributes_for :mapeamentos_manuais, reject_if: :all_blank, allow_destroy: true
  validates_associated :mapeamentos_manuais

  validates_presence_of :mes_referencia, :ano_referencia
  validates_uniqueness_of :mes_referencia, scope: [:ano_referencia], message: 'Arquivo do período já foi gerado.'

  validate :mes_pode_ser_gerado?, if: proc { self.mes_referencia.present? }

  before_create :preenche_dados
  before_destroy :apaga_saldos_e_movimentacoes_da_conta_por_informacoes

  enum mes_referencia: {
    janeiro: 1,
    fevereiro: 2,
    marco: 3,
    abril: 4,
    maio: 5,
    junho: 6,
    julho: 7,
    agosto: 8,
    setembro: 9,
    outubro: 10,
    novembro: 11,
    dezembro: 12,
    encerramento: 13
  }

  enum status: {
    arquivo_gerado: 1,
    arquivo_enviado: 2
  }

  after_create :criar_arquivos

  def criar_arquivos
    file_csv = self.arquivos_msc.new(formato: 'csv')
    file_csv.save

    file_xml = self.arquivos_msc.new(formato: 'xml')
    file_xml.save

    self.status = 'arquivo_gerado'
    self.save
  end

  def preenche_dados(exibir_progresso = false)
    orcamento = Orcamento.where(exercicio: self.ano_referencia).first
    if self.mes_referencia == 'encerramento'
      mes = 'dezembro'
    else
      mes = self.mes_referencia
    end

    if self.janeiro?
      mes_anterior = 12
      orcamento_anterior = Orcamento.where(exercicio: self.ano_referencia - 1).first
    else
      mes_anterior = self.encerramento? ? 12 : Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[mes] - 1
      orcamento_anterior = orcamento
    end
    data_inicial = Date.new(orcamento.exercicio, Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[mes], 1)
    data_final = data_inicial.end_of_month

    condicao_contas = ""
    if self.encerramento?
      condicao_contas = "codigo_da_conta not in ('531700000', '631710000', '631720000', '532700000', '632700000')"
    end

    if self.janeiro?
      tabela_anterior = Contabilidade::MovimentacaoDoPlanoDeContas
        .select(: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)
        .where("data_de_lancamento between ? and ?", data_inicial.strftime('%Y-%m-%d'), data_final.strftime('%Y-%m-%d'))
        .where("coalesce(lancamento_manual, 0) = 999")
        .group(: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)
        .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)
        .pluck(: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)
    else
      tabela_anterior = Contabilidade::SaldoMensalDaContaPorInformacao
        .select(: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)
        .where("mes_referencia = ? and orcamento_id = ?", mes_anterior, orcamento_anterior.id)
        .where(condicao_contas)
        .group(: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)
        .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)
        .pluck(: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)
    end

    if self.encerramento?
      condicao_lancamento_manual = 'coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) in (1000, 1001)'
    else
      condicao_lancamento_manual = 'coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) != 1000'
    end
    tabela = Contabilidade::MovimentacaoDoPlanoDeContas
      .select(: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)
      .where("data_de_lancamento between ? and ?", data_inicial.strftime('%Y-%m-%d'), data_final.strftime('%Y-%m-%d'))
      .where("coalesce(lancamento_manual, 0) != 999")
      .where(condicao_contas)
      .where(condicao_lancamento_manual)
      .group(: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)
      .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)
      .pluck(: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)
      
    grupos = (tabela_anterior + tabela).uniq

    movimentacoes_do_mes = carrega_dados_da_tabela_de_movimentacoes(data_inicial, data_final)
    saldos_finais = carrega_tabela_saldo_mensal(mes_anterior, orcamento_anterior, data_inicial, data_final)
    contas_pcasp = orcamento.contas.map(&:attributes)

    registros_de_saldos = []
    grupos.each do |grupo|

      #saldo_final_anterior = pesquisa_saldo_anterior(grupo[0], mes_anterior, orcamento_anterior, grupo[1], grupo[2], grupo[3], grupo[4], grupo[5], grupo[6], grupo[7], grupo[8], grupo[9], grupo[10], grupo[11])
      saldo_final_anterior = saldos_finais.select{ |i| 
        i[:codigo_da_conta] == grupo[0] && 
        i[:ic_po] == grupo[1] &&
        i[:ic_fp] == grupo[2] &&
        i[:ic_dc] == grupo[3] &&
        i[:ic_fr] == grupo[4] &&
        i[:ic_co] == grupo[5] &&
        i[:ic_cf] == grupo[6] &&
        i[:ic_nr] == grupo[7] &&
        i[:ic_nd] == grupo[8] &&
        i[:ic_fs] == grupo[9] &&
        i[:ic_es] == grupo[10] &&
        i[:ic_ai] == grupo[11]
      }

      if saldo_final_anterior.size > 1
        total_debito = saldo_final_anterior.select{ |i| i[:tipo_de_lancamento] == "debito" }.map { |i| i[:valor] }.sum
        total_credito = saldo_final_anterior.select{ |i| i[:tipo_de_lancamento] == "credito" }.map { |i| i[:valor] }.sum

        if total_debito > total_credito
          total = total_debito - total_credito
          tipo_de_saldo_inicial = 1
        else
          total = total_credito - total_debito
          tipo_de_saldo_inicial = 2
        end
      else
        total = saldo_final_anterior.first[:valor] rescue 0
        tipo_de_saldo_inicial = saldo_final_anterior.first[:natureza_do_saldo] || saldo_final_anterior.first[:tipo_de_lancamento] unless saldo_final_anterior.empty?
      end
      
      if saldo_final_anterior.present?
        saldo_final_anterior = saldo_final_anterior.first
        saldo_inicial = Contabilidade::SaldoMensalDaContaPorInformacao.new
        saldo_inicial.ic_po = saldo_final_anterior[:ic_po]
        saldo_inicial.ic_fp = saldo_final_anterior[:ic_fp]
        saldo_inicial.ic_dc = saldo_final_anterior[:ic_dc]
        saldo_inicial.ic_fr = saldo_final_anterior[:ic_fr]
        saldo_inicial.ic_co = saldo_final_anterior[:ic_co]
        saldo_inicial.ic_cf = saldo_final_anterior[:ic_cf]
        saldo_inicial.ic_nr = saldo_final_anterior[:ic_nr]
        saldo_inicial.ic_nd = saldo_final_anterior[:ic_nd]
        saldo_inicial.ic_fs = saldo_final_anterior[:ic_fs]
        saldo_inicial.ic_es = saldo_final_anterior[:ic_es]
        saldo_inicial.ic_ai = saldo_final_anterior[:ic_ai]
        saldo_inicial.codigo_da_conta = saldo_final_anterior[:codigo_da_conta]
        saldo_inicial.valor = total
        saldo_inicial.natureza_do_saldo = tipo_de_saldo_inicial
        saldo_inicial.orcamento = orcamento
        saldo_inicial.mes_referencia = self.encerramento? ? 13 : mes
        saldo_inicial.tipo_de_saldo = 'saldo_inicial'
        saldo_inicial.conta_id = contas_pcasp.select{ |i| i["codigo"] == grupo[0] }.first["id"]

        registros_de_saldos << saldo_inicial
      else
        saldo_inicial = Contabilidade::SaldoMensalDaContaPorInformacao.new
        saldo_inicial.orcamento = orcamento
        saldo_inicial.mes_referencia = self.encerramento? ? 13 : mes
        saldo_inicial.codigo_da_conta = grupo[0]
        saldo_inicial.ic_po = grupo[1]
        saldo_inicial.ic_fp = grupo[2]
        saldo_inicial.ic_dc = grupo[3]
        saldo_inicial.ic_fr = grupo[4]
        saldo_inicial.ic_co = grupo[5]
        saldo_inicial.ic_cf = grupo[6]
        saldo_inicial.ic_nr = grupo[7]
        saldo_inicial.ic_nd = grupo[8]
        saldo_inicial.ic_fs = grupo[9]
        saldo_inicial.ic_es = grupo[10]
        saldo_inicial.ic_ai = grupo[11]
        saldo_inicial.valor = 0
        saldo_inicial.tipo_de_saldo = 'saldo_inicial'
        saldo_inicial.conta_id = contas_pcasp.select{ |i| i["codigo"] == grupo[0] }.first["id"]
        saldo_inicial.natureza_do_saldo = contas_pcasp.select{ |i| i["codigo"] == grupo[0] }.first["natureza_do_saldo"] == :credor ? :credito : :debito

        registros_de_saldos << saldo_inicial
      end

      #movimentacoes_debito = pesquisa_movimentacaoes(grupo[0], data_inicial.strftime('%Y-%m-%d'), data_final.strftime('%Y-%m-%d'), :debito, grupo[1], grupo[2], grupo[3], grupo[4], grupo[5], grupo[6], grupo[7], grupo[8], grupo[9], grupo[10], grupo[11])
      #movimentacoes_credito = pesquisa_movimentacaoes(grupo[0], data_inicial.strftime('%Y-%m-%d'), data_final.strftime('%Y-%m-%d'), :credito, grupo[1], grupo[2], grupo[3], grupo[4], grupo[5], grupo[6], grupo[7], grupo[8], grupo[9], grupo[10], grupo[11])
      
      movimentacoes_debito = movimentacoes_do_mes.select{ |i| 
        i[:codigo_da_conta] == grupo[0] && 
        i[:tipo_de_lancamento] == "debito" &&
        i[:ic_po] == grupo[1] &&
        i[:ic_fp] == grupo[2] &&
        i[:ic_dc] == grupo[3] &&
        i[:ic_fr] == grupo[4] &&
        i[:ic_co] == grupo[5] &&
        i[:ic_cf] == grupo[6] &&
        i[:ic_nr] == grupo[7] &&
        i[:ic_nd] == grupo[8] &&
        i[:ic_fs] == grupo[9] &&
        i[:ic_es] == grupo[10] &&
        i[:ic_ai] == grupo[11]
      }.map{ |i| i[:valor] }.sum.to_d

      movimentacoes_credito = movimentacoes_do_mes.select{ |i| 
        i[:codigo_da_conta] == grupo[0] && 
        i[:tipo_de_lancamento] == "credito" &&
        i[:ic_po] == grupo[1] &&
        i[:ic_fp] == grupo[2] &&
        i[:ic_dc] == grupo[3] &&
        i[:ic_fr] == grupo[4] &&
        i[:ic_co] == grupo[5] &&
        i[:ic_cf] == grupo[6] &&
        i[:ic_nr] == grupo[7] &&
        i[:ic_nd] == grupo[8] &&
        i[:ic_fs] == grupo[9] &&
        i[:ic_es] == grupo[10] &&
        i[:ic_ai] == grupo[11]
      }.map{ |i| i[:valor] }.sum.to_d

      if saldo_inicial.debito?
        valor_do_saldo = saldo_inicial.valor + movimentacoes_debito - movimentacoes_credito
        natureza_final = :debito

        if valor_do_saldo < 0
          valor_do_saldo = valor_do_saldo * -1
          natureza_final = :credito
        end
      else
        valor_do_saldo = saldo_inicial.valor +  movimentacoes_credito - movimentacoes_debito
        natureza_final = :credito

        if valor_do_saldo < 0
          valor_do_saldo = valor_do_saldo * -1
          natureza_final = :debito
        end
      end

      saldo_final = saldo_inicial.dup
      saldo_final.tipo_de_saldo = 'saldo_final'
      saldo_final.valor = valor_do_saldo
      saldo_final.natureza_do_saldo = natureza_final
      registros_de_saldos << saldo_final
    end
    Contabilidade::SaldoMensalDaContaPorInformacao.import registros_de_saldos
  end

  def pesquisa_saldo_anterior(codigo_da_conta, mes_referencia, orcamento_id, ic_po, ic_fp, ic_dc, ic_fr, ic_co, ic_cf, ic_nr, ic_nd, ic_fs, ic_es, ic_ai)
    saldo_anterior = Contabilidade::SaldoMensalDaContaPorInformacao
      .where(
        codigo_da_conta: codigo_da_conta,
        ic_po: ic_po,
        ic_fp: ic_fp,
        ic_dc: ic_dc,
        ic_fr: ic_fr,
        ic_co: ic_co,
        ic_cf: ic_cf,
        ic_nr: ic_nr,
        ic_nd: ic_nd,
        ic_fs: ic_fs,
        ic_es: ic_es,
        ic_ai: ic_ai,
        tipo_de_saldo: 2,
        mes_referencia: mes_referencia,
        orcamento_id: orcamento_id
      )
  end

  def carrega_tabela_saldo_mensal(mes_referencia, orcamento_id, data_inicial, data_final)
    if self.janeiro?
      Contabilidade::MovimentacaoDoPlanoDeContas.where("coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) = 999 and data_de_lancamento between ? and ?", data_inicial, data_final).includes({ conta_por_evento_contabil: [:evento_contabil] }, :unidade_orcamentaria).map(&:attributes).map(&:symbolize_keys)
    else
      saldo_anterior = Contabilidade::SaldoMensalDaContaPorInformacao
        .where(
          tipo_de_saldo: 2,
          mes_referencia: mes_referencia,
          orcamento_id: orcamento_id
        ).map(&:attributes).map(&:symbolize_keys)
    end
  end

  def pesquisa_movimentacaoes(codigo_da_conta, data_inicial, data_final, tipo_de_lancamento, ic_po, ic_fp, ic_dc, ic_fr, ic_co, ic_cf, ic_nr, ic_nd, ic_fs, ic_es, ic_ai)
    if self.encerramento?
      condicao_lancamento_manual = 'coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) in (1000, 1001)'
    else
      condicao_lancamento_manual = 'coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) != 1000'
    end

    saldo_anterior = Contabilidade::MovimentacaoDoPlanoDeContas
      .where(condicao_lancamento_manual)
      .where(
        codigo_da_conta: codigo_da_conta,
        tipo_de_lancamento: tipo_de_lancamento,
        ic_po: ic_po,
        ic_fp: ic_fp,
        ic_dc: ic_dc,
        ic_fr: ic_fr,
        ic_co: ic_co,
        ic_cf: ic_cf,
        ic_nr: ic_nr,
        ic_nd: ic_nd,
        ic_fs: ic_fs,
        ic_es: ic_es,
        ic_ai: ic_ai
      ).where("data_de_lancamento between ? and ?", data_inicial, data_final).sum(:valor).to_d
  end

  def carrega_dados_da_tabela_de_movimentacoes(data_inicial, data_final)
    if self.encerramento?
      condicao_lancamento_manual = 'coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) in (1000, 1001) and coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) != 999'
    else
      condicao_lancamento_manual = 'coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) != 1000 and coalesce(contabilidade_movimentacoes_do_plano_de_contas.lancamento_manual, 0) != 999'
    end

    Contabilidade::MovimentacaoDoPlanoDeContas.where(condicao_lancamento_manual).where("data_de_lancamento between ? and ?", data_inicial, data_final).includes({ conta_por_evento_contabil: [:evento_contabil] }, :unidade_orcamentaria).map(&:attributes).map(&:symbolize_keys)
  end



  # def gerar_saldos_iniciais_do_periodo
  #   if self.mes_referencia == 'encerramento'
  #     mes = 'dezembro'
  #   else
  #     mes = self.mes_referencia
  #   end
  #   inicio_periodo = Date.new(self.ano_referencia.to_i, Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[mes], 1)
  #   fim_periodo = inicio_periodo.end_of_month
  #   orcamento = Orcamento.where(exercicio: self.ano_referencia).first
  #   orcamento_anterior = Orcamento.where(exercicio: self.ano_referencia - 1).first
  #   contas_pcasp = Contabilidade::Conta.where(importada_do_pcasp: true, orcamento_id: orcamento.id)
  #   mes_de_referencia = Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[mes] - 1
    
  #   if exibir_progresso == true
  #     bar = RakeProgressbar.new(contas_pcasp.size)
  #   end

  #   usa_orcamento_anterior = false
  #   if mes_de_referencia.zero?
  #     mes_de_referencia = 12
  #     usa_orcamento_anterior = true
  #   elsif mes_de_referencia == 13
  #     mes_de_referencia = 12
  #     usa_orcamento_anterior = false
  #   end

  #   contas_pcasp.each do |conta|
      
  #     if usa_orcamento_anterior
  #       conta_do_periodo_anterior = Contabilidade::Conta.where(codigo: conta.codigo, orcamento: orcamento_anterior).first 
  #       saldos_finais_da_conta_periodo_anterior = conta_do_periodo_anterior.saldo_mensal_da_conta_por_informacoes.where(orcamento: orcamento_anterior, mes_referencia: mes_de_referencia, tipo_de_saldo: 'saldo_final')
  #     else
  #       saldos_finais_da_conta_periodo_anterior = conta.saldo_mensal_da_conta_por_informacoes.where(orcamento: orcamento, mes_referencia: mes_de_referencia, tipo_de_saldo: 'saldo_final')
  #     end

  #     saldos_finais_da_conta_periodo_anterior.each do |saldo_final_anterior|
  #       saldo_inicial = saldo_final_anterior.dup
  #       saldo_inicial.orcamento = usa_orcamento_anterior == true ? orcamento_anterior : orcamento
  #       saldo_inicial.mes_referencia = mes
  #       saldo_inicial.tipo_de_saldo = 'saldo_inicial'

  #       saldo_inicial.save
  #     end

  #     conta.movimentacoes_do_plano_de_contas.where('coalesce(lancamento_manual, 0) != 1000').where('data_de_lancamento >= ? and data_de_lancamento <= ?', inicio_periodo, fim_periodo).each do |movimentacao|

  #       saldo_inicial = conta.saldo_mensal_da_conta_por_informacoes.where(ic_po: movimentacao.ic_po, ic_fp: movimentacao.ic_fp, ic_dc: movimentacao.ic_dc, 
  #         ic_fr: movimentacao.ic_fr, ic_co: movimentacao.ic_co, ic_cf: movimentacao.ic_cf, ic_nr: movimentacao.ic_nr, ic_nd: movimentacao.ic_nd, 
  #         ic_fs: movimentacao.ic_fs, ic_es: movimentacao.ic_es, ic_ai: movimentacao.ic_ai, mes_referencia: self.mes_referencia, tipo_de_saldo: 'saldo_inicial').first

  #       unless saldo_inicial.present?
  #         saldo_inicial = conta.saldo_mensal_da_conta_por_informacoes.new(
  #           mes_referencia: self.mes_referencia,
  #           orcamento_id: conta.orcamento.id,
  #           tipo_de_saldo: 'saldo_inicial',
  #           natureza_do_saldo: 'credito',
  #           valor: 0.00,
  #           ic_po: movimentacao.ic_po,
  #           ic_fp: movimentacao.ic_fp,
  #           ic_dc: movimentacao.ic_dc,
  #           ic_fr: movimentacao.ic_fr,
  #           ic_co: movimentacao.ic_co,
  #           ic_cf: movimentacao.ic_cf,
  #           ic_nr: movimentacao.ic_nr,
  #           ic_nd: movimentacao.ic_nd,
  #           ic_fs: movimentacao.ic_fs,
  #           ic_es: movimentacao.ic_es,
  #           ic_ai: movimentacao.ic_ai
  #         )

  #         saldo_inicial.save!
  #       end
  #     end
  #     bar.inc if bar.present?
  #   end

  #   bar.finished if bar.present?
  # end

  def mes_pode_ser_gerado?
    if self.mes_referencia == 'encerramento'
      mes = 'dezembro'
    else
      mes = self.mes_referencia
    end
    periodo = Date.new(self.ano_referencia.to_i, Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[mes], 1).end_of_month

    if Date.today <= periodo
      errors.add(:base, "Período não foi finalizado e não pode ser gerado.")
    end

    if self.mes_referencia == 'encerramento'
      orcamento = Orcamento.where(exercicio: self.ano_referencia).first rescue nil

      unless Contabilidade::SaldoMensalDaContaPorInformacao.where(orcamento_id: orcamento.id, mes_referencia: 12).any?
        errors.add(:base, "Arquivo não pode ser gerado pois periodo anterior não foi gerado.")
      end
    else
      unless self.mes_referencia == 'janeiro'
        orcamento = Orcamento.where(exercicio: self.ano_referencia).first rescue nil

        unless Contabilidade::SaldoMensalDaContaPorInformacao.where(orcamento_id: orcamento.id, mes_referencia: Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[self.mes_referencia] - 1).any?
          errors.add(:base, "Arquivo não pode ser gerado pois periodo anterior não foi gerado.")
        end
      end
    end
  end

  def apaga_saldos_e_movimentacoes_da_conta_por_informacoes
    orcamento = Orcamento.where(exercicio: self.ano_referencia).first rescue 0
    ActiveRecord::Base.connection.execute("DELETE FROM contabilidade_saldo_mensal_da_conta_por_informacoes where mes_referencia = '#{Contabilidade::PeriodoMatrizDeSaldoContabil.mes_referencias[self.mes_referencia]}' and orcamento_id = #{orcamento.id}")
  end

	def lote_do_sim_finalizado?
    return false if self.encerramento?
    
		lote_sim = Tcm::Lote.find_by(
			orcamento_id: Orcamento.find_by(exercicio: ano_referencia).id,
			tipo: [Tcm::Lote.tipos[:todos], Tcm::Lote.tipos[:contabilidade]],
			mes_de_referencia: self.mes_referencia,
			situacao: Tcm::Lote.situacoes[:finalizado]
		)
		return lote_sim.present?
	end

end
