You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.6 KiB
136 lines
3.6 KiB
class Answer |
|
attr_reader :question, :log |
|
|
|
delegate :type, to: :question |
|
delegate :id, to: :question |
|
delegate :answer_options, to: :question |
|
delegate :prefix, to: :question |
|
delegate :suffix, to: :question |
|
delegate :inferred_check_answers_value, to: :question |
|
delegate :inferred_answers, to: :question |
|
|
|
delegate :page, to: :question |
|
delegate :subsection, to: :page |
|
delegate :form, to: :subsection |
|
|
|
def initialize(question:, log:) |
|
@question = question |
|
@log = log |
|
end |
|
|
|
def answer_label |
|
return checkbox_answer_label if checkbox? |
|
return log[id]&.to_formatted_s(:govuk_date).to_s if date? |
|
|
|
answer = label_from_value(log[id]) if log[id].present? |
|
answer_label = [prefix, format_value(answer), suffix_label].join("") if answer |
|
|
|
inferred = inferred_check_answers_value["value"] if inferred_check_answers_value && has_inferred_check_answers_value? |
|
|
|
return inferred if inferred.present? |
|
|
|
answer_label |
|
end |
|
|
|
def suffix_label |
|
return "" unless suffix |
|
return suffix if suffix.is_a?(String) |
|
|
|
label = "" |
|
|
|
suffix.each do |s| |
|
condition = s["depends_on"] |
|
next unless condition |
|
|
|
answer = log.send(condition.keys.first) |
|
if answer == condition.values.first |
|
label = s["label"] |
|
end |
|
end |
|
label |
|
end |
|
|
|
def completed? |
|
return answer_options.keys.any? { |key| value_is_yes?(log[key]) } if checkbox? |
|
|
|
log[id].present? || !log.respond_to?(id.to_sym) || has_inferred_display_value? |
|
end |
|
|
|
def get_inferred_answers |
|
return [] unless inferred_answers |
|
|
|
enabled_inferred_answers(inferred_answers).keys.map do |question_id| |
|
question = form.get_question(question_id, log) |
|
if question.present? |
|
question.label_from_value(log[question_id]) |
|
else |
|
Array(question_id.to_s.split(".")).inject(log) { |l, method| l.present? ? l.public_send(*method) : "" } |
|
end |
|
end |
|
end |
|
|
|
private |
|
|
|
def enabled_inferred_answers(inferred_answers) |
|
inferred_answers.filter { |_key, value| value.all? { |condition_key, condition_value| log[condition_key] == condition_value } } |
|
end |
|
|
|
def has_inferred_display_value? |
|
inferred_check_answers_value.present? && log[inferred_check_answers_value["condition"].keys.first] == inferred_check_answers_value["condition"].values.first |
|
end |
|
|
|
def has_inferred_check_answers_value? |
|
return true if selected_answer_option_is_derived? |
|
return inferred_check_answers_value["condition"].values[0] == log[inferred_check_answers_value["condition"].keys[0]] if inferred_check_answers_value.present? |
|
|
|
false |
|
end |
|
|
|
def selected_answer_option_is_derived? |
|
selected_option = answer_options&.dig(log[id].to_s.presence) |
|
selected_option.is_a?(Hash) && selected_option["depends_on"] && form.depends_on_met(selected_option["depends_on"], log) |
|
end |
|
|
|
def format_value(answer_label) |
|
if prefix == "£" |
|
ActionController::Base.helpers.number_to_currency(answer_label, delimiter: ",", format: "%n") |
|
else |
|
answer_label |
|
end |
|
end |
|
|
|
def label_from_value(value) |
|
question.label_from_value(value) |
|
end |
|
|
|
def checkbox? |
|
question.type == "checkbox" |
|
end |
|
|
|
def date? |
|
question.type == "date" |
|
end |
|
|
|
def checkbox_answer_label |
|
answer = [] |
|
return "Yes" if declaration? && value_is_yes?(log["declaration"]) |
|
|
|
answer_options.each { |key, options| value_is_yes?(log[key]) ? answer << options["value"] : nil } |
|
answer.join(", ") |
|
end |
|
|
|
def declaration? |
|
question.id == "declaration" |
|
end |
|
|
|
def value_is_yes?(value) |
|
case type |
|
when "checkbox" |
|
value == 1 |
|
when "radio" |
|
RADIO_YES_VALUE[id.to_sym]&.include?(value) |
|
else |
|
%w[yes].include?(value.downcase) |
|
end |
|
end |
|
end
|
|
|