2020-08-06 16:35:45 +02:00
|
|
|
|
# == Schema Information
|
|
|
|
|
#
|
|
|
|
|
# Table name: champs
|
|
|
|
|
#
|
2021-02-04 19:23:40 +01:00
|
|
|
|
# id :integer not null, primary key
|
|
|
|
|
# data :jsonb
|
|
|
|
|
# fetch_external_data_exceptions :string is an Array
|
|
|
|
|
# private :boolean default(FALSE), not null
|
2021-10-20 17:26:09 +02:00
|
|
|
|
# rebased_at :datetime
|
2021-02-04 19:23:40 +01:00
|
|
|
|
# row :integer
|
|
|
|
|
# type :string
|
|
|
|
|
# value :string
|
2021-10-05 15:37:13 +02:00
|
|
|
|
# value_json :jsonb
|
2021-02-04 19:23:40 +01:00
|
|
|
|
# created_at :datetime
|
|
|
|
|
# updated_at :datetime
|
|
|
|
|
# dossier_id :integer
|
|
|
|
|
# etablissement_id :integer
|
|
|
|
|
# external_id :string
|
|
|
|
|
# parent_id :bigint
|
|
|
|
|
# type_de_champ_id :integer
|
2020-08-06 16:35:45 +02:00
|
|
|
|
#
|
2018-12-18 11:17:52 +01:00
|
|
|
|
class Champs::RepetitionChamp < Champ
|
|
|
|
|
accepts_nested_attributes_for :champs, allow_destroy: true
|
|
|
|
|
|
|
|
|
|
def rows
|
|
|
|
|
champs.group_by(&:row).values
|
|
|
|
|
end
|
|
|
|
|
|
2021-10-27 16:27:17 +02:00
|
|
|
|
def add_row
|
|
|
|
|
transaction do
|
|
|
|
|
row = (blank? ? -1 : champs.last.row) + 1
|
|
|
|
|
type_de_champ.types_de_champ.each do |type_de_champ|
|
|
|
|
|
self.champs << type_de_champ.champ.build(row: row)
|
|
|
|
|
end
|
2019-01-30 16:14:15 +01:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2021-07-21 10:45:59 +02:00
|
|
|
|
def blank?
|
|
|
|
|
champs.empty?
|
2019-01-30 16:14:15 +01:00
|
|
|
|
end
|
|
|
|
|
|
2018-12-18 11:17:52 +01:00
|
|
|
|
def search_terms
|
|
|
|
|
# The user cannot enter any information here so it doesn’t make much sense to search
|
|
|
|
|
end
|
2019-04-03 14:29:30 +02:00
|
|
|
|
|
2019-09-11 16:04:42 +02:00
|
|
|
|
def for_tag
|
|
|
|
|
([libelle] + rows.map do |champs|
|
|
|
|
|
champs.map do |champ|
|
|
|
|
|
"#{champ.libelle} : #{champ}"
|
|
|
|
|
end.join("\n")
|
|
|
|
|
end).join("\n\n")
|
|
|
|
|
end
|
|
|
|
|
|
2019-07-11 10:28:44 +02:00
|
|
|
|
def rows_for_export
|
|
|
|
|
rows.each.with_index(1).map do |champs, index|
|
|
|
|
|
Champs::RepetitionChamp::Row.new(index: index, dossier_id: dossier_id.to_s, champs: champs)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2019-11-06 17:03:07 +01:00
|
|
|
|
# We have to truncate the label here as spreadsheets have a (30 char) limit on length.
|
|
|
|
|
def libelle_for_export
|
2020-04-30 15:49:31 +02:00
|
|
|
|
str = "(#{stable_id}) #{libelle}"
|
2020-01-29 11:33:28 +01:00
|
|
|
|
# /\*?[] are invalid Excel worksheet characters
|
2020-09-24 14:24:53 +02:00
|
|
|
|
ActiveStorage::Filename.new(str.delete('[]*?')).sanitized
|
2019-11-06 17:03:07 +01:00
|
|
|
|
end
|
|
|
|
|
|
2019-04-03 14:29:30 +02:00
|
|
|
|
class Row < Hashie::Dash
|
|
|
|
|
property :index
|
|
|
|
|
property :dossier_id
|
|
|
|
|
property :champs
|
|
|
|
|
|
2019-07-11 10:28:44 +02:00
|
|
|
|
def read_attribute_for_serialization(attribute)
|
|
|
|
|
self[attribute]
|
|
|
|
|
end
|
|
|
|
|
|
2019-04-03 14:29:30 +02:00
|
|
|
|
def spreadsheet_columns
|
|
|
|
|
[
|
|
|
|
|
['Dossier ID', :dossier_id],
|
|
|
|
|
['Ligne', :index]
|
|
|
|
|
] + exported_champs
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def exported_champs
|
|
|
|
|
champs.reject(&:exclude_from_export?).map do |champ|
|
|
|
|
|
[champ.libelle, champ.for_export]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2018-12-18 11:17:52 +01:00
|
|
|
|
end
|