From 44cd3993ac94e887d193a796e82036df93ad93fa Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 20 Apr 2026 18:45:52 +0000 Subject: [PATCH] =?UTF-8?q?SU2-33=20|=20=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D1=81=D0=B5=D1=80=D0=BE=D0=BC=20=D0=B7=D0=BD=D0=B0?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B2=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/report_parser.rb | 33 ++++++++++++++++++-- app/services/report_parsers/form12_parser.rb | 1 - 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/app/services/report_parser.rb b/app/services/report_parser.rb index 62f48a1..fe233f2 100644 --- a/app/services/report_parser.rb +++ b/app/services/report_parser.rb @@ -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']) diff --git a/app/services/report_parsers/form12_parser.rb b/app/services/report_parsers/form12_parser.rb index 12df2d8..80ac29b 100644 --- a/app/services/report_parsers/form12_parser.rb +++ b/app/services/report_parsers/form12_parser.rb @@ -83,7 +83,6 @@ module ReportParsers has_code = normalized_cells.any? { |text| text == 'код' || text.start_with?('код ') || text.start_with?('код:') } return row if has_name && has_code end - 1 end