From f40ccaed961fed13b8107148c8808fe6d26b9d86 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 19 Jul 2023 09:19:26 +1000 Subject: [PATCH 01/10] Add calculated start date to transformer --- app/Transformers/TaskTransformer.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Transformers/TaskTransformer.php b/app/Transformers/TaskTransformer.php index d2080b6a4500..60949c0b1609 100644 --- a/app/Transformers/TaskTransformer.php +++ b/app/Transformers/TaskTransformer.php @@ -130,6 +130,7 @@ class TaskTransformer extends EntityTransformer 'status_sort_order' => (int) $task->status_sort_order, //deprecated 5.0.34 'is_date_based' => (bool) $task->is_date_based, 'status_order' => is_null($task->status_order) ? null : (int) $task->status_order, + 'calculated_start_date' => $task->calculated_start_date ?: '', ]; } } From 204e6bd8527bc6f71af5127a40acfd00ebe3cbc6 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 19 Jul 2023 19:25:01 +1000 Subject: [PATCH 02/10] Minor fixes --- app/Http/Livewire/PdfSlot.php | 9 ++++----- app/Transformers/TaskTransformer.php | 2 +- .../portal/ninja2020/components/html-viewer.blade.php | 7 ++++++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/Http/Livewire/PdfSlot.php b/app/Http/Livewire/PdfSlot.php index c0f29b517a00..dc4372f12340 100644 --- a/app/Http/Livewire/PdfSlot.php +++ b/app/Http/Livewire/PdfSlot.php @@ -20,12 +20,8 @@ use Illuminate\Support\Str; 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 Illuminate\Support\Facades\Cache; -use App\Services\Pdf\PdfConfiguration; use App\Models\PurchaseOrderInvitation; use App\Models\RecurringInvoiceInvitation; use App\Jobs\Vendor\CreatePurchaseOrderPdf; @@ -52,6 +48,8 @@ class PdfSlot extends Component public $show_quantity = true; + public $show_line_total = true; + public $route_entity = 'client'; public function mount() @@ -104,11 +102,12 @@ class PdfSlot extends Component $this->settings = $this->entity->client ? $this->entity->client->getMergedSettings() : $this->entity->company->settings; $this->show_cost = in_array('$product.unit_cost', $this->settings->pdf_variables->product_columns); - $this->show_quantity = in_array('$product.quantity', $this->settings->pdf_variables->product_columns); + $this->show_line_total = in_array('$product.line_total', $this->settings->pdf_variables->product_columns); if($this->entity_type == 'quote' && !$this->settings->sync_invoice_quote_columns ){ $this->show_cost = in_array('$product.unit_cost', $this->settings->pdf_variables->product_quote_columns); $this->show_quantity = in_array('$product.quantity', $this->settings->pdf_variables->product_quote_columns); + $this->show_line_total = in_array('$product.line_total', $this->settings->pdf_variables->product_quote_columns); } $this->html_variables = $this->entity->client ? diff --git a/app/Transformers/TaskTransformer.php b/app/Transformers/TaskTransformer.php index 60949c0b1609..503ec0612799 100644 --- a/app/Transformers/TaskTransformer.php +++ b/app/Transformers/TaskTransformer.php @@ -130,7 +130,7 @@ class TaskTransformer extends EntityTransformer 'status_sort_order' => (int) $task->status_sort_order, //deprecated 5.0.34 'is_date_based' => (bool) $task->is_date_based, 'status_order' => is_null($task->status_order) ? null : (int) $task->status_order, - 'calculated_start_date' => $task->calculated_start_date ?: '', + 'date' => $task->calculated_start_date ?: '', ]; } } diff --git a/resources/views/portal/ninja2020/components/html-viewer.blade.php b/resources/views/portal/ninja2020/components/html-viewer.blade.php index e471ed24fa57..d630d3240959 100644 --- a/resources/views/portal/ninja2020/components/html-viewer.blade.php +++ b/resources/views/portal/ninja2020/components/html-viewer.blade.php @@ -90,7 +90,12 @@ span { - {{ $product['line_total'] }} + + + @if($show_line_total) + {{ $product['line_total'] }} + @endif + @endforeach From 6139c7b0eed0a17b8c76b69609e7aef96aaa4c0c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 19 Jul 2023 19:59:11 +1000 Subject: [PATCH 03/10] Fixes for backup paths --- .../ProtectedDownloadController.php | 1 + app/Jobs/Company/CompanyExport.php | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/ProtectedDownloadController.php b/app/Http/Controllers/ProtectedDownloadController.php index c333539b99ab..b8f598a11021 100644 --- a/app/Http/Controllers/ProtectedDownloadController.php +++ b/app/Http/Controllers/ProtectedDownloadController.php @@ -11,6 +11,7 @@ namespace App\Http\Controllers; +use App\Utils\Ninja; use Illuminate\Http\Request; use App\Jobs\Util\UnlinkFile; use App\Exceptions\SystemError; diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 2b693dbabb12..2b89028e8a1c 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -441,15 +441,15 @@ class CompanyExport implements ShouldQueue $path = 'backups'; - Storage::makeDirectory(public_path('storage/backups/')); + Storage::makeDirectory(storage_path('backups/')); try { - mkdir(public_path('storage/backups/')); + mkdir(storage_path('backups/')); } catch(\Exception $e) { nlog("could not create directory"); } - $zip_path = public_path('storage/backups/'.$file_name); + $zip_path = storage_path('backups/'.$file_name); $zip = new \ZipArchive(); if ($zip->open($zip_path, \ZipArchive::CREATE)!==true) { @@ -459,14 +459,16 @@ class CompanyExport implements ShouldQueue $zip->addFromString("backup.json", json_encode($this->export_data)); $zip->close(); - if (Ninja::isHosted()) { - Storage::disk(config('filesystems.default'))->put('backups/'.$file_name, file_get_contents($zip_path)); - } + Storage::disk(config('filesystems.default'))->put('backups/'.$file_name, file_get_contents($zip_path)); + unlink($zip_path); - $storage_file_path = Storage::disk(config('filesystems.default'))->url('backups/'.$file_name); - $storage_path = Storage::disk(config('filesystems.default'))->path('backups/'.$file_name); + if(Ninja::isSelfHost()) + $storage_path = 'backups/'.$file_name; + else + $storage_path = Storage::disk(config('filesystems.default'))->path('backups/'.$file_name); $url = Cache::get($this->hash); + Cache::put($this->hash, $storage_path, now()->addHour()); App::forgetInstance('translator'); From b8c4d6668f4cade3a90a2b86ac9cd9df477a863d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 20 Jul 2023 08:07:11 +1000 Subject: [PATCH 04/10] Change length of webhook urls --- .../2023_07_18_214607_add_start_date_column_to_tasks.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/database/migrations/2023_07_18_214607_add_start_date_column_to_tasks.php b/database/migrations/2023_07_18_214607_add_start_date_column_to_tasks.php index ad988bd747ef..74b4a86ae689 100644 --- a/database/migrations/2023_07_18_214607_add_start_date_column_to_tasks.php +++ b/database/migrations/2023_07_18_214607_add_start_date_column_to_tasks.php @@ -16,6 +16,10 @@ return new class extends Migration Schema::table('tasks', function (Blueprint $table) { $table->date('calculated_start_date')->nullable(); }); + + Schema::table('webhooks', function (Blueprint $table){ + $table->text('target_url')->change(); + }); } /** From 843d7c3bf4e1fc52b0d0a5c5e44906c5072dc879 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 20 Jul 2023 09:08:17 +1000 Subject: [PATCH 05/10] Adjustments for vendor imports --- app/Import/Providers/BaseImport.php | 8 ++++++-- app/Repositories/VendorRepository.php | 12 ++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/Import/Providers/BaseImport.php b/app/Import/Providers/BaseImport.php index 0cb696bfde5c..5d6ef871dbd9 100644 --- a/app/Import/Providers/BaseImport.php +++ b/app/Import/Providers/BaseImport.php @@ -477,8 +477,12 @@ class BaseImport } nlog($invoice_data); + $saveable_invoice_data = $invoice_data; + + if(array_key_exists('payments', $saveable_invoice_data)) + unset($saveable_invoice_data['payments']); - $invoice_repository->save($invoice_data, $invoice); + $invoice_repository->save($saveable_invoice_data, $invoice); $count++; // If we're doing a generic CSV import, only import payment data if we're not importing a payment CSV. @@ -504,7 +508,7 @@ class BaseImport ]; /* Make sure we don't apply any payments to invoices with a Zero Amount*/ - if ($invoice->amount > 0) { + if ($invoice->amount > 0 && $payment_data['amount'] > 0) { $payment = $payment_repository->save( $payment_data, diff --git a/app/Repositories/VendorRepository.php b/app/Repositories/VendorRepository.php index bb9266014701..f1eeb0e25962 100644 --- a/app/Repositories/VendorRepository.php +++ b/app/Repositories/VendorRepository.php @@ -43,10 +43,14 @@ class VendorRepository extends BaseRepository */ public function save(array $data, Vendor $vendor) : ?Vendor { - $vendor->fill($data); - - nlog($data); - + $saveable_vendor = $data; + + if(array_key_exists('contacts', $data)) { + unset($saveable_vendor['contacts']); + } + + $vendor->fill($saveable_vendor); + $vendor->saveQuietly(); if ($vendor->number == '' || ! $vendor->number) { From 81d0059480e230881f37e18cc513b27c01ec4bd1 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 20 Jul 2023 09:57:46 +1000 Subject: [PATCH 06/10] Adjustments for self updater --- app/Http/Controllers/SelfUpdateController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/SelfUpdateController.php b/app/Http/Controllers/SelfUpdateController.php index 33e47e671145..12fd890840a6 100644 --- a/app/Http/Controllers/SelfUpdateController.php +++ b/app/Http/Controllers/SelfUpdateController.php @@ -53,7 +53,7 @@ class SelfUpdateController extends BaseController nlog('Test filesystem is writable'); - $this->testWritable(); + // $this->testWritable(); nlog('Clear cache directory'); From a7d3424720102f3625423f9ccc9de1b475af3db8 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 20 Jul 2023 16:46:10 +1000 Subject: [PATCH 07/10] Ensure document file names are translated --- app/Http/Controllers/ActivityController.php | 2 + .../ClientPortal/InvitationController.php | 8 ++- app/Http/Controllers/CreditController.php | 43 ++++++++------- app/Http/Controllers/InvoiceController.php | 51 +++++++++--------- .../Controllers/PurchaseOrderController.php | 37 ++++++------- app/Http/Controllers/QuoteController.php | 53 ++++++++++--------- .../RecurringInvoiceController.php | 31 +++++------ .../VendorPortal/InvitationController.php | 19 ++++--- app/Http/Middleware/SetInviteDb.php | 1 - app/Models/Company.php | 6 +++ .../PurchaseOrder/GetPurchaseOrderPdf.php | 3 +- 11 files changed, 137 insertions(+), 117 deletions(-) diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index b201296e0db4..7f4a7bd7fc8b 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -148,6 +148,8 @@ class ActivityController extends BaseController } } + $activity->company->setLocale(); + if (isset($activity->invoice_id)) { $filename = $activity->invoice->numberFormatter().'.pdf'; } elseif (isset($activity->quote_id)) { diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index a1d4949f0175..2c606c141573 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -85,23 +85,21 @@ class InvitationController extends Controller ->with('contact.client') ->firstOrFail(); - //09-03-2023 do not show entity if the invitation has been trashed. if ($invitation->trashed() || $invitation->{$entity}->is_deleted) { return $this->render('generic.not_available', ['account' => $invitation->company->account, 'company' => $invitation->company]); } - /* 12/01/2022 Clean up an edge case where if the contact is trashed, restore if a invitation comes back. */ if ($invitation->contact->trashed()) { $invitation->contact->restore(); } - /* Return early if we have the correct client_hash embedded */ $client_contact = $invitation->contact; if (empty($client_contact->email)) { $client_contact->email = Str::random(15) . "@example.com"; - } $client_contact->save(); - + $client_contact->save(); + } + if (request()->has('client_hash') && request()->input('client_hash') == $invitation->contact->client->client_hash) { request()->session()->invalidate(); auth()->guard('contact')->loginUsingId($client_contact->id, true); diff --git a/app/Http/Controllers/CreditController.php b/app/Http/Controllers/CreditController.php index 336706ea3668..bff1ac302f19 100644 --- a/app/Http/Controllers/CreditController.php +++ b/app/Http/Controllers/CreditController.php @@ -11,34 +11,35 @@ namespace App\Http\Controllers; -use App\Events\Credit\CreditWasCreated; -use App\Events\Credit\CreditWasUpdated; -use App\Factory\CloneCreditFactory; +use App\Utils\Ninja; +use App\Models\Client; +use App\Models\Credit; +use App\Models\Account; +use App\Models\Invoice; +use Illuminate\Http\Response; use App\Factory\CreditFactory; use App\Filters\CreditFilters; -use App\Http\Requests\Credit\ActionCreditRequest; +use App\Jobs\Credit\ZipCredits; +use App\Utils\Traits\MakesHash; +use App\Jobs\Entity\EmailEntity; +use App\Factory\CloneCreditFactory; +use App\Services\PdfMaker\PdfMerge; +use Illuminate\Support\Facades\App; +use App\Utils\Traits\SavesDocuments; +use App\Repositories\CreditRepository; +use App\Events\Credit\CreditWasCreated; +use App\Events\Credit\CreditWasUpdated; +use App\Transformers\CreditTransformer; +use Illuminate\Support\Facades\Storage; use App\Http\Requests\Credit\BulkCreditRequest; -use App\Http\Requests\Credit\CreateCreditRequest; -use App\Http\Requests\Credit\DestroyCreditRequest; use App\Http\Requests\Credit\EditCreditRequest; use App\Http\Requests\Credit\ShowCreditRequest; use App\Http\Requests\Credit\StoreCreditRequest; +use App\Http\Requests\Credit\ActionCreditRequest; +use App\Http\Requests\Credit\CreateCreditRequest; use App\Http\Requests\Credit\UpdateCreditRequest; use App\Http\Requests\Credit\UploadCreditRequest; -use App\Jobs\Credit\ZipCredits; -use App\Jobs\Entity\EmailEntity; -use App\Models\Account; -use App\Models\Client; -use App\Models\Credit; -use App\Models\Invoice; -use App\Repositories\CreditRepository; -use App\Services\PdfMaker\PdfMerge; -use App\Transformers\CreditTransformer; -use App\Utils\Ninja; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\SavesDocuments; -use Illuminate\Http\Response; -use Illuminate\Support\Facades\Storage; +use App\Http\Requests\Credit\DestroyCreditRequest; /** * Class CreditController. @@ -691,6 +692,8 @@ class CreditController extends BaseController $credit = $invitation->credit; + App::setLocale($invitation->contact->preferredLocale()); + $file = $credit->service()->getCreditPdf($invitation); $headers = ['Content-Type' => 'application/pdf']; diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 1c691f36f577..81556fc531af 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -12,38 +12,39 @@ namespace App\Http\Controllers; -use App\Events\Invoice\InvoiceWasCreated; -use App\Events\Invoice\InvoiceWasUpdated; -use App\Factory\CloneInvoiceFactory; -use App\Factory\CloneInvoiceToQuoteFactory; +use App\Utils\Ninja; +use App\Models\Quote; +use App\Models\Account; +use App\Models\Invoice; +use App\Jobs\Cron\AutoBill; +use Illuminate\Http\Response; use App\Factory\InvoiceFactory; use App\Filters\InvoiceFilters; -use App\Http\Requests\Invoice\ActionInvoiceRequest; +use App\Utils\Traits\MakesHash; +use App\Jobs\Invoice\ZipInvoices; +use App\Services\PdfMaker\PdfMerge; +use Illuminate\Support\Facades\App; +use App\Factory\CloneInvoiceFactory; +use App\Jobs\Invoice\BulkInvoiceJob; +use App\Utils\Traits\SavesDocuments; +use App\Jobs\Invoice\UpdateReminders; +use App\Transformers\QuoteTransformer; +use App\Repositories\InvoiceRepository; +use Illuminate\Support\Facades\Storage; +use App\Transformers\InvoiceTransformer; +use App\Events\Invoice\InvoiceWasCreated; +use App\Events\Invoice\InvoiceWasUpdated; +use App\Factory\CloneInvoiceToQuoteFactory; use App\Http\Requests\Invoice\BulkInvoiceRequest; -use App\Http\Requests\Invoice\CreateInvoiceRequest; -use App\Http\Requests\Invoice\DestroyInvoiceRequest; use App\Http\Requests\Invoice\EditInvoiceRequest; use App\Http\Requests\Invoice\ShowInvoiceRequest; use App\Http\Requests\Invoice\StoreInvoiceRequest; +use App\Http\Requests\Invoice\ActionInvoiceRequest; +use App\Http\Requests\Invoice\CreateInvoiceRequest; use App\Http\Requests\Invoice\UpdateInvoiceRequest; -use App\Http\Requests\Invoice\UpdateReminderRequest; use App\Http\Requests\Invoice\UploadInvoiceRequest; -use App\Jobs\Cron\AutoBill; -use App\Jobs\Invoice\BulkInvoiceJob; -use App\Jobs\Invoice\UpdateReminders; -use App\Jobs\Invoice\ZipInvoices; -use App\Models\Account; -use App\Models\Invoice; -use App\Models\Quote; -use App\Repositories\InvoiceRepository; -use App\Services\PdfMaker\PdfMerge; -use App\Transformers\InvoiceTransformer; -use App\Transformers\QuoteTransformer; -use App\Utils\Ninja; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\SavesDocuments; -use Illuminate\Http\Response; -use Illuminate\Support\Facades\Storage; +use App\Http\Requests\Invoice\DestroyInvoiceRequest; +use App\Http\Requests\Invoice\UpdateReminderRequest; /** * Class InvoiceController. @@ -821,6 +822,8 @@ class InvoiceController extends BaseController $invoice = $invitation->invoice; + App::setLocale($invitation->contact->preferredLocale()); + $file_name = $invoice->numberFormatter().'.pdf'; $file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $invitation->company->db))->handle(); diff --git a/app/Http/Controllers/PurchaseOrderController.php b/app/Http/Controllers/PurchaseOrderController.php index 91da9c5efd7d..c6892f89a69d 100644 --- a/app/Http/Controllers/PurchaseOrderController.php +++ b/app/Http/Controllers/PurchaseOrderController.php @@ -11,32 +11,33 @@ namespace App\Http\Controllers; -use App\Events\PurchaseOrder\PurchaseOrderWasCreated; -use App\Events\PurchaseOrder\PurchaseOrderWasUpdated; +use App\Utils\Ninja; +use App\Models\Client; +use App\Models\Account; +use App\Models\PurchaseOrder; +use Illuminate\Http\Response; +use App\Utils\Traits\MakesHash; +use App\Services\PdfMaker\PdfMerge; +use Illuminate\Support\Facades\App; +use App\Utils\Traits\SavesDocuments; use App\Factory\PurchaseOrderFactory; use App\Filters\PurchaseOrderFilters; -use App\Http\Requests\PurchaseOrder\ActionPurchaseOrderRequest; +use Illuminate\Support\Facades\Storage; +use App\Jobs\PurchaseOrder\ZipPurchaseOrders; +use App\Repositories\PurchaseOrderRepository; +use App\Jobs\PurchaseOrder\PurchaseOrderEmail; +use App\Transformers\PurchaseOrderTransformer; +use App\Events\PurchaseOrder\PurchaseOrderWasCreated; +use App\Events\PurchaseOrder\PurchaseOrderWasUpdated; use App\Http\Requests\PurchaseOrder\BulkPurchaseOrderRequest; -use App\Http\Requests\PurchaseOrder\CreatePurchaseOrderRequest; -use App\Http\Requests\PurchaseOrder\DestroyPurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\EditPurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\ShowPurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\StorePurchaseOrderRequest; +use App\Http\Requests\PurchaseOrder\ActionPurchaseOrderRequest; +use App\Http\Requests\PurchaseOrder\CreatePurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\UpdatePurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\UploadPurchaseOrderRequest; -use App\Jobs\PurchaseOrder\PurchaseOrderEmail; -use App\Jobs\PurchaseOrder\ZipPurchaseOrders; -use App\Models\Account; -use App\Models\Client; -use App\Models\PurchaseOrder; -use App\Repositories\PurchaseOrderRepository; -use App\Services\PdfMaker\PdfMerge; -use App\Transformers\PurchaseOrderTransformer; -use App\Utils\Ninja; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\SavesDocuments; -use Illuminate\Http\Response; -use Illuminate\Support\Facades\Storage; +use App\Http\Requests\PurchaseOrder\DestroyPurchaseOrderRequest; class PurchaseOrderController extends BaseController { diff --git a/app/Http/Controllers/QuoteController.php b/app/Http/Controllers/QuoteController.php index ca27b5840054..bfee11be5a57 100644 --- a/app/Http/Controllers/QuoteController.php +++ b/app/Http/Controllers/QuoteController.php @@ -11,38 +11,39 @@ namespace App\Http\Controllers; -use App\Events\Quote\QuoteWasCreated; -use App\Events\Quote\QuoteWasUpdated; -use App\Factory\CloneQuoteFactory; -use App\Factory\CloneQuoteToInvoiceFactory; -use App\Factory\CloneQuoteToProjectFactory; +use App\Utils\Ninja; +use App\Models\Quote; +use App\Models\Client; +use App\Models\Account; +use App\Models\Invoice; +use Illuminate\Http\Request; use App\Factory\QuoteFactory; use App\Filters\QuoteFilters; -use App\Http\Requests\Quote\ActionQuoteRequest; -use App\Http\Requests\Quote\BulkActionQuoteRequest; -use App\Http\Requests\Quote\CreateQuoteRequest; -use App\Http\Requests\Quote\DestroyQuoteRequest; +use App\Jobs\Quote\ZipQuotes; +use Illuminate\Http\Response; +use App\Utils\Traits\MakesHash; +use App\Factory\CloneQuoteFactory; +use App\Services\PdfMaker\PdfMerge; +use Illuminate\Support\Facades\App; +use App\Utils\Traits\SavesDocuments; +use App\Events\Quote\QuoteWasCreated; +use App\Events\Quote\QuoteWasUpdated; +use App\Repositories\QuoteRepository; +use App\Transformers\QuoteTransformer; +use App\Utils\Traits\GeneratesCounter; +use Illuminate\Support\Facades\Storage; +use App\Transformers\InvoiceTransformer; +use App\Factory\CloneQuoteToInvoiceFactory; +use App\Factory\CloneQuoteToProjectFactory; use App\Http\Requests\Quote\EditQuoteRequest; use App\Http\Requests\Quote\ShowQuoteRequest; use App\Http\Requests\Quote\StoreQuoteRequest; +use App\Http\Requests\Quote\ActionQuoteRequest; +use App\Http\Requests\Quote\CreateQuoteRequest; use App\Http\Requests\Quote\UpdateQuoteRequest; use App\Http\Requests\Quote\UploadQuoteRequest; -use App\Jobs\Quote\ZipQuotes; -use App\Models\Account; -use App\Models\Client; -use App\Models\Invoice; -use App\Models\Quote; -use App\Repositories\QuoteRepository; -use App\Services\PdfMaker\PdfMerge; -use App\Transformers\InvoiceTransformer; -use App\Transformers\QuoteTransformer; -use App\Utils\Ninja; -use App\Utils\Traits\GeneratesCounter; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\SavesDocuments; -use Illuminate\Http\Request; -use Illuminate\Http\Response; -use Illuminate\Support\Facades\Storage; +use App\Http\Requests\Quote\DestroyQuoteRequest; +use App\Http\Requests\Quote\BulkActionQuoteRequest; /** * Class QuoteController. @@ -824,6 +825,8 @@ class QuoteController extends BaseController $contact = $invitation->contact; $quote = $invitation->quote; + + App::setLocale($invitation->contact->preferredLocale()); $file = $quote->service()->getQuotePdf($contact); diff --git a/app/Http/Controllers/RecurringInvoiceController.php b/app/Http/Controllers/RecurringInvoiceController.php index 02b526d094c2..daa59552c836 100644 --- a/app/Http/Controllers/RecurringInvoiceController.php +++ b/app/Http/Controllers/RecurringInvoiceController.php @@ -11,29 +11,28 @@ namespace App\Http\Controllers; -use App\Events\RecurringInvoice\RecurringInvoiceWasCreated; -use App\Events\RecurringInvoice\RecurringInvoiceWasUpdated; +use App\Utils\Ninja; +use App\Models\Account; +use Illuminate\Http\Response; +use App\Utils\Traits\MakesHash; +use App\Models\RecurringInvoice; +use App\Utils\Traits\SavesDocuments; use App\Factory\RecurringInvoiceFactory; use App\Filters\RecurringInvoiceFilters; -use App\Http\Requests\RecurringInvoice\ActionRecurringInvoiceRequest; +use App\Jobs\RecurringInvoice\UpdateRecurring; +use App\Repositories\RecurringInvoiceRepository; +use App\Transformers\RecurringInvoiceTransformer; +use App\Events\RecurringInvoice\RecurringInvoiceWasCreated; +use App\Events\RecurringInvoice\RecurringInvoiceWasUpdated; use App\Http\Requests\RecurringInvoice\BulkRecurringInvoiceRequest; -use App\Http\Requests\RecurringInvoice\CreateRecurringInvoiceRequest; -use App\Http\Requests\RecurringInvoice\DestroyRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\EditRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\ShowRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\StoreRecurringInvoiceRequest; +use App\Http\Requests\RecurringInvoice\ActionRecurringInvoiceRequest; +use App\Http\Requests\RecurringInvoice\CreateRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\UpdateRecurringInvoiceRequest; use App\Http\Requests\RecurringInvoice\UploadRecurringInvoiceRequest; -use App\Jobs\RecurringInvoice\UpdateRecurring; -use App\Models\Account; -use App\Models\RecurringInvoice; -use App\Repositories\RecurringInvoiceRepository; -use App\Transformers\RecurringInvoiceTransformer; -use App\Utils\Ninja; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\SavesDocuments; -use Illuminate\Http\Response; -use Illuminate\Support\Facades\Storage; +use App\Http\Requests\RecurringInvoice\DestroyRecurringInvoiceRequest; /** * Class RecurringInvoiceController. @@ -566,6 +565,8 @@ class RecurringInvoiceController extends BaseController } $invoice = $invitation->recurring_invoice; + + \Illuminate\Support\Facades\App::setLocale($invitation->contact->preferredLocale()); $file_name = $invoice->numberFormatter().'.pdf'; diff --git a/app/Http/Controllers/VendorPortal/InvitationController.php b/app/Http/Controllers/VendorPortal/InvitationController.php index 80bc02e5d5df..7ce6ae394d01 100644 --- a/app/Http/Controllers/VendorPortal/InvitationController.php +++ b/app/Http/Controllers/VendorPortal/InvitationController.php @@ -11,16 +11,17 @@ namespace App\Http\Controllers\VendorPortal; -use App\Events\Misc\InvitationWasViewed; -use App\Events\PurchaseOrder\PurchaseOrderWasViewed; -use App\Http\Controllers\Controller; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; -use App\Models\PurchaseOrderInvitation; use App\Utils\Ninja; -use App\Utils\Traits\MakesDates; -use App\Utils\Traits\MakesHash; -use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\MakesDates; +use Illuminate\Support\Facades\App; +use App\Http\Controllers\Controller; +use Illuminate\Support\Facades\Auth; +use App\Models\PurchaseOrderInvitation; +use App\Events\Misc\InvitationWasViewed; +use App\Jobs\Vendor\CreatePurchaseOrderPdf; +use App\Events\PurchaseOrder\PurchaseOrderWasViewed; /** * Class InvitationController. @@ -89,6 +90,8 @@ class InvitationController extends Controller return response()->json(["message" => "no record found"], 400); } + App::setLocale($invitation->contact->preferredLocale()); + $file_name = $invitation->purchase_order->numberFormatter().'.pdf'; $file = (new CreatePurchaseOrderPdf($invitation))->rawPdf(); diff --git a/app/Http/Middleware/SetInviteDb.php b/app/Http/Middleware/SetInviteDb.php index 07dc7b4419d1..cc9ec3c1918b 100644 --- a/app/Http/Middleware/SetInviteDb.php +++ b/app/Http/Middleware/SetInviteDb.php @@ -53,7 +53,6 @@ class SetInviteDb /* Try and determine the DB from the invitation key STRING*/ if (config('ninja.db.multi_db_enabled')) { - // nlog("/ Try and determine the DB from the invitation key /"); $hashids = new Hashids(config('ninja.hash_salt'), 10); $segments = explode('-', $request->route('invitation_key')); diff --git a/app/Models/Company.php b/app/Models/Company.php index ea94a0a6c1d1..cce115b25c9c 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -16,6 +16,7 @@ use App\Casts\EncryptedCast; use App\Utils\Traits\AppSetup; use App\Utils\Traits\MakesHash; use App\DataMapper\CompanySettings; +use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Cache; use Laracasts\Presenter\PresentableTrait; use App\Utils\Traits\CompanySettingsSaver; @@ -686,6 +687,11 @@ class Company extends BaseModel return $this->getLocale(); } + public function setLocale() + { + App::setLocale($this->getLocale()); + } + public function getSetting($setting) { if (property_exists($this->settings, $setting) != false) { diff --git a/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php b/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php index 40044b90b6e5..5735b6eadeed 100644 --- a/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php +++ b/app/Services/PurchaseOrder/GetPurchaseOrderPdf.php @@ -11,11 +11,11 @@ namespace App\Services\PurchaseOrder; -use App\Jobs\Vendor\CreatePurchaseOrderPdf; use App\Models\PurchaseOrder; use App\Models\VendorContact; use App\Services\AbstractService; use Illuminate\Support\Facades\Storage; +use App\Jobs\Vendor\CreatePurchaseOrderPdf; class GetPurchaseOrderPdf extends AbstractService { @@ -31,6 +31,7 @@ class GetPurchaseOrderPdf extends AbstractService $invitation = $this->purchase_order->invitations()->where('vendor_contact_id', $this->contact->id)->first(); + if (! $invitation) { $invitation = $this->purchase_order->invitations()->first(); } From 1c9450a6e4eac9b90aacc70ec6ef1f010681e904 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 20 Jul 2023 21:17:01 +1000 Subject: [PATCH 08/10] Improve readability for html view in Client Portal --- app/Http/Livewire/PdfSlot.php | 16 ++++++++++------ .../ninja2020/components/html-viewer.blade.php | 8 ++++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/Http/Livewire/PdfSlot.php b/app/Http/Livewire/PdfSlot.php index dc4372f12340..dccaf802c03d 100644 --- a/app/Http/Livewire/PdfSlot.php +++ b/app/Http/Livewire/PdfSlot.php @@ -25,6 +25,7 @@ use Illuminate\Support\Facades\Cache; use App\Models\PurchaseOrderInvitation; use App\Models\RecurringInvoiceInvitation; use App\Jobs\Vendor\CreatePurchaseOrderPdf; +use App\Services\PdfMaker\Designs\Utilities\DesignHelpers; class PdfSlot extends Component { @@ -172,20 +173,20 @@ class PdfSlot extends Component if($this->entity_type == 'invoice' || $this->entity_type == 'recurring_invoice') { foreach($this->settings->pdf_variables->invoice_details as $variable) - $entity_details .= "

{$variable}_label

{$variable}

"; + $entity_details .= "

{$variable}_label

{$variable}

"; } elseif($this->entity_type == 'quote'){ foreach($this->settings->pdf_variables->quote_details as $variable) - $entity_details .= "

{$variable}_label

{$variable}

"; + $entity_details .= "

{$variable}_label

{$variable}

"; } elseif($this->entity_type == 'credit') { foreach($this->settings->pdf_variables->credit_details as $variable) - $entity_details .= "

{$variable}_label

{$variable}

"; + $entity_details .= "

{$variable}_label

{$variable}

"; } elseif($this->entity_type == 'purchase_order'){ foreach($this->settings->pdf_variables->purchase_order_details as $variable) - $entity_details .= "

{$variable}_label

{$variable}

"; + $entity_details .= "

{$variable}_label

{$variable}

"; } return $this->convertVariables($entity_details); @@ -228,13 +229,16 @@ class PdfSlot extends Component 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, + 'notes' => $this->invitation->company->markdown_enabled ? DesignHelpers::parseMarkdownToHtml($item->notes) : $item->notes, 'line_total' => Number::formatMoney($item->line_total, $this->entity->client ?: $this->entity->vendor), ]; }); @@ -250,7 +254,7 @@ class PdfSlot extends Component return [ 'quantity' => $item->quantity, 'cost' => Number::formatMoney($item->cost, $this->entity->client ?: $this->entity->vendor), - 'notes' => $item->notes, + 'notes' => $this->invitation->company->markdown_enabled ? DesignHelpers::parseMarkdownToHtml($item->notes) : $item->notes, 'line_total' => Number::formatMoney($item->line_total, $this->entity->client ?: $this->entity->vendor), ]; }); diff --git a/resources/views/portal/ninja2020/components/html-viewer.blade.php b/resources/views/portal/ninja2020/components/html-viewer.blade.php index d630d3240959..0b1ccdafed00 100644 --- a/resources/views/portal/ninja2020/components/html-viewer.blade.php +++ b/resources/views/portal/ninja2020/components/html-viewer.blade.php @@ -86,7 +86,7 @@ span { {{ $product['cost'] }} @endif

-

{{ $product['notes'] }}

+

{!! $product['notes'] !!}

@@ -106,19 +106,19 @@ span {
- + @foreach($services as $service) - + From 61c033b224c1a22865c0d4bfd4bb5e60321c663c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jul 2023 09:01:23 +1000 Subject: [PATCH 09/10] Minor fixes --- app/Http/Controllers/PreviewController.php | 2 +- tests/Feature/ClientPortal/CreditsTest.php | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index a6d6760d7919..7402b886a4cf 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -285,7 +285,7 @@ class PreviewController extends BaseController return $maker->getCompiledHTML(); } } catch(\Exception $e) { - nlog($e->getMessage()); + // nlog($e->getMessage()); DB::connection(config('database.default'))->rollBack(); return; diff --git a/tests/Feature/ClientPortal/CreditsTest.php b/tests/Feature/ClientPortal/CreditsTest.php index a579a9fd1bf1..e555dcf8f0d6 100644 --- a/tests/Feature/ClientPortal/CreditsTest.php +++ b/tests/Feature/ClientPortal/CreditsTest.php @@ -33,6 +33,8 @@ class CreditsTest extends TestCase use DatabaseTransactions; use AppSetup; + private $faker; + protected function setUp(): void { parent::setUp(); From c91f647df3b0a4268e8a93d12e7352c55511a130 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 21 Jul 2023 13:19:51 +1000 Subject: [PATCH 10/10] minor update for lock file --- composer.lock | 146 ++++++++++++++++++++++++++------------------------ 1 file changed, 77 insertions(+), 69 deletions(-) diff --git a/composer.lock b/composer.lock index 294a1edc5334..4afddc900c60 100644 --- a/composer.lock +++ b/composer.lock @@ -424,16 +424,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.275.7", + "version": "3.276.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "54dcef3349c81b46c0f5f6e54b5f9bfb5db19903" + "reference": "78c9510280512121e8fdaa9538b744778ab48bf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/54dcef3349c81b46c0f5f6e54b5f9bfb5db19903", - "reference": "54dcef3349c81b46c0f5f6e54b5f9bfb5db19903", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/78c9510280512121e8fdaa9538b744778ab48bf9", + "reference": "78c9510280512121e8fdaa9538b744778ab48bf9", "shasum": "" }, "require": { @@ -513,9 +513,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.275.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.276.2" }, - "time": "2023-07-13T18:21:04+00:00" + "time": "2023-07-20T18:16:37+00:00" }, { "name": "bacon/bacon-qr-code", @@ -2167,16 +2167,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.8.0", + "version": "v6.8.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "48b0210c51718d682e53210c24d25c5a10a2299b" + "reference": "5dbc8959427416b8ee09a100d7a8588c00fb2e26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/48b0210c51718d682e53210c24d25c5a10a2299b", - "reference": "48b0210c51718d682e53210c24d25c5a10a2299b", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/5dbc8959427416b8ee09a100d7a8588c00fb2e26", + "reference": "5dbc8959427416b8ee09a100d7a8588c00fb2e26", "shasum": "" }, "require": { @@ -2224,9 +2224,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.8.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.8.1" }, - "time": "2023-06-20T16:45:35+00:00" + "time": "2023-07-14T18:33:00+00:00" }, { "name": "fruitcake/php-cors", @@ -2485,16 +2485,16 @@ }, { "name": "google/apiclient-services", - "version": "v0.308.0", + "version": "v0.309.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "85cf00383e6bf6eca131bd3261b7859ea418a578" + "reference": "562f8e5ddbca68d52afc3bf47d03839e78722026" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/85cf00383e6bf6eca131bd3261b7859ea418a578", - "reference": "85cf00383e6bf6eca131bd3261b7859ea418a578", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/562f8e5ddbca68d52afc3bf47d03839e78722026", + "reference": "562f8e5ddbca68d52afc3bf47d03839e78722026", "shasum": "" }, "require": { @@ -2523,9 +2523,9 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.308.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.309.0" }, - "time": "2023-07-09T01:06:13+00:00" + "time": "2023-07-16T01:08:14+00:00" }, { "name": "google/auth", @@ -4554,16 +4554,16 @@ }, { "name": "laravel/socialite", - "version": "v5.7.0", + "version": "v5.8.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "f5996f499e14db15407201a6bfbaba3ce6ce736c" + "reference": "50148edf24b6cd3e428aa9bc06a5d915b24376bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/f5996f499e14db15407201a6bfbaba3ce6ce736c", - "reference": "f5996f499e14db15407201a6bfbaba3ce6ce736c", + "url": "https://api.github.com/repos/laravel/socialite/zipball/50148edf24b6cd3e428aa9bc06a5d915b24376bb", + "reference": "50148edf24b6cd3e428aa9bc06a5d915b24376bb", "shasum": "" }, "require": { @@ -4620,7 +4620,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2023-07-08T20:51:43+00:00" + "time": "2023-07-14T14:22:58+00:00" }, { "name": "laravel/tinker", @@ -5716,16 +5716,16 @@ }, { "name": "microsoft/microsoft-graph", - "version": "1.102.0", + "version": "1.103.0", "source": { "type": "git", "url": "https://github.com/microsoftgraph/msgraph-sdk-php.git", - "reference": "4b450b06ac9df3868bbdbddb31bfcc4595f643bc" + "reference": "6e325c22145dbed4e51970ffecca4d7648c3c27e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/4b450b06ac9df3868bbdbddb31bfcc4595f643bc", - "reference": "4b450b06ac9df3868bbdbddb31bfcc4595f643bc", + "url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/6e325c22145dbed4e51970ffecca4d7648c3c27e", + "reference": "6e325c22145dbed4e51970ffecca4d7648c3c27e", "shasum": "" }, "require": { @@ -5762,22 +5762,22 @@ "homepage": "https://developer.microsoft.com/en-us/graph", "support": { "issues": "https://github.com/microsoftgraph/msgraph-sdk-php/issues", - "source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.102.0" + "source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.103.0" }, - "time": "2023-07-05T13:07:19+00:00" + "time": "2023-07-19T03:27:15+00:00" }, { "name": "mollie/mollie-api-php", - "version": "v2.58.0", + "version": "v2.59.0", "source": { "type": "git", "url": "https://github.com/mollie/mollie-api-php.git", - "reference": "5120e5b3e4622a290b64acf87266ea47d10d7301" + "reference": "9834e5779c695d1cc278b2c78ee514de9434b084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/5120e5b3e4622a290b64acf87266ea47d10d7301", - "reference": "5120e5b3e4622a290b64acf87266ea47d10d7301", + "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/9834e5779c695d1cc278b2c78ee514de9434b084", + "reference": "9834e5779c695d1cc278b2c78ee514de9434b084", "shasum": "" }, "require": { @@ -5854,9 +5854,9 @@ ], "support": { "issues": "https://github.com/mollie/mollie-api-php/issues", - "source": "https://github.com/mollie/mollie-api-php/tree/v2.58.0" + "source": "https://github.com/mollie/mollie-api-php/tree/v2.59.0" }, - "time": "2023-07-11T12:01:27+00:00" + "time": "2023-07-18T13:41:40+00:00" }, { "name": "moneyphp/money", @@ -8514,16 +8514,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.18", + "version": "v0.11.19", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "4f00ee9e236fa6a48f4560d1300b9c961a70a7ec" + "reference": "1724ceff278daeeac5a006744633bacbb2dc4706" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4f00ee9e236fa6a48f4560d1300b9c961a70a7ec", - "reference": "4f00ee9e236fa6a48f4560d1300b9c961a70a7ec", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1724ceff278daeeac5a006744633bacbb2dc4706", + "reference": "1724ceff278daeeac5a006744633bacbb2dc4706", "shasum": "" }, "require": { @@ -8584,9 +8584,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.18" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.19" }, - "time": "2023-05-23T02:31:11+00:00" + "time": "2023-07-15T19:42:19+00:00" }, { "name": "pusher/pusher-php-server", @@ -15188,16 +15188,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.21.1", + "version": "v3.22.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "229b55b3eae4729a8e2a321441ba40fcb3720b86" + "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/229b55b3eae4729a8e2a321441ba40fcb3720b86", - "reference": "229b55b3eae4729a8e2a321441ba40fcb3720b86", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/92b019f6c8d79aa26349d0db7671d37440dc0ff3", + "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3", "shasum": "" }, "require": { @@ -15207,7 +15207,7 @@ "doctrine/lexer": "^2 || ^3", "ext-json": "*", "ext-tokenizer": "*", - "php": "^8.0.1", + "php": "^7.4 || ^8.0", "sebastian/diff": "^4.0 || ^5.0", "symfony/console": "^5.4 || ^6.0", "symfony/event-dispatcher": "^5.4 || ^6.0", @@ -15221,6 +15221,7 @@ "symfony/stopwatch": "^5.4 || ^6.0" }, "require-dev": { + "facile-it/paraunit": "^1.3 || ^2.0", "justinrainbow/json-schema": "^5.2", "keradus/cli-executor": "^2.0", "mikey179/vfsstream": "^1.6.11", @@ -15272,7 +15273,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.21.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.22.0" }, "funding": [ { @@ -15280,7 +15281,7 @@ "type": "github" } ], - "time": "2023-07-05T21:50:25+00:00" + "time": "2023-07-16T23:08:06+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -15460,37 +15461,33 @@ }, { "name": "mockery/mockery", - "version": "1.6.2", + "version": "1.6.4", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "13a7fa2642c76c58fa2806ef7f565344c817a191" + "reference": "d1413755e26fe56a63455f7753221c86cbb88f66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/13a7fa2642c76c58fa2806ef7f565344c817a191", - "reference": "13a7fa2642c76c58fa2806ef7f565344c817a191", + "url": "https://api.github.com/repos/mockery/mockery/zipball/d1413755e26fe56a63455f7753221c86cbb88f66", + "reference": "d1413755e26fe56a63455f7753221c86cbb88f66", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": "^7.4 || ^8.0" + "php": ">=7.4,<8.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { "phpunit/phpunit": "^8.5 || ^9.3", - "psalm/plugin-phpunit": "^0.18", - "vimeo/psalm": "^5.9" + "psalm/plugin-phpunit": "^0.18.4", + "symplify/easy-coding-standard": "^11.5.0", + "vimeo/psalm": "^5.13.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.6.x-dev" - } - }, "autoload": { "files": [ "library/helpers.php", @@ -15508,12 +15505,20 @@ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" + "homepage": "https://github.com/padraic", + "role": "Author" }, { "name": "Dave Marshall", "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" } ], "description": "Mockery is a simple yet flexible PHP mock object framework", @@ -15531,10 +15536,13 @@ "testing" ], "support": { + "docs": "https://docs.mockery.io/", "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.6.2" + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" }, - "time": "2023-06-07T09:07:52+00:00" + "time": "2023-07-19T15:51:02+00:00" }, { "name": "myclabs/deep-copy", @@ -16140,16 +16148,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.25", + "version": "1.10.26", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "578f4e70d117f9a90699324c555922800ac38d8c" + "reference": "5d660cbb7e1b89253a47147ae44044f49832351f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/578f4e70d117f9a90699324c555922800ac38d8c", - "reference": "578f4e70d117f9a90699324c555922800ac38d8c", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5d660cbb7e1b89253a47147ae44044f49832351f", + "reference": "5d660cbb7e1b89253a47147ae44044f49832351f", "shasum": "" }, "require": { @@ -16198,7 +16206,7 @@ "type": "tidelift" } ], - "time": "2023-07-06T12:11:37+00:00" + "time": "2023-07-19T12:44:37+00:00" }, { "name": "phpunit/php-code-coverage",
Service Amount

{{ $service['quantity'] }} × {{ $service['cost'] }}

-

{{ $service['notes'] }}

+

{!! $service['notes'] !!}