diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index 25fea802d1f5..a1d4949f0175 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -136,8 +136,11 @@ class InvitationController extends Controller } else { $is_silent = 'true'; + return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key}), 'silent' => $is_silent]); + return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key}), 'silent' => $is_silent])->header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); } + return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})]); return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})])->header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); } diff --git a/app/Http/Livewire/PdfSlot.php b/app/Http/Livewire/PdfSlot.php index b13fd1a24a0c..788e0048b3c4 100644 --- a/app/Http/Livewire/PdfSlot.php +++ b/app/Http/Livewire/PdfSlot.php @@ -12,14 +12,20 @@ namespace App\Http\Livewire; +use App\Utils\Number; use Livewire\Component; use App\Utils\HtmlEngine; use App\Libraries\MultiDB; +use App\Models\QuoteInvitation; use App\Utils\VendorHtmlEngine; +use App\Models\CreditInvitation; use App\Services\Pdf\PdfBuilder; use App\Services\Pdf\PdfService; +use App\Models\InvoiceInvitation; use App\Services\Pdf\PdfDesigner; use App\Services\Pdf\PdfConfiguration; +use App\Models\PurchaseOrderInvitation; +use App\Models\RecurringInvoiceInvitation; class PdfSlot extends Component { @@ -33,113 +39,178 @@ class PdfSlot extends Component public $url; + private $settings; + + private $html_variables; + + private $entity_type; + public function mount() { MultiDB::setDb($this->db); } + public function getPdf() + { + // $this->pdf = $this->entity->fullscreenPdfViewer($this->invitation); + } + public function render() { + $this->entity_type = $this->resolveEntityType(); + + $this->settings = $this->entity->client ? $this->entity->client->getMergedSettings() : $this->entity->company->settings; + + $this->html_variables = $this->entity->client ? + (new HtmlEngine($this->invitation))->generateLabelsAndValues() : + (new VendorHtmlEngine($this->invitation))->generateLabelsAndValues(); + return render('components.livewire.pdf-slot', [ 'invitation' => $this->invitation, 'entity' => $this->entity, - 'data' => $this->invitation->company->settings + 'data' => $this->invitation->company->settings, + 'entity_type' => $this->entity_type, + 'products' => $this->getProducts(), + 'services' => $this->getServices(), + 'amount' => Number::formatMoney($this->entity->amount, $this->entity->client ?: $this->entity->vendor), + 'balance' => Number::formatMoney($this->entity->balance, $this->entity->client ?: $this->entity->vendor), + 'company_details' => $this->getCompanyDetails(), + 'company_address' => $this->getCompanyAddress(), + 'entity_details' => $this->getEntityDetails(), + 'user_details' => $this->getUserDetails(), + ]); } - public function getPdf() + private function convertVariables($string): string { - - // $this->pdf = $this->entity->fullscreenPdfViewer($this->invitation); + $html = strtr($string, $this->html_variables['labels']); + + $html = strtr($html, $this->html_variables['values']); + + return $html; } - public function getHtml() + private function getCompanyAddress() { - $pdf_service = new PdfService($this->invitation); - - $pdf_service->config = (new PdfConfiguration($pdf_service))->init(); - - $pdf_service->html_variables = $pdf_service->config->client ? - (new HtmlEngine($this->invitation))->generateLabelsAndValues() : - (new VendorHtmlEngine($this->invitation))->generateLabelsAndValues(); - - } + $company_address = ""; - public function getHtmlX() - { - - $pdf_service = new PdfService($this->invitation); - - $pdf_service->config = (new PdfConfiguration($pdf_service))->init(); - - $pdf_service->html_variables = $pdf_service->config->client ? - (new HtmlEngine($this->invitation))->generateLabelsAndValues() : - (new VendorHtmlEngine($this->invitation))->generateLabelsAndValues(); - - $pdf_service->designer = (new PdfDesigner($pdf_service)); - - $pdf_service->builder = (new PdfBuilder($pdf_service)); - - $data = []; - - foreach(['company-details', 'company-address','client-details','entity-details','product-table','table-totals'] as $item) { - - - $pdf_service->designer->template = '
'; - - match($item){ - 'company-details' => $block = $pdf_service->builder->companyDetails(), - 'company-address' => $block = $pdf_service->builder->companyAddress(), - 'client-details' => $block = $pdf_service->builder->clientDetails(), - 'entity-details' => $block = $pdf_service->builder->invoiceDetails(), - 'product-table' => $block = $this->productTable(), - 'table-totals' => $block = $pdf_service->builder->getTableTotals(), - default => $block = [], - }; - - $section = [ - $item => [ - 'id' => $item, - 'elements' => $block, - ] - ]; - - $document = new \DOMDocument(); - $document->validateOnParse = true; - @$document->loadHTML(mb_convert_encoding($pdf_service->designer->template, 'HTML-ENTITIES', 'UTF-8')); - - $pdf_service->builder->document = $document; - $pdf_service->builder->sections = $section; - - $html = $pdf_service->builder - ->getEmptyElements() - ->updateElementProperties() - ->updateVariables(); - - // $pdf_service->builder->document->removeChild($pdf_service->builder->document->doctype); - // $pdf_service->builder->document->replaceChild($pdf_service->builder->document->firstChild->firstChild->firstChild, $pdf_service->builder->document->firstChild); - - $data[$item] = $pdf_service->builder->document->saveHTML(); - - $section = []; + foreach($this->settings->pdf_variables->company_address as $variable) { + $company_address .= "{$variable}
"; } - // nlog($pdf_service->builder->document->saveHTML()); - nlog($data); - - return $data; - } - - private function productTable() - { + return $this->convertVariables($company_address); } - private function sectionBuilder($tag) + private function getCompanyDetails() { + $company_details = ""; + + foreach($this->settings->pdf_variables->company_details as $variable) { + $company_details .= "{$variable}
"; + } + + return $this->convertVariables($company_details); + + } + + private function getEntityDetails() + { + $entity_details = "{$variable}
"; + } + } + else{ + foreach($this->settings->pdf_variables->client_details as $variable) { + $user_details .= "{$variable}
"; + } + } + return $this->convertVariables($user_details); + } + + private function getProducts() + { + $product_items = collect($this->entity->line_items)->filter(function ($item) { + return $item->type_id == 1 || $item->type_id == 6 || $item->type_id == 5; + })->map(function ($item){ + return [ + 'quantity' => $item->quantity, + 'cost' => Number::formatMoney($item->cost, $this->entity->client ?: $this->entity->vendor), + 'notes' => $item->notes, + 'line_total' => Number::formatMoney($item->line_total, $this->entity->client ?: $this->entity->vendor), + ]; + }); + + return $product_items; + } + + private function getServices() + { + $task_items = collect($this->entity->line_items)->filter(function ($item) { + return $item->type_id == 2; + })->map(function ($item){ + return [ + 'quantity' => $item->quantity, + 'cost' => Number::formatMoney($item->cost, $this->entity->client ?: $this->entity->vendor), + 'notes' => $item->notes, + 'line_total' => Number::formatMoney($item->line_total, $this->entity->client ?: $this->entity->vendor), + ]; + }); + + return $task_items; + + } + + private function resolveEntityType() :string + { + if ($this->invitation instanceof InvoiceInvitation) { + return 'invoice'; + } elseif ($this->invitation instanceof QuoteInvitation) { + return 'quote'; + } elseif ($this->invitation instanceof CreditInvitation) { + return 'credit'; + } elseif ($this->invitation instanceof RecurringInvoiceInvitation) { + return 'recurring_invoice'; + } elseif ($this->invitation instanceof PurchaseOrderInvitation) { + return 'purchase_order'; + } + + return ''; } } diff --git a/resources/views/portal/ninja2020/components/html-viewer.blade.php b/resources/views/portal/ninja2020/components/html-viewer.blade.php index fad5cb38c549..182e169966d0 100644 --- a/resources/views/portal/ninja2020/components/html-viewer.blade.php +++ b/resources/views/portal/ninja2020/components/html-viewer.blade.php @@ -1,11 +1,176 @@ -Item | +Amount | +
---|---|
+
+
+
+
+ {{ $product['quantity'] }} × {{ $product['cost'] }} +{{ $product['notes'] }} + |
+ {{ $product['line_total'] }} | +
Amount | +|
---|---|
+
+
+
+
+ {{ $service['quantity'] }} × {{ $service['cost'] }} +{{ $service['notes'] }} + |
+ {{ $service['line_total'] }} | +
+
+
+
+
+ {{ ctrans('texts.total') }} + |
+ {{ $amount }} | +
+
+
+
+
+ {{ ctrans('texts.balance') }} + |
+ {{ $balance }} | +