entity_type = $entity_type; return $this; } public function build(): self { try { DB::connection(config('database.default'))->transaction(function () { $this->createRecipient() ->initializeSettings() ->createEntity() ->linkRelations() ->buildHtml(); }); } catch (\Throwable $throwable) { nlog("DB ERROR " . $throwable->getMessage()); if (DB::connection(config('database.default'))->transactionLevel() > 0) { DB::connection(config('database.default'))->rollBack(); } } catch(\Exception $e) { nlog($e->getMessage()); if (DB::connection(config('database.default'))->transactionLevel() > 0) { DB::connection(config('database.default'))->rollBack(); } } return $this; } public function getPdf(): mixed { if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { return (new Phantom)->convertHtmlToPdf($this->html); } if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { $pdf = (new NinjaPdf())->build($this->html); $numbered_pdf = $this->pageNumbering($pdf, $this->company); if ($numbered_pdf) { $pdf = $numbered_pdf; } return $pdf; } return (new PreviewPdf($this->html, $this->company))->handle(); } private function initializeSettings(): self { $this->dynamic_settings_type = 'company'; match ($this->dynamic_settings_type) { 'company' => $this->setCompanySettings(), 'client' => $this->setClientSettings(), 'group' => $this->setGroupSettings(), }; return $this; } private function setCompanySettings(): self { $this->company->settings = $this->settings; $this->company->save(); return $this; } private function setClientSettings(): self { $this->recipient->settings = $this->settings; $this->recipient->save(); return $this; } private function setGroupSettings(): self { $g = GroupSettingFactory::create($this->company->id, $this->user->id); $g->name = Str::random(10); $g->settings = $this->settings; $g->save(); $this->recipient->group_settings_id = $g->id; $this->recipient->save(); return $this; } public function setSettings($settings): self { $this->settings = $settings; return $this; } public function setSettingsType($type): self { $this->dynamic_settings_type = $type; return $this; } private function buildHtml(): self { $html = new HtmlEngine($this->invitation); $design_string = "{$this->entity_type}_design_id"; $design = DesignModel::withTrashed()->find($this->decodePrimaryKey($html->settings->{$design_string})); $template = new PdfMakerDesign(strtolower($design->name)); $state = [ 'template' => $template->elements([ 'client' => $this->recipient, 'entity' => $this->entity, 'pdf_variables' => (array) $html->settings->pdf_variables, '$product' => $design->design->product, ]), 'variables' => $html->generateLabelsAndValues(), 'process_markdown' => $this->company->markdown_enabled, ]; $maker = new PdfMaker($state); $this->html = $maker->design($template) ->build() ->getCompiledHTML(); return $this; } private function linkRelations(): self { $this->entity->setRelation('invitations', $this->invitation); $this->entity->setRelation($this->recipient_string, $this->recipient); $this->entity->setRelation('company', $this->company); $this->entity->load("{$this->recipient_string}.company"); return $this; } private function createRecipient(): self { match ($this->entity_type) { 'invoice' => $this->createClient(), 'quote' => $this->createClient(), 'credit' => $this->createClient(), 'purchase_order' => $this->createVendor(), }; return $this; } private function createClient(): self { $this->recipient = Client::factory()->create([ 'user_id' => $this->user->id, 'company_id' => $this->company->id, ]); $this->contact = ClientContact::factory()->create([ 'user_id' => $this->user->id, 'company_id' => $this->company->id, 'client_id' => $this->recipient->id, ]); $this->recipient_string = 'client'; return $this; } private function createVendor(): self { $this->recipient = Vendor::factory()->create([ 'user_id' => $this->user->id, 'company_id' => $this->user->company()->id, ]); $this->contact = VendorContact::factory()->create([ 'user_id' => $this->user->id, 'company_id' => $this->company->id, 'vendor_id' => $this->recipient->id, ]); $this->recipient_string = 'vendor'; return $this; } private function createEntity(): self { match ($this->entity_type) { 'invoice' => $this->createInvoice(), 'quote' => $this->createQuote(), 'credit' => $this->createCredit(), 'purchase_order' => $this->createPurchaseOrder(), }; return $this; } private function createInvoice() { $this->entity = Invoice::factory()->create([ 'user_id' => $this->user->id, 'company_id' => $this->company->id, 'client_id' => $this->recipient->id, 'terms' => $this->company->settings->invoice_terms, 'footer' => $this->company->settings->invoice_footer, 'status_id' => Invoice::STATUS_PAID, ]); $this->invitation = InvoiceInvitation::factory()->create([ 'user_id' => $this->user->id, 'company_id' => $this->company->id, 'invoice_id' => $this->entity->id, 'client_contact_id' => $this->contact->id, ]); } private function createQuote() { $this->entity->save(); } private function createCredit() { $this->entity->save(); } private function createPurchaseOrder() { $this->entity->save(); } }