diff --git a/VERSION.txt b/VERSION.txt index 230cac8f9b7e..f3cb8c412987 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.6.30 \ No newline at end of file +5.6.31 \ No newline at end of file diff --git a/app/Console/Commands/CheckData.php b/app/Console/Commands/CheckData.php index 4f522262d093..7d931c1022fa 100644 --- a/app/Console/Commands/CheckData.php +++ b/app/Console/Commands/CheckData.php @@ -35,6 +35,7 @@ use App\Models\BankTransaction; use App\Models\QuoteInvitation; use Illuminate\Console\Command; use App\Models\CreditInvitation; +use App\Models\RecurringInvoice; use App\Models\InvoiceInvitation; use App\DataMapper\ClientSettings; use Illuminate\Support\Facades\DB; @@ -471,7 +472,7 @@ class CheckData extends Command $ii->saveQuietly(); }); - collect([Invoice::class, Quote::class, Credit::class, PurchaseOrder::class])->each(function ($entity) { + collect([Invoice::class, Quote::class, Credit::class, PurchaseOrder::class, RecurringInvoice::class])->each(function ($entity) { if ($entity::doesntHave('invitations')->count() > 0) { $entity::doesntHave('invitations')->cursor()->each(function ($entity) { $client_vendor_key = 'client_id'; @@ -694,7 +695,7 @@ class CheckData extends Command { $this->wrong_balances = 0; - Client::cursor()->where('is_deleted', 0)->where('clients.updated_at', '>', now()->subDays(2))->each(function ($client) { + Client::query()->cursor()->where('is_deleted', 0)->where('clients.updated_at', '>', now()->subDays(2))->each(function ($client) { $client->invoices->where('is_deleted', false)->whereIn('status_id', '!=', Invoice::STATUS_DRAFT)->each(function ($invoice) use ($client) { $total_paid = $invoice->payments() ->where('is_deleted', false)->whereIn('status_id', [Payment::STATUS_COMPLETED, Payment::STATUS_PENDING, Payment::STATUS_PARTIALLY_REFUNDED, Payment::STATUS_REFUNDED]) @@ -876,7 +877,7 @@ class CheckData extends Command $this->wrong_balances = 0; $this->wrong_paid_to_dates = 0; - foreach (Client::where('is_deleted', 0)->where('clients.updated_at', '>', now()->subDays(2))->cursor() as $client) { + foreach (Client::query()->where('is_deleted', 0)->where('clients.updated_at', '>', now()->subDays(2))->cursor() as $client) { $invoice_balance = $client->invoices()->where('is_deleted', false)->whereIn('status_id', [2,3])->sum('balance'); $ledger = CompanyLedger::where('client_id', $client->id)->orderBy('id', 'DESC')->first(); diff --git a/app/DataMapper/Analytics/RevenueTrack.php b/app/DataMapper/Analytics/RevenueTrack.php new file mode 100644 index 000000000000..0e790c63b4b5 --- /dev/null +++ b/app/DataMapper/Analytics/RevenueTrack.php @@ -0,0 +1,101 @@ +int_metric1 = $int_metric1; + $this->double_metric2 = $double_metric2; + $this->string_metric5 = $string_metric5; + $this->string_metric6 = $string_metric6; + $this->string_metric7 = $string_metric7; + $this->string_metric8 = $string_metric8; + $this->string_metric9 = $string_metric9; + $this->string_metric10 = $string_metric10; + } +} diff --git a/app/DataMapper/InvoiceItem.php b/app/DataMapper/InvoiceItem.php index 49571d668fdf..cdb1953c9be4 100644 --- a/app/DataMapper/InvoiceItem.php +++ b/app/DataMapper/InvoiceItem.php @@ -61,8 +61,13 @@ class InvoiceItem public $tax_id = ''; + public $task_id = ''; + + public $expense_id = ''; public static $casts = [ + 'task_id' => 'string', + 'expense_id' => 'string', 'tax_id' => 'string', 'type_id' => 'string', 'quantity' => 'float', diff --git a/app/Events/Account/StripeConnectFailure.php b/app/Events/Account/StripeConnectFailure.php new file mode 100644 index 000000000000..fd6f5a5d5738 --- /dev/null +++ b/app/Events/Account/StripeConnectFailure.php @@ -0,0 +1,36 @@ +orWhere('credits.custom_value4', 'like', '%'.$filter.'%') ->orWhereHas('client', function ($q) use ($filter) { $q->where('name', 'like', '%'.$filter.'%'); + }) + ->orWhereHas('client.contacts', function ($q) use ($filter) { + $q->where('first_name', 'like', '%'.$filter.'%') + ->orWhere('last_name', 'like', '%'.$filter.'%') + ->orWhere('email', 'like', '%'.$filter.'%'); }); }); } diff --git a/app/Filters/InvoiceFilters.php b/app/Filters/InvoiceFilters.php index deab3483fd8b..8ade4be3a6a1 100644 --- a/app/Filters/InvoiceFilters.php +++ b/app/Filters/InvoiceFilters.php @@ -116,6 +116,11 @@ class InvoiceFilters extends QueryFilters ->orWhere('custom_value4', 'like', '%'.$filter.'%') ->orWhereHas('client', function ($q) use ($filter) { $q->where('name', 'like', '%'.$filter.'%'); + }) + ->orWhereHas('client.contacts', function ($q) use ($filter) { + $q->where('first_name', 'like', '%'.$filter.'%') + ->orWhere('last_name', 'like', '%'.$filter.'%') + ->orWhere('email', 'like', '%'.$filter.'%'); }); }); } diff --git a/app/Filters/PaymentFilters.php b/app/Filters/PaymentFilters.php index 38381ed786bb..b6c82430baad 100644 --- a/app/Filters/PaymentFilters.php +++ b/app/Filters/PaymentFilters.php @@ -44,7 +44,12 @@ class PaymentFilters extends QueryFilters ->orWhere('custom_value4', 'like', '%'.$filter.'%') ->orWhereHas('client', function ($q) use ($filter) { $q->where('name', 'like', '%'.$filter.'%'); - }); + }) + ->orWhereHas('client.contacts', function ($q) use ($filter) { + $q->where('first_name', 'like', '%'.$filter.'%') + ->orWhere('last_name', 'like', '%'.$filter.'%') + ->orWhere('email', 'like', '%'.$filter.'%'); + }); }); } diff --git a/app/Filters/QuoteFilters.php b/app/Filters/QuoteFilters.php index a08c6aa09418..26a6b3f0ae2e 100644 --- a/app/Filters/QuoteFilters.php +++ b/app/Filters/QuoteFilters.php @@ -40,7 +40,12 @@ class QuoteFilters extends QueryFilters ->orWhere('custom_value4', 'like', '%'.$filter.'%') ->orWhereHas('client', function ($q) use ($filter) { $q->where('name', 'like', '%'.$filter.'%'); - }); + }) + ->orWhereHas('client.contacts', function ($q) use ($filter) { + $q->where('first_name', 'like', '%'.$filter.'%') + ->orWhere('last_name', 'like', '%'.$filter.'%') + ->orWhere('email', 'like', '%'.$filter.'%'); + }); }); } diff --git a/app/Filters/RecurringInvoiceFilters.php b/app/Filters/RecurringInvoiceFilters.php index 03a66b11f127..71fcca9d101f 100644 --- a/app/Filters/RecurringInvoiceFilters.php +++ b/app/Filters/RecurringInvoiceFilters.php @@ -42,7 +42,12 @@ class RecurringInvoiceFilters extends QueryFilters ->orWhere('custom_value4', 'like', '%'.$filter.'%') ->orWhereHas('client', function ($q) use ($filter) { $q->where('name', 'like', '%'.$filter.'%'); - }); + }) + ->orWhereHas('client.contacts', function ($q) use ($filter) { + $q->where('first_name', 'like', '%'.$filter.'%') + ->orWhere('last_name', 'like', '%'.$filter.'%') + ->orWhere('email', 'like', '%'.$filter.'%'); + }); }); } diff --git a/app/Filters/TaskFilters.php b/app/Filters/TaskFilters.php index 3e09a0d2addf..0c564af5a4f6 100644 --- a/app/Filters/TaskFilters.php +++ b/app/Filters/TaskFilters.php @@ -45,7 +45,12 @@ class TaskFilters extends QueryFilters }) ->orWhereHas('client', function ($q) use ($filter) { $q->where('name', 'like', '%'.$filter.'%'); - }); + }) + ->orWhereHas('client.contacts', function ($q) use ($filter) { + $q->where('first_name', 'like', '%'.$filter.'%') + ->orWhere('last_name', 'like', '%'.$filter.'%') + ->orWhere('email', 'like', '%'.$filter.'%'); + }); }); } diff --git a/app/Filters/UserFilters.php b/app/Filters/UserFilters.php index 12a26d27a6cf..3989ec7450ed 100644 --- a/app/Filters/UserFilters.php +++ b/app/Filters/UserFilters.php @@ -127,8 +127,7 @@ class UserFilters extends QueryFilters $user_array = $this->transformKeys(explode(',', $user_id)); return $this->builder->where(function ($query) use ($user_array) { - $query->whereNotIn('id', $user_array) - ->where('account_id', auth()->user()->account_id); + $query->whereNotIn('id', $user_array); }); } } diff --git a/app/Http/Controllers/ClientPortal/InvoiceController.php b/app/Http/Controllers/ClientPortal/InvoiceController.php index f67ae6042705..265cc5f8961e 100644 --- a/app/Http/Controllers/ClientPortal/InvoiceController.php +++ b/app/Http/Controllers/ClientPortal/InvoiceController.php @@ -252,11 +252,20 @@ class InvoiceController extends Controller // create new archive $zipFile = new \PhpZip\ZipFile(); try { + foreach ($invoices as $invoice) { - //add it to the zip - $zipFile->addFromString(basename($invoice->pdf_file_path()), file_get_contents($invoice->pdf_file_path(null, 'url', true))); + + if ($invoice->client->getSetting('enable_e_invoice')) { + $xml = $invoice->service()->getEInvoice(); + $zipFile->addFromString($invoice->getFileName("xml"), $xml); + } + + $file = $invoice->service()->getRawInvoicePdf(); + $zip_file_name = $invoice->getFileName(); + $zipFile->addFromString($zip_file_name, $file); } + $filename = date('Y-m-d').'_'.str_replace(' ', '_', trans('texts.invoices')).'.zip'; $filepath = sys_get_temp_dir().'/'.$filename; diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index d52068faa310..626c22df9acc 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -162,7 +162,9 @@ class InvoiceController extends BaseController */ public function create(CreateInvoiceRequest $request) { - $invoice = InvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + $invoice = InvoiceFactory::create($user->company()->id, $user->id); return $this->itemResponse($invoice); } @@ -211,7 +213,11 @@ class InvoiceController extends BaseController */ public function store(StoreInvoiceRequest $request) { - $invoice = $this->invoice_repo->save($request->all(), InvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id)); + + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $invoice = $this->invoice_repo->save($request->all(), InvoiceFactory::create($user->company()->id, $user->id)); $invoice = $invoice->service() ->fillDefaults() @@ -219,7 +225,7 @@ class InvoiceController extends BaseController ->adjustInventory() ->save(); - event(new InvoiceWasCreated($invoice, $invoice->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + event(new InvoiceWasCreated($invoice, $invoice->company, Ninja::eventVars($user ? $user->id : null))); $transaction = [ 'invoice' => $invoice->transaction_event(), @@ -473,62 +479,17 @@ class InvoiceController extends BaseController return $this->itemResponse($invoice->fresh()); } - /** - * Perform bulk actions on the list view. - * - * @return \Illuminate\Support\Collection - * - * @OA\Post( - * path="/api/v1/invoices/bulk", - * operationId="bulkInvoices", - * tags={"invoices"}, - * summary="Performs bulk actions on an array of invoices", - * description="", - * @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"), - * @OA\Parameter(ref="#/components/parameters/X-Requested-With"), - * @OA\Parameter(ref="#/components/parameters/index"), - * @OA\RequestBody( - * description="User credentials", - * required=true, - * @OA\MediaType( - * mediaType="application/json", - * @OA\Schema( - * type="array", - * @OA\Items( - * type="integer", - * description="Array of hashed IDs to be bulk 'actioned", - * example="[0,1,2,3]", - * ), - * ) - * ) - * ), - * @OA\Response( - * response=200, - * description="The Bulk Action response", - * @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"), - * @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"), - * @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"), - * ), - * @OA\Response( - * response=422, - * description="Validation error", - * @OA\JsonContent(ref="#/components/schemas/ValidationError"), - - * ), - * @OA\Response( - * response="default", - * description="Unexpected Error", - * @OA\JsonContent(ref="#/components/schemas/Error"), - * ), - * ) - */ public function bulk(BulkInvoiceRequest $request) { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + $action = $request->input('action'); $ids = $request->input('ids'); - if (Ninja::isHosted() && (stripos($action, 'email') !== false) && !auth()->user()->company()->account->account_sms_verified) { + if (Ninja::isHosted() && (stripos($action, 'email') !== false) && !$user->company()->account->account_sms_verified) { return response(['message' => 'Please verify your account to send emails.'], 400); } @@ -543,8 +504,8 @@ class InvoiceController extends BaseController */ if ($action == 'bulk_download' && $invoices->count() > 1) { - $invoices->each(function ($invoice) { - if (auth()->user()->cannot('view', $invoice)) { + $invoices->each(function ($invoice) use($user) { + if ($user->cannot('view', $invoice)) { nlog('access denied'); return response()->json(['message' => ctrans('text.access_denied')]); @@ -556,7 +517,7 @@ class InvoiceController extends BaseController return response()->json(['message' => ctrans('texts.sent_message')], 200); } - if ($action == 'download' && $invoices->count() >=1 && auth()->user()->can('view', $invoices->first())) { + if ($action == 'download' && $invoices->count() >=1 && $user->can('view', $invoices->first())) { $file = $invoices->first()->service()->getInvoicePdf(); return response()->streamDownload(function () use ($file) { @@ -564,7 +525,7 @@ class InvoiceController extends BaseController }, basename($file), ['Content-Type' => 'application/pdf']); } - if ($action == 'bulk_print' && auth()->user()->can('view', $invoices->first())) { + if ($action == 'bulk_print' && $user->can('view', $invoices->first())) { $paths = $invoices->map(function ($invoice) { return $invoice->service()->getInvoicePdf(); }); @@ -579,15 +540,15 @@ class InvoiceController extends BaseController /* * Send the other actions to the switch */ - $invoices->each(function ($invoice, $key) use ($action) { - if (auth()->user()->can('edit', $invoice)) { + $invoices->each(function ($invoice, $key) use ($action, $user) { + if ($user->can('edit', $invoice)) { $this->performAction($invoice, $action, true); } }); /* Need to understand which permission are required for the given bulk action ie. view / edit */ - return $this->listResponse(Invoice::withTrashed()->whereIn('id', $this->transformKeys($ids))->company()); + return $this->listResponse(Invoice::query()->withTrashed()->whereIn('id', $this->transformKeys($ids))->company()); } /** @@ -889,6 +850,7 @@ class InvoiceController extends BaseController $invoice = $invitation->invoice; $file = $invoice->service()->getEInvoice($contact); + $file_name = $invoice->getFileName("xml"); $headers = ['Content-Type' => 'application/xml']; @@ -897,8 +859,8 @@ class InvoiceController extends BaseController } return response()->streamDownload(function () use ($file) { - echo Storage::get($file); - }, basename($file), $headers); + echo $file; + }, $file_name, $headers); } /** @@ -1005,16 +967,17 @@ class InvoiceController extends BaseController */ public function upload(UploadInvoiceRequest $request, Invoice $invoice) { + if (! $this->checkFeature(Account::FEATURE_DOCUMENTS)) { return $this->featureFailure(); } if ($request->has('documents')) { - $this->saveDocuments($request->file('documents'), $invoice); + $this->saveDocuments($request->file('documents'), $invoice, $request->input('is_public', true)); } if ($request->has('file')) { - $this->saveDocuments($request->file('documents'), $invoice); + $this->saveDocuments($request->file('documents'), $invoice, $request->input('is_public', true)); } return $this->itemResponse($invoice->fresh()); @@ -1022,7 +985,10 @@ class InvoiceController extends BaseController public function update_reminders(UpdateReminderRequest $request) { - UpdateReminders::dispatch(auth()->user()->company()); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + UpdateReminders::dispatch($user->company()); return response()->json(['message' => 'Updating reminders'], 200); } diff --git a/app/Http/Livewire/BillingPortalPurchase.php b/app/Http/Livewire/BillingPortalPurchase.php index 9a7fae37b9ca..74e693faa459 100644 --- a/app/Http/Livewire/BillingPortalPurchase.php +++ b/app/Http/Livewire/BillingPortalPurchase.php @@ -62,11 +62,11 @@ class BillingPortalPurchase extends Component public $password; /** - * Instance of subscription. + * This arrives as an int and we resolve in the mount method * - * @var \App\Models\Subscription $subscription + * @var int|Subscription */ - public Subscription $subscription; + public $subscription; /** * Instance of client contact. diff --git a/app/Http/Livewire/PdfSlot.php b/app/Http/Livewire/PdfSlot.php index 8c8770eb1205..a97444ba89ee 100644 --- a/app/Http/Livewire/PdfSlot.php +++ b/app/Http/Livewire/PdfSlot.php @@ -21,6 +21,7 @@ use App\Models\QuoteInvitation; use App\Utils\VendorHtmlEngine; use App\Models\CreditInvitation; use App\Models\InvoiceInvitation; +use App\Jobs\Invoice\CreateEInvoice; use Illuminate\Support\Facades\Cache; use App\Models\PurchaseOrderInvitation; use App\Models\RecurringInvoiceInvitation; @@ -38,7 +39,7 @@ class PdfSlot extends Component public $pdf; public $url; - + private $settings; private $html_variables; @@ -61,7 +62,7 @@ class PdfSlot extends Component } public function getPdf() - { + { // $this->pdf = $this->entity->fullscreenPdfViewer($this->invitation); $blob = [ @@ -74,14 +75,14 @@ class PdfSlot extends Component $hash = Str::random(64); Cache::put($hash, $blob, now()->addMinutes(2)); - + $this->pdf = $hash; } public function downloadPdf() { - + $file_name = $this->entity->numberFormatter().'.pdf'; if($this->entity instanceof \App\Models\PurchaseOrder) @@ -95,17 +96,32 @@ class PdfSlot extends Component echo $file; }, $file_name, $headers); + } + public function downloadEInvoice() + { + + $file_name = $this->entity->numberFormatter().'.xml'; + + $file = (new CreateEInvoice($this->entity))->handle(); + + $headers = ['Content-Type' => 'application/xml']; + + return response()->streamDownload(function () use ($file) { + echo $file; + }, $file_name, $headers); + } public function render() { - + $this->entity_type = $this->resolveEntityType(); $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_line_total = in_array('$product.line_total', $this->settings->pdf_variables->product_columns); + $this->show_quantity = in_array('$product.quantity', $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); @@ -146,7 +162,7 @@ class PdfSlot extends Component private function getCompanyAddress() { - + $company_address = ""; foreach($this->settings->pdf_variables->company_address as $variable) { @@ -166,7 +182,7 @@ class PdfSlot extends Component } return $this->convertVariables($company_details); - + } private function getEntityDetails() @@ -174,9 +190,9 @@ class PdfSlot extends Component $entity_details = ""; if($this->entity_type == 'invoice' || $this->entity_type == 'recurring_invoice') { - foreach($this->settings->pdf_variables->invoice_details as $variable) + foreach($this->settings->pdf_variables->invoice_details as $variable) $entity_details .= "

{$variable}_label

{$variable}

"; - + } elseif($this->entity_type == 'quote'){ foreach($this->settings->pdf_variables->quote_details as $variable) @@ -190,7 +206,7 @@ class PdfSlot extends Component foreach($this->settings->pdf_variables->purchase_order_details as $variable) $entity_details .= "

{$variable}_label

{$variable}

"; } - + return $this->convertVariables($entity_details); } @@ -206,7 +222,7 @@ class PdfSlot extends Component $name = $this->settings->pdf_variables->client_details[0]; } - + return $this->convertVariables($name); } @@ -225,7 +241,7 @@ class PdfSlot extends Component $user_details .= "

{$variable}

"; } } - + return $this->convertVariables($user_details); } diff --git a/app/Http/Requests/Invoice/UploadInvoiceRequest.php b/app/Http/Requests/Invoice/UploadInvoiceRequest.php index 070fb4443d1b..8339f64aa393 100644 --- a/app/Http/Requests/Invoice/UploadInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UploadInvoiceRequest.php @@ -23,7 +23,9 @@ class UploadInvoiceRequest extends Request */ public function authorize() : bool { - return auth()->user()->can('edit', $this->invoice); + /** @var \App\Models\User $user */ + $user = auth()->user(); + return $user->can('edit', $this->invoice); } public function rules() @@ -42,6 +44,8 @@ class UploadInvoiceRequest extends Request $rules['file'] = $this->file_validation; } + $rules['is_public'] = 'sometimes|boolean'; + return $rules; } diff --git a/app/Http/Requests/Request.php b/app/Http/Requests/Request.php index 789d723938c7..5d8577efa189 100644 --- a/app/Http/Requests/Request.php +++ b/app/Http/Requests/Request.php @@ -20,7 +20,7 @@ class Request extends FormRequest use MakesHash; use RuntimeFormRequest; - protected $file_validation = 'sometimes|file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx,webp|max:20000'; + protected $file_validation = 'sometimes|file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx,webp,xml|max:20000'; /** * Get the validation rules that apply to the request. * diff --git a/app/Http/Requests/Shop/StoreShopClientRequest.php b/app/Http/Requests/Shop/StoreShopClientRequest.php index beffeeac2f1d..140dc08a904b 100644 --- a/app/Http/Requests/Shop/StoreShopClientRequest.php +++ b/app/Http/Requests/Shop/StoreShopClientRequest.php @@ -108,7 +108,7 @@ class StoreShopClientRequest extends Request $settings->currency_id = $this->getCurrencyCode($input['currency_code']); } - $input['settings'] = $settings; + $input['settings'] = (array)$settings; if (isset($input['contacts'])) { foreach ($input['contacts'] as $key => $contact) { diff --git a/app/Jobs/Entity/CreateEntityPdf.php b/app/Jobs/Entity/CreateEntityPdf.php index fec14ca6dfe3..7ef89d2c3e81 100644 --- a/app/Jobs/Entity/CreateEntityPdf.php +++ b/app/Jobs/Entity/CreateEntityPdf.php @@ -11,37 +11,38 @@ namespace App\Jobs\Entity; -use App\Exceptions\FilePermissionsFailure; -use App\Jobs\Invoice\CreateEInvoice; -use App\Libraries\MultiDB; +use App\Utils\Ninja; +use App\Models\Quote; use App\Models\Credit; -use App\Models\CreditInvitation; use App\Models\Design; use App\Models\Invoice; -use App\Models\InvoiceInvitation; -use App\Models\Quote; +use App\Utils\HtmlEngine; +use App\Libraries\MultiDB; +use Illuminate\Bus\Queueable; use App\Models\QuoteInvitation; +use App\Utils\Traits\MakesHash; +use App\Models\CreditInvitation; use App\Models\RecurringInvoice; +use App\Utils\PhantomJS\Phantom; +use App\Models\InvoiceInvitation; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\Traits\Pdf\PdfMaker; +use Illuminate\Support\Facades\App; +use App\Jobs\Invoice\CreateEInvoice; +use App\Utils\Traits\NumberFormatter; +use App\Utils\Traits\MakesInvoiceHtml; +use Illuminate\Queue\SerializesModels; +use App\Utils\Traits\Pdf\PageNumbering; +use Illuminate\Support\Facades\Storage; +use Illuminate\Queue\InteractsWithQueue; +use App\Exceptions\FilePermissionsFailure; use App\Models\RecurringInvoiceInvitation; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Foundation\Bus\Dispatchable; +use horstoeko\zugferd\ZugferdDocumentPdfBuilder; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Services\PdfMaker\PdfMaker as PdfMakerService; -use App\Utils\HostedPDF\NinjaPdf; -use App\Utils\HtmlEngine; -use App\Utils\Ninja; -use App\Utils\PhantomJS\Phantom; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\MakesInvoiceHtml; -use App\Utils\Traits\NumberFormatter; -use App\Utils\Traits\Pdf\PageNumbering; -use App\Utils\Traits\Pdf\PdfMaker; -use Illuminate\Bus\Queueable; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\Dispatchable; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Queue\SerializesModels; -use Illuminate\Support\Facades\App; -use Illuminate\Support\Facades\Storage; class CreateEntityPdf implements ShouldQueue { @@ -116,7 +117,8 @@ class CreateEntityPdf implements ShouldQueue } $entity_design_id = ''; - + $path = ''; + if ($this->entity instanceof Invoice) { $path = $this->client->invoice_filepath($this->invitation); $entity_design_id = 'invoice_design_id'; @@ -206,6 +208,11 @@ class CreateEntityPdf implements ShouldQueue info($maker->getCompiledHTML()); } + if($this->entity_string == "invoice" && $this->client->getSetting('enable_e_invoice')) + { + $pdf = $this->checkEInvoice($pdf); + } + if ($pdf) { try { Storage::disk($this->disk)->put($file_path, $pdf); @@ -213,9 +220,7 @@ class CreateEntityPdf implements ShouldQueue throw new FilePermissionsFailure($e->getMessage()); } } - if ($this->entity_string == "invoice" && $this->client->getSetting('enable_e_invoice')){ - (new CreateEInvoice($this->entity, true))->handle(); - } + $this->invitation = null; // $this->entity = null; $this->company = null; @@ -224,10 +229,65 @@ class CreateEntityPdf implements ShouldQueue $maker = null; $state = null; - return $file_path; } + /** + * Switch to determine if we need to embed the xml into the PDF itself + * + * @param string $pdf + * @return string + */ + private function checkEInvoice(string $pdf): string + { + if(!$this->entity instanceof Invoice) + return $pdf; + + $e_invoice_type = $this->entity->client->getSetting('e_invoice_type'); + + switch ($e_invoice_type) { + case "EN16931": + case "XInvoice_2_2": + case "XInvoice_2_1": + case "XInvoice_2_0": + case "XInvoice_1_0": + case "XInvoice-Extended": + case "XInvoice-BasicWL": + case "XInvoice-Basic": + return $this->embedEInvoiceZuGFerD($pdf) ?? $pdf; + //case "Facturae_3.2": + //case "Facturae_3.2.1": + //case "Facturae_3.2.2": + // + default: + return $pdf; + } + + } + + /** + * Embed the .xml file into the PDF + * + * @param string $pdf + * @return string + */ + private function embedEInvoiceZuGFerD(string $pdf): string + { + try { + + $e_rechnung = (new CreateEInvoice($this->entity, true))->handle(); + $pdfBuilder = new ZugferdDocumentPdfBuilder($e_rechnung, $pdf); + $pdfBuilder->generateDocument(); + return $pdfBuilder->downloadString(basename($this->entity->getFileName())); + + } catch (\Exception $e) { + nlog("E_Invoice Merge failed - " . $e->getMessage()); + } + + return $pdf; + } + + public function failed($e) { } diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index d1f8ff624bc6..921879021c61 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -11,41 +11,43 @@ namespace App\Jobs\Entity; -use App\Exceptions\FilePermissionsFailure; -use App\Libraries\MultiDB; +use App\Utils\Ninja; +use App\Models\Quote; use App\Models\Credit; -use App\Models\CreditInvitation; use App\Models\Design; use App\Models\Invoice; -use App\Models\InvoiceInvitation; -use App\Models\Quote; +use App\Utils\HtmlEngine; +use App\Libraries\MultiDB; +use Illuminate\Bus\Queueable; use App\Models\QuoteInvitation; +use App\Utils\Traits\MakesHash; +use App\Models\CreditInvitation; use App\Models\RecurringInvoice; +use App\Utils\PhantomJS\Phantom; +use App\Models\InvoiceInvitation; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\Traits\Pdf\PdfMaker; +use Illuminate\Support\Facades\App; +use App\Jobs\Invoice\CreateEInvoice; +use App\Utils\Traits\NumberFormatter; +use App\Utils\Traits\MakesInvoiceHtml; +use Illuminate\Queue\SerializesModels; +use App\Utils\Traits\Pdf\PageNumbering; +use Illuminate\Queue\InteractsWithQueue; +use App\Exceptions\FilePermissionsFailure; use App\Models\RecurringInvoiceInvitation; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Foundation\Bus\Dispatchable; +use horstoeko\zugferd\ZugferdDocumentPdfBuilder; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Services\PdfMaker\PdfMaker as PdfMakerService; -use App\Utils\HostedPDF\NinjaPdf; -use App\Utils\HtmlEngine; -use App\Utils\Ninja; -use App\Utils\PhantomJS\Phantom; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\MakesInvoiceHtml; -use App\Utils\Traits\NumberFormatter; -use App\Utils\Traits\Pdf\PageNumbering; -use App\Utils\Traits\Pdf\PdfMaker; -use Illuminate\Bus\Queueable; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\Dispatchable; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Queue\SerializesModels; -use Illuminate\Support\Facades\App; class CreateRawPdf implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, NumberFormatter, MakesInvoiceHtml, PdfMaker, MakesHash, PageNumbering; - public $entity; + public Invoice | Credit | Quote | RecurringInvoice $entity; public $company; @@ -103,6 +105,7 @@ class CreateRawPdf implements ShouldQueue } $entity_design_id = ''; + $path = ''; if ($this->entity instanceof Invoice) { $path = $this->entity->client->invoice_filepath($this->invitation); @@ -202,11 +205,67 @@ class CreateRawPdf implements ShouldQueue if ($pdf) { $maker =null; $state = null; - return $pdf; + + return $this->checkEInvoice($pdf); } throw new FilePermissionsFailure('Unable to generate the raw PDF'); } + + /** + * Switch to determine if we need to embed the xml into the PDF itself + * + * @param string $pdf + * @return string + */ + private function checkEInvoice(string $pdf): string + { + if(!$this->entity instanceof Invoice) + return $pdf; + + $e_invoice_type = $this->entity->client->getSetting('e_invoice_type'); + + switch ($e_invoice_type) { + case "EN16931": + case "XInvoice_2_2": + case "XInvoice_2_1": + case "XInvoice_2_0": + case "XInvoice_1_0": + case "XInvoice-Extended": + case "XInvoice-BasicWL": + case "XInvoice-Basic": + return $this->embedEInvoiceZuGFerD($pdf) ?? $pdf; + //case "Facturae_3.2": + //case "Facturae_3.2.1": + //case "Facturae_3.2.2": + // + default: + return $pdf; + } + + } + + /** + * Embed the .xml file into the PDF + * + * @param string $pdf + * @return string + */ + private function embedEInvoiceZuGFerD(string $pdf): string + { + try { + + $e_rechnung = (new CreateEInvoice($this->entity, true))->handle(); + $pdfBuilder = new ZugferdDocumentPdfBuilder($e_rechnung, $pdf); + $pdfBuilder->generateDocument(); + return $pdfBuilder->downloadString(basename($this->entity->getFileName())); + + } catch (\Exception $e) { + nlog("E_Invoice Merge failed - " . $e->getMessage()); + } + + return $pdf; + } public function failed($e) { diff --git a/app/Jobs/Invoice/CreateEInvoice.php b/app/Jobs/Invoice/CreateEInvoice.php index dc2fdfba1d39..c68662c4b108 100644 --- a/app/Jobs/Invoice/CreateEInvoice.php +++ b/app/Jobs/Invoice/CreateEInvoice.php @@ -14,6 +14,7 @@ namespace App\Jobs\Invoice; use App\Utils\Ninja; use App\Models\Invoice; +use horstoeko\zugferd\ZugferdDocumentBuilder; use Illuminate\Bus\Queueable; use Illuminate\Support\Facades\App; use Illuminate\Queue\SerializesModels; @@ -29,17 +30,16 @@ class CreateEInvoice implements ShouldQueue public $deleteWhenMissingModels = true; - public function __construct(private Invoice $invoice, private bool $alterPDF, private string $custom_pdf_path = "") + public function __construct(private Invoice $invoice, private bool $returnObject = false) { } /** * Execute the job. * - * - * @return string + * @return string|ZugferdDocumentBuilder */ - public function handle(): string + public function handle(): string|ZugferdDocumentBuilder { /* Forget the singleton*/ App::forgetInstance('translator'); @@ -63,13 +63,18 @@ class CreateEInvoice implements ShouldQueue case "XInvoice-Extended": case "XInvoice-BasicWL": case "XInvoice-Basic": - return (new ZugferdEInvoice($this->invoice))->run(); + $zugferd = (new ZugferdEInvoice($this->invoice))->run(); + + return $this->returnObject ? $zugferd->xrechnung : $zugferd->getXml(); case "Facturae_3.2": case "Facturae_3.2.1": case "Facturae_3.2.2": return (new FacturaEInvoice($this->invoice, str_replace("Facturae_", "", $e_invoice_type)))->run(); default: - return (new ZugferdEInvoice($this->invoice))->run(); + + $zugferd = (new ZugferdEInvoice($this->invoice))->run(); + + return $this->returnObject ? $zugferd : $zugferd->getXml(); } diff --git a/app/Jobs/Invoice/ZipInvoices.php b/app/Jobs/Invoice/ZipInvoices.php index 17209446b345..f7292988b0d1 100644 --- a/app/Jobs/Invoice/ZipInvoices.php +++ b/app/Jobs/Invoice/ZipInvoices.php @@ -73,27 +73,19 @@ class ZipInvoices implements ShouldQueue $invitation = $this->invoices->first()->invitations->first(); $path = $this->invoices->first()->client->invoice_filepath($invitation); - $this->invoices->each(function ($invoice) { - (new CreateEntityPdf($invoice->invitations()->first()))->handle(); - if ($invoice->client->getSetting('enable_e_invoice')){ - (new CreateEInvoice($invoice, false))->handle(); - } - }); - try { + foreach ($this->invoices as $invoice) { - $file = $invoice->service()->getInvoicePdf(); - $zip_file_name = basename($file); - $zipFile->addFromString($zip_file_name, Storage::get($file)); - - if($invoice->client->getSetting('enable_e_invoice')){ - - $xinvoice = $invoice->service()->getEInvoice(); - $xinvoice_zip_file_name = basename($xinvoice); - $zipFile->addFromString($xinvoice_zip_file_name, Storage::get($xinvoice)); - + + if ($invoice->client->getSetting('enable_e_invoice')) { + $xml = $invoice->service()->getEInvoice(); + $zipFile->addFromString($invoice->getFileName("xml"), $xml); } + + $file = $invoice->service()->getRawInvoicePdf(); + $zip_file_name = $invoice->getFileName(); + $zipFile->addFromString($zip_file_name, $file); } Storage::put($path.$file_name, $zipFile->outputAsString()); diff --git a/app/Jobs/User/UserEmailChanged.php b/app/Jobs/User/UserEmailChanged.php index c397f1ae65dd..f49718c916c4 100644 --- a/app/Jobs/User/UserEmailChanged.php +++ b/app/Jobs/User/UserEmailChanged.php @@ -36,10 +36,10 @@ class UserEmailChanged implements ShouldQueue * Create a new job instance. * * @param \App\Models\User $new_user - * @param \App\Models\User $old_user + * @param \stdClass $old_user * @param \App\Models\Company $company */ - public function __construct(protected User $new_user, protected User $old_user, protected Company $company) + public function __construct(protected User $new_user, protected \stdClass $old_user, protected Company $company) { $this->settings = $this->company->settings; } diff --git a/app/Jobs/Util/Import.php b/app/Jobs/Util/Import.php index 175074cf221a..8a12e02e11d4 100644 --- a/app/Jobs/Util/Import.php +++ b/app/Jobs/Util/Import.php @@ -1821,7 +1821,7 @@ class Import implements ShouldQueue private function processActivities(array $data): void { - Activity::where('company_id', $this->company->id)->cursor()->each(function ($a){ + Activity::query()->where('company_id', $this->company->id)->cursor()->each(function ($a){ $a->forceDelete(); nlog("deleting {$a->id}"); }); diff --git a/app/Jobs/Util/UploadFile.php b/app/Jobs/Util/UploadFile.php index 43417f3529a1..33aeef21c0b3 100644 --- a/app/Jobs/Util/UploadFile.php +++ b/app/Jobs/Util/UploadFile.php @@ -53,7 +53,7 @@ class UploadFile implements ShouldQueue public $disk; - public function __construct($file, $type, $user, $company, $entity, $disk = null, $is_public = false) + public function __construct($file, $type, $user, $company, $entity, $disk = null, $is_public = true) { $this->file = $file; $this->type = $type; diff --git a/app/Listeners/Account/StripeConnectFailureListener.php b/app/Listeners/Account/StripeConnectFailureListener.php new file mode 100644 index 000000000000..12ff3f94b412 --- /dev/null +++ b/app/Listeners/Account/StripeConnectFailureListener.php @@ -0,0 +1,57 @@ +db); + + if (Ninja::isHosted() && is_null(Cache::get("stripe_connect_notification:{$event->company->company_key}"))) + { + + $nmo = new NinjaMailerObject(); + $nmo->mailable = new StripeConnectFailed($event->company->owner(), $event->company); + $nmo->company = $event->company; + $nmo->settings = $event->company->settings; + $nmo->to_user = $event->company->owner(); + + NinjaMailerJob::dispatch($nmo, true); + + Cache::put("stripe_connect_notification:{$event->company->company_key}", true, 60 * 60 * 24); + + } + } +} diff --git a/app/Listeners/Activity/PaymentCreatedActivity.php b/app/Listeners/Activity/PaymentCreatedActivity.php index ff0c0abd0889..12ed24c288b4 100644 --- a/app/Listeners/Activity/PaymentCreatedActivity.php +++ b/app/Listeners/Activity/PaymentCreatedActivity.php @@ -21,6 +21,7 @@ class PaymentCreatedActivity implements ShouldQueue { protected $activity_repo; + public $delay = 5; /** * Create the event listener. * diff --git a/app/Listeners/Invoice/InvoicePaidActivity.php b/app/Listeners/Invoice/InvoicePaidActivity.php index 2d340dfb08df..836136aad0e0 100644 --- a/app/Listeners/Invoice/InvoicePaidActivity.php +++ b/app/Listeners/Invoice/InvoicePaidActivity.php @@ -21,6 +21,8 @@ class InvoicePaidActivity implements ShouldQueue { protected $activity_repo; + public $delay = 10; + /** * Create the event listener. * diff --git a/app/Listeners/Payment/PaymentNotification.php b/app/Listeners/Payment/PaymentNotification.php index 37623bf8dc75..f46c228b836e 100644 --- a/app/Listeners/Payment/PaymentNotification.php +++ b/app/Listeners/Payment/PaymentNotification.php @@ -11,14 +11,16 @@ namespace App\Listeners\Payment; +use App\Utils\Ninja; +use App\Libraries\MultiDB; use App\Jobs\Mail\NinjaMailer; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; -use App\Libraries\MultiDB; use App\Mail\Admin\EntityPaidObject; -use App\Utils\Ninja; -use App\Utils\Traits\Notifications\UserNotifies; +use Turbo124\Beacon\Facades\LightLogs; +use App\DataMapper\Analytics\RevenueTrack; use Illuminate\Contracts\Queue\ShouldQueue; +use App\Utils\Traits\Notifications\UserNotifies; class PaymentNotification implements ShouldQueue { @@ -158,6 +160,15 @@ class PaymentNotification implements ShouldQueue $url = $base."&t=item&in={$item}&ip={$amount}&iq=1"; $this->sendAnalytics($url); + + $email = $client->present()->email(); + $account_key = $client->custom_value2 ?? 'unknown'; + $product = $item; + $gateway_reference = $client->gateway_tokens()->count() >= 1 ? ($client->gateway_tokens()->first()->gateway_customer_reference ?? '') : ''; + + // LightLogs::create(new RevenueTrack($email, $account_key, 1, $amount, $product, $gateway_reference, $entity_number)) + // ->batch(); + } /** diff --git a/app/Mail/Ninja/StripeConnectFailed.php b/app/Mail/Ninja/StripeConnectFailed.php new file mode 100644 index 000000000000..4c935cdf291f --- /dev/null +++ b/app/Mail/Ninja/StripeConnectFailed.php @@ -0,0 +1,114 @@ +user->email, + ); + } + + /** + * Get the message content definition. + * + * @return \Illuminate\Mail\Mailables\Content + */ + public function content() + { + + return new Content( + view: 'email.admin.stripe_connect_failed', + text: 'email.admin.stripe_connect_failed_text', + with: [ + 'text_body' => $this->textBody(), //@todo this is a bit hacky here. + 'body' => $this->htmlBody(), + 'title' => 'Connect your Stripe account', + 'settings' => $this->company->settings, + 'logo' => $this->company->present()->logo(), + 'signature' => '', + 'company' => $this->company, + 'greeting' => '', + 'links' => [], + 'url' => 'https://www.loom.com/share/a3dc3131cc924e14a34634d5d48065c8?sid=b1971aa2-9deb-4339-8ebd-53f9947ef633', + 'button' => "texts.view" + ] + ); + } + + private function textBody() + { + return " + We note you are yet to connect your Stripe account to Invoice Ninja. Please log in to Invoice Ninja and connect your Stripe account.\n\n + Once logged in you can use the following resource to connect your Stripe account: \n\n + "; + } + + private function htmlBody() + { + return " + We note you are yet to connect your Stripe account to Invoice Ninja. Please log in to Invoice Ninja and connect your Stripe account.

+ + Once logged in you can use the following resource to connect your Stripe account:

+ + "; + } + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments() + { + return []; + } + + /** + * Get the message headers. + * + * @return \Illuminate\Mail\Mailables\Headers + */ + public function headers() + { + return new Headers( + messageId: null, + references: [], + text:['' => ''], + ); + } +} diff --git a/app/Mail/TemplateEmail.php b/app/Mail/TemplateEmail.php index ff77463df864..2fcd68874a81 100644 --- a/app/Mail/TemplateEmail.php +++ b/app/Mail/TemplateEmail.php @@ -18,7 +18,6 @@ use App\Services\PdfMaker\Designs\Utilities\DesignHelpers; use App\Utils\HtmlEngine; use App\Utils\Ninja; use Illuminate\Mail\Mailable; -use Illuminate\Support\Facades\Storage; class TemplateEmail extends Mailable { @@ -111,7 +110,7 @@ class TemplateEmail extends Mailable if (Ninja::isHosted()) { $bccs = explode(',', str_replace(' ', '', $settings->bcc_email)); $this->bcc(array_slice($bccs, 0, 2)); - //$this->bcc(reset($bccs)); //remove whitespace if any has been inserted. + //$this->bcc(reset($bccs)); //remove whitespace if any has been inserted. } else { $this->bcc(explode(',', str_replace(' ', '', $settings->bcc_email))); }//remove whitespace if any has been inserted. @@ -149,16 +148,21 @@ class TemplateEmail extends Mailable if ($this->invitation && $this->invitation->invoice && $settings->ubl_email_attachment && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $ubl_string = (new CreateUbl($this->invitation->invoice))->handle(); + nlog("template {$ubl_string}"); + if ($ubl_string) { $this->attachData($ubl_string, $this->invitation->invoice->getFileName('xml')); } + } if ($this->invitation && $this->invitation->invoice && $this->invitation->invoice->client->getSetting('enable_e_invoice') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { - - $xinvoice_filepath = $this->invitation->invoice->service()->getEInvoice($this->invitation->contact); + $xml_string = $this->invitation->invoice->service()->getEInvoice($this->invitation->contact); - if(Storage::disk(config('filesystems.default'))->exists($xinvoice_filepath)) - $this->attach(Storage::disk(config('filesystems.default'))->path($xinvoice_filepath), ['as' => $this->invitation->invoice->getFileName("xml"), 'mime' => null]); + nlog("template {$xml_string}"); + + if($xml_string) { + $this->attachData($xml_string, $this->invitation->invoice->getEFileName("xml")); + } } diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 7f8c0d4bca69..eb4c1772236a 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -237,6 +237,15 @@ class BaseModel extends Model return $this->numberFormatter().'.'.$extension; } + /** + * @param string $extension + * @return string + */ + public function getEFileName($extension = 'pdf') + { + return ctrans("texts.e_invoice"). "_" . $this->numberFormatter().'.'.$extension; + } + public function numberFormatter() { $number = strlen($this->number) >= 1 ? $this->translate_entity() . "_" . $this->number : class_basename($this) . "_" . Str::random(5); @@ -276,6 +285,7 @@ class BaseModel extends Model /** * Returns the base64 encoded PDF string of the entity + * @deprecated - unused implementation */ public function fullscreenPdfViewer($invitation = null): string { diff --git a/app/Models/Company.php b/app/Models/Company.php index 9b9f12c11858..644dcab807e1 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -707,6 +707,7 @@ class Company extends BaseModel public function getSetting($setting) { + //todo $this->setting ?? false if (property_exists($this->settings, $setting) != false) { return $this->settings->{$setting}; } diff --git a/app/Models/PaymentHash.php b/app/Models/PaymentHash.php index 9905feddab65..daf6b6197d9f 100644 --- a/app/Models/PaymentHash.php +++ b/app/Models/PaymentHash.php @@ -20,7 +20,7 @@ use Illuminate\Database\Eloquent\Model; * @property string $hash * @property float $fee_total * @property int|null $fee_invoice_id - * @property mixed $data + * @property \stdClass $data * @property int|null $payment_id * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at @@ -38,9 +38,16 @@ class PaymentHash extends Model 'data' => 'object', ]; + /** + * @class \App\Models\PaymentHash $this + * @property \App\Models\PaymentHash $data + * @class \stdClass $data + * @property string $raw_value + */ + /** - * @return array + * @return mixed */ public function invoices() { @@ -75,9 +82,8 @@ class PaymentHash extends Model public function withData(string $property, $value): self { - $this->data = array_merge((array) $this->data, [$property => $value]); - $this->save(); - - return $this; + $this->data = array_merge((array) $this->data, [$property => $value]); // @phpstan-ignore-line + $this->save();// @phpstan-ignore-line + return $this; // @phpstan-ignore-line } } diff --git a/app/Models/Vendor.php b/app/Models/Vendor.php index a055ed7992b4..84dcd3f286a1 100644 --- a/app/Models/Vendor.php +++ b/app/Models/Vendor.php @@ -230,9 +230,9 @@ class Vendor extends BaseModel * Returns a vendor settings proxying company setting * * @param string $setting - * @return string + * @return mixed */ - public function getSetting($setting): string + public function getSetting($setting): mixed { if ((property_exists($this->company->settings, $setting) != false) && (isset($this->company->settings->{$setting}) !== false)) { return $this->company->settings->{$setting}; diff --git a/app/PaymentDrivers/CheckoutCom/CheckoutWebhook.php b/app/PaymentDrivers/CheckoutCom/CheckoutWebhook.php index fcac5acdc3ac..c7c1069c63ff 100644 --- a/app/PaymentDrivers/CheckoutCom/CheckoutWebhook.php +++ b/app/PaymentDrivers/CheckoutCom/CheckoutWebhook.php @@ -69,7 +69,7 @@ class CheckoutWebhook implements ShouldQueue { $payment_object = $this->webhook_array['data']; - $payment = Payment::withTrashed()->where('transaction_reference', $payment_object['id'])->first(); + $payment = Payment::query()->withTrashed()->where('transaction_reference', $payment_object['id'])->first(); if($payment && $payment->status_id == Payment::STATUS_COMPLETED) return; @@ -84,18 +84,19 @@ class CheckoutWebhook implements ShouldQueue $metadata = $this->webhook_array['metadata']; - $payment_hash = PaymentHash::where('hash', $metadata['udf2'])->first(); + $payment_hash = PaymentHash::query()->where('hash', $metadata['udf2'])->first(); $driver = $this->company_gateway->driver($payment_hash->fee_invoice->client)->init()->setPaymentMethod(); - $payment_hash->data = array_merge((array) $payment_hash->data, $this->webhook_array); - $payment_hash->save(); - $driver->setPaymentHash($payment_hash); + $payment_hash->data = array_merge((array) $payment_hash->data, $this->webhook_array); // @phpstan-ignore-line + $payment_hash->save(); + $driver->setPaymentHash($payment_hash); + // @phpstan-ignore-line $data = [ 'payment_method' => isset($this->webhook_array['source']['id']) ? $this->webhook_array['source']['id'] : '', 'payment_type' => PaymentType::CREDIT_CARD_OTHER, - 'amount' => $payment_hash->data->raw_value, + 'amount' => $payment_hash->data->raw_value, // @phpstan-ignore-line 'transaction_reference' => $payment_object['id'], 'gateway_type_id' => GatewayType::CREDIT_CARD, ]; diff --git a/app/PaymentDrivers/CheckoutCom/Webhook.php b/app/PaymentDrivers/CheckoutCom/Webhook.php index 187d2dad2220..8fc5744762b7 100644 --- a/app/PaymentDrivers/CheckoutCom/Webhook.php +++ b/app/PaymentDrivers/CheckoutCom/Webhook.php @@ -66,8 +66,6 @@ class Webhook /** * Lists the workflows in Checkout - * - * @return void */ public function getWorkFlows() { diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index d83f5602c8f3..028eeb4dffc7 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -94,6 +94,7 @@ use App\Events\Misc\InvitationWasViewed; use App\Events\Payment\PaymentWasVoided; use App\Events\Vendor\VendorWasArchived; use App\Events\Vendor\VendorWasRestored; +use App\Events\Account\StripeConnectFailure; use App\Listeners\Mail\MailSentListener; use App\Observers\ClientContactObserver; use App\Observers\PurchaseOrderObserver; @@ -198,6 +199,8 @@ use App\Listeners\Invoice\InvoiceRestoredActivity; use App\Listeners\Invoice\InvoiceReversedActivity; use App\Listeners\Payment\PaymentRestoredActivity; use App\Listeners\Quote\QuoteApprovedNotification; +use SocialiteProviders\Apple\AppleExtendSocialite; +use SocialiteProviders\Manager\SocialiteWasCalled; use App\Events\Subscription\SubscriptionWasCreated; use App\Events\Subscription\SubscriptionWasDeleted; use App\Events\Subscription\SubscriptionWasUpdated; @@ -221,10 +224,12 @@ use App\Listeners\Invoice\InvoiceEmailFailedActivity; use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; use App\Events\PurchaseOrder\PurchaseOrderWasArchived; use App\Events\PurchaseOrder\PurchaseOrderWasRestored; +use App\Listeners\Payment\PaymentEmailFailureActivity; use App\Listeners\Vendor\UpdateVendorContactLastLogin; use App\Events\RecurringQuote\RecurringQuoteWasCreated; use App\Events\RecurringQuote\RecurringQuoteWasDeleted; use App\Events\RecurringQuote\RecurringQuoteWasUpdated; +use App\Listeners\Account\StripeConnectFailureListener; use App\Listeners\Activity\CreatedSubscriptionActivity; use App\Listeners\Activity\SubscriptionDeletedActivity; use App\Listeners\Activity\SubscriptionUpdatedActivity; @@ -234,6 +239,7 @@ use App\Events\RecurringQuote\RecurringQuoteWasRestored; use App\Listeners\Activity\SubscriptionArchivedActivity; use App\Listeners\Activity\SubscriptionRestoredActivity; use App\Listeners\Invoice\InvoiceFailedEmailNotification; +use SocialiteProviders\Microsoft\MicrosoftExtendSocialite; use App\Events\RecurringExpense\RecurringExpenseWasCreated; use App\Events\RecurringExpense\RecurringExpenseWasDeleted; use App\Events\RecurringExpense\RecurringExpenseWasUpdated; @@ -587,6 +593,9 @@ class EventServiceProvider extends ServiceProvider TaskWasRestored::class => [ TaskRestoredActivity::class, ], + StripeConnectFailure::class => [ + StripeConnectFailureListener::class, + ], SubscriptionWasCreated::class => [ CreatedSubscriptionActivity::class, ], diff --git a/app/Repositories/Migration/InvoiceMigrationRepository.php b/app/Repositories/Migration/InvoiceMigrationRepository.php index 05b4dafc20aa..729a9551b95f 100644 --- a/app/Repositories/Migration/InvoiceMigrationRepository.php +++ b/app/Repositories/Migration/InvoiceMigrationRepository.php @@ -136,7 +136,11 @@ class InvoiceMigrationRepository extends BaseRepository $state['finished_amount'] = $model->amount; - $model = $model->service()->applyNumber()->setReminder()->save(); + $model = $model->service()->applyNumber()->save(); + + if ($class->name == Invoice::class) { + $model->service()->setReminder()->save(); + } if ($class->name == Invoice::class || $class->name == RecurringInvoice::class) { if (($state['finished_amount'] != $state['starting_amount']) && ($model->status_id != Invoice::STATUS_DRAFT)) { diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index a374ddfa353c..e2d833fa9e31 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -322,10 +322,10 @@ class EmailDefaults } /** E-Invoice xml file */ if ($this->email->email_object->settings->enable_e_invoice && $this->email->email_object->entity instanceof Invoice) { - $xinvoice_path = $this->email->email_object->entity->service()->getEInvoice(); + $xml_string = $this->email->email_object->entity->service()->getEInvoice(); - if(Storage::disk(config('filesystems.default'))->exists($xinvoice_path)) - $this->email->email_object->attachments = array_merge($this->email->email_object->attachments, [['file' => base64_encode(Storage::get($xinvoice_path)), 'name' => explode(".", $this->email->email_object->entity->getFileName('xml'))[0]."-e_invoice.xml"]]); + if($xml_string) + $this->email->email_object->attachments = array_merge($this->email->email_object->attachments, [['file' => base64_encode($xml_string), 'name' => explode(".", $this->email->email_object->entity->getFileName('xml'))[0]."-e_invoice.xml"]]); } if (!$this->email->email_object->settings->document_email_attachment || !$this->email->company->account->hasFeature(Account::FEATURE_DOCUMENTS)) { diff --git a/app/Services/Invoice/EInvoice/ZugferdEInvoice.php b/app/Services/Invoice/EInvoice/ZugferdEInvoice.php index e40d3ed6dbc4..0410422a4d7e 100644 --- a/app/Services/Invoice/EInvoice/ZugferdEInvoice.php +++ b/app/Services/Invoice/EInvoice/ZugferdEInvoice.php @@ -22,12 +22,13 @@ use horstoeko\zugferd\codelists\ZugferdDutyTaxFeeCategories; class ZugferdEInvoice extends AbstractService { + public ZugferdDocumentBuilder $xrechnung; - public function __construct(public Invoice $invoice, private array $tax_map = []) + public function __construct(public Invoice $invoice, private readonly bool $returnObject = false, private array $tax_map = []) { } - public function run() + public function run(): self { $company = $this->invoice->company; @@ -45,10 +46,9 @@ class ZugferdEInvoice extends AbstractService default => ZugferdProfiles::PROFILE_EN16931, }; + $this->xrechnung = ZugferdDocumentBuilder::CreateNew($profile); - $xrechnung = ZugferdDocumentBuilder::CreateNew($profile); - - $xrechnung + $this->xrechnung ->setDocumentSupplyChainEvent(date_create($this->invoice->date)) ->setDocumentSeller($company->getSetting('name')) ->setDocumentSellerAddress($company->getSetting("address1"), $company->getSetting("address2"), "", $company->getSetting("postal_code"), $company->getSetting("city"), $company->country()->iso_3166_2, $company->getSetting("state")) @@ -59,32 +59,32 @@ class ZugferdEInvoice extends AbstractService ->addDocumentPaymentTerm(ctrans("texts.xinvoice_payable", ['payeddue' => date_create($this->invoice->date)->diff(date_create($this->invoice->due_date))->format("%d"), 'paydate' => $this->invoice->due_date])); if (!empty($this->invoice->public_notes)) { - $xrechnung->addDocumentNote($this->invoice->public_notes); + $this->xrechnung->addDocumentNote($this->invoice->public_notes); } if (empty($this->invoice->number)){ - $xrechnung->setDocumentInformation("DRAFT", "380", date_create($this->invoice->date), $this->invoice->client->getCurrencyCode()); + $this->xrechnung->setDocumentInformation("DRAFT", "380", date_create($this->invoice->date), $this->invoice->client->getCurrencyCode()); } else { - $xrechnung->setDocumentInformation($this->invoice->number, "380", date_create($this->invoice->date), $this->invoice->client->getCurrencyCode()); + $this->xrechnung->setDocumentInformation($this->invoice->number, "380", date_create($this->invoice->date), $this->invoice->client->getCurrencyCode()); } if (!empty($this->invoice->po_number)) { - $xrechnung->setDocumentBuyerOrderReferencedDocument($this->invoice->po_number); + $this->xrechnung->setDocumentBuyerOrderReferencedDocument($this->invoice->po_number); } if (empty($client->routing_id)) { - $xrechnung->setDocumentBuyerReference(ctrans("texts.xinvoice_no_buyers_reference")); + $this->xrechnung->setDocumentBuyerReference(ctrans("texts.xinvoice_no_buyers_reference")); } else { - $xrechnung->setDocumentBuyerReference($client->routing_id); + $this->xrechnung->setDocumentBuyerReference($client->routing_id); } if (!empty($client->shipping_address1)){ - $xrechnung->setDocumentShipToAddress($client->shipping_address1, $client->shipping_address2, "", $client->shipping_postal_code, $client->shipping_city, $client->shipping_country->iso_3166_2, $client->shipping_state); + $this->xrechnung->setDocumentShipToAddress($client->shipping_address1, $client->shipping_address2, "", $client->shipping_postal_code, $client->shipping_city, $client->shipping_country->iso_3166_2, $client->shipping_state); } - $xrechnung->addDocumentPaymentMean(68, ctrans("texts.xinvoice_online_payment")); + $this->xrechnung->addDocumentPaymentMean(68, ctrans("texts.xinvoice_online_payment")); if (str_contains($company->getSetting('vat_number'), "/")) { - $xrechnung->addDocumentSellerTaxRegistration("FC", $company->getSetting('vat_number')); + $this->xrechnung->addDocumentSellerTaxRegistration("FC", $company->getSetting('vat_number')); } else { - $xrechnung->addDocumentSellerTaxRegistration("VA", $company->getSetting('vat_number')); + $this->xrechnung->addDocumentSellerTaxRegistration("VA", $company->getSetting('vat_number')); } $invoicing_data = $this->invoice->calc(); @@ -92,29 +92,29 @@ class ZugferdEInvoice extends AbstractService //Create line items and calculate taxes foreach ($this->invoice->line_items as $index => $item) { /** @var \App\DataMapper\InvoiceItem $item **/ - $xrechnung->addNewPosition($index) + $this->xrechnung->addNewPosition($index) ->setDocumentPositionGrossPrice($item->gross_line_total) ->setDocumentPositionNetPrice($item->line_total); if (!empty($item->product_key)){ if (!empty($item->notes)){ - $xrechnung->setDocumentPositionProductDetails($item->product_key, $item->notes); + $this->xrechnung->setDocumentPositionProductDetails($item->product_key, $item->notes); } else { - $xrechnung->setDocumentPositionProductDetails($item->product_key); + $this->xrechnung->setDocumentPositionProductDetails($item->product_key); } } else { if (!empty($item->notes)){ - $xrechnung->setDocumentPositionProductDetails($item->notes); + $this->xrechnung->setDocumentPositionProductDetails($item->notes); } else { - $xrechnung->setDocumentPositionProductDetails("no product name defined"); + $this->xrechnung->setDocumentPositionProductDetails("no product name defined"); } } if (isset($item->task_id)) { - $xrechnung->setDocumentPositionQuantity($item->quantity, "HUR"); + $this->xrechnung->setDocumentPositionQuantity($item->quantity, "HUR"); } else { - $xrechnung->setDocumentPositionQuantity($item->quantity, "H87"); + $this->xrechnung->setDocumentPositionQuantity($item->quantity, "H87"); } $linenetamount = $item->line_total; if ($item->discount > 0) { @@ -124,18 +124,18 @@ class ZugferdEInvoice extends AbstractService $linenetamount -= $linenetamount * ($item->discount / 100); } } - $xrechnung->setDocumentPositionLineSummation($linenetamount); + $this->xrechnung->setDocumentPositionLineSummation($linenetamount); // According to european law, each line item can only have one tax rate if (!(empty($item->tax_name1) && empty($item->tax_name2) && empty($item->tax_name3))) { $taxtype = $this->getTaxType($item->tax_id); if (!empty($item->tax_name1)) { - $xrechnung->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate1); + $this->xrechnung->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate1); $this->addtoTaxMap($taxtype, $linenetamount, $item->tax_rate1); } elseif (!empty($item->tax_name2)) { - $xrechnung->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate2); + $this->xrechnung->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate2); $this->addtoTaxMap($taxtype, $linenetamount, $item->tax_rate2); } elseif (!empty($item->tax_name3)) { - $xrechnung->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate3); + $this->xrechnung->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate3); $this->addtoTaxMap($taxtype, $linenetamount, $item->tax_rate3); } else { nlog("Can't add correct tax position"); @@ -143,40 +143,45 @@ class ZugferdEInvoice extends AbstractService } else { if (!empty($this->invoice->tax_name1)) { $taxtype = $this->getTaxType($this->invoice->tax_name1); - $xrechnung->addDocumentPositionTax($taxtype, 'VAT', $this->invoice->tax_rate1); + $this->xrechnung->addDocumentPositionTax($taxtype, 'VAT', $this->invoice->tax_rate1); $this->addtoTaxMap($taxtype, $linenetamount, $this->invoice->tax_rate1); } elseif (!empty($this->invoice->tax_name2)) { $taxtype = $this->getTaxType($this->invoice->tax_name2); - $xrechnung->addDocumentPositionTax($taxtype, 'VAT', $this->invoice->tax_rate2); + $this->xrechnung->addDocumentPositionTax($taxtype, 'VAT', $this->invoice->tax_rate2); $this->addtoTaxMap($taxtype, $linenetamount, $this->invoice->tax_rate2); } elseif (!empty($this->invoice->tax_name3)) { $taxtype = $this->getTaxType($this->invoice->tax_name3); - $xrechnung->addDocumentPositionTax($taxtype, 'VAT', $this->invoice->tax_rate3); + $this->xrechnung->addDocumentPositionTax($taxtype, 'VAT', $this->invoice->tax_rate3); $this->addtoTaxMap($taxtype, $linenetamount, $this->invoice->tax_rate3); } else { $taxtype = ZugferdDutyTaxFeeCategories::ZERO_RATED_GOODS; - $xrechnung->addDocumentPositionTax($taxtype, 'VAT', 0); + $this->xrechnung->addDocumentPositionTax($taxtype, 'VAT', 0); $this->addtoTaxMap($taxtype, $linenetamount, 0); nlog("Can't add correct tax position"); } } } - $xrechnung->setDocumentSummation($this->invoice->amount, $this->invoice->balance, $invoicing_data->getSubTotal(), $invoicing_data->getTotalSurcharges(), $invoicing_data->getTotalDiscount(), $invoicing_data->getSubTotal(), $invoicing_data->getItemTotalTaxes(), 0.0, $this->invoice->amount-$this->invoice->balance); + $this->xrechnung->setDocumentSummation($this->invoice->amount, $this->invoice->balance, $invoicing_data->getSubTotal(), $invoicing_data->getTotalSurcharges(), $invoicing_data->getTotalDiscount(), $invoicing_data->getSubTotal(), $invoicing_data->getItemTotalTaxes(), 0.0, $this->invoice->amount-$this->invoice->balance); foreach ($this->tax_map as $item){ - $xrechnung->addDocumentTax($item["tax_type"], "VAT", $item["net_amount"], $item["tax_rate"]*$item["net_amount"], $item["tax_rate"]*100); - } - $disk = config('filesystems.default'); - - if (!Storage::disk($disk)->exists($client->e_invoice_filepath($this->invoice->invitations->first()))) { - Storage::makeDirectory($client->e_invoice_filepath($this->invoice->invitations->first())); + $this->xrechnung->addDocumentTax($item["tax_type"], "VAT", $item["net_amount"], $item["tax_rate"]*$item["net_amount"], $item["tax_rate"]*100); } - $xrechnung->writeFile(Storage::disk($disk)->path($client->e_invoice_filepath($this->invoice->invitations->first()) . $this->invoice->getFileName("xml"))); // The validity can be checked using https://portal3.gefeg.com/invoice/validation or https://e-rechnung.bayern.de/app/#/upload - - return $client->e_invoice_filepath($this->invoice->invitations->first()) . $this->invoice->getFileName("xml"); + return $this; + + } + + /** + * Returns the XML document + * in string format + * + * @return string + */ + public function getXml(): string + { + return $this->xrechnung->getContent(); } private function getTaxType($name): string diff --git a/app/Services/Invoice/GetInvoiceEInvoice.php b/app/Services/Invoice/GetInvoiceEInvoice.php deleted file mode 100644 index 6b6dac9f544f..000000000000 --- a/app/Services/Invoice/GetInvoiceEInvoice.php +++ /dev/null @@ -1,51 +0,0 @@ -contact) { - $this->contact = $this->invoice->client->primary_contact()->first() ?: $this->invoice->client->contacts()->first(); - } - - $invitation = $this->invoice->invitations->where('client_contact_id', $this->contact->id)->first(); - - if (! $invitation) { - $invitation = $this->invoice->invitations->first(); - } - - $file_path = $this->invoice->client->e_invoice_filepath($this->invoice->invitations->first()). $this->invoice->getFileName("xml"); - - // $disk = 'public'; - $disk = config('filesystems.default'); - - $file = Storage::disk($disk)->exists($file_path); - - if (! $file) { - $file_path = (new CreateEInvoice($this->invoice, false))->handle(); - } - - return $file_path; - } -} diff --git a/app/Services/Invoice/GetInvoicePdf.php b/app/Services/Invoice/GetInvoicePdf.php index 376cdfd95d98..9211a15bb8fd 100644 --- a/app/Services/Invoice/GetInvoicePdf.php +++ b/app/Services/Invoice/GetInvoicePdf.php @@ -12,6 +12,7 @@ namespace App\Services\Invoice; use App\Jobs\Entity\CreateEntityPdf; +use App\Jobs\Invoice\CreateEInvoice; use App\Models\ClientContact; use App\Models\Invoice; use App\Services\AbstractService; @@ -47,7 +48,7 @@ class GetInvoicePdf extends AbstractService if (! $file) { $file_path = (new CreateEntityPdf($invitation))->handle(); } - + return $file_path; } } diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index 0adec81b6ce9..148f0cae88d5 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -13,6 +13,7 @@ namespace App\Services\Invoice; use App\Events\Invoice\InvoiceWasArchived; use App\Jobs\Entity\CreateEntityPdf; +use App\Jobs\Entity\CreateRawPdf; use App\Jobs\Inventory\AdjustProductInventory; use App\Jobs\Invoice\CreateEInvoice; use App\Libraries\Currency\Conversion\CurrencyApi; @@ -187,6 +188,13 @@ class InvoiceService return (new GetInvoicePdf($this->invoice, $contact))->run(); } + public function getRawInvoicePdf($contact = null) + { + $invitation = $contact ? $this->invoice->invitations()->where('contact_id', $contact->id)->first() : $this->invoice->invitations()->first(); + + return (new CreateRawPdf($invitation, $invitation->company->db))->handle(); + } + public function getInvoiceDeliveryNote(Invoice $invoice, \App\Models\ClientContact $contact = null) { return (new GenerateDeliveryNote($invoice, $contact))->run(); @@ -194,13 +202,9 @@ class InvoiceService public function getEInvoice($contact = null) { - return (new GetInvoiceEInvoice($this->invoice, $contact))->run(); + return (new CreateEInvoice($this->invoice))->handle(); } - public function mergeEInvoice($contact = null): void - { - (new MergeEInvoice($this->invoice, $contact))->run(); - } public function sendEmail($contact = null) { $send_email = new SendEmail($this->invoice, null, $contact); @@ -343,6 +347,7 @@ class InvoiceService })->toArray(); $this->deletePdf(); + $this->deleteEInvoice(); return $this; } @@ -410,6 +415,7 @@ class InvoiceService $this->invoice = $this->invoice->calc()->getInvoice(); $this->deletePdf(); + $this->deleteEInvoice(); /* 24-03-2022 */ $new_balance = $this->invoice->balance; @@ -462,12 +468,6 @@ class InvoiceService if ($force) { $this->invoice->invitations->each(function ($invitation) { (new CreateEntityPdf($invitation))->handle(); - - if ($invitation->invoice->client->getSetting('enable_e_invoice') && $invitation instanceof InvoiceInvitation) - { - (new CreateEInvoice($invitation->invoice, true))->handle(); - } - }); return $this; @@ -478,7 +478,7 @@ class InvoiceService CreateEntityPdf::dispatch($invitation); if ($invitation->invoice->client->getSetting('enable_e_invoice') && $invitation instanceof InvoiceInvitation) { - CreateEInvoice::dispatch($invitation->invoice, true); + CreateEInvoice::dispatch($invitation->invoice); } }); diff --git a/app/Services/Invoice/MergeEInvoice.php b/app/Services/Invoice/MergeEInvoice.php deleted file mode 100644 index d05d61abaf86..000000000000 --- a/app/Services/Invoice/MergeEInvoice.php +++ /dev/null @@ -1,61 +0,0 @@ -invoice->client->getSetting('e_invoice_type'); - switch ($e_invoice_type) { - case "EN16931": - case "XInvoice_2_2": - case "XInvoice_2_1": - case "XInvoice_2_0": - case "XInvoice_1_0": - case "XInvoice-Extended": - case "XInvoice-BasicWL": - case "XInvoice-Basic": - $this->embedEInvoiceZuGFerD(); - //case "Facturae_3.2": - //case "Facturae_3.2.1": - //case "Facturae_3.2.2": - // - default: - $this->embedEInvoiceZuGFerD(); - break; - } - } - - /** - * @throws \Exception - */ - private function embedEInvoiceZuGFerD(): void - { - $filepath_pdf = $this->invoice->client->invoice_filepath($this->invoice->invitations->first()) . $this->invoice->getFileName(); - $e_invoice_path = $this->invoice->client->e_invoice_filepath($this->invoice->invitations->first()) . $this->invoice->getFileName("xml"); - $document = ZugferdDocumentReader::readAndGuessFromFile($e_invoice_path); - $disk = config('filesystems.default'); - - if (!Storage::disk($disk)->exists($this->invoice->client->e_invoice_filepath($this->invoice->invitations->first()))) { - Storage::makeDirectory($this->invoice->client->e_invoice_filepath($this->invoice->invitations->first())); - } - $pdfBuilder = new ZugferdDocumentPdfBuilder($document, Storage::disk($disk)->path($filepath_pdf)); - $pdfBuilder->generateDocument(); - $pdfBuilder->saveDocument(Storage::disk($disk)->path($filepath_pdf)); - } -} diff --git a/app/Services/PurchaseOrder/PurchaseOrderExpense.php b/app/Services/PurchaseOrder/PurchaseOrderExpense.php index d206efbb28fb..e25bc84de163 100644 --- a/app/Services/PurchaseOrder/PurchaseOrderExpense.php +++ b/app/Services/PurchaseOrder/PurchaseOrderExpense.php @@ -57,7 +57,7 @@ class PurchaseOrderExpense $expense->number = empty($expense->number) ? $this->getNextExpenseNumber($expense) : $expense->number; - $expense->save(); + $expense->saveQuietly(); event('eloquent.created: App\Models\Expense', $expense); $this->purchase_order->expense_id = $expense->id; diff --git a/app/Services/PurchaseOrder/PurchaseOrderService.php b/app/Services/PurchaseOrder/PurchaseOrderService.php index f9bc5d7c75e1..3445e261dd7d 100644 --- a/app/Services/PurchaseOrder/PurchaseOrderService.php +++ b/app/Services/PurchaseOrder/PurchaseOrderService.php @@ -20,11 +20,8 @@ class PurchaseOrderService { use MakesHash; - public PurchaseOrder $purchase_order; - - public function __construct(PurchaseOrder $purchase_order) + public function __construct(public PurchaseOrder $purchase_order) { - $this->purchase_order = $purchase_order; } public function createInvitations() @@ -156,7 +153,7 @@ class PurchaseOrderService /** * Saves the purchase order. - * @return \App\Models\PurchaseOrder object + * @return \App\Models\PurchaseOrder */ public function save(): ?PurchaseOrder { diff --git a/app/Utils/TemplateEngine.php b/app/Utils/TemplateEngine.php index 2e531daf9484..4bd3b8310a26 100644 --- a/app/Utils/TemplateEngine.php +++ b/app/Utils/TemplateEngine.php @@ -52,8 +52,8 @@ class TemplateEngine public $template; - /** @var \App\Models\Invoice | \App\Models\Quote | \App\Models\Credit | \App\Models\PurchaseOrder | \App\Models\RecurringInvoice $entity_obj **/ - private \App\Models\Invoice | \App\Models\Quote | \App\Models\Credit | \App\Models\PurchaseOrder | \App\Models\RecurringInvoice $entity_obj; + /** @var \App\Models\Invoice | \App\Models\Quote | \App\Models\Credit | \App\Models\PurchaseOrder | \App\Models\RecurringInvoice | \App\Models\Payment $entity_obj **/ + private \App\Models\Invoice | \App\Models\Quote | \App\Models\Credit | \App\Models\PurchaseOrder | \App\Models\RecurringInvoice | \App\Models\Payment $entity_obj; /** @var \App\Models\Company | \App\Models\Client | null $settings_entity **/ private $settings_entity; diff --git a/app/Utils/Traits/Inviteable.php b/app/Utils/Traits/Inviteable.php index ed7c7056845c..13a161462aae 100644 --- a/app/Utils/Traits/Inviteable.php +++ b/app/Utils/Traits/Inviteable.php @@ -79,7 +79,7 @@ trait Inviteable if (Ninja::isHosted()) { $domain = $this->company->domain(); } else { - $domain = strlen($this->company->portal_domain) > 5 ? $this->company->portal_domain : config('ninja.app_url'); + $domain = strlen($this->company->portal_domain ?? '') > 5 ? $this->company->portal_domain : config('ninja.app_url'); } $entity_type = Str::snake(class_basename($this->entityType())); @@ -94,7 +94,7 @@ trait Inviteable if (Ninja::isHosted()) { $domain = $this->company->domain(); } else { - $domain = strlen($this->company->portal_domain) > 5 ? $this->company->portal_domain : config('ninja.app_url'); + $domain = strlen($this->company->portal_domain ?? '') > 5 ? $this->company->portal_domain : config('ninja.app_url'); } switch ($this->company->portal_mode) { @@ -119,7 +119,7 @@ trait Inviteable if (Ninja::isHosted()) { $domain = $this->company->domain(); } else { - $domain = strlen($this->company->portal_domain) > 5 ? $this->company->portal_domain : config('ninja.app_url'); + $domain = strlen($this->company->portal_domain ?? '') > 5 ? $this->company->portal_domain : config('ninja.app_url'); } switch ($this->company->portal_mode) { diff --git a/composer.lock b/composer.lock index 6bf16dd7b2c8..2be5001245e6 100644 --- a/composer.lock +++ b/composer.lock @@ -370,16 +370,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.1", + "version": "v1.2.2", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5" + "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/1926277fc71d253dfa820271ac5987bdb193ccf5", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/2f1dc7b7eda080498be96a4a6d683a41583030e9", + "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9", "shasum": "" }, "require": { @@ -418,22 +418,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.1" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.2" }, - "time": "2023-03-24T20:22:19+00:00" + "time": "2023-07-20T16:49:55+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.276.2", + "version": "3.279.0", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "78c9510280512121e8fdaa9538b744778ab48bf9" + "reference": "7b3d38cfccd393add0ea0ce281de91846967c61e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/78c9510280512121e8fdaa9538b744778ab48bf9", - "reference": "78c9510280512121e8fdaa9538b744778ab48bf9", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/7b3d38cfccd393add0ea0ce281de91846967c61e", + "reference": "7b3d38cfccd393add0ea0ce281de91846967c61e", "shasum": "" }, "require": { @@ -442,11 +442,11 @@ "ext-pcre": "*", "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0", + "guzzlehttp/promises": "^1.4.0 || ^2.0", "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "mtdowling/jmespath.php": "^2.6", - "php": ">=5.5", - "psr/http-message": "^1.0" + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", @@ -461,7 +461,7 @@ "ext-sockets": "*", "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", "psr/cache": "^1.0", "psr/simple-cache": "^1.0", "sebastian/comparator": "^1.2.3 || ^4.0", @@ -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.276.2" + "source": "https://github.com/aws/aws-sdk-php/tree/3.279.0" }, - "time": "2023-07-20T18:16:37+00:00" + "time": "2023-08-16T18:18:34+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1351,16 +1351,16 @@ }, { "name": "doctrine/dbal", - "version": "3.6.4", + "version": "3.6.5", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "19f0dec95edd6a3c3c5ff1d188ea94c6b7fc903f" + "reference": "96d5a70fd91efdcec81fc46316efc5bf3da17ddf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/19f0dec95edd6a3c3c5ff1d188ea94c6b7fc903f", - "reference": "19f0dec95edd6a3c3c5ff1d188ea94c6b7fc903f", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/96d5a70fd91efdcec81fc46316efc5bf3da17ddf", + "reference": "96d5a70fd91efdcec81fc46316efc5bf3da17ddf", "shasum": "" }, "require": { @@ -1375,10 +1375,10 @@ "require-dev": { "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2022.3", - "phpstan/phpstan": "1.10.14", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.21", "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.7", + "phpunit/phpunit": "9.6.9", "psalm/plugin-phpunit": "0.18.4", "squizlabs/php_codesniffer": "3.7.2", "symfony/cache": "^5.4|^6.0", @@ -1443,7 +1443,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.6.4" + "source": "https://github.com/doctrine/dbal/tree/3.6.5" }, "funding": [ { @@ -1459,7 +1459,7 @@ "type": "tidelift" } ], - "time": "2023-06-15T07:40:12+00:00" + "time": "2023-07-17T09:15:50+00:00" }, { "name": "doctrine/deprecations", @@ -1762,28 +1762,27 @@ }, { "name": "doctrine/lexer", - "version": "2.1.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + "reference": "84a527db05647743d50373e0ec53a152f2cde568" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.0" + "vimeo/psalm": "^5.0" }, "type": "library", "autoload": { @@ -1820,7 +1819,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.0" + "source": "https://github.com/doctrine/lexer/tree/3.0.0" }, "funding": [ { @@ -1836,20 +1835,20 @@ "type": "tidelift" } ], - "time": "2022-12-14T08:49:07+00:00" + "time": "2022-12-15T16:57:16+00:00" }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.2", + "version": "v3.3.3", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8" + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8", - "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", "shasum": "" }, "require": { @@ -1889,7 +1888,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.2" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" }, "funding": [ { @@ -1897,7 +1896,7 @@ "type": "github" } ], - "time": "2022-09-10T18:51:20+00:00" + "time": "2023-08-10T19:36:49+00:00" }, { "name": "egulias/email-validator", @@ -2485,16 +2484,16 @@ }, { "name": "google/apiclient-services", - "version": "v0.309.0", + "version": "v0.312.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "562f8e5ddbca68d52afc3bf47d03839e78722026" + "reference": "45d47fed73b28254c511882bc743b1690a99558d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/562f8e5ddbca68d52afc3bf47d03839e78722026", - "reference": "562f8e5ddbca68d52afc3bf47d03839e78722026", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/45d47fed73b28254c511882bc743b1690a99558d", + "reference": "45d47fed73b28254c511882bc743b1690a99558d", "shasum": "" }, "require": { @@ -2523,9 +2522,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.309.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.312.0" }, - "time": "2023-07-16T01:08:14+00:00" + "time": "2023-08-14T00:56:12+00:00" }, { "name": "google/auth", @@ -2833,29 +2832,33 @@ }, { "name": "guzzlehttp/promises", - "version": "1.5.3", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", - "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -2892,7 +2895,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.3" + "source": "https://github.com/guzzle/promises/tree/2.0.1" }, "funding": [ { @@ -2908,20 +2911,20 @@ "type": "tidelift" } ], - "time": "2023-05-21T12:31:43+00:00" + "time": "2023-08-03T15:11:55+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.5.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77", + "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77", "shasum": "" }, "require": { @@ -3008,7 +3011,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.0" }, "funding": [ { @@ -3024,7 +3027,7 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2023-08-03T15:06:02+00:00" }, { "name": "guzzlehttp/uri-template", @@ -3345,16 +3348,16 @@ }, { "name": "horstoeko/zugferd", - "version": "v1.0.20", + "version": "v1.0.23", "source": { "type": "git", "url": "https://github.com/horstoeko/zugferd.git", - "reference": "725c130ec0a09d72cf54b3d819840f3959a5502c" + "reference": "bb55417be4c4de8deb0113e832feeaf7b4d3984e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/725c130ec0a09d72cf54b3d819840f3959a5502c", - "reference": "725c130ec0a09d72cf54b3d819840f3959a5502c", + "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/bb55417be4c4de8deb0113e832feeaf7b4d3984e", + "reference": "bb55417be4c4de8deb0113e832feeaf7b4d3984e", "shasum": "" }, "require": { @@ -3412,9 +3415,9 @@ ], "support": { "issues": "https://github.com/horstoeko/zugferd/issues", - "source": "https://github.com/horstoeko/zugferd/tree/v1.0.20" + "source": "https://github.com/horstoeko/zugferd/tree/v1.0.23" }, - "time": "2023-07-04T15:21:32+00:00" + "time": "2023-08-16T17:39:36+00:00" }, { "name": "http-interop/http-factory-guzzle", @@ -3926,22 +3929,22 @@ }, { "name": "jms/serializer", - "version": "3.26.0", + "version": "3.27.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "926a7d57438fa1ff4ab794551c5ae26e68536853" + "reference": "e8c812460d7b47b15bc0ccd78901276bd44ad452" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/926a7d57438fa1ff4ab794551c5ae26e68536853", - "reference": "926a7d57438fa1ff4ab794551c5ae26e68536853", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/e8c812460d7b47b15bc0ccd78901276bd44ad452", + "reference": "e8c812460d7b47b15bc0ccd78901276bd44ad452", "shasum": "" }, "require": { "doctrine/annotations": "^1.13 || ^2.0", "doctrine/instantiator": "^1.0.3 || ^2.0", - "doctrine/lexer": "^2", + "doctrine/lexer": "^2.0 || ^3.0", "jms/metadata": "^2.6", "php": "^7.2||^8.0", "phpstan/phpdoc-parser": "^0.4 || ^0.5 || ^1.0" @@ -4010,7 +4013,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.26.0" + "source": "https://github.com/schmittjoh/serializer/tree/3.27.0" }, "funding": [ { @@ -4018,20 +4021,20 @@ "type": "github" } ], - "time": "2023-06-24T19:25:58+00:00" + "time": "2023-07-29T22:33:44+00:00" }, { "name": "josemmo/facturae-php", - "version": "v1.7.7", + "version": "v1.7.8", "source": { "type": "git", "url": "https://github.com/josemmo/Facturae-PHP.git", - "reference": "00c093bb4a618dca4f195d8d84120b2c762801b4" + "reference": "3c490fa60e668a6275ba2fb6c228f1e19216d02e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/josemmo/Facturae-PHP/zipball/00c093bb4a618dca4f195d8d84120b2c762801b4", - "reference": "00c093bb4a618dca4f195d8d84120b2c762801b4", + "url": "https://api.github.com/repos/josemmo/Facturae-PHP/zipball/3c490fa60e668a6275ba2fb6c228f1e19216d02e", + "reference": "3c490fa60e668a6275ba2fb6c228f1e19216d02e", "shasum": "" }, "require": { @@ -4073,9 +4076,9 @@ ], "support": { "issues": "https://github.com/josemmo/Facturae-PHP/issues", - "source": "https://github.com/josemmo/Facturae-PHP/tree/v1.7.7" + "source": "https://github.com/josemmo/Facturae-PHP/tree/v1.7.8" }, - "time": "2023-07-02T08:07:03+00:00" + "time": "2023-08-06T15:34:37+00:00" }, { "name": "khanamiryan/qrcode-detector-decoder", @@ -4235,16 +4238,16 @@ }, { "name": "laravel/framework", - "version": "v9.52.10", + "version": "v9.52.15", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "858add225ce88a76c43aec0e7866288321ee0ee9" + "reference": "e3350e87a52346af9cc655a3012d2175d2d05ad7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/858add225ce88a76c43aec0e7866288321ee0ee9", - "reference": "858add225ce88a76c43aec0e7866288321ee0ee9", + "url": "https://api.github.com/repos/laravel/framework/zipball/e3350e87a52346af9cc655a3012d2175d2d05ad7", + "reference": "e3350e87a52346af9cc655a3012d2175d2d05ad7", "shasum": "" }, "require": { @@ -4429,20 +4432,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-06-27T13:25:54+00:00" + "time": "2023-08-08T14:28:40+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.3.0", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" + "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", - "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/e5a3057a5591e1cfe8183034b0203921abe2c902", + "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902", "shasum": "" }, "require": { @@ -4489,7 +4492,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-01-30T18:31:20+00:00" + "time": "2023-07-14T13:56:28+00:00" }, { "name": "laravel/slack-notification-channel", @@ -5079,16 +5082,16 @@ }, { "name": "league/csv", - "version": "9.9.0", + "version": "9.10.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "b4418ede47fbd88facc34e40a16c8ce9153b961b" + "reference": "d24b0d484812313b07ab74b0fe4db9661606df6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/b4418ede47fbd88facc34e40a16c8ce9153b961b", - "reference": "b4418ede47fbd88facc34e40a16c8ce9153b961b", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/d24b0d484812313b07ab74b0fe4db9661606df6c", + "reference": "d24b0d484812313b07ab74b0fe4db9661606df6c", "shasum": "" }, "require": { @@ -5097,16 +5100,17 @@ "php": "^8.1.2" }, "require-dev": { - "doctrine/collections": "^2.1.2", + "doctrine/collections": "^2.1.3", "ext-dom": "*", "ext-xdebug": "*", - "friendsofphp/php-cs-fixer": "^v3.14.3", - "phpbench/phpbench": "^1.2.8", - "phpstan/phpstan": "^1.10.4", - "phpstan/phpstan-deprecation-rules": "^1.1.2", - "phpstan/phpstan-phpunit": "^1.3.10", - "phpstan/phpstan-strict-rules": "^1.5.0", - "phpunit/phpunit": "^10.0.14" + "friendsofphp/php-cs-fixer": "^v3.22.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/phpstan": "^1.10.26", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.13", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^10.3.1", + "symfony/var-dumper": "^6.3.3" }, "suggest": { "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", @@ -5162,7 +5166,7 @@ "type": "github" } ], - "time": "2023-03-11T15:57:12+00:00" + "time": "2023-08-04T15:12:48+00:00" }, { "name": "league/flysystem", @@ -5448,26 +5452,26 @@ }, { "name": "league/mime-type-detection", - "version": "1.11.0", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/a6dfb1194a2946fcdc1f38219445234f65b35c96", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96", "shasum": "" }, "require": { "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3" + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { @@ -5488,7 +5492,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.13.0" }, "funding": [ { @@ -5500,7 +5504,7 @@ "type": "tidelift" } ], - "time": "2022-04-17T13:12:02+00:00" + "time": "2023-08-05T12:09:49+00:00" }, { "name": "league/oauth1-client", @@ -5643,16 +5647,16 @@ }, { "name": "livewire/livewire", - "version": "v2.12.3", + "version": "v2.12.6", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "019b1e69d8cd8c7e749eba7a38e4fa69ecbc8f74" + "reference": "7d3a57b3193299cf1a0639a3935c696f4da2cf92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/019b1e69d8cd8c7e749eba7a38e4fa69ecbc8f74", - "reference": "019b1e69d8cd8c7e749eba7a38e4fa69ecbc8f74", + "url": "https://api.github.com/repos/livewire/livewire/zipball/7d3a57b3193299cf1a0639a3935c696f4da2cf92", + "reference": "7d3a57b3193299cf1a0639a3935c696f4da2cf92", "shasum": "" }, "require": { @@ -5704,7 +5708,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v2.12.3" + "source": "https://github.com/livewire/livewire/tree/v2.12.6" }, "funding": [ { @@ -5712,20 +5716,20 @@ "type": "github" } ], - "time": "2023-03-03T20:12:38+00:00" + "time": "2023-08-11T04:02:34+00:00" }, { "name": "microsoft/microsoft-graph", - "version": "1.103.0", + "version": "1.104.0", "source": { "type": "git", "url": "https://github.com/microsoftgraph/msgraph-sdk-php.git", - "reference": "6e325c22145dbed4e51970ffecca4d7648c3c27e" + "reference": "fc2a3549e8efc9501dbf5d55d350882d8d641295" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/6e325c22145dbed4e51970ffecca4d7648c3c27e", - "reference": "6e325c22145dbed4e51970ffecca4d7648c3c27e", + "url": "https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/fc2a3549e8efc9501dbf5d55d350882d8d641295", + "reference": "fc2a3549e8efc9501dbf5d55d350882d8d641295", "shasum": "" }, "require": { @@ -5762,22 +5766,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.103.0" + "source": "https://github.com/microsoftgraph/msgraph-sdk-php/tree/1.104.0" }, - "time": "2023-07-19T03:27:15+00:00" + "time": "2023-08-11T07:41:39+00:00" }, { "name": "mollie/mollie-api-php", - "version": "v2.59.0", + "version": "v2.61.0", "source": { "type": "git", "url": "https://github.com/mollie/mollie-api-php.git", - "reference": "9834e5779c695d1cc278b2c78ee514de9434b084" + "reference": "d3ec7a191985aa57bec9b4425a665e95b4ba346a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/9834e5779c695d1cc278b2c78ee514de9434b084", - "reference": "9834e5779c695d1cc278b2c78ee514de9434b084", + "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/d3ec7a191985aa57bec9b4425a665e95b4ba346a", + "reference": "d3ec7a191985aa57bec9b4425a665e95b4ba346a", "shasum": "" }, "require": { @@ -5854,22 +5858,22 @@ ], "support": { "issues": "https://github.com/mollie/mollie-api-php/issues", - "source": "https://github.com/mollie/mollie-api-php/tree/v2.59.0" + "source": "https://github.com/mollie/mollie-api-php/tree/v2.61.0" }, - "time": "2023-07-18T13:41:40+00:00" + "time": "2023-07-31T15:37:46+00:00" }, { "name": "moneyphp/money", - "version": "v4.1.1", + "version": "v4.2.0", "source": { "type": "git", "url": "https://github.com/moneyphp/money.git", - "reference": "9682220995ffd396843be5b4ee1e5f2c2d6ecee2" + "reference": "f660ab7f1d7a4c2ffdd30f50c55ed2c95c26fc3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/moneyphp/money/zipball/9682220995ffd396843be5b4ee1e5f2c2d6ecee2", - "reference": "9682220995ffd396843be5b4ee1e5f2c2d6ecee2", + "url": "https://api.github.com/repos/moneyphp/money/zipball/f660ab7f1d7a4c2ffdd30f50c55ed2c95c26fc3f", + "reference": "f660ab7f1d7a4c2ffdd30f50c55ed2c95c26fc3f", "shasum": "" }, "require": { @@ -5943,9 +5947,9 @@ ], "support": { "issues": "https://github.com/moneyphp/money/issues", - "source": "https://github.com/moneyphp/money/tree/v4.1.1" + "source": "https://github.com/moneyphp/money/tree/v4.2.0" }, - "time": "2023-04-11T09:18:34+00:00" + "time": "2023-08-16T14:31:24+00:00" }, { "name": "monolog/monolog", @@ -6248,25 +6252,29 @@ }, { "name": "nesbot/carbon", - "version": "2.68.1", + "version": "2.69.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "4f991ed2a403c85efbc4f23eb4030063fdbe01da" + "reference": "4308217830e4ca445583a37d1bf4aff4153fa81c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4f991ed2a403c85efbc4f23eb4030063fdbe01da", - "reference": "4f991ed2a403c85efbc4f23eb4030063fdbe01da", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4308217830e4ca445583a37d1bf4aff4153fa81c", + "reference": "4308217830e4ca445583a37d1bf4aff4153fa81c", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, + "provide": { + "psr/clock-implementation": "1.0" + }, "require-dev": { "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", @@ -6346,25 +6354,25 @@ "type": "tidelift" } ], - "time": "2023-06-20T18:29:04+00:00" + "time": "2023-08-03T09:00:52+00:00" }, { "name": "nette/schema", - "version": "v1.2.3", + "version": "v1.2.4", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" + "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", - "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "url": "https://api.github.com/repos/nette/schema/zipball/c9ff517a53903b3d4e29ec547fb20feecb05b8ab", + "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab", "shasum": "" }, "require": { "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": ">=7.1 <8.3" + "php": "7.1 - 8.3" }, "require-dev": { "nette/tester": "^2.3 || ^2.4", @@ -6406,26 +6414,26 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.3" + "source": "https://github.com/nette/schema/tree/v1.2.4" }, - "time": "2022-10-13T01:24:26+00:00" + "time": "2023-08-05T18:56:25+00:00" }, { "name": "nette/utils", - "version": "v4.0.0", + "version": "v4.0.1", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e" + "reference": "9124157137da01b1f5a5a22d6486cb975f26db7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/cacdbf5a91a657ede665c541eda28941d4b09c1e", - "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e", + "url": "https://api.github.com/repos/nette/utils/zipball/9124157137da01b1f5a5a22d6486cb975f26db7e", + "reference": "9124157137da01b1f5a5a22d6486cb975f26db7e", "shasum": "" }, "require": { - "php": ">=8.0 <8.3" + "php": ">=8.0 <8.4" }, "conflict": { "nette/finder": "<3", @@ -6433,7 +6441,7 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "dev-master", - "nette/tester": "^2.4", + "nette/tester": "^2.5", "phpstan/phpstan": "^1.0", "tracy/tracy": "^2.9" }, @@ -6493,22 +6501,22 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.0" + "source": "https://github.com/nette/utils/tree/v4.0.1" }, - "time": "2023-02-02T10:41:53+00:00" + "time": "2023-07-30T15:42:21+00:00" }, { "name": "nikic/php-parser", - "version": "v4.16.0", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "19526a33fb561ef417e822e85f08a00db4059c17" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", - "reference": "19526a33fb561ef417e822e85f08a00db4059c17", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -6549,9 +6557,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-06-25T14:52:30+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "nunomaduro/termwind", @@ -7711,16 +7719,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.7.2", + "version": "1.7.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d" + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d", - "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", "shasum": "" }, "require": { @@ -7763,9 +7771,9 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.2" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" }, - "time": "2023-05-30T18:13:47+00:00" + "time": "2023-08-12T11:01:26+00:00" }, { "name": "phpoption/phpoption", @@ -7954,16 +7962,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.22.1", + "version": "1.23.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "65c39594fbd8c67abfc68bb323f86447bab79cc0" + "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/65c39594fbd8c67abfc68bb323f86447bab79cc0", - "reference": "65c39594fbd8c67abfc68bb323f86447bab79cc0", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/846ae76eef31c6d7790fac9bc399ecee45160b26", + "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26", "shasum": "" }, "require": { @@ -7995,9 +8003,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.22.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.23.1" }, - "time": "2023-06-29T20:46:06+00:00" + "time": "2023-08-03T16:32:59+00:00" }, { "name": "pragmarx/google2fa", @@ -8514,16 +8522,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.19", + "version": "v0.11.20", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "1724ceff278daeeac5a006744633bacbb2dc4706" + "reference": "0fa27040553d1d280a67a4393194df5228afea5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1724ceff278daeeac5a006744633bacbb2dc4706", - "reference": "1724ceff278daeeac5a006744633bacbb2dc4706", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/0fa27040553d1d280a67a4393194df5228afea5b", + "reference": "0fa27040553d1d280a67a4393194df5228afea5b", "shasum": "" }, "require": { @@ -8584,9 +8592,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.19" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.20" }, - "time": "2023-07-15T19:42:19+00:00" + "time": "2023-07-31T14:32:22+00:00" }, { "name": "pusher/pusher-php-server", @@ -9207,16 +9215,16 @@ }, { "name": "sentry/sentry", - "version": "3.20.1", + "version": "3.21.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "644ad9768c18139a80ac510090fad000d9ffd8a4" + "reference": "624aafc22b84b089ffa43b71fb01e0096505ec4f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/644ad9768c18139a80ac510090fad000d9ffd8a4", - "reference": "644ad9768c18139a80ac510090fad000d9ffd8a4", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/624aafc22b84b089ffa43b71fb01e0096505ec4f", + "reference": "624aafc22b84b089ffa43b71fb01e0096505ec4f", "shasum": "" }, "require": { @@ -9260,11 +9268,6 @@ "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.13.x-dev" - } - }, "autoload": { "files": [ "src/functions.php" @@ -9296,7 +9299,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.20.1" + "source": "https://github.com/getsentry/sentry-php/tree/3.21.0" }, "funding": [ { @@ -9308,20 +9311,20 @@ "type": "custom" } ], - "time": "2023-06-26T11:01:40+00:00" + "time": "2023-07-31T15:31:24+00:00" }, { "name": "sentry/sentry-laravel", - "version": "3.6.1", + "version": "3.7.3", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "eb94a52b88794d0c108dc46ca1a680531c3a8bad" + "reference": "2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/eb94a52b88794d0c108dc46ca1a680531c3a8bad", - "reference": "eb94a52b88794d0c108dc46ca1a680531c3a8bad", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf", + "reference": "2aee4ad217be8ef04ffcde6e9f7dd17af5a3b0bf", "shasum": "" }, "require": { @@ -9329,7 +9332,7 @@ "nyholm/psr7": "^1.0", "php": "^7.2 | ^8.0", "sentry/sdk": "^3.4", - "sentry/sentry": "^3.20", + "sentry/sentry": "^3.20.1", "symfony/psr-http-message-bridge": "^1.0 | ^2.0" }, "require-dev": { @@ -9337,6 +9340,7 @@ "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", "mockery/mockery": "^1.3", "orchestra/testbench": "^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0", + "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^8.4 | ^9.3" }, "type": "library", @@ -9386,7 +9390,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/3.6.1" + "source": "https://github.com/getsentry/sentry-laravel/tree/3.7.3" }, "funding": [ { @@ -9398,7 +9402,7 @@ "type": "custom" } ], - "time": "2023-07-04T10:30:42+00:00" + "time": "2023-08-03T10:10:23+00:00" }, { "name": "setasign/fpdf", @@ -9448,16 +9452,16 @@ }, { "name": "setasign/fpdi", - "version": "v2.3.7", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/Setasign/FPDI.git", - "reference": "bccc892d5fa1f48c43f8ba7db5ed4ba6f30c8c05" + "reference": "f4ba73e5bc053ccc90b81717c5df1cb2ea7bae7b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDI/zipball/bccc892d5fa1f48c43f8ba7db5ed4ba6f30c8c05", - "reference": "bccc892d5fa1f48c43f8ba7db5ed4ba6f30c8c05", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/f4ba73e5bc053ccc90b81717c5df1cb2ea7bae7b", + "reference": "f4ba73e5bc053ccc90b81717c5df1cb2ea7bae7b", "shasum": "" }, "require": { @@ -9470,7 +9474,7 @@ "require-dev": { "phpunit/phpunit": "~5.7", "setasign/fpdf": "~1.8", - "setasign/tfpdf": "1.31", + "setasign/tfpdf": "~1.31", "squizlabs/php_codesniffer": "^3.5", "tecnickcom/tcpdf": "~6.2" }, @@ -9508,7 +9512,7 @@ ], "support": { "issues": "https://github.com/Setasign/FPDI/issues", - "source": "https://github.com/Setasign/FPDI/tree/v2.3.7" + "source": "https://github.com/Setasign/FPDI/tree/v2.4.1" }, "funding": [ { @@ -9516,7 +9520,7 @@ "type": "tidelift" } ], - "time": "2023-02-09T10:38:43+00:00" + "time": "2023-07-27T08:12:09+00:00" }, { "name": "shopify/shopify-api", @@ -9583,16 +9587,16 @@ }, { "name": "smalot/pdfparser", - "version": "v2.5.0", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/smalot/pdfparser.git", - "reference": "9094d7777aeaa7d8a0a845b352f7dfe4a8baced3" + "reference": "eef0263bbaec86d30801d3551ac83f4e1015d4c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smalot/pdfparser/zipball/9094d7777aeaa7d8a0a845b352f7dfe4a8baced3", - "reference": "9094d7777aeaa7d8a0a845b352f7dfe4a8baced3", + "url": "https://api.github.com/repos/smalot/pdfparser/zipball/eef0263bbaec86d30801d3551ac83f4e1015d4c3", + "reference": "eef0263bbaec86d30801d3551ac83f4e1015d4c3", "shasum": "" }, "require": { @@ -9628,9 +9632,9 @@ ], "support": { "issues": "https://github.com/smalot/pdfparser/issues", - "source": "https://github.com/smalot/pdfparser/tree/v2.5.0" + "source": "https://github.com/smalot/pdfparser/tree/v2.7.0" }, - "time": "2023-04-24T07:00:49+00:00" + "time": "2023-08-10T06:11:26+00:00" }, { "name": "socialiteproviders/apple", @@ -9830,16 +9834,16 @@ }, { "name": "spatie/laravel-data", - "version": "3.7.0", + "version": "3.8.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "a975123d86e0133a361ac225d17acb3d11aa351f" + "reference": "7ead3d8f761846185a94d06e584bfe17e43b9239" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/a975123d86e0133a361ac225d17acb3d11aa351f", - "reference": "a975123d86e0133a361ac225d17acb3d11aa351f", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/7ead3d8f761846185a94d06e584bfe17e43b9239", + "reference": "7ead3d8f761846185a94d06e584bfe17e43b9239", "shasum": "" }, "require": { @@ -9901,7 +9905,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/3.7.0" + "source": "https://github.com/spatie/laravel-data/tree/3.8.1" }, "funding": [ { @@ -9909,20 +9913,20 @@ "type": "github" } ], - "time": "2023-07-05T11:45:14+00:00" + "time": "2023-08-11T11:59:07+00:00" }, { "name": "spatie/laravel-package-tools", - "version": "1.15.0", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "efab1844b8826443135201c4443690f032c3d533" + "reference": "38fe533e93f86a1b2fb1000bf7df09c4748e6458" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/efab1844b8826443135201c4443690f032c3d533", - "reference": "efab1844b8826443135201c4443690f032c3d533", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/38fe533e93f86a1b2fb1000bf7df09c4748e6458", + "reference": "38fe533e93f86a1b2fb1000bf7df09c4748e6458", "shasum": "" }, "require": { @@ -9961,7 +9965,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.15.0" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.0" }, "funding": [ { @@ -9969,7 +9973,7 @@ "type": "github" } ], - "time": "2023-04-27T08:09:01+00:00" + "time": "2023-08-09T14:08:04+00:00" }, { "name": "sprain/swiss-qr-bill", @@ -10150,16 +10154,16 @@ }, { "name": "symfony/console", - "version": "v6.3.0", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7" + "reference": "aa5d64ad3f63f2e48964fc81ee45cb318a723898" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", - "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", + "url": "https://api.github.com/repos/symfony/console/zipball/aa5d64ad3f63f2e48964fc81ee45cb318a723898", + "reference": "aa5d64ad3f63f2e48964fc81ee45cb318a723898", "shasum": "" }, "require": { @@ -10220,7 +10224,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.3.0" + "source": "https://github.com/symfony/console/tree/v6.3.2" }, "funding": [ { @@ -10236,20 +10240,20 @@ "type": "tidelift" } ], - "time": "2023-05-29T12:49:39+00:00" + "time": "2023-07-19T20:17:28+00:00" }, { "name": "symfony/css-selector", - "version": "v6.3.0", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "88453e64cd86c5b60e8d2fb2c6f953bbc353ffbf" + "reference": "883d961421ab1709877c10ac99451632a3d6fa57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/88453e64cd86c5b60e8d2fb2c6f953bbc353ffbf", - "reference": "88453e64cd86c5b60e8d2fb2c6f953bbc353ffbf", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57", "shasum": "" }, "require": { @@ -10285,7 +10289,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.3.0" + "source": "https://github.com/symfony/css-selector/tree/v6.3.2" }, "funding": [ { @@ -10301,7 +10305,7 @@ "type": "tidelift" } ], - "time": "2023-03-20T16:43:42+00:00" + "time": "2023-07-12T16:00:22+00:00" }, { "name": "symfony/deprecation-contracts", @@ -10372,16 +10376,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.3.0", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "99d2d814a6351461af350ead4d963bd67451236f" + "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/99d2d814a6351461af350ead4d963bd67451236f", - "reference": "99d2d814a6351461af350ead4d963bd67451236f", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/85fd65ed295c4078367c784e8a5a6cee30348b7a", + "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a", "shasum": "" }, "require": { @@ -10426,7 +10430,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.3.0" + "source": "https://github.com/symfony/error-handler/tree/v6.3.2" }, "funding": [ { @@ -10442,20 +10446,20 @@ "type": "tidelift" } ], - "time": "2023-05-10T12:03:13+00:00" + "time": "2023-07-16T17:05:46+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.3.0", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa" + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", - "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "shasum": "" }, "require": { @@ -10506,7 +10510,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" }, "funding": [ { @@ -10522,7 +10526,7 @@ "type": "tidelift" } ], - "time": "2023-04-21T14:41:17+00:00" + "time": "2023-07-06T06:56:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -10665,16 +10669,16 @@ }, { "name": "symfony/finder", - "version": "v6.3.0", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2" + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d9b01ba073c44cef617c7907ce2419f8d00d75e2", - "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", "shasum": "" }, "require": { @@ -10709,7 +10713,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.0" + "source": "https://github.com/symfony/finder/tree/v6.3.3" }, "funding": [ { @@ -10725,20 +10729,20 @@ "type": "tidelift" } ], - "time": "2023-04-02T01:25:41+00:00" + "time": "2023-07-31T08:31:44+00:00" }, { "name": "symfony/http-client", - "version": "v6.3.1", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "1c828a06aef2f5eeba42026dfc532d4fc5406123" + "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/1c828a06aef2f5eeba42026dfc532d4fc5406123", - "reference": "1c828a06aef2f5eeba42026dfc532d4fc5406123", + "url": "https://api.github.com/repos/symfony/http-client/zipball/15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", + "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", "shasum": "" }, "require": { @@ -10801,7 +10805,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.3.1" + "source": "https://github.com/symfony/http-client/tree/v6.3.2" }, "funding": [ { @@ -10817,7 +10821,7 @@ "type": "tidelift" } ], - "time": "2023-06-24T11:51:27+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/http-client-contracts", @@ -10899,16 +10903,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.3.1", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e0ad0d153e1c20069250986cd9e9dd1ccebb0d66" + "reference": "43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e0ad0d153e1c20069250986cd9e9dd1ccebb0d66", - "reference": "e0ad0d153e1c20069250986cd9e9dd1ccebb0d66", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3", + "reference": "43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3", "shasum": "" }, "require": { @@ -10956,7 +10960,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.1" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.2" }, "funding": [ { @@ -10972,20 +10976,20 @@ "type": "tidelift" } ], - "time": "2023-06-24T11:51:27+00:00" + "time": "2023-07-23T21:58:39+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.3.1", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "161e16fd2e35fb4881a43bc8b383dfd5be4ac374" + "reference": "d3b567f0addf695e10b0c6d57564a9bea2e058ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/161e16fd2e35fb4881a43bc8b383dfd5be4ac374", - "reference": "161e16fd2e35fb4881a43bc8b383dfd5be4ac374", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d3b567f0addf695e10b0c6d57564a9bea2e058ee", + "reference": "d3b567f0addf695e10b0c6d57564a9bea2e058ee", "shasum": "" }, "require": { @@ -11069,7 +11073,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.3.1" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.3" }, "funding": [ { @@ -11085,20 +11089,20 @@ "type": "tidelift" } ], - "time": "2023-06-26T06:07:32+00:00" + "time": "2023-07-31T10:33:00+00:00" }, { "name": "symfony/intl", - "version": "v6.3.1", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "fdf4aff85fff2cc681cc45936b6b2a52731acc23" + "reference": "1f8cb145c869ed089a8531c51a6a4b31ed0b3c69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/fdf4aff85fff2cc681cc45936b6b2a52731acc23", - "reference": "fdf4aff85fff2cc681cc45936b6b2a52731acc23", + "url": "https://api.github.com/repos/symfony/intl/zipball/1f8cb145c869ed089a8531c51a6a4b31ed0b3c69", + "reference": "1f8cb145c869ed089a8531c51a6a4b31ed0b3c69", "shasum": "" }, "require": { @@ -11106,7 +11110,8 @@ }, "require-dev": { "symfony/filesystem": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0" + "symfony/finder": "^5.4|^6.0", + "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -11150,7 +11155,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.3.1" + "source": "https://github.com/symfony/intl/tree/v6.3.2" }, "funding": [ { @@ -11166,7 +11171,7 @@ "type": "tidelift" } ], - "time": "2023-06-21T12:08:28+00:00" + "time": "2023-07-20T07:43:09+00:00" }, { "name": "symfony/mailer", @@ -11250,16 +11255,16 @@ }, { "name": "symfony/mailgun-mailer", - "version": "v6.3.0", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "2fafefe8683a93155aceb6cca622c7cee2e27174" + "reference": "df371e42a4c2a78a28c8de910f96949040e308fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/2fafefe8683a93155aceb6cca622c7cee2e27174", - "reference": "2fafefe8683a93155aceb6cca622c7cee2e27174", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/df371e42a4c2a78a28c8de910f96949040e308fd", + "reference": "df371e42a4c2a78a28c8de910f96949040e308fd", "shasum": "" }, "require": { @@ -11299,7 +11304,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v6.3.0" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.3.2" }, "funding": [ { @@ -11315,24 +11320,25 @@ "type": "tidelift" } ], - "time": "2023-05-02T16:15:19+00:00" + "time": "2023-07-20T10:26:17+00:00" }, { "name": "symfony/mime", - "version": "v6.3.0", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad" + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", - "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", + "url": "https://api.github.com/repos/symfony/mime/zipball/9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -11341,7 +11347,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2" + "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -11350,7 +11356,7 @@ "symfony/dependency-injection": "^5.4|^6.0", "symfony/property-access": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "^6.2" + "symfony/serializer": "~6.2.13|^6.3.2" }, "type": "library", "autoload": { @@ -11382,7 +11388,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.0" + "source": "https://github.com/symfony/mime/tree/v6.3.3" }, "funding": [ { @@ -11398,7 +11404,7 @@ "type": "tidelift" } ], - "time": "2023-04-28T15:57:00+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/options-resolver", @@ -12442,16 +12448,16 @@ }, { "name": "symfony/process", - "version": "v6.3.0", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628" + "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8741e3ed7fe2e91ec099e02446fb86667a0f1628", - "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628", + "url": "https://api.github.com/repos/symfony/process/zipball/c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", + "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", "shasum": "" }, "require": { @@ -12483,7 +12489,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.3.0" + "source": "https://github.com/symfony/process/tree/v6.3.2" }, "funding": [ { @@ -12499,20 +12505,20 @@ "type": "tidelift" } ], - "time": "2023-05-19T08:06:44+00:00" + "time": "2023-07-12T16:00:22+00:00" }, { "name": "symfony/property-access", - "version": "v5.4.22", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "ffee082889586b5718347b291e04071f4d07b38f" + "reference": "0249e46f69e92049a488f39fcf531cb42c50caaa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/ffee082889586b5718347b291e04071f4d07b38f", - "reference": "ffee082889586b5718347b291e04071f4d07b38f", + "url": "https://api.github.com/repos/symfony/property-access/zipball/0249e46f69e92049a488f39fcf531cb42c50caaa", + "reference": "0249e46f69e92049a488f39fcf531cb42c50caaa", "shasum": "" }, "require": { @@ -12564,7 +12570,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.4.22" + "source": "https://github.com/symfony/property-access/tree/v5.4.26" }, "funding": [ { @@ -12580,7 +12586,7 @@ "type": "tidelift" } ], - "time": "2023-03-14T14:59:20+00:00" + "time": "2023-07-13T15:20:41+00:00" }, { "name": "symfony/property-info", @@ -12667,21 +12673,22 @@ }, { "name": "symfony/psr-http-message-bridge", - "version": "v2.2.0", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "28a732c05bbad801304ad5a5c674cf2970508993" + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/28a732c05bbad801304ad5a5c674cf2970508993", - "reference": "28a732c05bbad801304ad5a5c674cf2970508993", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/581ca6067eb62640de5ff08ee1ba6850a0ee472e", + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/http-message": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", "symfony/http-foundation": "^5.4 || ^6.0" }, "require-dev": { @@ -12700,7 +12707,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-main": "2.2-dev" + "dev-main": "2.3-dev" } }, "autoload": { @@ -12735,7 +12742,7 @@ ], "support": { "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.2.0" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.3.1" }, "funding": [ { @@ -12751,24 +12758,25 @@ "type": "tidelift" } ], - "time": "2023-04-21T08:40:19+00:00" + "time": "2023-07-26T11:53:26+00:00" }, { "name": "symfony/routing", - "version": "v6.3.1", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "d37ad1779c38b8eb71996d17dc13030dcb7f9cf5" + "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/d37ad1779c38b8eb71996d17dc13030dcb7f9cf5", - "reference": "d37ad1779c38b8eb71996d17dc13030dcb7f9cf5", + "url": "https://api.github.com/repos/symfony/routing/zipball/e7243039ab663822ff134fbc46099b5fdfa16f6a", + "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.12", @@ -12817,7 +12825,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.3.1" + "source": "https://github.com/symfony/routing/tree/v6.3.3" }, "funding": [ { @@ -12833,7 +12841,7 @@ "type": "tidelift" } ], - "time": "2023-06-05T15:30:22+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/service-contracts", @@ -12919,16 +12927,16 @@ }, { "name": "symfony/string", - "version": "v6.3.0", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" + "reference": "53d1a83225002635bca3482fcbf963001313fb68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", + "reference": "53d1a83225002635bca3482fcbf963001313fb68", "shasum": "" }, "require": { @@ -12985,7 +12993,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.0" + "source": "https://github.com/symfony/string/tree/v6.3.2" }, "funding": [ { @@ -13001,24 +13009,25 @@ "type": "tidelift" } ], - "time": "2023-03-21T21:06:29+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/translation", - "version": "v6.3.0", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f" + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/f72b2cba8f79dd9d536f534f76874b58ad37876f", - "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f", + "url": "https://api.github.com/repos/symfony/translation/zipball/3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, @@ -13079,7 +13088,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.3.0" + "source": "https://github.com/symfony/translation/tree/v6.3.3" }, "funding": [ { @@ -13095,7 +13104,7 @@ "type": "tidelift" } ], - "time": "2023-05-19T12:46:45+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/translation-contracts", @@ -13251,16 +13260,16 @@ }, { "name": "symfony/validator", - "version": "v6.3.1", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "1b71f43c62ee867ab08195ba6039a1bc3e6654dc" + "reference": "b0c4ecf17d39eee1edfecc92299a03b9f5d5220b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/1b71f43c62ee867ab08195ba6039a1bc3e6654dc", - "reference": "1b71f43c62ee867ab08195ba6039a1bc3e6654dc", + "url": "https://api.github.com/repos/symfony/validator/zipball/b0c4ecf17d39eee1edfecc92299a03b9f5d5220b", + "reference": "b0c4ecf17d39eee1edfecc92299a03b9f5d5220b", "shasum": "" }, "require": { @@ -13327,7 +13336,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.3.1" + "source": "https://github.com/symfony/validator/tree/v6.3.2" }, "funding": [ { @@ -13343,24 +13352,25 @@ "type": "tidelift" } ], - "time": "2023-06-21T12:08:28+00:00" + "time": "2023-07-26T17:39:03+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.1", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "c81268d6960ddb47af17391a27d222bd58cf0515" + "reference": "77fb4f2927f6991a9843633925d111147449ee7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c81268d6960ddb47af17391a27d222bd58cf0515", - "reference": "c81268d6960ddb47af17391a27d222bd58cf0515", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/77fb4f2927f6991a9843633925d111147449ee7a", + "reference": "77fb4f2927f6991a9843633925d111147449ee7a", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -13369,6 +13379,7 @@ "require-dev": { "ext-iconv": "*", "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" @@ -13409,7 +13420,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.1" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.3" }, "funding": [ { @@ -13425,24 +13436,25 @@ "type": "tidelift" } ], - "time": "2023-06-21T12:08:28+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/yaml", - "version": "v6.3.0", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "a9a8337aa641ef2aa39c3e028f9107ec391e5927" + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/a9a8337aa641ef2aa39c3e028f9107ec391e5927", - "reference": "a9a8337aa641ef2aa39c3e028f9107ec391e5927", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -13480,7 +13492,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.3.0" + "source": "https://github.com/symfony/yaml/tree/v6.3.3" }, "funding": [ { @@ -13496,7 +13508,7 @@ "type": "tidelift" } ], - "time": "2023-04-28T13:28:14+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -14232,16 +14244,16 @@ }, { "name": "barryvdh/laravel-debugbar", - "version": "v3.8.1", + "version": "v3.8.2", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "aff3235fecb4104203b1e62c32239c56530eee32" + "reference": "56a2dc1da9d3219164074713983eef68996386cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/aff3235fecb4104203b1e62c32239c56530eee32", - "reference": "aff3235fecb4104203b1e62c32239c56530eee32", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/56a2dc1da9d3219164074713983eef68996386cf", + "reference": "56a2dc1da9d3219164074713983eef68996386cf", "shasum": "" }, "require": { @@ -14300,7 +14312,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.8.1" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.8.2" }, "funding": [ { @@ -14312,7 +14324,7 @@ "type": "github" } ], - "time": "2023-02-21T14:21:02+00:00" + "time": "2023-07-26T04:57:49+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -15188,16 +15200,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.22.0", + "version": "v3.23.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3" + "reference": "35af3cbbacfa91e164b252a28ec0b644f1ed4e78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/92b019f6c8d79aa26349d0db7671d37440dc0ff3", - "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/35af3cbbacfa91e164b252a28ec0b644f1ed4e78", + "reference": "35af3cbbacfa91e164b252a28ec0b644f1ed4e78", "shasum": "" }, "require": { @@ -15273,7 +15285,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.22.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.23.0" }, "funding": [ { @@ -15281,7 +15293,7 @@ "type": "github" } ], - "time": "2023-07-16T23:08:06+00:00" + "time": "2023-08-14T12:27:35+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -15461,31 +15473,31 @@ }, { "name": "mockery/mockery", - "version": "1.6.4", + "version": "1.6.6", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "d1413755e26fe56a63455f7753221c86cbb88f66" + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/d1413755e26fe56a63455f7753221c86cbb88f66", - "reference": "d1413755e26fe56a63455f7753221c86cbb88f66", + "url": "https://api.github.com/repos/mockery/mockery/zipball/b8e0bb7d8c604046539c1115994632c74dcb361e", + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": ">=7.4,<8.3" + "php": ">=7.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3", + "phpunit/phpunit": "^8.5 || ^9.6.10", "psalm/plugin-phpunit": "^0.18.4", "symplify/easy-coding-standard": "^11.5.0", - "vimeo/psalm": "^5.13.1" + "vimeo/psalm": "^4.30" }, "type": "library", "autoload": { @@ -15542,7 +15554,7 @@ "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, - "time": "2023-07-19T15:51:02+00:00" + "time": "2023-08-09T00:03:52+00:00" }, { "name": "myclabs/deep-copy", @@ -15744,16 +15756,16 @@ }, { "name": "nunomaduro/larastan", - "version": "v2.6.3", + "version": "v2.6.4", "source": { "type": "git", "url": "https://github.com/nunomaduro/larastan.git", - "reference": "73e5be5f5c732212ce6ca77ffd2753a136f36a23" + "reference": "6c5e8820f3db6397546f3ce48520af9d312aed27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/73e5be5f5c732212ce6ca77ffd2753a136f36a23", - "reference": "73e5be5f5c732212ce6ca77ffd2753a136f36a23", + "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/6c5e8820f3db6397546f3ce48520af9d312aed27", + "reference": "6c5e8820f3db6397546f3ce48520af9d312aed27", "shasum": "" }, "require": { @@ -15816,7 +15828,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/larastan/issues", - "source": "https://github.com/nunomaduro/larastan/tree/v2.6.3" + "source": "https://github.com/nunomaduro/larastan/tree/v2.6.4" }, "funding": [ { @@ -15836,7 +15848,7 @@ "type": "patreon" } ], - "time": "2023-06-13T21:39:27+00:00" + "time": "2023-07-29T12:13:13+00:00" }, { "name": "openlss/lib-array2xml", @@ -16148,16 +16160,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.26", + "version": "1.10.29", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "5d660cbb7e1b89253a47147ae44044f49832351f" + "reference": "ee5d8f2d3977fb09e55603eee6fb53bdd76ee9c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5d660cbb7e1b89253a47147ae44044f49832351f", - "reference": "5d660cbb7e1b89253a47147ae44044f49832351f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ee5d8f2d3977fb09e55603eee6fb53bdd76ee9c1", + "reference": "ee5d8f2d3977fb09e55603eee6fb53bdd76ee9c1", "shasum": "" }, "require": { @@ -16206,20 +16218,20 @@ "type": "tidelift" } ], - "time": "2023-07-19T12:44:37+00:00" + "time": "2023-08-14T13:24:11+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", + "version": "9.2.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1", + "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1", "shasum": "" }, "require": { @@ -16275,7 +16287,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.27" }, "funding": [ { @@ -16283,7 +16296,7 @@ "type": "github" } ], - "time": "2023-03-06T12:58:08+00:00" + "time": "2023-07-26T13:44:30+00:00" }, { "name": "phpunit/php-file-iterator", @@ -17135,16 +17148,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -17187,7 +17200,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -17195,7 +17208,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -17657,16 +17670,16 @@ }, { "name": "spatie/flare-client-php", - "version": "1.4.1", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "943894c6a6b00501365ac0b91ae0dce56f2226fa" + "reference": "5f2c6a7a0d2c1d90c12559dc7828fd942911a544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/943894c6a6b00501365ac0b91ae0dce56f2226fa", - "reference": "943894c6a6b00501365ac0b91ae0dce56f2226fa", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/5f2c6a7a0d2c1d90c12559dc7828fd942911a544", + "reference": "5f2c6a7a0d2c1d90c12559dc7828fd942911a544", "shasum": "" }, "require": { @@ -17715,7 +17728,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.4.1" + "source": "https://github.com/spatie/flare-client-php/tree/1.4.2" }, "funding": [ { @@ -17723,7 +17736,7 @@ "type": "github" } ], - "time": "2023-07-06T09:29:49+00:00" + "time": "2023-07-28T08:07:24+00:00" }, { "name": "spatie/ignition", diff --git a/config/beacon.php b/config/beacon.php index 801fb16091e7..8fff666a8173 100644 --- a/config/beacon.php +++ b/config/beacon.php @@ -22,8 +22,8 @@ return [ */ 'batch' => true, - 'cache_connection' => 'sentinel-cache', - + 'cache_connection' => 'sentinel-cache', + // 'cache_connection' => 'cache', /* * The default key used to store * metrics for batching diff --git a/config/ninja.php b/config/ninja.php index a3d19b473f7d..233559f73bbf 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -15,8 +15,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION','5.6.30'), - 'app_tag' => env('APP_TAG','5.6.30'), + 'app_version' => env('APP_VERSION','5.6.31'), + 'app_tag' => env('APP_TAG','5.6.31'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', ''), diff --git a/lang/en/texts.php b/lang/en/texts.php index f9d8f3821afb..ba7b3f4085fb 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5101,7 +5101,7 @@ $LANG = array( 'certificate_passphrase' => 'Certificate Passphrase', 'valid_vat_number' => 'Valid VAT Number', 'react_notification_link' => 'React Notification Links', - 'react_notification_link_help' => 'Admin emails will contain links to the react application', + 'react_notification_link_help' => 'Admin emails will contain links to the react application', 'show_task_billable' => 'Show Task Billable', 'credit_item' => 'Credit Item', 'drop_file_here' => 'Drop file here', @@ -5109,7 +5109,7 @@ $LANG = array( 'camera' => 'Camera', 'gallery' => 'Gallery', 'project_location' => 'Project Location', - 'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments', + 'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments', 'lang_Hungarian' => 'Hungarian', 'use_mobile_to_manage_plan' => 'Use your phone subscription settings to manage your plan', 'item_tax3' => 'Item Tax3', @@ -5125,7 +5125,7 @@ $LANG = array( 'lang_French - Swiss' => 'French - Swiss', 'currency_swazi_lilangeni' => 'Swazi Lilangeni', 'income' => 'Income', - 'amount_received_help' => 'Enter a value here if the total amount received was MORE than the invoice amount, or when recording a payment with no invoices. Otherwise this field should be left blank.', + 'amount_received_help' => 'Enter a value here if the total amount received was MORE than the invoice amount, or when recording a payment with no invoices. Otherwise this field should be left blank.', 'vendor_phone' => 'Vendor Phone', 'mercado_pago' => 'Mercado Pago', 'mybank' => 'MyBank', @@ -5143,6 +5143,7 @@ $LANG = array( 'is_tax_exempt' => 'Tax Exempt', 'drop_files_here' => 'Drop files here', 'upload_files' => 'Upload Files', + 'download_e_invoice' => 'Download E-Invoice', 'triangular_tax_info' => 'Intra-community triangular transaction', 'intracommunity_tax_info' => 'Tax-free intra-community delivery', 'reverse_tax_info' => 'Please note that this supply is subject to reverse charge', diff --git a/phpstan.neon b/phpstan.neon index 92bb5444400e..6bc4f9205594 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -8,19 +8,18 @@ parameters: excludePaths: - 'vendor/' - 'app/Jobs/Ninja/*' + - 'app/Models/Presenters/*' - 'app/Console/Commands/*' - 'app/DataMapper/Analytics/*' - 'app/PaymentDrivers/Authorize/*' - 'app/Utils/Traits/*' + - 'resources/views/*' universalObjectCratesClasses: - App\DataMapper\Tax\RuleInterface - App\DataMapper\FeesAndLimits reportUnmatchedIgnoredErrors: false ignoreErrors: - - '#Call to an undefined method [a-zA-Z0-9\\_]+::company\(\)#' - - '#Call to an undefined method [a-zA-Z0-9\\_]+::entityFilter\(\)#' - - '#Call to an undefined method [a-zA-Z0-9\\_]+::exclude\(\)#' - '#Array has 2 duplicate keys with value#' - - '#Undefined method#' + - '#Call to an undefined method#' - '#makeHidden#' - '#Socialite#' \ No newline at end of file diff --git a/resources/views/email/admin/stripe_connect_failed.blade.php b/resources/views/email/admin/stripe_connect_failed.blade.php new file mode 100644 index 000000000000..aba251b4892f --- /dev/null +++ b/resources/views/email/admin/stripe_connect_failed.blade.php @@ -0,0 +1,59 @@ +@component('email.template.admin', ['design' => 'light', 'settings' => $settings, 'logo' => $logo]) +
+ @isset($greeting) +

{{ $greeting }}

+ @endisset + + @isset($title) +

{{ $title }}

+ @endisset + + @isset($h2) +

{{ $title }}

+ @endisset + +
+ @isset($body) + {!! $body !!} + @endisset + + @isset($slot) + {{ $slot }} + @endisset +
+ + @isset($additional_info) +

{{ $additional_info }}

+ @endisset + + @isset($url) + + + + + + + +
+ + {{ ctrans($button) }} + +
+ + + + @endisset + + @isset($signature) +

{!! nl2br($signature) !!}

+ @endisset +
+@endcomponent diff --git a/resources/views/email/admin/stripe_connect_failed_text.blade.php b/resources/views/email/admin/stripe_connect_failed_text.blade.php new file mode 100644 index 000000000000..319daf0679d0 --- /dev/null +++ b/resources/views/email/admin/stripe_connect_failed_text.blade.php @@ -0,0 +1,5 @@ +{!! $title !!} + +{!! $text_body !!} + +{!! $url !!} \ No newline at end of file diff --git a/resources/views/portal/ninja2020/components/livewire/pdf-slot.blade.php b/resources/views/portal/ninja2020/components/livewire/pdf-slot.blade.php index 1e45ef9b2871..d15f748c6e23 100644 --- a/resources/views/portal/ninja2020/components/livewire/pdf-slot.blade.php +++ b/resources/views/portal/ninja2020/components/livewire/pdf-slot.blade.php @@ -1,5 +1,5 @@
-
+
+ @if($settings->enable_e_invoice && $entity_type == 'invoice') + + @endif