|
|
|
|
@ -89,68 +89,6 @@ module Csv
|
|
|
|
|
|
|
|
|
|
ORDERED_ADDRESS_FIELDS = %w[uprn address_line1 address_line2 town_or_city county postcode_full is_la_inferred la_label la uprn_selection address_search_value_check address_line1_input postcode_full_input address_line1_as_entered address_line2_as_entered town_or_city_as_entered county_as_entered postcode_full_as_entered la_as_entered].freeze |
|
|
|
|
|
|
|
|
|
def value(attribute, log) |
|
|
|
|
if CUSTOM_CALL_CHAINS.key? attribute.to_sym |
|
|
|
|
call_chain = CUSTOM_CALL_CHAINS[attribute.to_sym][@export_type.to_sym] |
|
|
|
|
call_chain.reduce(log) { |object, next_call| object&.public_send(next_call) } |
|
|
|
|
elsif FIELDS_ALWAYS_EXPORTED_AS_CODES.include? attribute |
|
|
|
|
log.send(attribute) |
|
|
|
|
elsif FIELDS_ALWAYS_EXPORTED_AS_LABELS.key? attribute |
|
|
|
|
attribute = FIELDS_ALWAYS_EXPORTED_AS_LABELS[attribute] |
|
|
|
|
value = log.send(attribute) |
|
|
|
|
get_label(value, attribute, log) |
|
|
|
|
elsif SYSTEM_DATE_FIELDS.include? attribute |
|
|
|
|
log.public_send(attribute)&.iso8601 |
|
|
|
|
elsif PERSON_DETAILS.key?(attribute) && (person_details_not_known?(log, attribute) || age_not_known?(log, attribute)) |
|
|
|
|
case @export_type |
|
|
|
|
when "codes" |
|
|
|
|
PERSON_DETAILS.find { |key, _value| key == attribute }[1]["refused_code"] |
|
|
|
|
when "labels" |
|
|
|
|
PERSON_DETAILS.find { |key, _value| key == attribute }[1]["refused_label"] |
|
|
|
|
end |
|
|
|
|
else |
|
|
|
|
value = log.public_send(attribute) |
|
|
|
|
case @export_type |
|
|
|
|
when "codes" |
|
|
|
|
value |
|
|
|
|
when "labels" |
|
|
|
|
answer_label = get_label(value, attribute, log) |
|
|
|
|
answer_label || label_if_boolean_value(value) || value |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def get_label(value, attribute, log) |
|
|
|
|
log.form |
|
|
|
|
.get_question(attribute, log) |
|
|
|
|
&.label_from_value(value) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def label_if_boolean_value(value) |
|
|
|
|
return "Yes" if value == true |
|
|
|
|
return "No" if value == false |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def attribute_mappings |
|
|
|
|
mappings = { |
|
|
|
|
"saledate" => %w[day month year], |
|
|
|
|
"exdate" => %w[exday exmonth exyear], |
|
|
|
|
"hodate" => %w[hoday homonth hoyear], |
|
|
|
|
"ppostcode_full" => %w[ppostc1 ppostc2], |
|
|
|
|
"la" => %w[la la_label], |
|
|
|
|
"prevloc" => %w[prevloc prevloc_label], |
|
|
|
|
"assigned_to_id" => %w[created_by assigned_to], |
|
|
|
|
"owning_organisation_id" => %w[owning_organisation_name], |
|
|
|
|
"managing_organisation_id" => %w[managing_organisation_name], |
|
|
|
|
"value" => %w[value value_value_check], |
|
|
|
|
"mscharge" => %w[mscharge mscharge_value_check], |
|
|
|
|
} |
|
|
|
|
unless @user.support? && @year >= 2024 |
|
|
|
|
mappings["postcode_full"] = %w[pcode1 pcode2] |
|
|
|
|
end |
|
|
|
|
mappings |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
SUPPORT_ONLY_ATTRIBUTES = %w[address_line1_as_entered address_line2_as_entered town_or_city_as_entered county_as_entered postcode_full_as_entered la_as_entered created_by value_value_check mscharge_value_check].freeze |
|
|
|
|
|
|
|
|
|
SUPPORT_ATTRIBUTE_NAME_MAPPINGS = { |
|
|
|
|
@ -206,10 +144,25 @@ module Csv
|
|
|
|
|
"uprn_confirmed" => "UPRNCONFIRMED", |
|
|
|
|
}.freeze |
|
|
|
|
|
|
|
|
|
def formatted_attribute_headers |
|
|
|
|
return @attributes unless @user.support? |
|
|
|
|
|
|
|
|
|
@attributes.map do |attribute| |
|
|
|
|
SUPPORT_ATTRIBUTE_NAME_MAPPINGS[attribute] || attribute.upcase |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def sales_log_attributes |
|
|
|
|
ordered_questions = FormHandler.instance.ordered_questions_for_year(@year, "sales") |
|
|
|
|
ordered_questions.reject! { |q| q.id.match?(/((?<!la)_known)|(_check)|(_asked)|nationality_all_group|nationality_all_buyer2_group/) } |
|
|
|
|
attributes = ordered_questions.flat_map do |question| |
|
|
|
|
attributes = insert_derived_and_related_attributes(ordered_questions) |
|
|
|
|
order_address_fields_for_support(attributes) |
|
|
|
|
final_attributes = non_question_fields + attributes |
|
|
|
|
@user.support? ? final_attributes : final_attributes - SUPPORT_ONLY_ATTRIBUTES |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def insert_derived_and_related_attributes(ordered_questions) |
|
|
|
|
ordered_questions.flat_map do |question| |
|
|
|
|
if question.type == "checkbox" |
|
|
|
|
question.answer_options.keys |
|
|
|
|
elsif attribute_mappings.key? question.id |
|
|
|
|
@ -218,6 +171,29 @@ module Csv
|
|
|
|
|
question.id |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def attribute_mappings |
|
|
|
|
mappings = { |
|
|
|
|
"saledate" => %w[day month year], |
|
|
|
|
"exdate" => %w[exday exmonth exyear], |
|
|
|
|
"hodate" => %w[hoday homonth hoyear], |
|
|
|
|
"ppostcode_full" => %w[ppostc1 ppostc2], |
|
|
|
|
"la" => %w[la la_label], |
|
|
|
|
"prevloc" => %w[prevloc prevloc_label], |
|
|
|
|
"assigned_to_id" => %w[created_by assigned_to], |
|
|
|
|
"owning_organisation_id" => %w[owning_organisation_name], |
|
|
|
|
"managing_organisation_id" => %w[managing_organisation_name], |
|
|
|
|
"value" => %w[value value_value_check], |
|
|
|
|
"mscharge" => %w[mscharge mscharge_value_check], |
|
|
|
|
} |
|
|
|
|
unless @user.support? && @year >= 2024 |
|
|
|
|
mappings["postcode_full"] = %w[pcode1 pcode2] |
|
|
|
|
end |
|
|
|
|
mappings |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def order_address_fields_for_support(attributes) |
|
|
|
|
if @user.support? && @year >= 2024 |
|
|
|
|
first_address_field_index = attributes.find_index { |q| all_address_fields.include?(q) } |
|
|
|
|
if first_address_field_index |
|
|
|
|
@ -225,18 +201,6 @@ module Csv
|
|
|
|
|
attributes.insert(first_address_field_index, *ORDERED_ADDRESS_FIELDS) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
final_attributes = non_question_fields + attributes |
|
|
|
|
@user.support? ? final_attributes : final_attributes - SUPPORT_ONLY_ATTRIBUTES |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def person_details_not_known?(log, attribute) |
|
|
|
|
details_known_field = PERSON_DETAILS.find { |key, _value| key == attribute }[1]["details_known_field"] |
|
|
|
|
log[details_known_field] == 2 # 1 for lettings logs, 2 for sales logs |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def age_not_known?(log, attribute) |
|
|
|
|
age_known_field = PERSON_DETAILS.find { |key, _value| key == attribute }[1]["age_known_field"] |
|
|
|
|
log[age_known_field] == 1 |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def non_question_fields |
|
|
|
|
@ -256,12 +220,56 @@ module Csv
|
|
|
|
|
ORDERED_ADDRESS_FIELDS + %w[uprn_confirmed] |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def formatted_attribute_headers |
|
|
|
|
return @attributes unless @user.support? |
|
|
|
|
def value(attribute, log) |
|
|
|
|
if CUSTOM_CALL_CHAINS.key? attribute.to_sym |
|
|
|
|
call_chain = CUSTOM_CALL_CHAINS[attribute.to_sym][@export_type.to_sym] |
|
|
|
|
call_chain.reduce(log) { |object, next_call| object&.public_send(next_call) } |
|
|
|
|
elsif FIELDS_ALWAYS_EXPORTED_AS_CODES.include? attribute |
|
|
|
|
log.send(attribute) |
|
|
|
|
elsif FIELDS_ALWAYS_EXPORTED_AS_LABELS.key? attribute |
|
|
|
|
attribute = FIELDS_ALWAYS_EXPORTED_AS_LABELS[attribute] |
|
|
|
|
value = log.send(attribute) |
|
|
|
|
get_label(value, attribute, log) |
|
|
|
|
elsif SYSTEM_DATE_FIELDS.include? attribute |
|
|
|
|
log.public_send(attribute)&.iso8601 |
|
|
|
|
elsif PERSON_DETAILS.key?(attribute) && (person_details_not_known?(log, attribute) || age_not_known?(log, attribute)) |
|
|
|
|
case @export_type |
|
|
|
|
when "codes" |
|
|
|
|
PERSON_DETAILS.find { |key, _value| key == attribute }[1]["refused_code"] |
|
|
|
|
when "labels" |
|
|
|
|
PERSON_DETAILS.find { |key, _value| key == attribute }[1]["refused_label"] |
|
|
|
|
end |
|
|
|
|
else |
|
|
|
|
value = log.public_send(attribute) |
|
|
|
|
case @export_type |
|
|
|
|
when "codes" |
|
|
|
|
value |
|
|
|
|
when "labels" |
|
|
|
|
answer_label = get_label(value, attribute, log) |
|
|
|
|
answer_label || label_if_boolean_value(value) || value |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
@attributes.map do |attribute| |
|
|
|
|
SUPPORT_ATTRIBUTE_NAME_MAPPINGS[attribute] || attribute.upcase |
|
|
|
|
def person_details_not_known?(log, attribute) |
|
|
|
|
details_known_field = PERSON_DETAILS.find { |key, _value| key == attribute }[1]["details_known_field"] |
|
|
|
|
log[details_known_field] == 2 # 1 for lettings logs, 2 for sales logs |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def age_not_known?(log, attribute) |
|
|
|
|
age_known_field = PERSON_DETAILS.find { |key, _value| key == attribute }[1]["age_known_field"] |
|
|
|
|
log[age_known_field] == 1 |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def get_label(value, attribute, log) |
|
|
|
|
log.form |
|
|
|
|
.get_question(attribute, log) |
|
|
|
|
&.label_from_value(value) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def label_if_boolean_value(value) |
|
|
|
|
return "Yes" if value == true |
|
|
|
|
return "No" if value == false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|