Files
fuel-price/routes/console.php
Ovidiu U 48af2083f3 feat: add fuel:archive command and monthly scheduler entry
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>
2026-04-29 18:33:05 +01:00

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();