- маршрут /documents/:document_id возвращён: старые ссылки («Открыть подтверждённую форму») снова открывают документ; ЮЛ и консолидация для переключателя документов берутся из документа и его файла, а не из адреса; в списке переключателя — вторая строка (тип · формат · дата), ББ и ОФР одного PDF различимы - чек-лист: ОФР — ячейка INCOME (было 'OFR' → всегда «Отсутствует»), сборка строк — buildChecklistRows с тестами, rowKey по ЮЛ, типы ответа GET …/checklist - удаление файла по id файла (fileId строки), а не по id документа (было 404); ошибка — без закрытия окна - замена: настоящая загрузка нового файла в ту же консолидацию (автозамена ядра, 05-domain-rules §9.5 п. 3), причина — комментарием к заменяемому документу; кнопка доступна только в версии в работе - комментарий: путь без хвостового «/», типы, закрытие только после успеха, лимит 4000 - счётчики над таблицей формы — модуль reviewCounters (по needs_review, как подсветка) с тестами; buildStatementGrid возвращён к test (падали 3 теста) - PageTitle и store возвращены к test (ширина переключателя — внутри DocumentPage; имя ЮЛ — пропсом) - цвет подписей полей в теме: #667085 (опечатка #665087) - типы во всех новых компонентах: tsc 0 ошибок, ESLint/biome без ошибок, vitest 331/331, сборка Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
68 lines
2.1 KiB
TypeScript
68 lines
2.1 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import type { HeaderFieldOut, StatementOut, ValueOut } from '../../types/api';
|
|
import { countReviewValues } from './reviewCounters';
|
|
|
|
const v = (extra: Partial<ValueOut> = {}): ValueOut => ({
|
|
id: 'v',
|
|
column_id: 'c1',
|
|
column_index: 0,
|
|
amount: '1.00',
|
|
string_value: null,
|
|
text: null,
|
|
confidence: '100',
|
|
is_recognized: true,
|
|
is_modified: false,
|
|
original_amount: null,
|
|
needs_review: false,
|
|
is_confirmed: false,
|
|
...extra,
|
|
});
|
|
|
|
const field = (extra: Partial<HeaderFieldOut> = {}): HeaderFieldOut => ({
|
|
value: 'x',
|
|
original_value: 'x',
|
|
verified: null,
|
|
modified: null,
|
|
...extra,
|
|
});
|
|
|
|
const statement = (values: ValueOut[], header: Partial<StatementOut['header']> = {}) =>
|
|
({
|
|
header: {
|
|
inn: field(),
|
|
report_date: field(),
|
|
units: field(),
|
|
organization_name_modified: false,
|
|
needs_review_fields: [],
|
|
...header,
|
|
},
|
|
lines: [{ id: 'l1', values }],
|
|
}) as unknown as StatementOut;
|
|
|
|
describe('countReviewValues', () => {
|
|
it('чистая форма — нули', () => {
|
|
expect(countReviewValues(statement([v(), v()]))).toEqual({ changed: 0, needsReview: 0 });
|
|
});
|
|
|
|
it('на проверку — needs_review без подтверждения и без правки (как подсветка ячейки)', () => {
|
|
const values = [
|
|
v({ needs_review: true }),
|
|
v({ needs_review: true, is_confirmed: true }),
|
|
v({ needs_review: true, is_modified: true }),
|
|
// достроенная сервером ячейка: is_recognized = null, на проверку не считается
|
|
v({ id: null, is_recognized: null, amount: null }),
|
|
];
|
|
expect(countReviewValues(statement(values))).toEqual({ changed: 1, needsReview: 1 });
|
|
});
|
|
|
|
it('шапка: правки полей и наименования, поля из needs_review_fields без подтверждения', () => {
|
|
const s = statement([], {
|
|
inn: field({ modified: true }),
|
|
report_date: field({ verified: true }),
|
|
organization_name_modified: true,
|
|
needs_review_fields: ['report_date', 'units'],
|
|
});
|
|
expect(countReviewValues(s)).toEqual({ changed: 2, needsReview: 1 });
|
|
});
|
|
});
|