From 4942120005bdec4104705c3f68ef45a30fb36746 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 27 Oct 2026 18:53:01 +0400 Subject: [PATCH] =?UTF-8?q?fix(#195):=20M=20=D0=B2=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=D0=BB=D0=BA=D0=B5=20=D0=BF=D0=B0=D1=80=20=E2=80=94=20?= =?UTF-8?q?=D1=87=D0=B8=D1=81=D0=BB=D0=BE=20=D1=80=D0=B0=D0=B7=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20missing=5Fid,=20=C2=AB=D1=81=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=C2=BB=20=D0=B1=D0=B5=D0=B7=20=D1=81=D0=BA=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20(web)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- web/src/utils/consolidations.test.ts | 11 +++++++++-- web/src/utils/consolidations.ts | 9 +++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/web/src/utils/consolidations.test.ts b/web/src/utils/consolidations.test.ts index 1624a9e..1c74617 100644 --- a/web/src/utils/consolidations.test.ts +++ b/web/src/utils/consolidations.test.ts @@ -214,10 +214,17 @@ describe('counterPairsWarning', () => { expect(w.headline).toBe('Нет встречных записей: 1 пара у 1 участника.'); expect(w.details.endsWith('Ещё 1260 строк без ИНН учтены как внешние.')).toBe(true); }); - it('пять пар у трёх участников', () => { - const ps = [pair('a', 'b'), pair('a', 'c'), pair('a', 'd'), pair('e', 'b'), pair('f', 'c')]; + it('пять пар у трёх участников (M — разные missing_id)', () => { + const ps = [pair('a', 'c'), pair('a', 'd'), pair('a', 'e'), pair('b', 'c'), pair('b', 'd')]; expect(counterPairsWarning(ps, 5).headline).toBe('Нет встречных записей: 5 пар у 3 участников.'); }); + it('M считает missing_id, а не holder_id', () => { + const ps = [pair('a', 'b'), pair('a', 'c'), pair('d', 'b'), pair('e', 'b'), pair('f', 'b')]; + expect(counterPairsWarning(ps, 5).headline).toBe('Нет встречных записей: 5 пар у 2 участников.'); + }); + it('две пары у двух участников', () => { + expect(counterPairsWarning([pair('a', 'b'), pair('a', 'c')], 1).headline).toBe('Нет встречных записей: 2 пары у 2 участников.'); + }); it('без строк без ИНН', () => { expect(counterPairsWarning([pair('a', 'b')], 0).details).toBe( 'Возможно, контрагент среди строк без ИНН, его ИНН не найден в справочнике или это пропуск в учёте.', diff --git a/web/src/utils/consolidations.ts b/web/src/utils/consolidations.ts index bf42a44..8a23293 100644 --- a/web/src/utils/consolidations.ts +++ b/web/src/utils/consolidations.ts @@ -150,13 +150,10 @@ export const rememberCounterPairsShown = ( /** Тексты модалки «Проверьте встречные записи участников». */ export const counterPairsWarning = (pairs: readonly CounterPairOut[], unmappedTotal: number): { headline: string; details: string } => { - const holders = new Set(pairs.map((p) => p.holder_id)).size; + const missing = new Set(pairs.map((p) => p.missing_id)).size; const base = 'Возможно, контрагент среди строк без ИНН, его ИНН не найден в справочнике или это пропуск в учёте.'; return { - headline: `Нет встречных записей: ${pairs.length} ${pluralRu(pairs.length, ['пара', 'пары', 'пар'])} у ${holders} ${pluralRu(holders, ['участника', 'участников', 'участников'])}.`, - details: - unmappedTotal > 0 - ? `${base} Ещё ${unmappedTotal} ${pluralRu(unmappedTotal, ['строка', 'строки', 'строк'])} без ИНН учтены как внешние.` - : base, + headline: `Нет встречных записей: ${pairs.length} ${pluralRu(pairs.length, ['пара', 'пары', 'пар'])} у ${missing} ${pluralRu(missing, ['участника', 'участников', 'участников'])}.`, + details: unmappedTotal > 0 ? `${base} Ещё ${unmappedTotal} строк без ИНН учтены как внешние.` : base, }; };