fix(marketplace): приёмка партии из списка — через единый диалог коррекции (ревью 2026-05-30)

Кнопка «Создать акт приёмки» на ожидающей партии звала createAplReception
напрямую, без формы сверки — оператор принимал по заказанным кол-вам и
исходным ценам (риск «приняли как 100, хотя привезли 80»). Перенаправлена в
openPickupForSupplier («Принять партию») — тот же диалог коррекции кол-ва/цены,
что и QR-скан и «самовывоз по факту». Коррекция доступна на ВСЕХ путях приёмки
без исключений. createReceptionForShipment удалена. Фронт-only, codegen не нужен.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ant
2026-05-30 16:05:32 +00:00
parent d50e0f85a2
commit 923532bed7
@@ -34,8 +34,11 @@ import SignAplReceptionChairmanDialog from './SignAplReceptionChairmanDialog.vue
*
* Оператор не вводит идентификатор партии руками — он либо выбирает
* ожидающую приёмки партию из списка (партии `SUPPLY_PREPARED`, прибывшие
* на его КУ), либо сканирует QR поставщика (Story 14.3). Оба пути зовут
* `createAplReception({ shipment_id })`.
* на его КУ), либо сканирует QR поставщика (Story 14.3). Все пути ведут в
* единый диалог коррекции (`openPickupForSupplier`): оператор сверяет факт,
* правит количество и цену по каждой единице и только потом формирует акт —
* коррекция доступна ВСЕГДА и без исключений (ревью 2026-05-30). Без формы
* сверки нельзя: иначе риск «приняли как заказано, хотя привезли меньше».
*
* Story 14.2: отдельный раздел «Самовывоз по факту» — поставщики с принятыми
* заказами, которые не формировали партию заранее. Оператор принимает по факту
@@ -154,24 +157,6 @@ async function acceptExpressPickup(
await openPickupForSupplier(candidate.offerer_account);
}
async function createReceptionForShipment(shipmentId: string): Promise<void> {
const id = shipmentId.trim();
if (!id) {
FailAlert(new Error('Не указана партия для приёмки.'));
return;
}
Loading.show({ message: 'Создаю акт приёмки…' });
try {
await createAplReception({ shipment_id: id });
SuccessAlert('Акт приёмки создан');
await load();
} catch (e) {
FailAlert(e, 'Не удалось создать акт приёмки');
} finally {
Loading.hide();
}
}
// QR-код передачи (Эпик 14, агрегирующая приёмка): оператор сканирует
// account-bound код поставщика → грузим ВСЕ единицы имущества этого поставщика,
// ожидающие приёмки на этом КУ (единый базис «акцепт поставщика на КУ», R4),
@@ -370,8 +355,8 @@ q-page.reception(role='region', aria-label='Приёмка партии')
template(v-else)
PageHint(storage-key='mp:operator-reception:banner-dismissed')
| Партии, прибывшие на ваш пункт выдачи, ждут приёмки ниже. Выберите партию
| (или отсканируйте QR поставщика), создайте акт приёмки и подпишите его
| председателем участка.
| (или отсканируйте QR поставщика), сверьте фактическое количество и цену
| по каждой позиции, сформируйте акт и подпишите его председателем участка.
//- Ожидающие приёмки партии: выбор из списка вместо ручного ввода id.
//- QR-сканер — для тех, кто принимает с телефона (Story 14.3).
@@ -391,10 +376,10 @@ q-page.reception(role='region', aria-label='Приёмка партии')
.reception__ship-meta
| {{ SHIPMENT_VARIANT_LABEL[s.delivery_variant] ?? s.delivery_variant }} · {{ formatAsset2Digits(s.total_amount) }}
template(v-if='s.ttn_number') · ТТН {{ s.ttn_number }}
BaseButton(variant='primary', size='sm', @click='createReceptionForShipment(s.id)')
BaseButton(variant='primary', size='sm', @click='openPickupForSupplier(s.offerer_account)')
template(#icon-left)
q-icon(name='add', size='16px')
| Создать акт приёмки
q-icon(name='how_to_reg', size='16px')
| Принять партию
//- Story 14.2: самовывоз по факту — поставщик приехал без заранее
//- сформированной партии; оператор открывает приёмку по факту присутствия.