diff --git a/app/pipeline/mapping.py b/app/pipeline/mapping.py index e21e1a9..e549c29 100644 --- a/app/pipeline/mapping.py +++ b/app/pipeline/mapping.py @@ -693,7 +693,10 @@ def _format_operation_documents(lookup: _PayloadLookup) -> str: document.get(field_name, "") for field_name in _OPERATION_DOCUMENT_FIELDS ] fields.insert(1, "") - formatted_documents.append(f"{position}. {', '.join(fields)};") + # Эталонный отчёт отделяет номер документа запятой, а не точкой: + # "1, 13, , , 05/08/2026, ...". Расхождение затрагивало почти каждую + # строку отчёта, поэтому приводим к виду эталона. + formatted_documents.append(f"{position}, {', '.join(fields)};") return "\n".join(formatted_documents) diff --git a/app/pipeline/mapping_table.json b/app/pipeline/mapping_table.json index fdb481d..e1cdb92 100644 --- a/app/pipeline/mapping_table.json +++ b/app/pipeline/mapping_table.json @@ -2028,7 +2028,7 @@ "xml_tag": "НомерКарта", "xml_path": "СообщОперКО/ИнформЧасть/СведКО/Операция/СведенияКартаИнБанк/НомерКарта", "source_scope": "any", - "allow_short_lookup": true, + "allow_short_lookup": false, "allow_direct_mapping": true, "structured_value": false, "structured_group": "", diff --git a/tests/unit/test_mapping.py b/tests/unit/test_mapping.py index e4a4228..1f157cf 100644 --- a/tests/unit/test_mapping.py +++ b/tests/unit/test_mapping.py @@ -933,9 +933,9 @@ def test_operation_documents_keep_positions_and_join_multiple_documents() -> Non ) assert row[107] == ( - "1. 13, , , 29/01/2026, 253, Размещение денежных средств;\n" - "2. 99, , Депозитный договор, 29/01/2026, Р202307/0001/93/Э, ;\n" - "3. 99, , Общие условия размещения депозитов, 17/11/2020, Р202307/0001, ;" + "1, 13, , , 29/01/2026, 253, Размещение денежных средств;\n" + "2, 99, , Депозитный договор, 29/01/2026, Р202307/0001/93/Э, ;\n" + "3, 99, , Общие условия размещения депозитов, 17/11/2020, Р202307/0001, ;" ) @@ -1998,3 +1998,31 @@ def test_code_list_with_single_value_is_untouched() -> None: participant_fields={}, ) assert row[21] == "1101" + + +def test_card_number_stays_in_its_own_block() -> None: + """Тег НомерКарта есть и в блоке внесения/получения наличных (колонка 81), + и в блоке карты иностранного банка (колонка 102). Короткий поиск по имени + тега уводил карту из первого блока во второй: на сверке с эталоном за + 10.08.2026 это давало 63 лишних значения в колонке 102.""" + own_account = build_fixed_row_by_index( + file_name="f.xml", + record_id="R1", + operation_index=1, + operation_fields={ + "СведенияВнесениеПолучениеНалДС.НомерКарта": "2200380368847984" + }, + participant_fields={}, + ) + assert own_account[81] == "2200380368847984" + assert own_account[102] == "" + + foreign_card = build_fixed_row_by_index( + file_name="f.xml", + record_id="R2", + operation_index=1, + operation_fields={"СведенияКартаИнБанк.НомерКарта": "5555444433332222"}, + participant_fields={}, + ) + assert foreign_card[102] == "5555444433332222" + assert foreign_card[81] == ""