From dc871af5eb0bfa32d6a86a14727ef41710ffcd14 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 22 Sep 2023 22:35:43 +1000 Subject: [PATCH] Template Service --- app/Services/Template/TemplateService.php | 65 ++++++++++++----------- tests/Feature/Template/TemplateTest.php | 24 ++++++++- 2 files changed, 57 insertions(+), 32 deletions(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index cb69f462fdf8..1fac26132e13 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -12,9 +12,10 @@ namespace App\Services\Template; use App\Models\Design; +use App\Utils\HtmlEngine; use App\Utils\VendorHtmlEngine; use App\Utils\PaymentHtmlEngine; -use Illuminate\Database\Eloquent\Collection; +use Illuminate\Support\Collection; class TemplateService { @@ -46,7 +47,7 @@ class TemplateService 'recurring_id', 'subscription_id' ]; - + public function __construct(public Design $template) { $this->template = $template; @@ -73,7 +74,7 @@ class TemplateService * @param array $data - the payload to be passed into the template * @return self */ - private function build(array $data): self + public function build(array $data): self { $this->compose() ->parseNinjaBlocks($data) @@ -97,7 +98,7 @@ class TemplateService { $data = $this->preProcessDataBlocks($data); $replacements = []; - +nlog($data); $contents = $this->document->getElementsByTagName('ninja'); foreach ($contents as $content) { @@ -131,15 +132,17 @@ class TemplateService /** * Parses all variables in the document - * + * @param array $data * @return self */ - private function parseVariables(): self + private function parseVariables(array $data): self { - $variables = $this->resolveHtmlEngine(); + $variables = $this->resolveHtmlEngine($data); + + $html = $this->getHtml(); foreach($variables as $key => $variable) { - $html = strtr($this->getHtml(), $variable['labels']); + $html = strtr($html, $variable['labels']); $html = strtr($html, $variable['values']); } @@ -188,18 +191,18 @@ class TemplateService */ private function resolveHtmlEngine(array $data): array { - return collect($data)->map(function ($key, $value) { - - $processed[$key] = []; + return collect($data)->map(function ($value, $key) { + + $processed = []; match ($key) { - 'invoices' => $processed[$key] = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), - 'quotes' => $processed[$key] = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), - 'credits' => $processed[$key] = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), - 'payments' => $processed[$key] = (new PaymentHtmlEngine($value->first(), $value->first()->client->contacts()->first()))->generateLabelsAndValues(), - 'tasks' => $processed[$key] = [], - 'projects' => $processed[$key] = [], - 'purchase_orders' => $processed[$key] = (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'invoices' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'quotes' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'credits' => $processed = (new HtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), + 'payments' => $processed = (new PaymentHtmlEngine($value->first(), $value->first()->client->contacts()->first()))->generateLabelsAndValues(), + 'tasks' => $processed = [], + 'projects' => $processed = [], + 'purchase_orders' => $processed = (new VendorHtmlEngine($value->first()->invitations()->first()))->generateLabelsAndValues(), }; return $processed; @@ -210,18 +213,18 @@ class TemplateService private function preProcessDataBlocks($data): array { - return collect($data)->map(function ($key, $value){ + return collect($data)->map(function ($value, $key){ - $processed[$key] = []; + $processed = []; match ($key) { - 'invoices' => $processed[$key] = $this->processInvoices($value), - 'quotes' => $processed[$key] = $this->processQuotes($value), - 'credits' => $processed[$key] = $this->processCredits($value), - 'payments' => $processed[$key] = $this->processPayments($value), - 'tasks' => $processed[$key] = $this->processTasks($value), - 'projects' => $processed[$key] = $this->processProjects($value), - 'purchase_orders' => $processed[$key] = $this->processPurchaseOrders($value), + 'invoices' => $processed = $this->processInvoices($value), + 'quotes' => $processed = $this->processQuotes($value), + 'credits' => $processed = $this->processCredits($value), + 'payments' => $processed = $this->processPayments($value), + 'tasks' => $processed = $this->processTasks($value), + 'projects' => $processed = $this->processProjects($value), + 'purchase_orders' => $processed = $this->processPurchaseOrders($value), }; return $processed; @@ -231,7 +234,9 @@ class TemplateService private function processInvoices($invoices): Collection { - return $invoices->makeHidden($this->standard_excludes); + return $invoices->map(function($invoice){ + return $invoice->makeHidden($this->standard_excludes); + }); } private function processQuotes($quotes): Collection @@ -269,7 +274,7 @@ class TemplateService private function processTasks($tasks): Collection { - return $task->makeHidden([ + return $tasks->makeHidden([ 'id', 'user_id', 'assigned_user_id', @@ -298,7 +303,7 @@ class TemplateService private function processPurchaseOrders($purchase_orders): array { - return $projects->makeHidden($this->purchase_excludes); + return $purchase_orders->makeHidden($this->purchase_excludes); // return $purchase_orders->map(function ($purchase_order){ // })->toArray(); diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 490fd0440090..b2dc89d61540 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -20,7 +20,6 @@ use Tests\MockAccountData; use App\Services\PdfMaker\PdfMaker; use Illuminate\Support\Facades\App; use App\Jobs\Entity\CreateEntityPdf; -use App\Services\PdfMaker\Design as DesignMaker; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Services\Template\TemplateService; @@ -51,6 +50,7 @@ class TemplateTest extends TestCase + {% for entity in invoices %} {% for item in entity.line_items|filter(item => item.type_id == "1") %} {{ item.product_key }} @@ -60,6 +60,7 @@ class TemplateTest extends TestCase 0 {% endfor %} + {% endfor %} @@ -78,7 +79,7 @@ class TemplateTest extends TestCase } - public function testTemplateService() + public function testTemplateServiceBuild() { $design_model = Design::find(2); @@ -89,6 +90,25 @@ class TemplateTest extends TestCase $replicated_design->is_custom = true; $replicated_design->save(); + $data = []; + $data['invoices'] = collect([$this->invoice]); + + $ts = $replicated_design->service()->build($data); + + nlog($ts->getHtml()); + $this->assertNotNull($ts->getHtml()); + } + + public function testTemplateService() + { + $design_model = Design::find(2); + + $replicated_design = $design_model->replicate(); + $design = $replicated_design->design; + $design->body .= $this->body; + $replicated_design->design = $design; + $replicated_design->is_custom = true; + $replicated_design->save(); $this->assertNotNull($replicated_design->service()); $this->assertInstanceOf(TemplateService::class, $replicated_design->service());