2
This commit is contained in:
@@ -0,0 +1,363 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Models\Jugador;
|
||||
use App\Models\Aficionado;
|
||||
use App\Models\Evento;
|
||||
use App\Models\Equipo;
|
||||
use App\Models\Promocion;
|
||||
use App\Models\QrCode;
|
||||
use App\Models\PromoQr;
|
||||
use App\Mail\QrCodeMail;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class PanelController extends Controller
|
||||
{
|
||||
private \App\Services\NotificacionService $notifService;
|
||||
|
||||
public function __construct(\App\Services\NotificacionService $notifService)
|
||||
{
|
||||
$this->notifService = $notifService;
|
||||
}
|
||||
|
||||
// ── Helper: obtener usuario logueado ──
|
||||
private function getUser()
|
||||
{
|
||||
if (!session()->has('user_logged_in')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$tipo = session('user_tipo');
|
||||
$id = session('user_id');
|
||||
|
||||
if ($tipo === 'jugador') {
|
||||
return ['user' => Jugador::find($id), 'tipo' => $tipo];
|
||||
}
|
||||
return ['user' => Aficionado::find($id), 'tipo' => $tipo];
|
||||
}
|
||||
|
||||
// ══════════════════════════════════
|
||||
// PANEL PRINCIPAL
|
||||
// ══════════════════════════════════
|
||||
public function index(Request $request)
|
||||
{
|
||||
$data = $this->getUser();
|
||||
if (!$data || !$data['user']) {
|
||||
session()->flush();
|
||||
return redirect('/?logout_msg=' . urlencode('Tu usuario no fue encontrado. Iniciá sesión nuevamente.'));
|
||||
}
|
||||
|
||||
$user = $data['user'];
|
||||
$userTipo = $data['tipo'];
|
||||
$userId = session('user_id');
|
||||
|
||||
// Cargar relaciones de club/equipos para jugadores
|
||||
if ($userTipo === 'jugador') {
|
||||
$user->load(['clubActual', 'equipos.club']);
|
||||
}
|
||||
|
||||
// Obtener QRs del usuario (eventos que NO estén borrados)
|
||||
if ($userTipo === 'jugador') {
|
||||
$qrCodes = QrCode::whereHas('evento')
|
||||
->where('id_jugador', $user->id_jugador)
|
||||
->orderBy('creado', 'desc')
|
||||
->get();
|
||||
} else {
|
||||
$qrCodes = QrCode::whereHas('evento')
|
||||
->where('id_aficionado', $user->id_aficionado)
|
||||
->orderBy('creado', 'desc')
|
||||
->get();
|
||||
}
|
||||
|
||||
// Obtener beneficios de promociones
|
||||
$promoQrs = PromoQr::with('promocion')
|
||||
->where('id_usuario', $userId)
|
||||
->where('tipo_usuario', $userTipo)
|
||||
->orderBy('generado_en', 'desc')
|
||||
->get();
|
||||
|
||||
return view('panel.index', compact('user', 'userTipo', 'qrCodes', 'promoQrs'));
|
||||
}
|
||||
|
||||
// ══════════════════════════════════
|
||||
// ACTUALIZAR DATOS
|
||||
// ══════════════════════════════════
|
||||
public function actualizarDatos(Request $request)
|
||||
{
|
||||
$data = $this->getUser();
|
||||
if (!$data) return redirect('/');
|
||||
|
||||
$request->validate([
|
||||
'email' => 'required|email',
|
||||
'telefono' => 'required|string',
|
||||
'localidad' => 'nullable|string',
|
||||
]);
|
||||
|
||||
$user = $data['user'];
|
||||
|
||||
if ($data['tipo'] === 'jugador') {
|
||||
$user->update([
|
||||
'email' => $request->input('email'),
|
||||
'telefono' => $request->input('telefono'),
|
||||
]);
|
||||
} else {
|
||||
$user->update([
|
||||
'email' => $request->input('email'),
|
||||
'telefono' => $request->input('telefono'),
|
||||
'localidad' => $request->input('localidad'),
|
||||
]);
|
||||
}
|
||||
|
||||
return back()->with('panel_msg', 'Datos actualizados correctamente.');
|
||||
}
|
||||
|
||||
// ══════════════════════════════════
|
||||
// CAMBIAR CONTRASEÑA
|
||||
// ══════════════════════════════════
|
||||
public function cambiarPassword(Request $request)
|
||||
{
|
||||
$data = $this->getUser();
|
||||
if (!$data) return redirect('/');
|
||||
|
||||
$request->validate([
|
||||
'password_actual' => 'required|string',
|
||||
'password_nueva' => 'required|confirmed|min:6',
|
||||
]);
|
||||
|
||||
$user = $data['user'];
|
||||
|
||||
if ($user->password) {
|
||||
if (!Hash::check($request->input('password_actual'), $user->password)) {
|
||||
return back()->with('panel_error', 'La contraseña actual es incorrecta.');
|
||||
}
|
||||
}
|
||||
|
||||
$user->update([
|
||||
'password' => bcrypt($request->input('password_nueva')),
|
||||
]);
|
||||
|
||||
return back()->with('panel_msg', 'Contraseña cambiada correctamente.');
|
||||
}
|
||||
|
||||
// ══════════════════════════════════
|
||||
// SOLICITAR QR PARA EVENTO
|
||||
// ══════════════════════════════════
|
||||
public function solicitarQr(Request $request)
|
||||
{
|
||||
$data = $this->getUser();
|
||||
if (!$data || !$data['user']) return redirect('/');
|
||||
|
||||
$user = $data['user'];
|
||||
$userTipo = $data['tipo'];
|
||||
|
||||
$id_evento = $request->input('id_evento');
|
||||
$evento = Evento::with(['equipoLocal', 'equipoVisitante'])->find($id_evento);
|
||||
|
||||
if (!$evento) {
|
||||
return back()->with('panel_error', 'Evento no encontrado.');
|
||||
}
|
||||
|
||||
$qrs_a_generar = 0;
|
||||
|
||||
if ($userTipo === 'jugador') {
|
||||
// Verificar si ya generó QRs para este evento
|
||||
$yaGenero = QrCode::where('id_evento', $id_evento)
|
||||
->where('id_jugador', $user->id_jugador)
|
||||
->count();
|
||||
|
||||
if ($yaGenero > 0) {
|
||||
return back()->with('panel_error', 'Ya solicitaste QRs para este evento.');
|
||||
}
|
||||
|
||||
// Verificar si el jugador está activo
|
||||
if (!$user->activo) {
|
||||
return back()->with('panel_error', 'Tu registro no está activo. Completá tu registro primero.');
|
||||
}
|
||||
|
||||
// Verificar si pertenece a alguno de los equipos del evento
|
||||
$pertenece = DB::table('jugador_equipo')
|
||||
->where('id_jugador', $user->id_jugador)
|
||||
->whereIn('id_equipo', array_filter([$evento->id_equipo_local, $evento->id_equipo_visitante]))
|
||||
->exists();
|
||||
|
||||
if ($pertenece) {
|
||||
$qrs_a_generar = $evento->limite_qr_jugador ?? 3; // Límite configurable
|
||||
$tipoQr = 'invitado';
|
||||
} else {
|
||||
// Check if category is "libre"
|
||||
$edadCategoria = date('Y') - \Carbon\Carbon::parse($user->fecha_nacimiento)->format('Y');
|
||||
$categoriaDB = \App\Models\Categoria::where('edad_min', '<=', $edadCategoria)
|
||||
->where('edad_max', '>=', $edadCategoria)
|
||||
->first();
|
||||
|
||||
if ($categoriaDB && $categoriaDB->es_libre) {
|
||||
$qrs_a_generar = 1;
|
||||
$tipoQr = 'libre_50'; // Identificador para 50% de descuento
|
||||
} else {
|
||||
return back()->with('panel_error', 'No podés generar QR para este partido ya que no pertenecés a los equipos ni sos categoría Libre. Deberás abonar la totalidad de la entrada en puerta.');
|
||||
}
|
||||
}
|
||||
|
||||
if ($qrs_a_generar === 0) {
|
||||
return back()->with('panel_error', 'No se permiten QRs para este evento.');
|
||||
}
|
||||
|
||||
// Generar QRs
|
||||
for ($i = 0; $i < $qrs_a_generar; $i++) {
|
||||
QrCode::create([
|
||||
'id_qr' => uniqid('qr_'),
|
||||
'id_evento' => $id_evento,
|
||||
'id_jugador' => $user->id_jugador,
|
||||
'tipo_qr' => $tipoQr ?? 'invitado',
|
||||
'escaneos_restantes' => 1,
|
||||
'creado' => now(),
|
||||
]);
|
||||
}
|
||||
|
||||
} else {
|
||||
// Aficionado: no puede solicitar QRs para eventos
|
||||
return back()->with('panel_error', 'Los aficionados no pueden solicitar QRs para eventos. Adquirí tu entrada directamente en el lugar.');
|
||||
}
|
||||
|
||||
// Enviar mail con QRs
|
||||
try {
|
||||
Mail::to($user->email)->send(new QrCodeMail($user, $evento, $qrs_a_generar));
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Error enviando mail de QRs: " . $e->getMessage());
|
||||
}
|
||||
|
||||
// Notificación interna
|
||||
$this->notifService->enviar(
|
||||
$userTipo,
|
||||
$userTipo === 'jugador' ? $user->id_jugador : $user->id_aficionado,
|
||||
'sistema',
|
||||
'🎫 QRs Generados',
|
||||
"Tus {$qrs_a_generar} QR(s) para el evento " . ($evento->nombre_evento ?? 'seleccionado') . " ya están disponibles.",
|
||||
route('panel.mis.qrs', ['evento' => $id_evento])
|
||||
);
|
||||
|
||||
return redirect()->route('panel.mis.qrs', ['evento' => $id_evento])
|
||||
->with('panel_msg', "¡QR(s) generados correctamente! ({$qrs_a_generar})");
|
||||
}
|
||||
|
||||
// ══════════════════════════════════
|
||||
// MIS QRS (per evento)
|
||||
// ══════════════════════════════════
|
||||
public function misQrs(Request $request)
|
||||
{
|
||||
$data = $this->getUser();
|
||||
if (!$data || !$data['user']) return redirect('/');
|
||||
|
||||
$user = $data['user'];
|
||||
$userTipo = $data['tipo'];
|
||||
$id_evento = $request->query('evento');
|
||||
|
||||
// Traer QRs del usuario (solo de eventos activos)
|
||||
$query = QrCode::whereHas('evento')
|
||||
->with(['evento.equipoLocal.club', 'evento.equipoVisitante.club', 'evento.torneo']);
|
||||
|
||||
if ($userTipo === 'jugador') {
|
||||
$query->where('id_jugador', $user->id_jugador);
|
||||
$user->load('clubActual');
|
||||
} else {
|
||||
$query->where('id_aficionado', $user->id_aficionado);
|
||||
}
|
||||
|
||||
if ($id_evento) {
|
||||
$query->where('id_evento', $id_evento);
|
||||
$evento = Evento::find($id_evento);
|
||||
} else {
|
||||
$evento = null;
|
||||
}
|
||||
|
||||
$qrs = $query->orderBy('creado', 'desc')->get();
|
||||
|
||||
// Adjuntar información de grupo si hay torneo
|
||||
foreach ($qrs as $qr) {
|
||||
if ($qr->evento && $qr->evento->id_torneo && $qr->evento->id_equipo_local) {
|
||||
$rel = DB::table('torneo_equipo')
|
||||
->where('id_torneo', $qr->evento->id_torneo)
|
||||
->where('id_equipo', $qr->evento->id_equipo_local)
|
||||
->first();
|
||||
if ($rel) {
|
||||
$qr->evento->grupo_nombre = $rel->grupo ?? 'General';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return view('panel.mis_qrs', compact('user', 'userTipo', 'qrs', 'evento'));
|
||||
}
|
||||
|
||||
// ══════════════════════════════════
|
||||
// GENERAR QR PARA PROMOCIÓN
|
||||
// ══════════════════════════════════
|
||||
public function generarPromoQr(Request $request)
|
||||
{
|
||||
$data = $this->getUser();
|
||||
if (!$data || !$data['user']) return redirect('/');
|
||||
|
||||
$user = $data['user'];
|
||||
$userTipo = $data['tipo'];
|
||||
$userId = session('user_id');
|
||||
|
||||
$id_promo = $request->input('id_promo');
|
||||
$promo = Promocion::find($id_promo);
|
||||
|
||||
if (!$promo) {
|
||||
return back()->with('panel_error', 'Promoción no encontrada.');
|
||||
}
|
||||
|
||||
// Verificar si ya generó QR para esta promo
|
||||
$yaGenero = PromoQr::where('id_promo', $id_promo)
|
||||
->where('id_usuario', $userId)
|
||||
->where('tipo_usuario', $userTipo)
|
||||
->count();
|
||||
|
||||
if ($yaGenero > 0) {
|
||||
return back()->with('panel_error', 'Ya generaste un QR para esta promoción.');
|
||||
}
|
||||
|
||||
$id_qr = bin2hex(random_bytes(8));
|
||||
|
||||
PromoQr::create([
|
||||
'id_qr' => $id_qr,
|
||||
'id_promo' => $id_promo,
|
||||
'id_usuario' => $userId,
|
||||
'tipo_usuario' => $userTipo,
|
||||
'generado_en' => now(),
|
||||
'usado' => false,
|
||||
]);
|
||||
|
||||
return redirect()->route('panel.promo.qr.ver', ['id' => $id_qr])
|
||||
->with('panel_msg', '¡QR de beneficio generado correctamente!');
|
||||
}
|
||||
|
||||
// ══════════════════════════════════
|
||||
// VER QR DE PROMOCIÓN
|
||||
// ══════════════════════════════════
|
||||
public function verPromoQr($id)
|
||||
{
|
||||
$data = $this->getUser();
|
||||
if (!$data || !$data['user']) return redirect('/');
|
||||
|
||||
$user = $data['user'];
|
||||
$userTipo = $data['tipo'];
|
||||
|
||||
if ($userTipo === 'jugador') {
|
||||
$user->load('clubActual');
|
||||
}
|
||||
|
||||
$promoQr = PromoQr::with('promocion')
|
||||
->where('id_qr', $id)
|
||||
->where('id_usuario', session('user_id'))
|
||||
->where('tipo_usuario', $userTipo)
|
||||
->firstOrFail();
|
||||
|
||||
return view('panel.promo_qr', compact('promoQr', 'user', 'userTipo'));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user