SU2-33 | Фикс перезаписи парсером значений в БД
This commit is contained in:
@@ -64,10 +64,12 @@ class ReportParser
|
||||
target_years.each do |year|
|
||||
statement = find_or_build_statement(year)
|
||||
if should_update_statement?(statement)
|
||||
previous_data = statement.data.deep_dup if statement.persisted?
|
||||
|
||||
statement.assign_attributes(
|
||||
yearly_file: @yearly_file,
|
||||
sheet_number: year,
|
||||
data: build_payload_for_year(year, parsed_forms, codes)
|
||||
data: build_payload_for_year(year, parsed_forms, codes, previous_data: previous_data)
|
||||
)
|
||||
statement.save!
|
||||
end
|
||||
@@ -82,9 +84,19 @@ class ReportParser
|
||||
years.sort.reverse
|
||||
end
|
||||
|
||||
def build_payload_for_year(year, parsed_forms, codes)
|
||||
def build_payload_for_year(year, parsed_forms, codes, previous_data: nil)
|
||||
forms_payload = FORM_DEFINITIONS.each_with_object({}) do |(form_code, config), hash|
|
||||
form_data = parsed_forms.fetch(form_code, {})[year] || {}
|
||||
form_present, form_data = parsed_form_for_year(parsed_forms, form_code, year)
|
||||
form_data ||= {}
|
||||
|
||||
unless form_present
|
||||
previous_payload = previous_form_payload(previous_data, form_code)
|
||||
if previous_payload.present?
|
||||
hash[form_code] = previous_payload
|
||||
next
|
||||
end
|
||||
end
|
||||
|
||||
source_rows = form_data[:rows] || form_data['rows'] || []
|
||||
rows_by_code = index_rows_by_code(source_rows)
|
||||
form_codes = report_codes_for_form(form_code, codes)
|
||||
@@ -111,6 +123,21 @@ class ReportParser
|
||||
}
|
||||
end
|
||||
|
||||
def parsed_form_for_year(parsed_forms, form_code, year)
|
||||
form_results = parsed_forms.fetch(form_code, {})
|
||||
return [true, form_results[year]] if form_results.key?(year)
|
||||
return [true, form_results[year.to_s]] if form_results.key?(year.to_s)
|
||||
|
||||
[false, {}]
|
||||
end
|
||||
|
||||
def previous_form_payload(previous_data, form_code)
|
||||
forms = previous_data && (previous_data[:forms] || previous_data['forms'])
|
||||
return unless forms.is_a?(Hash)
|
||||
|
||||
forms[form_code] || forms[form_code.to_sym]
|
||||
end
|
||||
|
||||
def index_rows_by_code(rows)
|
||||
rows.each_with_object({}) do |row, hash|
|
||||
normalized_code = normalize_code(row[:line_code] || row['line_code'])
|
||||
|
||||
Reference in New Issue
Block a user