class AddPeriodoInicialAndPeriodoFinalToContabilidadeLoteBancario < ActiveRecord::Migration[5.2]
  def change
    add_column :contabilidade_lotes_bancarios, :periodo_inicial, :date
    add_column :contabilidade_lotes_bancarios, :periodo_final, :date

    Contabilidade::LoteBancario.all.each do |lote_bancario|
      primeiro_pagamento = lote_bancario.pagamentos_do_lote_bancario.joins(conta_bancaria_por_pagamento: :pagamento).order("contabilidade_pagamentos.data").first&.conta_bancaria_por_pagamento&.pagamento&.data
      primeira_retencao = lote_bancario.pagamentos_do_lote_bancario.joins(:pagamento_da_retencao).order("contabilidade_pagamentos_das_retencoes.data_do_pagamento").first&.pagamento_da_retencao&.data_do_pagamento
      primeira_transferencia = lote_bancario.pagamentos_do_lote_bancario.joins(:transferencia_financeira).order("contabilidade_transferencias_financeiras.data").first&.transferencia_financeira&.data
      
      ultimo_pagamento = lote_bancario.pagamentos_do_lote_bancario.joins(conta_bancaria_por_pagamento: :pagamento).order("contabilidade_pagamentos.data").last&.conta_bancaria_por_pagamento&.pagamento&.data
      ultima_retencao = lote_bancario.pagamentos_do_lote_bancario.joins(:pagamento_da_retencao).order("contabilidade_pagamentos_das_retencoes.data_do_pagamento").last&.pagamento_da_retencao&.data_do_pagamento
      ultima_transferencia = lote_bancario.pagamentos_do_lote_bancario.joins(:transferencia_financeira).order("contabilidade_transferencias_financeiras.data").last&.transferencia_financeira&.data

      inicio = [primeiro_pagamento, primeira_retencao, primeira_transferencia].compact
      final = [ultimo_pagamento, ultima_retencao, ultima_transferencia].compact

      lote_bancario.update_column(:periodo_inicial, inicio.min)
      lote_bancario.update_column(:periodo_final, inicio.min)
    end
  end
end
