diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index ee9afae8ec9a..237cab626a2a 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -481,13 +481,21 @@ class CompanySettings extends BaseSettings public $enable_e_invoice = false; - public $statement_design_id = 'VolejRejNm'; + public $delivery_note_design_id = ''; + + public $statement_design_id = ''; + + public $payment_receipt_design_id = ''; - public $delivery_note_design_id = 'VolejRejNm'; + public $payment_refund_design_id = ''; public $classification = ''; // individual, business, partnership, trust, charity, government, other public static $casts = [ + 'statement_design_id' => 'string', + 'delivery_note_design_id' => 'string', + 'payment_receipt_design_id' => 'string', + 'payment_refund_design_id' => 'string', 'classification' => 'string', 'enable_e_invoice' => 'bool', 'default_expense_payment_type_id' => 'string', @@ -718,8 +726,6 @@ class CompanySettings extends BaseSettings 'portal_custom_js' => 'string', 'client_portal_enable_uploads' => 'bool', 'purchase_order_number_counter' => 'integer', - 'statement_design_id' => 'string', - 'delivery_note_design_id' => 'string', ]; public static $free_plan_casts = [ diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 2eca29cedd34..268c5994458c 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -911,8 +911,12 @@ class InvoiceController extends BaseController $file = $invoice->service()->getInvoiceDeliveryNote($invoice, $invoice->invitations->first()->contact); return response()->streamDownload(function () use ($file) { - echo Storage::get($file); + echo $file; }, basename($file), ['Content-Type' => 'application/pdf']); + + // return response()->streamDownload(function () use ($file) { + // echo Storage::get($file); + // }, basename($file), ['Content-Type' => 'application/pdf']); } /** diff --git a/app/Http/Requests/Design/StoreDesignRequest.php b/app/Http/Requests/Design/StoreDesignRequest.php index 386114c12b41..63d2b17911d1 100644 --- a/app/Http/Requests/Design/StoreDesignRequest.php +++ b/app/Http/Requests/Design/StoreDesignRequest.php @@ -16,6 +16,11 @@ use App\Models\Account; class StoreDesignRequest extends Request { + + private array $valid_entities = [ + 'invoice', + ]; + /** * Determine if the user is authorized to make this request. * @@ -78,6 +83,20 @@ class StoreDesignRequest extends Request $input['design']['body'] = ''; } + if(array_key_exists('entities', $input)) { + $user_entities = explode(",", $input['entities']); + + $e = []; + + foreach ($user_entities as $entity) { + if (in_array($entity, $this->valid_entities)) { + $e[] = $entity; + } + } + + $input['entities'] = implode(",", $e); + } + $this->replace($input); } } diff --git a/app/Http/Requests/Design/UpdateDesignRequest.php b/app/Http/Requests/Design/UpdateDesignRequest.php index 62b1b4a97562..07fb4e68ea7f 100644 --- a/app/Http/Requests/Design/UpdateDesignRequest.php +++ b/app/Http/Requests/Design/UpdateDesignRequest.php @@ -18,6 +18,10 @@ class UpdateDesignRequest extends Request { use ChecksEntityStatus; + private array $valid_entities = [ + 'invoice', + ]; + /** * Determine if the user is authorized to make this request. * @@ -67,6 +71,21 @@ class UpdateDesignRequest extends Request $input['design']['body'] = ''; } + if(array_key_exists('entities', $input)) { + $user_entities = explode(",", $input['entities']); + + $e = []; + + foreach ($user_entities as $entity) { + if (in_array($entity, $this->valid_entities)) { + $e[] = $entity; + } + } + + $input['entities'] = implode(",", $e); + } + + $this->replace($input); } } diff --git a/app/Models/Design.php b/app/Models/Design.php index 329182e7e8b9..e328d88853fd 100644 --- a/app/Models/Design.php +++ b/app/Models/Design.php @@ -70,6 +70,7 @@ class Design extends BaseModel 'design', 'is_active', 'is_template', + 'entities', ]; public function company() diff --git a/app/Services/Invoice/GenerateDeliveryNote.php b/app/Services/Invoice/GenerateDeliveryNote.php index 681891138811..a7a35a05fcac 100644 --- a/app/Services/Invoice/GenerateDeliveryNote.php +++ b/app/Services/Invoice/GenerateDeliveryNote.php @@ -17,6 +17,7 @@ use App\Models\Design; use App\Models\Invoice; use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Services\PdfMaker\PdfMaker as PdfMakerService; +use App\Services\Template\TemplateService; use App\Utils\HostedPDF\NinjaPdf; use App\Utils\HtmlEngine; use App\Utils\PhantomJS\Phantom; @@ -40,6 +41,22 @@ class GenerateDeliveryNote public function run() { + + $delivery_note_design_id = $this->invoice->client->getSetting('delivery_note_design_id'); + + // if($design = Design::find($this->decodePrimaryKey($delivery_note_design_id))) + if($design = Design::find(15)) + { + + $ts = new TemplateService($design); + $pdf = $ts->build([ + 'invoices' => collect([$this->invoice]), + ])->getPdf(); + + return $pdf; + + } + $design_id = $this->invoice->design_id ? $this->invoice->design_id : $this->decodePrimaryKey($this->invoice->client->getSetting('invoice_design_id')); @@ -84,8 +101,6 @@ class GenerateDeliveryNote ->design($template) ->build(); - // Storage::makeDirectory($this->invoice->client->invoice_filepath(), 0775); - if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); } else { @@ -96,11 +111,12 @@ class GenerateDeliveryNote info($maker->getCompiledHTML()); } - Storage::disk($this->disk)->put($file_path, $pdf); + return $pdf; + // Storage::disk($this->disk)->put($file_path, $pdf); $maker = null; $state = null; - return $file_path; + // return $file_path; } } diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index cd787c1ea8e5..9ed3762cdffe 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -11,8 +11,6 @@ namespace App\Services\Template; -use App\Models\Task; -use App\Models\Quote; use App\Utils\Number; use App\Models\Client; use App\Models\Credit; @@ -22,27 +20,25 @@ use App\Models\Payment; use App\Models\Project; use App\Utils\HtmlEngine; use League\Fractal\Manager; -use App\Models\ClientContact; use App\Models\PurchaseOrder; use App\Utils\VendorHtmlEngine; use App\Utils\PaymentHtmlEngine; use App\Utils\Traits\MakesDates; +use App\Utils\HostedPDF\NinjaPdf; use Twig\Extra\Intl\IntlExtension; use App\Transformers\TaskTransformer; use App\Transformers\QuoteTransformer; use App\Services\Template\TemplateMock; use App\Transformers\CreditTransformer; use App\Transformers\InvoiceTransformer; -use App\Transformers\PaymentTransformer; use App\Transformers\ProjectTransformer; -use App\Services\Template\LogoTokenParser; use App\Transformers\PurchaseOrderTransformer; use League\Fractal\Serializer\ArraySerializer; -use League\Fractal\Serializer\JsonApiSerializer; +use App\Utils\Traits\Pdf\PdfMaker; class TemplateService { - use MakesDates; + use MakesDates, PdfMaker; private \DomDocument $document; @@ -131,6 +127,19 @@ class TemplateService return $this->compiled_html; } + public function getPdf(): mixed + { + + if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { + $pdf = (new NinjaPdf())->build($this->compiled_html); + } else { + $pdf = $this->makePdf(null, null, $this->compiled_html); + } + + return $pdf; + + } + private function processData($data): self { @@ -318,10 +327,14 @@ class TemplateService $invoices = collect($invoices) ->map(function ($invoice){ - $payments = $invoice->payments->map(function ($payment) { - // nlog(microtime(true)); - return $this->transformPayment($payment); - })->toArray(); + $payments = []; + nlog($invoice); + if($invoice->payments) { + $payments = $invoice->payments->map(function ($payment) { + // nlog(microtime(true)); + return $this->transformPayment($payment); + })->toArray(); + } return [ 'amount' => Number::formatMoney($invoice->amount, $invoice->client), @@ -391,12 +404,12 @@ class TemplateService { return collect($items)->map(function ($item) use ($client){ - $item->cost_raw = $item->cost; - $item->discount_raw = $item->discount; - $item->line_total_raw = $item->line_total; - $item->gross_line_total_raw = $item->gross_line_total; - $item->tax_amount_raw = $item->tax_amount; - $item->product_cost_raw = $item->product_cost; + $item->cost_raw = $item->cost ?? 0; + $item->discount_raw = $item->discount ?? 0; + $item->line_total_raw = $item->line_total ?? 0; + $item->gross_line_total_raw = $item->gross_line_total ?? 0; + $item->tax_amount_raw = $item->tax_amount ?? 0; + $item->product_cost_raw = $item->product_cost ?? 0; $item->cost = Number::formatMoney($item->cost_raw, $client); diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 227301467aa6..39109ce8855b 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -324,7 +324,7 @@ class TemplateTest extends TestCase nlog("query count = {$count}"); $x = $invoices->toArray(); - nlog(json_encode($x)); + // nlog(json_encode($x)); // nlog(json_encode(htmlspecialchars(json_encode($x), ENT_QUOTES, 'UTF-8'))); // nlog($invoices->toJson()); @@ -337,8 +337,8 @@ class TemplateTest extends TestCase private function transformPayment(Payment $payment): array { - $data = []; - + $data = []; + $credits = $payment->credits->map(function ($credit) use ($payment) { return [ 'credit' => $credit->number, @@ -401,11 +401,12 @@ class TemplateTest extends TestCase ], 'paymentables' => $pivot, ]; - + return $data; + } public function testVariableResolutionViaTransformersForPaymentsInStatements()