From 12f42d5efca83d03bdb319905c5427ce2d304d0d Mon Sep 17 00:00:00 2001 From: twotalesanimation <80506065+twotalesanimation@users.noreply.github.com> Date: Fri, 2 Jan 2026 20:25:02 +0200 Subject: [PATCH] fix: Use View::file() to render sticker template directly, add missing test route, and allow GET for regenerate - Changed from View::make() to View::file() with full path resolution - Added file existence check with detailed error logging - Allow GET/POST for regenerate sticker endpoint for easier testing - Add design name and customer surname to A6 PDF stickers - Add regenerate sticker endpoint POST /test/sticker/{orderNumber}/regenerate - Add test sticker preview page at /test/sticker/{orderNumber} --- app/Services/QrStickerService.php | 63 ++++++++++++--- resources/views/stickers/qr-sticker.blade.php | 7 +- .../views/test/sticker-display.blade.php | 81 +++++++++++++++++++ routes/web.php | 62 ++++++++++++++ 4 files changed, 201 insertions(+), 12 deletions(-) create mode 100644 resources/views/test/sticker-display.blade.php diff --git a/app/Services/QrStickerService.php b/app/Services/QrStickerService.php index 25cf4c0..edea14b 100644 --- a/app/Services/QrStickerService.php +++ b/app/Services/QrStickerService.php @@ -8,6 +8,7 @@ use chillerlan\QRCode\QRCode; use chillerlan\QRCode\QROptions; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Facades\View; class QrStickerService { @@ -99,28 +100,68 @@ class QrStickerService ? 'STOCK ORDER' : 'CUSTOM ORDER'; + // Extract design name from first order item + $designName = ''; + if ($order->items && $order->items->count() > 0) { + $firstItem = $order->items->first(); + $designName = $firstItem->product?->name ?? $firstItem->name ?? 'Custom Design'; + } + + // Extract customer surname (last word of name) + $customerName = $order->user?->name ?? ''; + $nameParts = explode(' ', trim($customerName)); + $customerSurname = end($nameParts); + // Prepare data for the view $data = [ 'order' => $order, 'qrSvg' => $qrSvg, 'orderType' => $orderType, + 'designName' => $designName, + 'customerSurname' => $customerSurname, 'qrUrl' => $qrUrl, 'generatedAt' => now()->format('Y-m-d H:i'), ]; - // Generate PDF using the sticker template - $pdf = Pdf::loadView('stickers.qr-sticker', $data); + // Render the view to HTML first + try { + $viewPath = resource_path('views/stickers/qr-sticker.blade.php'); + if (!file_exists($viewPath)) { + throw new \Exception("View file not found at: {$viewPath}"); + } + + // Compile and render the view + $html = View::file($viewPath, $data)->render(); + } catch (\Exception $e) { + Log::error('Failed to render sticker view', [ + 'order_uuid' => $order->uuid, + 'error' => $e->getMessage(), + 'view_path' => $viewPath ?? 'unknown', + ]); + throw $e; + } - // Configure for A6 landscape - // A6 is 105mm × 148mm (landscape: 148mm × 105mm) - $pdf->setPaper([0, 0, 420.94, 297.64], 'portrait'); // 148mm × 105mm in points (1mm ≈ 2.834645669 points) + // Generate PDF from HTML using DomPDF + try { + $pdf = Pdf::loadHTML($html); + + // Configure for A6 landscape + // A6 is 105mm × 148mm (landscape: 148mm × 105mm) + $pdf->setPaper([0, 0, 420.94, 297.64], 'portrait'); // 148mm × 105mm in points (1mm ≈ 2.834645669 points) - // Store PDF - $filename = "{$order->uuid}.pdf"; - $path = "qr-stickers/{$filename}"; - $pdfContent = $pdf->output(); - Storage::disk('public')->put($path, $pdfContent); + // Store PDF + $filename = "{$order->uuid}.pdf"; + $path = "qr-stickers/{$filename}"; + $pdfContent = $pdf->output(); + Storage::disk('public')->put($path, $pdfContent); - return $path; + return $path; + } catch (\Exception $e) { + Log::error('DomPDF generation failed', [ + 'order_uuid' => $order->uuid, + 'error' => $e->getMessage(), + ]); + throw $e; + } } } diff --git a/resources/views/stickers/qr-sticker.blade.php b/resources/views/stickers/qr-sticker.blade.php index 0ed63f1..5e85fb4 100644 --- a/resources/views/stickers/qr-sticker.blade.php +++ b/resources/views/stickers/qr-sticker.blade.php @@ -170,11 +170,16 @@
Customer
-
{{ $order->user->name ?? 'N/A' }}
+
{{ $customerSurname }}
+
+ Design: + {{ substr($designName, 0, 12) }} +
+
Date: {{ $order->created_at->format('M d') }} diff --git a/resources/views/test/sticker-display.blade.php b/resources/views/test/sticker-display.blade.php new file mode 100644 index 0000000..4e07031 --- /dev/null +++ b/resources/views/test/sticker-display.blade.php @@ -0,0 +1,81 @@ +@extends('layouts.app') + +@section('content') +
+

QR Sticker Preview

+ +
+ +
+

Order Details

+ +
+
+

Order Number

+

{{ $order->order_number }}

+
+ +
+

UUID

+

{{ $order->uuid }}

+
+ +
+

Status

+

{{ str_replace('_', ' ', $order->status) }}

+
+ +
+

Customer

+

{{ $order->user?->name ?? 'N/A' }}

+
+ +
+

Created

+

{{ $order->created_at->format('M d, Y H:i') }}

+
+ + @if($order->items->count() > 0) +
+

Design

+

{{ $order->items->first()?->product?->name ?? 'Custom' }}

+
+ @endif + +
+

Sticker Path

+

{{ $stickerPath }}

+
+
+ + + + 📥 Download PDF + +
+ + +
+

PDF Preview (A6 Sticker)

+ +
+ +
+ +

+ If the PDF doesn't display above, it may be loading. Try refreshing or downloading the PDF directly. +

+
+
+ + + +
+@endsection diff --git a/routes/web.php b/routes/web.php index 37b28b6..98fce5c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -84,6 +84,68 @@ Route::middleware('auth')->group(function () { // QR landing page (public but token-gated) Route::get('/ops/orders/{token}', [OpsController::class, 'showOrder'])->name('ops.order.show'); +// Test routes (remove in production) +Route::get('/test/sticker/{orderNumber}', function ($orderNumber) { + $order = \App\Models\Order::where('order_number', $orderNumber)->first(); + + if (!$order) { + return response()->json(['error' => 'Order not found'], 404); + } + + $stickerPath = "qr-stickers/{$order->uuid}.pdf"; + + if (!\Illuminate\Support\Facades\Storage::disk('public')->exists($stickerPath)) { + return response()->json([ + 'error' => 'Sticker PDF not generated yet', + 'order_uuid' => $order->uuid, + 'regenerate_url' => route('test.sticker.regenerate', ['orderNumber' => $orderNumber]) + ], 404); + } + + $pdfUrl = \Illuminate\Support\Facades\Storage::disk('public')->url($stickerPath); + + return view('test.sticker-display', [ + 'order' => $order, + 'pdfUrl' => $pdfUrl, + 'stickerPath' => $stickerPath, + ]); +})->name('test.sticker'); + +// Regenerate sticker PDF for testing +Route::match(['get', 'post'], '/test/sticker/{orderNumber}/regenerate', function ($orderNumber) { + $order = \App\Models\Order::where('order_number', $orderNumber)->first(); + + if (!$order) { + return response()->json(['error' => 'Order not found'], 404); + } + + try { + // Ensure order has QR token + if (!$order->qr_token) { + $order->qr_token = \Illuminate\Support\Str::random(32); + $order->qr_generated_at = now(); + $order->save(); + } + + // Generate sticker + $service = new \App\Services\QrStickerService(); + $paths = $service->generateSticker($order); + + return response()->json([ + 'success' => true, + 'message' => 'Sticker PDF generated successfully', + 'svg_path' => $paths['svg_path'], + 'pdf_path' => $paths['pdf_path'], + 'view_url' => route('test.sticker', ['orderNumber' => $orderNumber]) + ]); + } catch (\Exception $e) { + return response()->json([ + 'error' => 'Failed to generate sticker', + 'message' => $e->getMessage() + ], 500); + } +})->name('test.sticker.regenerate'); + // use Illuminate\Support\Facades\Route; Route::get('/font-test', function () {