From 4fb477d5c2e2b5b199d663e4afc6ee89c5465dd3 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 18 Oct 2026 22:55:42 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D1=8C=20?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=B9=20=D1=86=D0=B5=D0=BB=D0=B8?= =?UTF-8?q?=20=C2=AB=D1=86=D0=B5=D0=BB=D1=8C=20=D0=BD=D0=B5=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B0=C2=BB,=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D1=8B=20null/null=20(=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E=20I-1,=20M-1,=20M-2,=20M-4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- src/types/api.ts | 3 ++- src/widgets/DocumentReview/checkText.test.ts | 7 +++++-- src/widgets/DocumentReview/checkText.ts | 10 +++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/types/api.ts b/src/types/api.ts index 05b62ea..83d2d5d 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -231,8 +231,9 @@ export interface FailedCheckOut { /** -1 в GET …/statement и null в теле 409 — нарушение без колонки (P3-60) */ column_index: number | null; relation: string; - /** null — у связи нет строки цели (P3-30) */ + /** null — цель соотношения не заполнена при непустых членах (P3-30) */ expected: string | null; + /** допускает null по OpenAPI ядра (P3-30) */ actual: string | null; codes: string[]; line_ids: string[]; diff --git a/src/widgets/DocumentReview/checkText.test.ts b/src/widgets/DocumentReview/checkText.test.ts index 43e6e2d..0a67bf1 100644 --- a/src/widgets/DocumentReview/checkText.test.ts +++ b/src/widgets/DocumentReview/checkText.test.ts @@ -18,11 +18,14 @@ describe('failureText', () => { it('обычное нарушение с номером колонки', () => { expect(failureText(base)).toBe('Колонка 1: 1600 = 1700 — ожидалось 10,00, получено 9,00'); }); - it('expected = null: «нет строки цели», без NaN', () => { + it('expected = null: «цель не заполнена»', () => { const text = failureText({ ...base, expected: null }); - expect(text).toContain('ожидалось нет строки цели'); + expect(text).toBe('Колонка 1: 1600 = 1700 — цель не заполнена, получено 9,00'); expect(text).not.toContain('NaN'); }); + it('expected и actual оба null', () => { + expect(failureText({ ...base, expected: null, actual: null })).toContain('цель не заполнена, получено —'); + }); it('actual = null показывается прочерком', () => { expect(failureText({ ...base, actual: null })).toContain('получено —'); }); diff --git a/src/widgets/DocumentReview/checkText.ts b/src/widgets/DocumentReview/checkText.ts index fabfac8..20457f1 100644 --- a/src/widgets/DocumentReview/checkText.ts +++ b/src/widgets/DocumentReview/checkText.ts @@ -1,8 +1,8 @@ import type { FailedCheckOut } from '../../types/api'; import { formatAmount } from '../../utils/money'; -/** Подпись пустой цели: expected = null — у связи нет строки-цели (P3-30). */ -const NO_TARGET = 'нет строки цели'; +/** Подпись пустой цели: expected = null — цель соотношения не заполнена при непустых членах (P3-30). */ +const NO_TARGET = 'цель не заполнена'; /** * Есть ли у нарушения колонка. Ядро кодирует «колонки нет» двумя способами: @@ -13,11 +13,11 @@ export const hasColumn = (index: number | null | undefined): index is number => export const failureKey = (f: Pick): string => `${hasColumn(f.column_index) ? f.column_index : 'none'}-${f.relation}`; -const expectedText = (v: string | null): string => (v === null ? NO_TARGET : formatAmount(v)); - /** «ожидалось …, получено …» для любых expected/actual, в том числе null. */ export const expectedActualText = (f: Pick): string => - `ожидалось ${expectedText(f.expected)}, получено ${formatAmount(f.actual)}`; + f.expected === null + ? `${NO_TARGET}, получено ${formatAmount(f.actual)}` + : `ожидалось ${formatAmount(f.expected)}, получено ${formatAmount(f.actual)}`; export const failureText = (f: FailedCheckOut): string => { const where = hasColumn(f.column_index) ? `Колонка ${f.column_index + 1}` : 'Без колонки';