Completes Tasks 12 + 13 from docs/superpowers/plans/2026-04-03-fuel-api-ingestion.md. - ArchiveOldPricesCommand moves station_prices rows older than 12 months into station_prices_archive in chunks of 1000, wrapping each chunk's insert + delete in a DB::transaction so a partial failure can't duplicate rows. - StationPriceArchive: add $table = 'station_prices_archive'; without it Eloquent infers 'station_price_archives' and the insert would fail. - routes/console.php: register fuel:archive monthly on the 1st at 04:00 UTC, alongside the other fuel/oil scheduler entries. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
47 lines
1.6 KiB
PHP
47 lines
1.6 KiB
PHP
<?php
|
|
|
|
use App\Jobs\SendScheduledWhatsAppJob;
|
|
use Illuminate\Foundation\Inspiring;
|
|
use Illuminate\Support\Facades\Artisan;
|
|
use Illuminate\Support\Facades\Schedule;
|
|
|
|
Artisan::command('inspire', function () {
|
|
$this->comment(Inspiring::quote());
|
|
})->purpose('Display an inspiring quote');
|
|
|
|
// Poll for price changes every 30 minutes — API updates within 30 min of any
|
|
// change. The command auto-refreshes station metadata once per day on the
|
|
// first poll after midnight, and uses incremental fetch thereafter.
|
|
Schedule::command('fuel:poll')
|
|
->everyThirtyMinutes()
|
|
->withoutOverlapping()
|
|
->onOneServer()
|
|
->runInBackground();
|
|
|
|
// Safety-net full station + price refresh at 3am in case the auto-refresh
|
|
// staleness check is skipped for any reason.
|
|
Schedule::command('fuel:poll --full')
|
|
->dailyAt('03:00')
|
|
->withoutOverlapping()
|
|
->onOneServer()
|
|
->runInBackground();
|
|
|
|
// Fetch FRED prices and generate oil price prediction daily at 7am
|
|
Schedule::command('oil:predict --fetch')
|
|
->dailyAt('07:00')
|
|
->withoutOverlapping()
|
|
->onOneServer()
|
|
->runInBackground();
|
|
|
|
// Move station_prices rows older than 12 months into station_prices_archive
|
|
// once a month. Keeps the partitioned hot table bounded.
|
|
Schedule::command('fuel:archive')
|
|
->monthlyOn(1, '04:00')
|
|
->withoutOverlapping()
|
|
->onOneServer()
|
|
->runInBackground();
|
|
|
|
// Scheduled WhatsApp updates — morning and evening
|
|
Schedule::job(new SendScheduledWhatsAppJob('morning'))->dailyAt('07:30')->onOneServer();
|
|
Schedule::job(new SendScheduledWhatsAppJob('evening'))->dailyAt('18:00')->onOneServer();
|