Files
OnAPB-Carrere_Demartin/app/Http/Controllers/QrDownloadController.php
T
Laucha1312 90c5f85512 2
2026-06-04 15:15:23 -03:00

130 lines
4.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\QrCode;
use Illuminate\Http\Request;
use Barryvdh\DomPDF\Facade\Pdf;
class QrDownloadController extends Controller
{
public function download($id)
{
$qr = QrCode::with(['evento.equipoLocal.club', 'evento.equipoVisitante.club', 'jugador.clubActual', 'aficionado'])
->where('id_qr', $id)
->firstOrFail();
// Verificar que el usuario tenga permiso para descargar este QR
$isUser = session()->has('user_logged_in') && session('user_logged_in');
$isAdmin = session()->has('admin_logged_in') && session('admin_logged_in');
if ($isUser) {
$userId = session('user_id');
$userTipo = session('user_tipo');
if ($userTipo === 'jugador' && $qr->id_jugador != $userId) abort(403);
if ($userTipo === 'aficionado' && $qr->id_aficionado != $userId) abort(403);
} elseif (!$isAdmin) {
abort(403);
}
$user = $qr->jugador ?: $qr->aficionado;
$userTipo = $qr->id_jugador ? 'jugador' : 'aficionado';
// Convertir imágenes a Base64 para DomPDF (más fiable que URLs remotas/locales)
$qrImageBase64 = '';
try {
$qrUrl = "https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=" . urlencode($qr->id_qr);
$qrContent = @file_get_contents($qrUrl);
if ($qrContent) {
$qrImageBase64 = 'data:image/png;base64,' . base64_encode($qrContent);
}
} catch (\Exception $e) { }
$club = ($qr->evento && $qr->evento->equipoLocal && $qr->evento->equipoLocal->club) ? $qr->evento->equipoLocal->club : null;
$backgroundBase64 = null;
if ($club && $club->qr_background) {
// 1. Intentar en storage/app/public (ruta interna Laravel)
$pathInStorage = str_replace(['storage/', 'storage\\'], '', $club->qr_background);
$bgPath = storage_path('app/public/' . $pathInStorage);
// 2. Intentar en public_path (desarrollo local o symlink funcional)
if (!file_exists($bgPath)) {
$bgPath = public_path($club->qr_background);
}
// 3. Intentar estructura Hostinger (public_html es hermano de la carpeta laravel)
if (!file_exists($bgPath)) {
$bgPath = base_path('../public_html/' . $club->qr_background);
}
if (file_exists($bgPath)) {
$bgContent = @file_get_contents($bgPath);
if ($bgContent) {
$ext = pathinfo($bgPath, PATHINFO_EXTENSION);
$backgroundBase64 = 'data:image/' . $ext . ';base64,' . base64_encode($bgContent);
}
}
}
$logoBase64 = null;
$logoPathFinal = null;
// Logo del club del jugador (no del local) si corresponde:
// jugador → su club actual; aficionado/sin club → club local; fallback → logo OnAPB.
$logoClub = null;
if ($userTipo === 'jugador' && $qr->jugador && $qr->jugador->clubActual) {
$logoClub = $qr->jugador->clubActual;
} elseif ($club) {
$logoClub = $club;
}
if ($logoClub && $logoClub->imagen) {
$logoInStorage = str_replace(['storage/', 'storage\\'], '', $logoClub->imagen);
$lPath = storage_path('app/public/' . $logoInStorage);
if (!file_exists($lPath)) {
$lPath = public_path($logoClub->imagen);
}
if (!file_exists($lPath)) {
$lPath = base_path('../public_html/' . $logoClub->imagen);
}
if (file_exists($lPath)) {
$logoPathFinal = $lPath;
}
}
// Si no hay logo, usar logo general
if (!$logoPathFinal) {
if (file_exists(public_path('logo.png'))) {
$logoPathFinal = public_path('logo.png');
}
}
if ($logoPathFinal) {
$logoContent = @file_get_contents($logoPathFinal);
if ($logoContent) {
$ext = pathinfo($logoPathFinal, PATHINFO_EXTENSION);
$logoBase64 = 'data:image/' . $ext . ';base64,' . base64_encode($logoContent);
}
}
$data = [
'qr' => $qr,
'user' => $user,
'userTipo' => $userTipo,
'club' => $club,
'qrImageBase64' => $qrImageBase64,
'backgroundBase64' => $backgroundBase64,
'logoBase64' => $logoBase64,
];
$pdf = Pdf::loadView('pdf.qr_ticket', $data)
->setPaper([0, 0, 320, 500], 'portrait');
return $pdf->download("onapb_qr_{$qr->id_qr}.pdf");
}
}