comment(Inspiring::quote()); })->purpose('Display an inspiring quote'); // Spec §6.1: ежедневный сброс projects.delivered_today=0 в 00:00 МСК. // delivered_in_month НЕ трогаем — это месячный счётчик, отдельный cron Plan 4. // // NB: без `withoutOverlapping()` — операция идемпотентна (UPDATE WHERE delivered_today <> 0) // и завершается за < 1 сек на любом ожидаемом объёме, overlap физически невозможен. // Кроме того, `withoutOverlapping` требует таблицу `cache_locks`, которой в нашей // schema.sql нет (Laravel-default-миграции удалены, см. project_state.md фаза 1). Schedule::command('projects:reset-delivered-today') ->dailyAt('00:00') ->timezone('Europe/Moscow'); // Plan 4: monthly reset 1-го числа в 00:00 МСК для tier-lookup в LedgerService. Schedule::command('projects:reset-monthly') ->monthlyOn(1, '00:00') ->timezone('Europe/Moscow'); // Audit #2 Phase 14 P2: partition maintenance — создаёт разделы на 3 месяца вперёд. // Без этой записи partitions:create-months не запускается автоматически. Schedule::command('partitions:create-months') ->daily() ->timezone('Europe/Moscow'); // Plan 3 Task 8: 5 Schedule entries для supplier-flow. // // NB: ->onOneServer() требует cache_locks таблицу, которой у нас нет // (см. project_state.md фаза 1). Операции идемпотентны: SyncSupplierProjectsJob // делает diff'ы (skip-no-diff), CleanupJob — UPDATE WHERE conditions, RefreshSession // — Cache::lock guard внутри handle, RetryFailedSupplierJobs — WHERE retried_at // фильтр. На multi-server prod может потребовать cache_locks таблицу. Schedule::job(new RefreshSupplierSessionJob)->hourly(); Schedule::job(new RefreshSupplierSessionJob) ->dailyAt('20:15') ->timezone('Europe/Moscow'); Schedule::job(new SyncSupplierProjectsJob) ->dailyAt('20:30') ->timezone('Europe/Moscow'); Schedule::job(new CleanupInactiveSupplierProjectsJob) ->dailyAt('02:00') ->timezone('Europe/Moscow'); Schedule::command('supplier:retry-failed')->hourly(); // Plan 4 Task 8: hourly CSV reconciliation (резерв-канал приёма лидов). // Spec: docs/superpowers/specs/2026-05-11-plan4-billing-csv-admin-design.md §5.3 Schedule::job(new CsvReconcileJob)->hourly();