fix: права на заявку новому участнику после делегирования и замены исполнителя
Tests / frontend-test (push) Successful in 2m3s

Права на заявку новым участникам маршрута выдаёт бэкенд по вебхуку на
изменение элемента списка данных. Делегирование и замена/удаление
исполнителя меняли только список согласования — вебхук не приходил, и
новый человек видел «Элемент не найден». Теперь после этих действий
заявка перезаписывается с тем же статусом: значение не меняется, но
появляется новая версия элемента и срабатывает вебхук.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-05 10:21:56 +05:00
parent 8eb5b13985
commit 2e0c942fe5
@@ -120,6 +120,7 @@ export class ApproverService {
// activateNextQueued затем активирует первого делеганта (у него меньший order). // activateNextQueued затем активирует первого делеганта (у него меньший order).
await this.approval.setStatus(current.id, REQUEST_STATUS.queued); await this.approval.setStatus(current.id, REQUEST_STATUS.queued);
await this.approval.activateNextQueued(requestId); await this.approval.activateNextQueued(requestId);
await this.touchRequest(requestId);
emitRequestsChanged(); emitRequestsChanged();
} }
@@ -171,6 +172,7 @@ export class ApproverService {
const row = this.editableExecutionRow(rows, rowId); const row = this.editableExecutionRow(rows, rowId);
const position = await this.approval.getJobTitle(user.loginName).catch(() => ''); const position = await this.approval.getJobTitle(user.loginName).catch(() => '');
await this.approval.replaceApprover(rowId, { email: user.email, position }); await this.approval.replaceApprover(rowId, { email: user.email, position });
await this.touchRequest(requestId);
emitRequestsChanged(); emitRequestsChanged();
return row.status === REQUEST_STATUS.onExecution; return row.status === REQUEST_STATUS.onExecution;
} }
@@ -205,6 +207,7 @@ export class ApproverService {
await this.approval.activateNextQueued(requestId); await this.approval.activateNextQueued(requestId);
const rowsAfter = await this.approval.getForRequest(requestId); const rowsAfter = await this.approval.getForRequest(requestId);
await this.touchRequest(requestId);
emitRequestsChanged(); emitRequestsChanged();
return rowsAfter return rowsAfter
.filter((r) => r.status === REQUEST_STATUS.onExecution && !activeBefore.has(r.id)) .filter((r) => r.status === REQUEST_STATUS.onExecution && !activeBefore.has(r.id))
@@ -270,4 +273,16 @@ export class ApproverService {
RequestStatus: status, RequestStatus: status,
}); });
} }
// Права на заявку новым участникам маршрута выдаёт бэкенд по вебхуку на
// изменение элемента СПИСКА ДАННЫХ. Делегирование и замена/удаление
// исполнителя меняют только список согласования — без этой записи вебхук не
// приходит, и новый человек видит «Элемент не найден». Пишем текущий статус
// как есть: значение не меняется, но у элемента появляется новая версия.
private async touchRequest(id: number): Promise<void> {
const item = (await this.dataList().items.getById(id).select('RequestStatus')()) as {
RequestStatus?: string;
};
await this.updateRequestStatus(id, item.RequestStatus || '');
}
} }