Your IP : 216.73.217.77


Current Path : /home/users/unlimited/www/ultimate-ai.codeskitter.site/app/Services/Orders/
Upload File :
Current File : /home/users/unlimited/www/ultimate-ai.codeskitter.site/app/Services/Orders/OrdersExportService.php

<?php

namespace App\Services\Orders;

namespace App\Services\Orders;

use App\Models\UserOrder;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Response;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use ZipArchive;

class OrdersExportService
{
    public function __construct()
    {
        ini_set('memory_limit', '1024M');
        ini_set('max_execution_time', '300');
    }

    public function exportAsPdf(null|Collection|UserOrder $invoices = null): RedirectResponse|BinaryFileResponse|JsonResponse
    {
        $userOrders = $invoices ?? UserOrder::where('user_id', auth()->user()->id)->get();
        if ($userOrders->count() > 0) {
            $zipFileName = 'user_orders.zip';
            $zipPath = 'upload/zips/' . $zipFileName;

            if (! file_exists('upload/zips') && ! mkdir('upload/zips', 0777, true) && ! is_dir('upload/zips')) {
                throw new \RuntimeException(sprintf('Directory "%s" was not created', 'upload/zips'));
            }

            $zip = new ZipArchive;
            if ($zip->open($zipPath, ZipArchive::CREATE|ZipArchive::OVERWRITE) !== true) {
                return back()->with(['message' => __('Could not create ZIP file'), 'type' => 'error']);
            }

            $invoicesPath = 'upload/invoices';
            if (! file_exists($invoicesPath) && ! mkdir($invoicesPath, 0777, true) && ! is_dir($invoicesPath)) {
                throw new \RuntimeException(sprintf('Directory "%s" was not created', $invoicesPath));
            }

            $pdfFiles = [];

            foreach ($userOrders as $order) {
                $html = $this->getInvoice($order->id);
                $pdf = app('dompdf.wrapper');
                $pdf->loadHTML($html);
                $pdf->setPaper('A4', 'portrait');
                $pdf->render();
                $pdfPath = $invoicesPath . '/' . $order->order_id . '.pdf';
                $pdf->save($pdfPath);

                $zip->addFile($pdfPath, $order->order_id . '.pdf');
                $pdfFiles[] = $pdfPath;
            }

            $zip->close();

            // Create response and delete PDFs after sending
            $response = response()->download($zipPath)->deleteFileAfterSend(true);

            // Delete PDF files after ZIP is created
            foreach ($pdfFiles as $file) {
                if (file_exists($file)) {
                    unlink($file);
                }
            }

            return $response;
        }

        return back()->with(['message' => __('No invoices found'), 'type' => 'error']);
    }

    private function getInvoice($id): string
    {
        $invoice = UserOrder::findOrFail($id);

        return view('panel.user.orders.invoice-single', compact('invoice'))->render();
    }
}