3
This commit is contained in:
@@ -0,0 +1,323 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Mi Panel - OnAPB')
|
||||
|
||||
@section('content')
|
||||
|
||||
<div class="container-fluid py-5" style="background: var(--surface);">
|
||||
<div class="container py-4">
|
||||
<div class="mb-5 d-flex justify-content-between align-items-end">
|
||||
<div>
|
||||
<span class="text-primary fw-bold tracking-widest text-uppercase d-block mb-2">Mi Perfil</span>
|
||||
<h1 class="display-1 fw-bold mb-0" style="line-height: 0.9;">{{ $user->nombre }}<span class="text-primary">.</span></h1>
|
||||
</div>
|
||||
<div class="text-end">
|
||||
<span class="badge bg-dark px-3 py-2 text-uppercase">{{ $userTipo }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(session('panel_msg'))
|
||||
<div class="bg-white p-4 mb-4 border-start border-success border-5 shadow-sm">
|
||||
<p class="mb-0 fw-bold text-success"><i class="bi bi-check-circle-fill me-2"></i> {{ session('panel_msg') }}</p>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="row g-4">
|
||||
<!-- Columna Izquierda: Datos y Config -->
|
||||
<div class="col-lg-4">
|
||||
<div class="kinetic-card p-4 mb-4">
|
||||
<h3 class="fw-bold mb-4 text-uppercase border-bottom pb-2">Datos Personales</h3>
|
||||
<form method="POST" action="{{ route('panel.actualizar') }}">
|
||||
@csrf
|
||||
<div class="mb-3">
|
||||
<label class="small fw-bold text-muted text-uppercase d-block mb-1">Nombre Completo</label>
|
||||
<div class="fs-5 fw-bold">{{ $user->nombre }} {{ $user->apellido }}</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="small fw-bold text-muted text-uppercase d-block mb-1">DNI / Documento</label>
|
||||
<div class="fs-5">{{ $userTipo === 'jugador' ? $user->documento : $user->dni }}</div>
|
||||
</div>
|
||||
@if($userTipo === 'jugador')
|
||||
<div class="mb-3">
|
||||
<label class="small fw-bold text-muted text-uppercase d-block mb-1">Categoría</label>
|
||||
<div class="fs-5 fw-bold text-primary">{{ $user->categoria_calculada }}</div>
|
||||
</div>
|
||||
@endif
|
||||
<hr class="my-4">
|
||||
<div class="mb-3">
|
||||
<label class="small fw-bold text-muted text-uppercase d-block mb-1">Email</label>
|
||||
<input type="email" name="email" class="form-control border-0 bg-light p-3" value="{{ $user->email }}" required style="border-radius: 0;">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="small fw-bold text-muted text-uppercase d-block mb-1">Teléfono</label>
|
||||
<input type="text" name="telefono" class="form-control border-0 bg-light p-3" value="{{ $user->telefono }}" required style="border-radius: 0;">
|
||||
</div>
|
||||
<button type="submit" class="btn-kinetic-primary w-100 py-3 mt-2">ACTUALIZAR DATOS</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="kinetic-card p-4">
|
||||
<h3 class="fw-bold mb-4 text-uppercase border-bottom pb-2">Seguridad</h3>
|
||||
<form method="POST" action="{{ route('panel.password') }}">
|
||||
@csrf
|
||||
<div class="mb-3">
|
||||
<input type="password" name="password_actual" class="form-control border-0 bg-light p-3" placeholder="Contraseña actual" required style="border-radius: 0;">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<input type="password" name="password_nueva" class="form-control border-0 bg-light p-3" placeholder="Nueva contraseña" required style="border-radius: 0;">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-dark w-100 py-3" style="border-radius: 0;">CAMBIAR CONTRASEÑA</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Columna Derecha: Actividad y QRs -->
|
||||
<div class="col-lg-8">
|
||||
@if($userTipo === 'jugador')
|
||||
<div class="kinetic-card p-4 mb-4" style="background: var(--primary-container);">
|
||||
<h3 class="fw-bold mb-4 text-uppercase">Mi Club</h3>
|
||||
<div class="d-flex align-items-center bg-white p-4 shadow-sm">
|
||||
<div class="me-4" style="width: 80px; height: 80px;">
|
||||
@if($user->clubActual && $user->clubActual->imagen)
|
||||
<img src="{{ asset($user->clubActual->imagen) }}" alt="{{ $user->clubActual->nombre }}" class="w-100 h-100" style="object-fit: contain;">
|
||||
@else
|
||||
<div class="w-100 h-100 bg-primary d-flex align-items-center justify-content-center text-white">
|
||||
<i class="bi bi-shield-fill fs-1"></i>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h2 class="fw-bold mb-0">{{ $user->clubActual->nombre ?? 'Sin Club Asignado' }}</h2>
|
||||
@if($user->equipos && $user->equipos->count() > 0)
|
||||
<p class="text-muted mb-0">{{ $user->equipos->count() }} equipos registrados</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- Mis Entradas -->
|
||||
<div class="mb-4">
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<h3 class="fw-bold mb-0 text-uppercase">Mis Entradas (QRs)</h3>
|
||||
<a href="{{ route('panel.mis.qrs') }}" class="text-primary fw-bold text-decoration-none">VER TODAS <i class="bi bi-arrow-right"></i></a>
|
||||
</div>
|
||||
|
||||
@if($qrCodes->isEmpty())
|
||||
<div class="bg-white p-5 text-center shadow-sm border-dashed">
|
||||
<p class="text-muted mb-0">No tenés entradas activas.</p>
|
||||
<a href="{{ route('eventos.index') }}" class="btn-kinetic-primary mt-3 px-4">BUSCAR EVENTOS</a>
|
||||
</div>
|
||||
@else
|
||||
<div class="row g-3">
|
||||
@foreach($qrCodes->take(4) as $qr)
|
||||
<div class="col-md-6">
|
||||
<div class="bg-white p-4 shadow-sm border-start border-primary border-5 d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<h5 class="fw-bold mb-1">{{ $qr->evento ? $qr->evento->nombre_evento : 'Evento' }}</h5>
|
||||
<span class="badge {{ $qr->escaneos_restantes > 0 ? 'bg-success' : 'bg-danger' }} text-uppercase">
|
||||
{{ $qr->escaneos_restantes > 0 ? 'Disponible' : 'Usado' }}
|
||||
</span>
|
||||
</div>
|
||||
<a href="{{ route('panel.mis.qrs', ['evento' => $qr->id_evento]) }}" class="btn btn-outline-dark btn-sm" style="border-radius: 0;">VER QR</a>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<!-- Mis Beneficios -->
|
||||
<div>
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<h3 class="fw-bold mb-0 text-uppercase">Mis Beneficios</h3>
|
||||
<a href="{{ route('promos.index') }}" class="text-primary fw-bold text-decoration-none">BUSCAR MÁS <i class="bi bi-arrow-right"></i></a>
|
||||
</div>
|
||||
|
||||
@if($promoQrs->isEmpty())
|
||||
<div class="bg-white p-5 text-center shadow-sm border-dashed">
|
||||
<p class="text-muted mb-0">No reclamaste beneficios aún.</p>
|
||||
</div>
|
||||
@else
|
||||
<div class="table-responsive bg-white shadow-sm p-3">
|
||||
<table class="table table-hover align-middle mb-0">
|
||||
<thead class="bg-light">
|
||||
<tr>
|
||||
<th class="border-0 text-uppercase small fw-bold">Promoción</th>
|
||||
<th class="border-0 text-uppercase small fw-bold text-center">Estado</th>
|
||||
<th class="border-0 text-uppercase small fw-bold text-end">Acciones</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($promoQrs->take(5) as $pq)
|
||||
<tr>
|
||||
<td>
|
||||
<div class="fw-bold">{{ $pq->promocion ? $pq->promocion->nombre : 'Beneficio' }}</div>
|
||||
<div class="small text-muted">{{ $pq->promocion->direccion ?? '' }}</div>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="badge {{ $pq->usado ? 'bg-light text-muted' : 'bg-primary' }} text-uppercase">
|
||||
{{ $pq->usado ? 'Usado' : 'Disponible' }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-end">
|
||||
@if(!$pq->usado)
|
||||
<a href="{{ route('panel.promo.qr.ver', $pq->id_qr) }}" class="btn btn-link text-primary p-0">Ver QR</a>
|
||||
@else
|
||||
<span class="text-muted small">—</span>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- ═══════════════════════════════════════════ --}}
|
||||
{{-- SECCIÓN: MIS EQUIPOS SEGUIDOS --}}
|
||||
{{-- ═══════════════════════════════════════════ --}}
|
||||
<div class="mt-5" id="mis-equipos-seguidos">
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h2 class="fw-bold text-uppercase mb-0">
|
||||
<i class="bi bi-star-fill text-warning me-2"></i>Equipos Seguidos
|
||||
</h2>
|
||||
<a href="{{ route('eventos.index') }}" class="text-primary fw-bold text-decoration-none small">
|
||||
Ver todos los partidos <i class="bi bi-arrow-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div id="equipos-seguidos-container">
|
||||
<div class="text-center py-4 text-muted">
|
||||
<div class="spinner-border spinner-border-sm me-2" role="status"></div> Cargando...
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Si es jugador, mostrar sus equipos propios --}}
|
||||
@if($userTipo === 'jugador' && $user->equipos && $user->equipos->count() > 0)
|
||||
<div class="mt-4">
|
||||
<h5 class="fw-bold text-muted text-uppercase small border-bottom pb-2 mb-3">Mis Equipos (asignados)</h5>
|
||||
<div class="row g-3">
|
||||
@foreach($user->equipos as $eq)
|
||||
<div class="col-md-4">
|
||||
<div class="bg-white p-3 shadow-sm d-flex align-items-center gap-3">
|
||||
<div class="bg-primary bg-opacity-10 rounded p-2">
|
||||
<i class="bi bi-shield-fill text-primary fs-4"></i>
|
||||
</div>
|
||||
<div>
|
||||
<div class="fw-bold">{{ $eq->club->nombre ?? '?' }}</div>
|
||||
<div class="small text-muted">{{ $eq->categoria }} {{ $eq->division }}</div>
|
||||
</div>
|
||||
<a href="{{ route('equipos.show', $eq->id_equipo) }}" class="ms-auto btn btn-sm btn-outline-primary">Ver</a>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- Buscar más equipos para seguir --}}
|
||||
<div class="text-center mt-4">
|
||||
<p class="text-muted small">¿Querés seguir más equipos?</p>
|
||||
<a href="{{ route('torneos.standings', ['id' => optional(\App\Models\Torneo::latest('fecha_inicio')->first())->id ?? 0]) }}" class="btn btn-outline-dark btn-sm">
|
||||
<i class="bi bi-trophy me-1"></i> Ver torneos y equipos
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('scripts')
|
||||
<script>
|
||||
// Cargar equipos seguidos vía AJAX
|
||||
fetch('/seguimiento/mis-equipos')
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
const container = document.getElementById('equipos-seguidos-container');
|
||||
if (!container) return;
|
||||
|
||||
if (!data.equipos || data.equipos.length === 0) {
|
||||
container.innerHTML = `
|
||||
<div class="bg-white p-4 text-center shadow-sm">
|
||||
<i class="bi bi-star display-4 text-muted opacity-50"></i>
|
||||
<p class="mt-2 text-muted">No seguís ningún equipo todavía.</p>
|
||||
<p class="text-muted small">Andá a la página de un equipo o torneo y presioná "Seguir".</p>
|
||||
</div>`;
|
||||
return;
|
||||
}
|
||||
|
||||
// Próximos partidos
|
||||
let partidosHtml = '';
|
||||
if (data.proximos_partidos && data.proximos_partidos.length > 0) {
|
||||
partidosHtml = `<h6 class="text-uppercase fw-bold text-muted mt-4 mb-3 small">Próximos partidos</h6><div class="row g-3">`;
|
||||
data.proximos_partidos.forEach(p => {
|
||||
partidosHtml += `
|
||||
<div class="col-md-6">
|
||||
<div class="bg-white p-3 shadow-sm border-start border-3 border-primary">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div>
|
||||
<div class="fw-bold">${p.local} <span class="text-muted">vs</span> ${p.visitante}</div>
|
||||
<div class="small text-muted mt-1">
|
||||
<i class="bi bi-calendar3 me-1"></i>${p.fecha}
|
||||
${p.hora ? '<i class="bi bi-clock ms-2 me-1"></i>' + p.hora : ''}
|
||||
${p.sede ? '<i class="bi bi-geo-alt ms-2 me-1"></i>' + p.sede : ''}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
});
|
||||
partidosHtml += `</div>`;
|
||||
} else {
|
||||
partidosHtml = `<p class="text-muted small mt-3"><i class="bi bi-calendar-x me-1"></i>No hay partidos próximos para tus equipos seguidos.</p>`;
|
||||
}
|
||||
|
||||
// Cards de equipos seguidos
|
||||
let equiposHtml = `<div class="row g-3">`;
|
||||
data.equipos.forEach(eq => {
|
||||
equiposHtml += `
|
||||
<div class="col-md-4 col-6">
|
||||
<div class="bg-white p-3 shadow-sm d-flex align-items-center justify-content-between gap-2">
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<i class="bi bi-star-fill text-warning"></i>
|
||||
<div>
|
||||
<div class="fw-bold small">${eq.club}</div>
|
||||
<div class="text-muted" style="font-size:0.75rem;">${eq.categoria}${eq.division ? ' ' + eq.division : ''}</div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn btn-sm btn-outline-danger border-0 p-1 dejar-seguir"
|
||||
data-id="${eq.id}" data-csrf="{{ csrf_token() }}"
|
||||
title="Dejar de seguir">
|
||||
<i class="bi bi-x-circle"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>`;
|
||||
});
|
||||
equiposHtml += `</div>`;
|
||||
|
||||
container.innerHTML = equiposHtml + partidosHtml;
|
||||
|
||||
// Botones "Dejar de seguir"
|
||||
document.querySelectorAll('.dejar-seguir').forEach(btn => {
|
||||
btn.addEventListener('click', function() {
|
||||
const id = this.dataset.id;
|
||||
fetch(`/seguimiento/equipo/${id}`, {
|
||||
method: 'POST',
|
||||
headers: { 'X-CSRF-TOKEN': this.dataset.csrf, 'Content-Type': 'application/json' }
|
||||
}).then(r => r.json()).then(data => {
|
||||
if (data.ok) this.closest('.col-md-4, .col-6').remove();
|
||||
});
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
const c = document.getElementById('equipos-seguidos-container');
|
||||
if (c) c.innerHTML = '<p class="text-muted small">No se pudieron cargar los equipos.</p>';
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Mis QRs - OnAPB')
|
||||
|
||||
@section('content')
|
||||
<div class="container mt-4 mb-5">
|
||||
<div class="d-flex justify-content-between align-items-end mb-5">
|
||||
<div>
|
||||
<span class="text-primary fw-bold text-uppercase small d-block mb-1">Mi Panel</span>
|
||||
<h1 class="display-3 fw-bold mb-0" style="line-height:0.9;">Mis QRs<span class="text-primary">.</span></h1>
|
||||
@if($evento)<p class="text-muted mt-2 mb-0">{{ $evento->nombre_evento }}</p>@endif
|
||||
</div>
|
||||
<a href="{{ route('panel.usuario') }}" class="btn btn-outline-dark btn-sm text-uppercase fw-bold" style="border-radius:0;">
|
||||
<i class="bi bi-arrow-left me-1"></i> Volver
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
@if($evento)
|
||||
<div class="kinetic-card p-4 mb-4 border-start border-primary border-4">
|
||||
<h5 class="mb-1 fw-bold">{{ $evento->nombre_evento }}</h5>
|
||||
<p class="text-muted mb-0 small">
|
||||
<i class="bi bi-calendar3 me-1"></i>{{ $evento->fecha_evento ? \Carbon\Carbon::parse($evento->fecha_evento)->format('d/m/Y') : '—' }}
|
||||
·
|
||||
<i class="bi bi-clock me-1"></i>{{ $evento->hora_inicio ? substr($evento->hora_inicio, 0, 5) : '' }} - {{ $evento->hora_fin ? substr($evento->hora_fin, 0, 5) : '' }}
|
||||
@if($evento->sede)
|
||||
· <i class="bi bi-geo-alt me-1"></i>{{ $evento->sede }}
|
||||
@endif
|
||||
</p>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if($qrs->isEmpty())
|
||||
<div class="text-center py-5">
|
||||
<i class="bi bi-ticket-perforated text-muted" style="font-size: 3rem;"></i>
|
||||
<p class="text-muted mt-3">No tenés QRs{{ $evento ? ' para este evento' : '' }}.</p>
|
||||
<a href="{{ route('eventos.index') }}" class="btn btn-primary">Ver eventos disponibles</a>
|
||||
</div>
|
||||
@else
|
||||
<div class="row">
|
||||
@foreach($qrs as $qr)
|
||||
@php
|
||||
$agotado = (int)$qr->escaneos_restantes <= 0;
|
||||
$club = ($qr->evento && $qr->evento->equipoLocal && $qr->evento->equipoLocal->club) ? $qr->evento->equipoLocal->club : null;
|
||||
$bgPath = ($club && $club->qr_background) ? asset($club->qr_background) : null;
|
||||
$textColor = ($club && $club->qr_color_texto) ? $club->qr_color_texto : '#333';
|
||||
@endphp
|
||||
<div class="col-lg-4 col-md-6 mb-4">
|
||||
<div class="qr-ticket-card {{ $agotado ? 'qr-agotado' : '' }}"
|
||||
style="border: 1px solid var(--outline-variant); border-radius: var(--radius); overflow: hidden; position: relative; min-height: 480px;
|
||||
{{ $bgPath ? "background: url('$bgPath') no-repeat center center; background-size: cover;" : "background: var(--surface-container-lowest);" }}">
|
||||
|
||||
{{-- Overlay semi-transparente si hay fondo para legibilidad --}}
|
||||
@if($bgPath)
|
||||
<div style="position: absolute; inset: 0; background: rgba(255,255,255,0.1); z-index: 1;"></div>
|
||||
@endif
|
||||
|
||||
<div class="card-body d-flex flex-column align-items-center justify-content-between text-center" style="position: relative; z-index: 5; color: {{ $textColor }};">
|
||||
|
||||
{{-- Logo Cabecera --}}
|
||||
<div class="mt-2 d-flex align-items-center justify-content-center gap-2">
|
||||
<img src="{{ asset('logo.png') }}" alt="OnAPB" style="height: 35px; filter: drop-shadow(0 2px 4px rgba(0,0,0,0.2));">
|
||||
@if($userTipo === 'jugador' && $user->clubActual && $user->clubActual->imagen)
|
||||
<div style="height: 35px; width: 35px; background: #fff; border-radius: 50%; padding: 3px; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
|
||||
<img src="{{ asset($user->clubActual->imagen) }}" alt="{{ $user->clubActual->nombre }}" style="max-height: 100%; max-width: 100%; object-fit: contain;">
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
{{-- Datos Jugador / Evento --}}
|
||||
<div class="my-2">
|
||||
<h4 class="fw-bold mb-0" style="text-transform: uppercase; letter-spacing: 1px;">
|
||||
{{ $user->nombre }} {{ $user->apellido }}
|
||||
</h4>
|
||||
<p class="small mb-1 opacity-75">{{ $qr->evento->nombre_evento ?? 'Partido - OnAPB' }}</p>
|
||||
@if($qr->evento && $qr->evento->equipoLocal)
|
||||
<p class="small mb-1 fw-bold opacity-75" style="font-size: 0.75rem;">
|
||||
CATEGORIA: {{ $qr->evento->grupo_nombre ?? ($qr->evento->equipoLocal->categoria . ($qr->evento->equipoLocal->division ? ' ' . $qr->evento->equipoLocal->division : '')) }}
|
||||
</p>
|
||||
@endif
|
||||
@if($qr->tipo_qr === 'libre_50')
|
||||
<span class="badge bg-warning text-dark px-3 py-2 rounded-pill shadow-sm">
|
||||
<i class="bi bi-percent"></i> 50% DESCUENTO
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
{{-- QR visual --}}
|
||||
<div class="qr-container p-3 bg-white shadow-lg" style="border-radius: var(--radius); position: relative;">
|
||||
@if($agotado)
|
||||
<div style="position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; z-index: 10; background: rgba(255,255,255,0.8); border-radius: var(--radius);">
|
||||
<span style="font-size: 5rem; transform: rotate(-15deg);">🚫</span>
|
||||
</div>
|
||||
@endif
|
||||
<img src="https://api.qrserver.com/v1/create-qr-code/?size=200x200&data={{ urlencode($qr->id_qr) }}"
|
||||
alt="QR {{ $qr->id_qr }}"
|
||||
class="img-fluid"
|
||||
style="max-width: 180px; {{ $agotado ? 'filter: grayscale(100%);' : '' }}">
|
||||
</div>
|
||||
|
||||
{{-- Footer Ticket --}}
|
||||
<div class="w-100 mt-3 p-2 rounded" style="background: rgba(0,0,0,0.05); backdrop-filter: blur(5px);">
|
||||
@if($agotado)
|
||||
<div class="text-danger fw-bold">❌ QR YA UTILIZADO</div>
|
||||
@else
|
||||
<div class="fw-bold mb-1">✅ QR VÁLIDO</div>
|
||||
<div class="small opacity-75">Escaneos: {{ $qr->escaneos_restantes }} de 1</div>
|
||||
@endif
|
||||
@if($qr->evento && $qr->evento->equipoLocal)
|
||||
<p class="small mb-0 opacity-75" style="font-size: 0.7rem; font-weight: bold;">
|
||||
CATEGORIA: {{ $qr->evento->grupo_nombre ?? ($qr->evento->equipoLocal->categoria . ($qr->evento->equipoLocal->division ? ' ' . $qr->evento->equipoLocal->division : '')) }}
|
||||
</p>
|
||||
@endif
|
||||
<div class="mt-1 small" style="font-size: 0.7rem; font-family: monospace;">{{ $qr->id_qr }}</div>
|
||||
|
||||
@if(!$agotado)
|
||||
<div class="mt-2 pt-2 border-top">
|
||||
<a href="{{ route('panel.qr.descargar', $qr->id_qr) }}" class="btn btn-outline-dark btn-sm w-100" style="font-size: 0.75rem; font-weight: bold; border-radius: 0;">
|
||||
<i class="bi bi-file-earmark-pdf me-1"></i> DESCARGAR PDF
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info mt-3">
|
||||
<i class="bi bi-info-circle-fill"></i>
|
||||
Estos QRs ya están registrados en el sistema. Mostralos en la entrada para ingresar al partido.
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,83 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'QR de Beneficio - OnAPB')
|
||||
|
||||
@section('content')
|
||||
<div class="container mt-4 mb-5">
|
||||
<div class="text-center">
|
||||
<h2 class="mb-3">🎟️ QR de beneficio</h2>
|
||||
|
||||
@if(session('panel_msg'))
|
||||
<div class="alert alert-success alert-dismissible fade show mx-auto" style="max-width: 450px;" role="alert">
|
||||
{{ session('panel_msg') }}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@php
|
||||
$club = ($userTipo === 'jugador' && $user->clubActual) ? $user->clubActual : null;
|
||||
$bgPath = ($club && $club->qr_background) ? asset($club->qr_background) : null;
|
||||
$textColor = ($club && $club->qr_color_texto) ? $club->qr_color_texto : '#333';
|
||||
@endphp
|
||||
|
||||
<div class="qr-ticket-container my-4 mx-auto"
|
||||
style="max-width: 400px; border-radius: 25px; overflow: hidden; position: relative; min-height: 550px; box-shadow: 0 10px 30px rgba(0,0,0,0.1);
|
||||
{{ $bgPath ? "background: url('$bgPath') no-repeat center center; background-size: cover;" : "background: #fff; border: 1px solid #eee;" }}">
|
||||
|
||||
@if($bgPath)
|
||||
<div style="position: absolute; inset: 0; background: rgba(255,255,255,0.1); z-index: 1;"></div>
|
||||
@endif
|
||||
|
||||
<div class="d-flex flex-column align-items-center justify-content-between p-4 h-100 text-center" style="position: relative; z-index: 5; color: {{ $textColor }}; min-height: 550px;">
|
||||
|
||||
<div class="mt-2 d-flex align-items-center justify-content-center gap-2">
|
||||
<img src="{{ asset('logo.png') }}" alt="OnAPB" style="height: 40px; filter: drop-shadow(0 2px 4px rgba(0,0,0,0.2));">
|
||||
@if($userTipo === 'jugador' && $user->clubActual && $user->clubActual->imagen)
|
||||
<div style="height: 40px; width: 40px; background: #fff; border-radius: 50%; padding: 4px; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
|
||||
<img src="{{ asset($user->clubActual->imagen) }}" alt="{{ $user->clubActual->nombre }}" style="max-height: 100%; max-width: 100%; object-fit: contain;">
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<h5 class="mt-3 fw-bold" style="font-family: 'Bebas Neue', cursive; letter-spacing: 1px; font-size: 1.5rem;">CÓDIGO DE BENEFICIO</h5>
|
||||
|
||||
<div class="qr-box p-3 bg-white shadow-lg" style="border-radius: 25px;">
|
||||
<img src="https://api.qrserver.com/v1/create-qr-code/?size=300x300&data={{ urlencode($promoQr->id_qr) }}"
|
||||
alt="QR Promoción"
|
||||
class="img-fluid"
|
||||
style="max-width: 250px;">
|
||||
</div>
|
||||
|
||||
<div class="w-100 mt-4">
|
||||
<h6 class="fw-bold mb-1" style="text-transform: uppercase;">{{ $user->nombre }} {{ $user->apellido }}</h6>
|
||||
<p class="small mb-2 opacity-75">Válido en: {{ $promoQr->promocion->nombre ?? 'Comercio adherido' }}</p>
|
||||
|
||||
<div class="alert alert-warning py-2 px-3 mb-0" style="font-size: 0.75rem; border-radius: 15px; border: none; background: rgba(255, 193, 7, 0.9);">
|
||||
<strong>⚠️ IMPORTANTE:</strong> Presentalo únicamente en el local. Si se escanea por error, se pierde.
|
||||
</div>
|
||||
<div class="mt-2 small opacity-50" style="font-family: monospace; font-size: 0.65rem;">{{ $promoQr->id_qr }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if($promoQr->promocion)
|
||||
<div class="card shadow-sm mx-auto" style="max-width: 450px;">
|
||||
<div class="card-body">
|
||||
<h5>{{ $promoQr->promocion->nombre }}</h5>
|
||||
@if($promoQr->promocion->descripcion)
|
||||
<p class="mb-1"><strong>Beneficio:</strong> {{ $promoQr->promocion->descripcion }}</p>
|
||||
@endif
|
||||
@if($promoQr->promocion->direccion)
|
||||
<p class="mb-0 text-muted"><i class="bi bi-geo-alt"></i> {{ $promoQr->promocion->direccion }}</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="mt-4">
|
||||
<a href="{{ route('panel.usuario') }}" class="btn btn-outline-secondary">
|
||||
<i class="bi bi-arrow-left"></i> Volver a Mi Panel
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Reference in New Issue
Block a user