ministryofjustice/Claim-for-Crown-Court-Defence

View on GitHub
app/presenters/claim_history_presenter.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
class ClaimHistoryPresenter < BasePresenter
  presents :claim

  def history_items_by_date
    unique_formatted_dates.each_with_object({}) do |date_string, hash|
      arr = select_by_date_string(messages, date_string) +
            select_by_date_string(state_transitions, date_string) +
            select_by_date_string(assessments, date_string) +
            select_by_date_string(redetermination_versions, date_string)
      hash[date_string] = arr.flatten.sort_by(&:created_at) if arr.any?
    end
  end

  private

  def unique_formatted_dates
    unique_sorted_dates.map { |d| d.strftime(Settings.date_format) }.uniq
  end

  def unique_sorted_dates
    (message_dates + state_transition_dates + assessment_dates + redetermination_dates).compact.uniq.sort
  end

  def message_dates
    messages.map(&:created_at)
  end

  def state_transitions
    claim_state_transitions.where.not(to: ['draft'])
  end

  def state_transition_dates
    state_transitions.map(&:created_at)
  end

  def assessment_dates
    assessments.map(&:created_at)
  end

  def redetermination_dates
    redetermination_versions.map(&:created_at)
  end

  def messages
    claim.messages.where.not(created_at: nil).order(created_at: :asc)
  end

  def assessments
    claim.assessment.versions.order(created_at: :asc)
  end

  def redetermination_versions
    claim.redeterminations.map { |redetermination| redetermination.versions.order(created_at: :asc) }.flatten
  end

  def select_by_date_string(collection, date_string)
    collection.select { |e| e.created_at.strftime(Settings.date_format) == date_string }
  end
end