ministryofjustice/Claim-for-Crown-Court-Defence

View on GitHub
app/models/claim/transfer_brain.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# This class holds only static methods to help with
# validation, determining visibility, the full fee name and the case
# allocation type for a TransferClaim.
#

module Claim
  class TransferBrain
    include DataItemCollectionDelegatable

    Struct.new('TransferStage', :id, :description, :requires_case_conclusion)

    TRANSFER_STAGES = {
      10 => Struct::TransferStage.new(10, 'Up to and including PCMH transfer', true),
      20 => Struct::TransferStage.new(20, 'Before trial transfer', true),
      30 => Struct::TransferStage.new(30, 'During trial transfer', true),
      40 => Struct::TransferStage.new(40, 'Transfer after trial and before sentence hearing', false),
      50 => Struct::TransferStage.new(50, 'Transfer before retrial', true),
      60 => Struct::TransferStage.new(60, 'Transfer during retrial', true),
      70 => Struct::TransferStage.new(70, 'Transfer after retrial and before sentence hearing', false)
    }.freeze

    CASE_CONCLUSIONS = {
      10 => 'Trial',
      20 => 'Retrial',
      30 => 'Cracked',
      40 => 'Cracked before retrial',
      50 => 'Guilty plea'
    }.freeze

    data_item_collection_delegate :allocation_type, :bill_scenario, :ppe_required, :days_claimable

    def self.transfer_detail_summary(detail)
      TransferBrain::DataItemCollection.instance.transfer_fee_full_name(detail)
    end

    def self.transfer_stage_by_id(id)
      name = TRANSFER_STAGES[id]
      raise ArgumentError, "No such transfer stage id: #{id}" if name.nil?
      name
    end

    def self.transfer_stage_id(description)
      transfer_stage = TRANSFER_STAGES.values.detect { |ts| ts.description == description }
      raise ArgumentError, "No such transfer stage: '#{description}'" if transfer_stage.nil?
      transfer_stage.id
    end

    def self.transfer_stage_ids
      TRANSFER_STAGES.keys
    end

    def self.transfer_stage(detail)
      TRANSFER_STAGES[detail.transfer_stage_id]
    end

    def self.case_conclusion_by_id(id)
      name = CASE_CONCLUSIONS[id]
      raise ArgumentError, "No such case conclusion id: #{id}" if name.nil?
      name
    end

    def self.case_conclusion_id(name)
      id = CASE_CONCLUSIONS.key(name)
      raise ArgumentError, "No such case conclusion: '#{name}'" if id.nil?
      id
    end

    def self.case_conclusion_ids
      CASE_CONCLUSIONS.keys
    end

    def self.case_conclusion(detail)
      CASE_CONCLUSIONS[detail.case_conclusion_id]
    end

    #
    # only new litigators that transfered onto unelected cases at specific stages
    # are required to specify case conclusions.
    # i.e. 'new', false, [10,20,30,50,60]
    def self.case_conclusion_required?(detail)
      if detail&.transfer_stage_id.nil?
        false
      else
        detail.litigator_type == 'new' &&
          detail.elected_case == false && # treat nil as failure i.e. non-false
          TRANSFER_STAGES[detail.transfer_stage_id].requires_case_conclusion
      end
    end
  end
end