option('school-year'); $autoFix = $this->option('fix'); $result = $movementService->reconcile($schoolYear); $this->info("School Year: {$result['school_year']}"); $this->info("Total Items: {$result['total_items']}"); $this->info("Discrepancies: {$result['discrepancies_count']}"); if (empty($result['discrepancies'])) { $this->info('✅ All item quantities match movement ledger.'); return Command::SUCCESS; } $this->table( ['ID', 'Name', 'Stored Qty', 'Movement Sum', 'Variance'], collect($result['discrepancies'])->map(fn ($d) => [ $d['id'], $d['name'], $d['stored_quantity'], $d['movement_sum'], $d['variance'], ])->toArray() ); if ($autoFix) { $this->info('Fixing discrepancies...'); foreach ($result['discrepancies'] as $d) { if ($d['variance'] !== 0) { $movementService->recordMovement( itemId: $d['id'], qtyChange: -$d['variance'], type: 'adjust', reason: 'Auto-reconciliation: stored qty differed from movement sum', note: 'Reconciled from '.$d['stored_quantity'].' to '.$d['movement_sum'], performedBy: null ); $this->line(" Fixed item #{$d['id']} ({$d['name']}): variance was {$d['variance']}"); } } $this->info('✅ Fix applied.'); } else { $this->warn('Run with --fix to automatically correct discrepancies.'); } return Command::SUCCESS; } }