fix: новый шаг в матрице не копирует решение согласующего

После возврата заявки с одним согласующим каждый добавленный на доработке
шаг показывался «Возвращена на доработку»: statusForNewRow копировал общий
статус строк. Решения (согласовано/возвращено/отклонено/выполнено) больше
не копируются — новый шаг показывается с «—». В SharePoint это не
попадало: writeRoute и раньше писал всем строкам «Ждёт очереди».

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-09-29 12:41:25 +05:00
parent b82008943f
commit 27b3c8de2a
2 changed files with 19 additions and 0 deletions
@@ -165,6 +165,11 @@ describe('statusForNewRow', () => {
expect(statusForNewRow(rows)).toBe('—'); expect(statusForNewRow(rows)).toBe('—');
}); });
it('решение согласующего не копируется, даже если оно у всех одинаковое', () => {
expect(statusForNewRow([row({ status: 'Возвращена на доработку' })])).toBe('—');
expect(statusForNewRow([row({ status: 'Согласовано' }), row({ status: 'Согласовано' })])).toBe('—');
});
it('пустой статус приравнивается к прочерку', () => { it('пустой статус приравнивается к прочерку', () => {
expect(statusForNewRow([row({ status: '' }), row({ status: '—' })])).toBe('—'); expect(statusForNewRow([row({ status: '' }), row({ status: '—' })])).toBe('—');
}); });
@@ -3,6 +3,7 @@ import { friendlyErrorMessage } from '../diagnostics';
import { IMatrixRow } from './models/IMatrixRow'; import { IMatrixRow } from './models/IMatrixRow';
import { ISiteUser } from './models/ISiteUser'; import { ISiteUser } from './models/ISiteUser';
import { IApproverOrgInfo } from './approverOrgInfo'; import { IApproverOrgInfo } from './approverOrgInfo';
import { REQUEST_STATUS } from './models/statuses';
export interface IUseMatrixEditor { export interface IUseMatrixEditor {
rows: IMatrixRow[]; rows: IMatrixRow[];
@@ -79,9 +80,22 @@ export function withOrders(rows: IMatrixRow[]): IMatrixRow[] {
// строкам общий статус, и показывать «—» рядом с «Черновик» было бы враньём. // строкам общий статус, и показывать «—» рядом с «Черновик» было бы враньём.
// Если статусы разные (возвращённая заявка, часть шагов уже с решениями) — // Если статусы разные (возвращённая заявка, часть шагов уже с решениями) —
// честнее оставить «—»: в какое состояние попадёт новый шаг, ещё не решено. // честнее оставить «—»: в какое состояние попадёт новый шаг, ещё не решено.
//
// Решение согласующего (Согласовано / Возвращена / Отклонено / Выполнено) не
// копируем никогда, даже если оно у всех строк одинаковое: у только что
// добавленного человека решения нет. Иначе после возврата заявки с одним
// согласующим каждый новый шаг показывался «Возвращена на доработку».
const DECISION_STATUSES: string[] = [
REQUEST_STATUS.approved,
REQUEST_STATUS.returned,
REQUEST_STATUS.rejected,
REQUEST_STATUS.executed,
];
export function statusForNewRow(rows: IMatrixRow[]): string { export function statusForNewRow(rows: IMatrixRow[]): string {
if (rows.length === 0) return '—'; if (rows.length === 0) return '—';
const first = rows[0].status || '—'; const first = rows[0].status || '—';
if (DECISION_STATUSES.indexOf(first) >= 0) return '—';
return rows.every((r) => (r.status || '—') === first) ? first : '—'; return rows.every((r) => (r.status || '—') === first) ? first : '—';
} }