scan($paths); $added = 0; $disabled = 0; $unchanged = 0; // Upsert discovered actions foreach ($discovered as $class => $attribute) { $existing = ScheduledAction::where('action_class', $class)->first(); if ($existing) { $unchanged++; continue; } ScheduledAction::create([ 'action_class' => $class, 'frequency' => $attribute->frequency, 'timezone' => $attribute->timezone, 'without_overlapping' => $attribute->withoutOverlapping, 'run_in_background' => $attribute->runInBackground, 'is_enabled' => true, ]); $added++; } // Disable actions no longer in codebase $discoveredClasses = array_keys($discovered); if (empty($discoveredClasses)) { $this->warn('No scheduled actions discovered — skipping stale cleanup to avoid disabling all rows.'); } else { $stale = ScheduledAction::where('is_enabled', true) ->whereNotIn('action_class', $discoveredClasses) ->get(); foreach ($stale as $action) { $action->update(['is_enabled' => false]); $disabled++; } } $this->info("Schedule sync complete: {$added} added, {$disabled} disabled, {$unchanged} unchanged."); return Command::SUCCESS; } }