ministryofjustice/Claim-for-Crown-Court-Defence

View on GitHub
app/controllers/case_workers/claims_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
98%
module CaseWorkers
  class ClaimsController < CaseWorkers::ApplicationController
    include PaginationHelpers

    skip_load_and_authorize_resource
    authorize_resource class: Claim::BaseClaim

    helper_method :sort_column, :sort_direction, :search_terms

    respond_to :html

    # callback order is important (must set claims before filtering and sorting)
    before_action :set_claims, only: %i[index archived]
    before_action :set_presenters
    before_action :filter_current_claims,   only: [:index]
    before_action :filter_archived_claims,  only: [:archived]
    before_action :sort_claims,             only: %i[index archived]
    before_action :set_claim, only: %i[show messages download_zip]

    include ReadMessages
    include MessageControlsDisplay

    def index; end

    def archived; end

    def show
      prepare_show_action
    end

    def download_zip
      zip_file = S3ZipDownloader.new(@claim).generate!

      send_file zip_file,
                filename: "#{@claim.case_number}-documents.zip",
                type: 'application/zip',
                disposition: 'attachment'
    end

    def messages
      render template: 'messages/claim_messages'
    end

    def update
      updater = Claims::CaseWorkerClaimUpdater.new(params[:id], claim_params.merge(current_user:)).update!
      @claim = updater.claim
      if updater.result == :ok
        redirect_to case_workers_claim_path(permitted_params)
      else
        @error_presenter = ErrorMessage::Presenter.new(@claim)
        prepare_show_action
        render :show
      end
    end

    private

    def permitted_params
      params.permit(:messages)
    end

    def prepare_show_action
      @claim.assessment = Assessment.new if @claim.assessment.nil?
      @messages = @claim.messages.most_recent_last
      @message = @claim.messages.build
    end

    def search(states = nil)
      @claims = @claims.search(search_terms, states, *search_options) unless @claims.remote?
    end

    def claim_params
      params.require(:claim).permit(
        :state,
        :refuse_reason_text,
        :reject_reason_text,
        :additional_information,
        assessment_attributes: %i[id fees expenses disbursements vat_amount],
        redeterminations_attributes: %i[id fees expenses disbursements vat_amount],
        state_reason: []
      )
    end

    def set_claims
      @claims = Claims::CaseWorkerClaims.new(current_user:, action: tab, criteria: criteria_params).claims
    end

    def set_presenters
      @defendant_presenter = CaseWorkers::DefendantPresenter
    end

    # Only these 2 actions are handle in this controller. Rest of actions in the admin-namespaced controller.
    def tab
      %w[current archived].include?(params[:tab]) ? params[:tab] : 'current'
    end

    def set_claim
      @claim = Claim::BaseClaim.active.find(params[:id])
    end

    def filter_current_claims
      search(Claims::StateMachine::CASEWORKER_DASHBOARD_UNDER_ASSESSMENT_STATES) if search_terms.present?
    end

    def filter_archived_claims
      search(Claims::StateMachine::CASEWORKER_DASHBOARD_ARCHIVED_STATES) if search_terms.present?
    end

    def sort_column
      params[:sort].presence || 'last_submitted_at'
    end

    def sort_direction
      %w[asc desc].include?(params[:direction]) ? params[:direction] : 'asc'
    end

    def search_terms
      params[:search]
    end

    def sort_and_paginate
      # GOTCHA: must paginate in same call that sorts/orders
      @claims = @claims.sort_using(sort_column, sort_direction).page(current_page).per(page_size) unless @claims.remote?
    end

    def sort_claims
      sort_and_paginate
      add_claim_carousel_info
    end

    def criteria_params
      { sorting: sort_column, direction: sort_direction, page: current_page, limit: page_size, search: search_terms }
    end
  end
end