$order->uuid, 'order_number' => $order->order_number, ]); try { // Generate QR code URL $qrUrl = route('ops.order.show', ['token' => $order->qr_token]); Log::debug('Generating QR sticker', [ 'order_uuid' => $order->uuid, 'order_number' => $order->order_number, 'qr_url' => $qrUrl, ]); // Generate SVG (for web display) $svgPath = $this->generateSvg($order, $qrUrl); Log::info('SVG QR code generated', [ 'order_uuid' => $order->uuid, 'svg_path' => $svgPath, ]); // Generate A6 PDF (for printing) $pdfPath = $this->generatePdf($order, $qrUrl); Log::info('QR sticker generated successfully', [ 'order_uuid' => $order->uuid, 'svg_path' => $svgPath, 'pdf_path' => $pdfPath, ]); return [ 'svg_path' => $svgPath, 'pdf_path' => $pdfPath, ]; } catch (\Exception $e) { Log::error('Failed to generate QR sticker', [ 'order_uuid' => $order->uuid, 'error' => $e->getMessage(), ]); throw $e; } } /** * Generate SVG QR code for web display */ private function generateSvg(Order $order, string $qrUrl): string { $options = new QROptions([ 'outputType' => QRCode::OUTPUT_MARKUP_SVG, 'eccLevel' => QRCode::ECC_H, 'scale' => 3, 'imageBase64' => false, ]); $qrCode = new QRCode($options); $qrSvg = $qrCode->render($qrUrl); $path = "qr-codes/{$order->uuid}.svg"; Storage::disk('public')->put($path, $qrSvg); return $path; } /** * Generate A6 PDF sticker (105mm × 148mm) with QR code and readable info */ private function generatePdf(Order $order, string $qrUrl): string { // Generate QR code as base64-encoded PNG (DomPDF handles this better than SVG) $options = new QROptions([ 'outputType' => QRCode::OUTPUT_IMAGE_PNG, 'eccLevel' => QRCode::ECC_H, 'scale' => 8, 'imageBase64' => true, ]); $qrCode = new QRCode($options); $qrBase64 = $qrCode->render($qrUrl); // Determine order type $orderType = $order->type === 'standard' ? 'STOCK ORDER' : 'CUSTOM ORDER'; // Extract design name $designName = ''; if ($order->items && $order->items->count() > 0) { $firstItem = $order->items->first(); $designName = $firstItem->product?->name ?? $firstItem->name ?? 'Custom Design'; } // Extract customer surname $customerName = $order->user?->name ?? ''; $nameParts = explode(' ', trim($customerName)); $customerSurname = end($nameParts); // Build HTML with proper SVG embedding (avoid heredoc issues) $html = '
' . htmlspecialchars($orderType) . '
' . htmlspecialchars($order->order_number) . '
Customer
' . htmlspecialchars($customerSurname) . '
Design: ' . htmlspecialchars($this->truncate($designName, 12)) . '
Date: ' . htmlspecialchars($order->created_at->format('M d')) . '
Status: ' . htmlspecialchars($this->formatStatus($order->status)) . '
QR Code
'; try { $pdf = Pdf::loadHTML($html); // Set to A6 size (105mm × 148mm) in portrait orientation // 105mm = 297.64 points, 148mm = 420.94 points $pdf->setPaper([0, 0, 297.64, 420.94], 'portrait'); $pdf->setOption('isRemoteEnabled', true); $filename = "{$order->uuid}.pdf"; $path = "qr-stickers/{$filename}"; $pdfContent = $pdf->output(); Storage::disk('public')->put($path, $pdfContent); return $path; } catch (\Exception $e) { Log::error('DomPDF generation failed', [ 'order_uuid' => $order->uuid, 'error' => $e->getMessage(), ]); throw $e; } } /** * Helper: Truncate string */ private function truncate($string, $length): string { return substr($string, 0, $length); } /** * Helper: Format status text */ private function formatStatus($status): string { return str_replace('_', ' ', $status); } }