787df436a3
Task 1.6 плана 2026-05-24-billing-v2-spec-c-preflight-vtb. BalanceFrozenReminderJob — окна 24-48ч (reminder) и 72-96ч (final). Throttle через balance_freeze_log markers (event_type 'reminder_sent' / 'final_sent') на 5 дней — повторов в окне не будет. Re-evaluate PreflightResult для актуального дефицита в письме (клиент мог частично пополнить — reminder покажет обновлённое число). Schedule @18:30 MSK (после основного sweep @18:00) — если sweep только что заморозил тенанта, reminder в тот же день не сработает (окно 24h+ ещё не открыто). TDD: 4 теста GREEN (reminder/final/skip-fresh/throttle). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
34 lines
1.1 KiB
PHP
34 lines
1.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Jobs\Billing\BalanceFrozenReminderJob;
|
|
use Illuminate\Console\Command;
|
|
|
|
/**
|
|
* Daily: повторные письма заморозки баланса.
|
|
* • reminder в окне 24-48ч после freeze;
|
|
* • final в окне 72-96ч после freeze.
|
|
*
|
|
* Запускается @18:30 MSK (routes/console.php), после основного preflight-sweep @18:00.
|
|
* Throttle живёт в BalanceFrozenReminderJob через balance_freeze_log markers.
|
|
*/
|
|
final class BillingFrozenReminderCommand extends Command
|
|
{
|
|
/** @var string */
|
|
protected $signature = 'billing:frozen-reminder';
|
|
|
|
/** @var string */
|
|
protected $description = 'Повторные письма заморозки баланса (reminder +1д, final +3д)';
|
|
|
|
public function handle(): int
|
|
{
|
|
(new BalanceFrozenReminderJob)->handle();
|
|
$this->info('Повторные письма заморозки разосланы (если есть кандидаты в окнах).');
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
}
|