demarches-normaliennes/app/models/prefill_params.rb

89 lines
2.2 KiB
Ruby
Raw Normal View History

class PrefillParams
def initialize(dossier, params)
@dossier = dossier
@params = params
end
def to_a
2023-01-26 17:57:57 +01:00
build_prefill_values.filter(&:prefillable?).map(&:to_h).flatten
end
private
def build_prefill_values
2022-12-05 09:49:03 +01:00
value_by_stable_id = @params
2022-12-05 10:09:44 +01:00
.map { |prefixed_typed_id, value| [stable_id_from_typed_id(prefixed_typed_id), value] }
2022-12-05 09:49:03 +01:00
.filter { |stable_id, value| stable_id.present? && value.present? }
.to_h
2022-12-01 11:17:48 +01:00
@dossier
2022-12-05 09:49:03 +01:00
.find_champs_by_stable_ids(value_by_stable_id.keys)
.map { |champ| [champ, value_by_stable_id[champ.stable_id]] }
.map { |champ, value| PrefillValue.new(champ:, value:) }
2022-12-01 11:17:48 +01:00
end
2022-12-05 10:09:44 +01:00
def stable_id_from_typed_id(prefixed_typed_id)
return nil unless prefixed_typed_id.starts_with?("champ_")
Champ.id_from_typed_id(prefixed_typed_id.gsub("champ_", "")).to_i
2022-12-01 11:17:48 +01:00
rescue
nil
end
class PrefillValue
NEED_VALIDATION_TYPES_DE_CHAMPS = [
TypeDeChamp.type_champs.fetch(:decimal_number),
2022-12-19 22:00:22 +01:00
TypeDeChamp.type_champs.fetch(:integer_number),
TypeDeChamp.type_champs.fetch(:date),
TypeDeChamp.type_champs.fetch(:datetime),
TypeDeChamp.type_champs.fetch(:civilite),
TypeDeChamp.type_champs.fetch(:yes_no),
TypeDeChamp.type_champs.fetch(:checkbox),
TypeDeChamp.type_champs.fetch(:pays),
TypeDeChamp.type_champs.fetch(:regions)
]
attr_reader :champ, :value
2022-12-01 11:17:48 +01:00
def initialize(champ:, value:)
@champ = champ
@value = value
end
def prefillable?
champ.prefillable? && valid?
end
def to_h
2023-01-26 17:57:57 +01:00
if champ.type_champ == TypeDeChamp.type_champs.fetch(:repetition)
repeatable_hashes
else
{
id: champ.id,
value: value
}
end
end
private
def valid?
return true unless NEED_VALIDATION_TYPES_DE_CHAMPS.include?(champ.type_champ)
champ.value = value
champ.valid?(:prefill)
end
2023-01-26 17:57:57 +01:00
def repeatable_hashes
value.map.with_index do |repetition, index|
row = champ.rows[index] || champ.add_row(champ.dossier_revision)
JSON.parse(repetition).map do |key, value|
id = row.find { |champ| champ.libelle == key }.id
{ id: id, value: value }
end
rescue JSON::ParserError
end.flatten
end
end
end