diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 8e849dce81..3857ef5f3c 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -189,8 +189,13 @@ class PreviewController extends BaseController $pdf = $ps->boot() ->designer - ->buildFromPartials($request->design['design']) - ->getPdf(); + ->buildFromPartials($request->design['design']); + + if ($request->query('html') == 'true') { + return $ps->getHtml(); + } + + $pdf = $ps->getPdf(); return response()->streamDownload(function () use ($pdf) { echo $pdf; @@ -281,6 +286,8 @@ class PreviewController extends BaseController private function blankEntity() { + nlog("blankEntity"); + /** @var \App\Models\User $user */ $user = auth()->user(); @@ -299,192 +306,66 @@ class PreviewController extends BaseController return $this->mockEntity(); } - $design_object = json_decode(json_encode(request()->input('design'))); + $design_object = json_decode(json_encode(request()->input('design')), true); - if (! is_object($design_object)) { + if (! is_array($design_object)) { return response()->json(['message' => 'Invalid custom design object'], 400); } - $html = new HtmlEngine($invitation); + $ps = new PdfService($invitation, 'product', [ + 'client' => $invitation->client ?? false, + 'invoices' => [$invitation->invoice], + ]); - $design = new Design(Design::CUSTOM, ['custom_partials' => request()->design['design']]); + $ps->boot() + ->designer + ->buildFromPartials($design_object['design']) + ->build(); - $state = [ - 'template' => $design->elements([ - 'client' => $invitation->invoice->client, - 'entity' => $invitation->invoice, - 'pdf_variables' => (array) $invitation->invoice->company->settings->pdf_variables, - 'products' => request()->design['design']['product'], - ]), - 'variables' => $html->generateLabelsAndValues(), - 'process_markdown' => $invitation->invoice->client->company->markdown_enabled, - 'options' => [ - 'client' => $invitation->invoice->client, - 'invoices' => [$invitation->invoice], - ] - ]; - - $maker = new PdfMaker($state); - - $maker - ->design($design) - ->build(); if (request()->query('html') == 'true') { - return $maker->getCompiledHTML(); + return $ps->getHtml(); } - if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { - return (new Phantom())->convertHtmlToPdf($maker->getCompiledHTML(true)); - } + $pdf = $ps->getPdf(); - /** @var \App\Models\User $user */ - $user = auth()->user(); + return response()->streamDownload(function () use ($pdf) { + echo $pdf; + }, 'preview.pdf', [ + 'Content-Disposition' => 'inline', + 'Content-Type' => 'application/pdf', + 'Cache-Control:' => 'no-cache', + ]); - /** @var \App\Models\Company $company */ - $company = $user->company(); - - if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { - $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - - $numbered_pdf = $this->pageNumbering($pdf, $company); - - if ($numbered_pdf) { - $pdf = $numbered_pdf; - } - - return $pdf; - } - - $file_path = (new PreviewPdf($maker->getCompiledHTML(true), $company))->handle(); - - $response = Response::make($file_path, 200); - $response->header('Content-Type', 'application/pdf'); - - return $response; } + private function mockEntity() { - /** @var \App\Models\User $user */ + + $start = microtime(true); $user = auth()->user(); /** @var \App\Models\Company $company */ $company = $user->company(); - try { - DB::connection($company->db)->beginTransaction(); - - /** @var \App\Models\Client $client */ - $client = Client::factory()->create([ - 'user_id' => $user->id, - 'company_id' => $company->id, - ]); - - /** @var \App\Models\ClientContact $contact */ - $contact = ClientContact::factory()->create([ - 'user_id' => $user->id, - 'company_id' => $company->id, - 'client_id' => $client->id, - 'is_primary' => 1, - 'send_email' => true, - ]); - - $settings = $company->settings; - - /** @var \App\Models\Invoice $invoice */ - $invoice = Invoice::factory()->create([ - 'user_id' => $user->id, - 'company_id' => $company->id, - 'client_id' => $client->id, - 'terms' => $company->settings->invoice_terms, - 'footer' => $company->settings->invoice_footer, - 'public_notes' => 'Sample Public Notes', - ]); - - if ($settings->invoice_number_pattern) { - $invoice->number = $this->getFormattedEntityNumber( - $invoice, - rand(1, 9999), - $settings->counter_padding ?: 4, - $settings->invoice_number_pattern, - ); - $invoice->save(); - } - - $invitation = InvoiceInvitation::factory()->create([ - 'user_id' => $user->id, - 'company_id' => $company->id, - 'invoice_id' => $invoice->id, - 'client_contact_id' => $contact->id, - ]); - - $invoice->setRelation('invitations', $invitation); - $invoice->setRelation('client', $client); - $invoice->setRelation('company', $company); - $invoice->load('client.company'); - - $design_object = json_decode(json_encode(request()->input('design'))); - - if (! is_object($design_object)) { - return response()->json(['message' => 'Invalid custom design object'], 400); - } - - $html = new HtmlEngine($invoice->invitations()->first()); - - $design = new Design(Design::CUSTOM, ['custom_partials' => request()->design['design']]); - - $state = [ - 'template' => $design->elements([ - 'client' => $invoice->client, - 'entity' => $invoice, - 'pdf_variables' => (array) $settings->pdf_variables, - 'products' => request()->design['design']['product'], - ]), - 'variables' => $html->generateLabelsAndValues(), - 'process_markdown' => $invoice->client->company->markdown_enabled, - 'options' => [ - 'client' => $invoice->client, - 'invoices' => [$invoice], - ] - ]; - - $maker = new PdfMaker($state); - - $maker - ->design($design) - ->build(); - - DB::connection($company->db)->rollBack(); - } catch (\Exception $e) { - DB::connection($company->db)->rollBack(); - return response()->json(['message' => $e->getMessage()], 400); - } + $request = request()->input('design'); + $request['entity_type'] = request()->input('entity', 'invoice'); + $pdf = (new PdfMock($request, $company))->build(); + if (request()->query('html') == 'true') { - return $maker->getCompiledHTML(); + return $pdf->getHtml(); } - if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { - return (new Phantom())->convertHtmlToPdf($maker->getCompiledHTML(true)); - } + $pdf = $pdf->getPdf(); - if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { - $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - - $numbered_pdf = $this->pageNumbering($pdf, $company); - - if ($numbered_pdf) { - $pdf = $numbered_pdf; - } - - return $pdf; - } - - $file_path = (new PreviewPdf($maker->getCompiledHTML(true), $company))->handle(); - - $response = Response::make($file_path, 200); + $response = Response::make($pdf, 200); $response->header('Content-Type', 'application/pdf'); + $response->header('Server-Timing', (string) (microtime(true) - $start)); + return $response; + } + } diff --git a/app/Services/Pdf/PdfDesigner.php b/app/Services/Pdf/PdfDesigner.php index 031373b1e0..55feb25c5e 100644 --- a/app/Services/Pdf/PdfDesigner.php +++ b/app/Services/Pdf/PdfDesigner.php @@ -59,6 +59,8 @@ class PdfDesigner $this->template = $this->composeFromPartials($partials); + nlog("template is"); + nlog($this->template); return $this; } diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index 05cc7f0021..3a8396b1e6 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -42,18 +42,20 @@ class PdfMock private string $entity_string = 'invoice'; + private PdfService $pdf_service; + public function __construct(public array $request, public Company $company) { } - public function getPdf(): mixed + public function setPdfService(): self { //need to resolve the pdf type here, ie product / purchase order $document_type = $this->request['entity_type'] == 'purchase_order' ? 'purchase_order' : 'product'; - $pdf_service = new PdfService($this->mock->invitation, $document_type); + $this->pdf_service = new PdfService($this->mock->invitation, $document_type); - $pdf_config = (new PdfConfiguration($pdf_service)); + $pdf_config = (new PdfConfiguration($this->pdf_service)); $pdf_config->entity = $this->mock; $pdf_config->entity_string = $this->request['entity_type']; $this->entity_string = $this->request['entity_type']; @@ -76,29 +78,44 @@ class PdfMock $pdf_config->design = Design::withTrashed()->find($this->decodePrimaryKey($pdf_config->entity_design_id)); } - $pdf_service->config = $pdf_config; + $this->pdf_service->config = $pdf_config; if (isset($this->request['design'])) { - $pdf_designer = (new PdfDesigner($pdf_service))->buildFromPartials($this->request['design']); + $pdf_designer = (new PdfDesigner($this->pdf_service))->buildFromPartials($this->request['design']); } else { - $pdf_designer = (new PdfDesigner($pdf_service))->build(); + $pdf_designer = (new PdfDesigner($this->pdf_service))->build(); } - $pdf_service->designer = $pdf_designer; + $this->pdf_service->designer = $pdf_designer; - $pdf_service->html_variables = $document_type == 'purchase_order' ? $this->getVendorStubVariables() : $this->getStubVariables(); + $this->pdf_service->html_variables = $document_type == 'purchase_order' ? $this->getVendorStubVariables() : $this->getStubVariables(); - $pdf_builder = (new PdfBuilder($pdf_service))->build(); - $pdf_service->builder = $pdf_builder; + $pdf_builder = (new PdfBuilder($this->pdf_service))->build(); + $this->pdf_service->builder = $pdf_builder; - $html = $pdf_service->getHtml(); + return $this; + } + + public function getPdf(): mixed + { + + $html = $this->pdf_service->getHtml(); + + return $this->pdf_service->resolvePdfEngine($html); + + } + + public function getHtml(): string + { + return $this->pdf_service->getHtml(); - return $pdf_service->resolvePdfEngine($html); } public function build(): self { $this->mock = $this->initEntity(); + + $this->setPdfService(); return $this; }