mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-01 20:17:35 -04:00 
			
		
		
		
	Template Service
This commit is contained in:
		
							parent
							
								
									c83e94d3af
								
							
						
					
					
						commit
						dc871af5eb
					
				| @ -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();
 | ||||
|  | ||||
| @ -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 | ||||
|                             </tr> | ||||
|                         </thead> | ||||
|                         <tbody> | ||||
|                         {% for entity in invoices %} | ||||
|                         {% for item in entity.line_items|filter(item => item.type_id == "1") %} | ||||
|                             <tr class="border-b dark:border-neutral-500"> | ||||
|                                 <td class="whitespace-nowrap px-6 py-4 font-medium">{{ item.product_key }}</td> | ||||
| @ -60,6 +60,7 @@ class TemplateTest extends TestCase | ||||
|                                 <td class="whitespace-nowrap px-6 py-4 font-medium">0</td> | ||||
|                             </tr> | ||||
|                         {% endfor %} | ||||
|                         {% endfor %} | ||||
|                         </tbody> | ||||
|                     </table> | ||||
|                 </ninja> | ||||
| @ -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()); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user