$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 inline QR code as SVG $options = new QROptions([ 'outputType' => QRCode::OUTPUT_MARKUP_SVG, 'eccLevel' => QRCode::ECC_H, 'scale' => 4, 'imageBase64' => false, ]); $qrCode = new QRCode($options); $qrSvg = $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 directly (no view file dependency) $html = <<
{$orderType}
{$order->order_number}
Customer
{$customerSurname}
Design: {$this->truncate($designName, 12)}
Date: {$order->created_at->format('M d')}
Status: {$this->formatStatus($order->status)}
{$qrSvg}
HTML; try { $pdf = Pdf::loadHTML($html); $pdf->setPaper([0, 0, 420.94, 297.64], 'portrait'); $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); } }