copy()->subDays(7)->startOfDay(); $semanaAnteriorHasta = $ahora->copy()->subDay()->endOfDay(); $proximaSemanaHasta = $ahora->copy()->addDays(7)->endOfDay(); // ── Partidos jugados la semana anterior ── $jugados = Evento::with(['equipoLocal.club', 'equipoVisitante.club']) ->whereBetween('fecha_evento', [$semanaAnteriorDesde->toDateString(), $semanaAnteriorHasta->toDateString()]) ->whereNotNull('marcador_local') ->get(); // ── Próximos partidos ── $proximos = Evento::with(['equipoLocal.club', 'equipoVisitante.club']) ->where('fecha_evento', '>=', $ahora->toDateString()) ->where('fecha_evento', '<=', $proximaSemanaHasta->toDateString()) ->orderBy('fecha_evento') ->orderBy('hora_inicio') ->get(); // ── Top goleadores ── $topGoleadores = DB::table('evento_jugador') ->join('jugadores', 'evento_jugador.id_jugador', '=', 'jugadores.id_jugador') ->selectRaw('jugadores.nombre, jugadores.apellido, SUM(evento_jugador.puntos) as total_puntos, COUNT(evento_jugador.id_evento) as partidos') ->groupBy('jugadores.id_jugador', 'jugadores.nombre', 'jugadores.apellido') ->orderByDesc('total_puntos') ->limit(10) ->get(); // ── QRs de la semana ── $qrsSemana = DB::table('qr_codes') ->where('creado', '>=', $semanaAnteriorDesde) ->count(); $qrsValidados = DB::table('qr_codes') ->where('creado', '>=', $semanaAnteriorDesde) ->where('escaneos_restantes', 0) ->count(); $data = compact('jugados', 'proximos', 'topGoleadores', 'qrsSemana', 'qrsValidados', 'semanaAnteriorDesde', 'semanaAnteriorHasta'); if ($this->option('dry-run')) { $this->info('=== REPORTE SEMANAL (DRY RUN) ==='); $this->line("Partidos jugados: {$jugados->count()}"); $this->line("Próximos partidos: {$proximos->count()}"); $this->line("Top goleador: " . ($topGoleadores->first() ? $topGoleadores->first()->apellido . ' (' . $topGoleadores->first()->total_puntos . ' pts)' : 'N/A')); $this->line("QRs generados: {$qrsSemana} | Validados: {$qrsValidados}"); return self::SUCCESS; } // 1. Priorizar email configurado en sistema $emails = []; $configEmail = \App\Models\Configuracion::get('email_reportes'); if ($configEmail) { $emails[] = $configEmail; } // 2. Si no hay, buscar superadmins (rol=1) if (empty($emails)) { $emails = DB::table('admin_users')->where('rol', 1)->whereNotNull('email')->pluck('email')->toArray(); } // 3. Fallback: email del .env if (empty($emails)) { $fallback = config('mail.from.address'); if ($fallback) $emails = [$fallback]; } if (empty($emails)) { $this->error('No hay destinatarios configurados para enviar el reporte.'); return self::FAILURE; } try { Mail::send('emails.reporte_semanal', $data, function ($mail) use ($emails, $ahora) { $mail->to($emails) ->subject("📊 Reporte Semanal ONAPB — Semana del " . $ahora->startOfWeek()->format('d/m')); }); $this->info("✅ Reporte enviado a: " . implode(', ', $emails)); } catch (\Exception $e) { Log::error('Error enviando reporte semanal: ' . $e->getMessage()); $this->error('Error: ' . $e->getMessage()); return self::FAILURE; } return self::SUCCESS; } }