@ -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?
@attributes . map do | attribute |
SUPPORT_ATTRIBUTE_NAME_MAPPINGS [ attribute ] || attribute . upcase
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 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