diff --git a/web/src/types/api.ts b/web/src/types/api.ts index 52e0e9a..c6e0850 100644 --- a/web/src/types/api.ts +++ b/web/src/types/api.ts @@ -127,6 +127,8 @@ export interface IssueCountsOut { } /** Уровень строки ОСВ (DBML `osv_group_type`). */ export type OsvGroupType = 'ACCOUNT' | 'DEPARTMENT' | 'COUNTERPARTY' | 'CONTRACT' | 'OTHER'; +/** Вид сумм строки ОСВ (`osv_data_type`): BU, SUM — рубли; NU, CURRENCY, QUANTITY — строки-показатели под строкой БУ. */ +export type OsvDataType = 'BU' | 'NU' | 'CURRENCY' | 'QUANTITY' | 'SUM'; export interface EntryOut { id: string; @@ -136,6 +138,7 @@ export interface EntryOut { row_value: string | null; group_type: OsvGroupType | null; group_name: string | null; + data_type: OsvDataType | null; account_code: string | null; counterparty_name: string | null; counterparty_inn: string | null; diff --git a/web/src/widgets/DocumentReview/OsvDocument.tsx b/web/src/widgets/DocumentReview/OsvDocument.tsx index e162784..2e0661c 100644 --- a/web/src/widgets/DocumentReview/OsvDocument.tsx +++ b/web/src/widgets/DocumentReview/OsvDocument.tsx @@ -10,11 +10,15 @@ import { IssuesPanel } from './IssuesPanel'; import { confirmButtonStyle } from './ReviewCard'; import { expectedActualText, failureKey } from './checkText'; import { confirmErrorInfo } from './confirmError'; -import { AMOUNT_KEYS, type AmountKey, type OsvRow, flattenEntries } from './osvRows'; +import { AMOUNT_KEYS, type AmountKey, type OsvRow, filterRows, flattenEntries } from './osvRows'; import { osvBodyHeight } from './osvTableSize'; /** Ширина колонки суммы: «17 780 468 796,56» помещается в одну строку, «Итого по документу» не переносится и не обрезается. */ const MONEY_WIDTH = 160; +/** Отступ одного уровня вложенности в колонке аналитики, px. */ +const INDENT = 16; +/** Строки-группы (счёт, субсчёт, подразделение с вложенными строками) — жирным, как промежуточные итоги в 1С. */ +const groupRowStyle = { fontWeight: 600 }; const money = (key: AmountKey, title: string) => ({ key, @@ -48,7 +52,8 @@ function buildColumns(options: ColumnsOptions): ColumnsType { title: analyticsHint ? {analyticsTitle} : analyticsTitle, dataIndex: 'analytics', width: 320, - render: (v: string | null) => v ?? '—', + // отступ по уровню вложенности — дерево строк как в 1С + render: (v: string | null, row: OsvRow) => {v ?? '—'}, }, ...(hasCounterparties ? [{ key: 'inn', title: 'ИНН', dataIndex: 'inn', width: 120 }] : []), group('Сальдо на начало периода', [money('opening_debit', 'Дебет'), money('opening_credit', 'Кредит')]), @@ -57,15 +62,6 @@ function buildColumns(options: ColumnsOptions): ColumnsType { ]; } -/** Поиск по аналитике (и по ИНН, если он есть) без учёта регистра и фильтр по субсчёту — на клиенте: строки документа уже загружены целиком. */ -function filterRows(rows: OsvRow[], query: string, account: string | undefined): OsvRow[] { - const q = query.trim().toLowerCase(); - return rows.filter( - (row) => - (!account || row.account === account) && (!q || (row.analytics ?? '').toLowerCase().includes(q) || (row.inn ?? '').includes(q)), - ); -} - interface ConfirmProblem { code: string | undefined; message: string; @@ -164,7 +160,7 @@ export function OsvDocument({ document, onChanged }: { document: DocumentOut; on />