feat: параметр source во внешней ссылке ТМЦ сохраняется в заявке

Внешняя система (напр. КПС) передаёт source — пишем его в новую колонку
SourceSystem рядом с SourcePositionId, чтобы по заявке было видно, откуда
она пришла и куда отвечать. Запоминание источника вынесено в отдельный
эффект: positionId/source/склад сохраняются и по ссылке без nomenclatureId.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-05 12:39:48 +05:00
parent 7f1e36874a
commit 9400f8546e
9 changed files with 59 additions and 13 deletions
@@ -129,6 +129,10 @@ describe('parseRoute', () => {
});
});
it('внешняя ссылка ТМЦ: source прокидывается в create как sourceSystem', () => {
expect(parseRoute('?rptype=wh-tmc-transfer&positionId=abc&source=kps').sourceSystem).toBe('kps');
});
it('positionId/nomenclatureId без rptype игнорируются — обычная подача', () => {
// Внешние параметры имеют смысл только при открытии формы (rptype); сами по
// себе не должны влиять на маршрут.
+9 -1
View File
@@ -86,6 +86,13 @@ export interface IRoute {
* этому складу. Приходит по той же внешней ссылке; пусто — все склады.
*/
storeName?: string;
/**
* Система, из которой открыли форму по внешней ссылке (параметр `source`,
* напр. 'kps'). Сохраняется в заявке, чтобы знать, откуда она пришла и куда
* отвечать. Не путать с sourceId (rpsource) — тот про предзаполнение из
* другой заявки портала.
*/
sourceSystem?: string;
/** Подвкладка «Моих заявок»; задана только при nav='own'. */
ownTab?: OwnTab;
/** Фильтр по статусу заявки; задан только при nav='own' и ownTab='created'. */
@@ -378,6 +385,7 @@ export function parseRoute(search: string = window.location.search): IRoute {
const positionId = params.get('positionId') ?? undefined;
const nomenclatureId = params.get('nomenclatureId') ?? undefined;
const storeName = params.get('storeName') ?? undefined;
const sourceSystem = params.get('source') ?? undefined;
// Подвкладка и фильтр — состояние раздела «Мои заявки», поэтому вне его не
// читаются вовсе (иначе чужой rptab из ссылки «протёк» бы в другой раздел).
@@ -432,7 +440,7 @@ export function parseRoute(search: string = window.location.search): IRoute {
// rpmode=approve без валидного rpid) должна откатываться на обычную подачу,
// а не тихо превращаться в открытие пустой формы другого режима.
if (formKey && mode !== 'approve' && mode !== 'edit') {
return { mode: 'create', nav: 'new', formKey, positionId, nomenclatureId, storeName };
return { mode: 'create', nav: 'new', formKey, positionId, nomenclatureId, storeName, sourceSystem };
}
return { mode: 'submit', nav, ownTab, ownStatus, allTypeId, page, query };
}