Files
portal/app/app/Services/Supplier/Channel/Exceptions/WindowDeferredException.php
T
Дмитрий 0e27844a28 feat(supplier): FailoverProjectChannel skeleton — escalation matrix without dedup
Tier 1 → классификация исключения → ярус 2 (плейсхолдер) / ярус 3 (queue).
Без портального dedup (см. Task 5). Без реального Tier 2 (см. Task 7).

Матрица эскалации:
- Tier 1 success → return id
- WindowDeferredException → re-throw (операция переносится, без queue/alert)
- SupplierTransientException → сразу Tier 3 (skip Tier 2 — хост недоступен)
- SupplierClient/AuthException → Tier 2; success → failover_to_form alert;
  fail → Tier 3 queue + manual_required alert + TierEscalatedException
- escalateToTier3 пишет supplier_manual_sync_queue + queue'ит критический alert.

6 тестов матрицы эскалации зелёные (17 assertions). Spec §4.4, §6, §8.
Task 4 of 12.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 12:55:06 +03:00

17 lines
622 B
PHP

<?php
declare(strict_types=1);
namespace App\Services\Supplier\Channel\Exceptions;
/**
* Маркер «портал отказал по причине окна редактирования» (22:00-00:00 МСК).
*
* НЕ сбой канала — операция переносится. FailoverProjectChannel пропускает
* эскалацию ярусов и не пишет в supplier_manual_sync_queue. Job-уровень
* получает исключение и помечает попытку как deferred.
*
* Spec §8.
*/
final class WindowDeferredException extends \RuntimeException {}