SU2-33 | Фикс перезаписи парсером значений в БД

This commit is contained in:
Dmitry
2026-04-20 18:45:52 +00:00
parent e9660f016f
commit 44cd3993ac
2 changed files with 30 additions and 4 deletions
+30 -3
View File
@@ -64,10 +64,12 @@ class ReportParser
target_years.each do |year| target_years.each do |year|
statement = find_or_build_statement(year) statement = find_or_build_statement(year)
if should_update_statement?(statement) if should_update_statement?(statement)
previous_data = statement.data.deep_dup if statement.persisted?
statement.assign_attributes( statement.assign_attributes(
yearly_file: @yearly_file, yearly_file: @yearly_file,
sheet_number: year, 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! statement.save!
end end
@@ -82,9 +84,19 @@ class ReportParser
years.sort.reverse years.sort.reverse
end 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| 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'] || [] source_rows = form_data[:rows] || form_data['rows'] || []
rows_by_code = index_rows_by_code(source_rows) rows_by_code = index_rows_by_code(source_rows)
form_codes = report_codes_for_form(form_code, codes) form_codes = report_codes_for_form(form_code, codes)
@@ -111,6 +123,21 @@ class ReportParser
} }
end 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) def index_rows_by_code(rows)
rows.each_with_object({}) do |row, hash| rows.each_with_object({}) do |row, hash|
normalized_code = normalize_code(row[:line_code] || row['line_code']) normalized_code = normalize_code(row[:line_code] || row['line_code'])
@@ -83,7 +83,6 @@ module ReportParsers
has_code = normalized_cells.any? { |text| text == 'код' || text.start_with?('код ') || text.start_with?('код:') } has_code = normalized_cells.any? { |text| text == 'код' || text.start_with?('код ') || text.start_with?('код:') }
return row if has_name && has_code return row if has_name && has_code
end end
1 1
end end