diff --git a/app/Domains/CostUnit/Controllers/ExportController.php b/app/Domains/CostUnit/Controllers/ExportController.php
new file mode 100644
index 0000000..a473033
--- /dev/null
+++ b/app/Domains/CostUnit/Controllers/ExportController.php
@@ -0,0 +1,110 @@
+costUnits->getById($costUnitId);
+
+ $invoicesForExport = $this->invoices->getByStatus($costUnit, InvoiceStatus::INVOICE_STATUS_APPROVED, false);
+
+ $webdavProvider = new WebDavProvider(WebDavProvider::INVOICE_PREFIX . $this->tenant->url . '/' . $costUnit->name);
+
+ $painFileData = $this->painData($invoicesForExport);
+ $csvData = $this->csvData($invoicesForExport);
+
+ $filePrefix = Tenant::getTempDirectory();
+
+ $painFileWriteProvider = new FileWriteProvider($filePrefix . 'abrechnungen-' . date('Y-m-d_H-i') . '-sepa.xml', $painFileData);
+ $painFileWriteProvider->writeToFile();
+
+ $csvFileWriteProvider = new FileWriteProvider($filePrefix . 'abrechnungen-' . date('Y-m-d_H-i') . '.csv', $csvData);
+ $csvFileWriteProvider->writeToFile();
+
+ if ($this->tenant->upload_exports) {
+ $webdavProvider->uploadFile($painFileWriteProvider->fileName);
+ $webdavProvider->uploadFile($csvFileWriteProvider->fileName);
+ }
+
+ $downloadZipArchiveFiles = [
+ $painFileWriteProvider->fileName,
+ $csvFileWriteProvider->fileName
+ ];
+
+ foreach ($invoicesForExport as $invoice) {
+ $changeStatusRequest = new ChangeStatusRequest($invoice, InvoiceStatus::INVOICE_STATUS_EXPORTED);
+ $changeStatusCommand = new ChangeStatusCommand($changeStatusRequest);
+ $changeStatusCommand->execute();
+
+ if ($this->tenant->download_exports) {
+ $createInvoiceReceiptRequest = new CreateInvoiceReceiptRequest($invoice);
+ $createInvoiceReceiptCommand = new CreateInvoiceReceiptCommand($createInvoiceReceiptRequest);
+ $response = $createInvoiceReceiptCommand->execute();
+
+ $downloadZipArchiveFiles[] = $response->fileName;
+ }
+ }
+
+ if ($this->tenant->download_exports) {
+ $zipFile = Tenant::getTempDirectory() . 'Abrechnungen-' . $costUnit->name . '.zip';
+ $zipFileProvider = new ZipArchiveFileProvider($zipFile);
+ foreach ($downloadZipArchiveFiles as $file) {
+ $zipFileProvider->addFile($file);
+ }
+
+ $zipFileProvider->create();
+ foreach ($downloadZipArchiveFiles as $file) {
+ Storage::delete($file);
+ }
+
+ Storage::delete($painFileWriteProvider->fileName);
+ Storage::delete($csvFileWriteProvider->fileName);
+
+ return response()->download(
+ storage_path('app/private/' . $zipFile),
+ basename($zipFile),
+ ['Content-Type' => 'application/zip']
+ );
+ }
+
+ Storage::delete($painFileWriteProvider->fileName);
+ Storage::delete($csvFileWriteProvider->fileName);
+ return response()->json([
+ 'message' => 'Die Abrechnungen wurden exportiert.' . PHP_EOL .'Die Belege werden asynchron auf dem Webdav-Server hinterlegt.' . PHP_EOL . PHP_EOL . 'Sollten diese in 15 Minuten nicht vollständig sein, kontaktiere den Adminbistrator.'
+ ]);
+
+ }
+
+ private function painData(array $invoices) : string {
+ $invoicesForPainFile = [];
+ foreach ($invoices as $invoice) {
+ if ($invoice->contact_bank_owner !== null && $invoice->contact_bank_iban !== '' && !$invoice->donation) {
+ $invoicesForPainFile[] = $invoice;
+ }
+ }
+
+ $painFileProvider = new PainFileProvider($this->tenant->account_iban, $this->tenant->account_name, $this->tenant->account_bic, $invoicesForPainFile);
+ return $painFileProvider->createPainFileContent();
+ }
+
+ public function csvData(array $invoices) : string {
+ $csvDateProvider = new InvoiceCsvFileProvider($invoices);
+ return $csvDateProvider->createCsvFileContent();
+ }
+}
+
diff --git a/app/Domains/CostUnit/Routes/api.php b/app/Domains/CostUnit/Routes/api.php
index 2461809..76781e1 100644
--- a/app/Domains/CostUnit/Routes/api.php
+++ b/app/Domains/CostUnit/Routes/api.php
@@ -3,6 +3,7 @@ use App\Domains\CostUnit\Controllers\ChangeStateController;
use App\Domains\CostUnit\Controllers\CreateController;
use App\Domains\CostUnit\Controllers\DistanceAllowanceController;
use App\Domains\CostUnit\Controllers\EditController;
+use App\Domains\CostUnit\Controllers\ExportController;
use App\Domains\CostUnit\Controllers\ListController;
use App\Domains\CostUnit\Controllers\OpenController;
use App\Domains\CostUnit\Controllers\TreasurersEditController;
@@ -37,6 +38,7 @@ Route::prefix('api/v1')
Route::get('/treasurers', TreasurersEditController::class);
Route::post('/treasurers', [TreasurersEditController::class, 'update']);
+ Route::get('/export-payouts', ExportController::class);
});
diff --git a/app/Domains/CostUnit/Views/Partials/ListCostUnits.vue b/app/Domains/CostUnit/Views/Partials/ListCostUnits.vue
index 8e88874..03099fb 100644
--- a/app/Domains/CostUnit/Views/Partials/ListCostUnits.vue
+++ b/app/Domains/CostUnit/Views/Partials/ListCostUnits.vue
@@ -1,19 +1,11 @@
@@ -176,7 +168,7 @@ async function export_payouts(cost_unit_id) {
-
+
@@ -217,17 +209,10 @@ async function export_payouts(cost_unit_id) {
-
-
-
-
-
-
+
-
-
@@ -236,7 +221,7 @@ async function export_payouts(cost_unit_id) {
-
+
diff --git a/composer.json b/composer.json
index e7da8ea..6c221a6 100644
--- a/composer.json
+++ b/composer.json
@@ -9,7 +9,10 @@
"php": "^8.5",
"inertiajs/inertia-laravel": "^2.0",
"laravel/framework": "^12.0",
- "laravel/tinker": "^2.10.1"
+ "laravel/tinker": "^2.10.1",
+ "ext-dom": "*",
+ "contelli/webdav-sync": "^1.0",
+ "ext-zip": "*"
},
"require-dev": {
"fakerphp/faker": "^1.23",
@@ -18,7 +21,11 @@
"laravel/sail": "^1.41",
"mockery/mockery": "^1.6",
"nunomaduro/collision": "^8.6",
- "phpunit/phpunit": "^11.5.3"
+ "phpunit/phpunit": "^11.5.3",
+ "dompdf/dompdf": "^3.0",
+ "setasign/fpdf": "^1.8",
+ "setasign/fpdi": "^2.6",
+ "maennchen/zipstream-php": "^3.1"
},
"autoload": {
"psr-4": {
diff --git a/composer.lock b/composer.lock
index 13f363a..31bec50 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "587caff9de06de75c1e22cceac366334",
+ "content-hash": "19f52629617de390dc3e1aa33f8cd050",
"packages": [
{
"name": "brick/math",
- "version": "0.14.1",
+ "version": "0.14.8",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
- "reference": "f05858549e5f9d7bb45875a75583240a38a281d0"
+ "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/brick/math/zipball/f05858549e5f9d7bb45875a75583240a38a281d0",
- "reference": "f05858549e5f9d7bb45875a75583240a38a281d0",
+ "url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629",
+ "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629",
"shasum": ""
},
"require": {
@@ -56,7 +56,7 @@
],
"support": {
"issues": "https://github.com/brick/math/issues",
- "source": "https://github.com/brick/math/tree/0.14.1"
+ "source": "https://github.com/brick/math/tree/0.14.8"
},
"funding": [
{
@@ -64,7 +64,7 @@
"type": "github"
}
],
- "time": "2025-11-24T14:40:29+00:00"
+ "time": "2026-02-10T14:33:43+00:00"
},
{
"name": "carbonphp/carbon-doctrine-types",
@@ -135,6 +135,52 @@
],
"time": "2024-02-09T16:56:22+00:00"
},
+ {
+ "name": "contelli/webdav-sync",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/TiDSchi/webdav-sync.git",
+ "reference": "0b265fd23c6799ac298baeb39db61017e89b8345"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/TiDSchi/webdav-sync/zipball/0b265fd23c6799ac298baeb39db61017e89b8345",
+ "reference": "0b265fd23c6799ac298baeb39db61017e89b8345",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "WebDav\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Thomas Günther",
+ "email": "th.guenther@saale-mail.de",
+ "homepage": "https://github.com/TiDschi"
+ }
+ ],
+ "homepage": "https://github.com/TiDschi/webdav-sync",
+ "keywords": [
+ "WebDAV",
+ "lybrary",
+ "sync"
+ ],
+ "support": {
+ "issues": "https://github.com/TiDSchi/webdav-sync/issues",
+ "source": "https://github.com/TiDSchi/webdav-sync/tree/1.0.0"
+ },
+ "time": "2024-12-19T10:59:00+00:00"
+ },
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
@@ -1054,16 +1100,16 @@
},
{
"name": "inertiajs/inertia-laravel",
- "version": "v2.0.19",
+ "version": "v2.0.20",
"source": {
"type": "git",
"url": "https://github.com/inertiajs/inertia-laravel.git",
- "reference": "732a991342a0f82653a935440e2f3b9be1eb6f6e"
+ "reference": "02a719d1120378aed68053b5b2d35157140df50e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/732a991342a0f82653a935440e2f3b9be1eb6f6e",
- "reference": "732a991342a0f82653a935440e2f3b9be1eb6f6e",
+ "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/02a719d1120378aed68053b5b2d35157140df50e",
+ "reference": "02a719d1120378aed68053b5b2d35157140df50e",
"shasum": ""
},
"require": {
@@ -1118,22 +1164,22 @@
],
"support": {
"issues": "https://github.com/inertiajs/inertia-laravel/issues",
- "source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.19"
+ "source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.20"
},
- "time": "2026-01-13T15:29:20+00:00"
+ "time": "2026-02-13T11:53:06+00:00"
},
{
"name": "laravel/framework",
- "version": "v12.49.0",
+ "version": "v12.51.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "4bde4530545111d8bdd1de6f545fa8824039fcb5"
+ "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/4bde4530545111d8bdd1de6f545fa8824039fcb5",
- "reference": "4bde4530545111d8bdd1de6f545fa8824039fcb5",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/ce4de3feb211e47c4f959d309ccf8a2733b1bc16",
+ "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16",
"shasum": ""
},
"require": {
@@ -1342,34 +1388,34 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2026-01-28T03:40:49+00:00"
+ "time": "2026-02-10T18:20:19+00:00"
},
{
"name": "laravel/prompts",
- "version": "v0.3.11",
+ "version": "v0.3.13",
"source": {
"type": "git",
"url": "https://github.com/laravel/prompts.git",
- "reference": "dd2a2ed95acacbcccd32fd98dee4c946ae7a7217"
+ "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/prompts/zipball/dd2a2ed95acacbcccd32fd98dee4c946ae7a7217",
- "reference": "dd2a2ed95acacbcccd32fd98dee4c946ae7a7217",
+ "url": "https://api.github.com/repos/laravel/prompts/zipball/ed8c466571b37e977532fb2fd3c272c784d7050d",
+ "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d",
"shasum": ""
},
"require": {
"composer-runtime-api": "^2.2",
"ext-mbstring": "*",
"php": "^8.1",
- "symfony/console": "^6.2|^7.0"
+ "symfony/console": "^6.2|^7.0|^8.0"
},
"conflict": {
"illuminate/console": ">=10.17.0 <10.25.0",
"laravel/framework": ">=10.17.0 <10.25.0"
},
"require-dev": {
- "illuminate/collections": "^10.0|^11.0|^12.0",
+ "illuminate/collections": "^10.0|^11.0|^12.0|^13.0",
"mockery/mockery": "^1.5",
"pestphp/pest": "^2.3|^3.4|^4.0",
"phpstan/phpstan": "^1.12.28",
@@ -1399,33 +1445,33 @@
"description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": {
"issues": "https://github.com/laravel/prompts/issues",
- "source": "https://github.com/laravel/prompts/tree/v0.3.11"
+ "source": "https://github.com/laravel/prompts/tree/v0.3.13"
},
- "time": "2026-01-27T02:55:06+00:00"
+ "time": "2026-02-06T12:17:10+00:00"
},
{
"name": "laravel/serializable-closure",
- "version": "v2.0.8",
+ "version": "v2.0.9",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
- "reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b"
+ "reference": "8f631589ab07b7b52fead814965f5a800459cb3e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7581a4407012f5f53365e11bafc520fd7f36bc9b",
- "reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/8f631589ab07b7b52fead814965f5a800459cb3e",
+ "reference": "8f631589ab07b7b52fead814965f5a800459cb3e",
"shasum": ""
},
"require": {
"php": "^8.1"
},
"require-dev": {
- "illuminate/support": "^10.0|^11.0|^12.0",
+ "illuminate/support": "^10.0|^11.0|^12.0|^13.0",
"nesbot/carbon": "^2.67|^3.0",
"pestphp/pest": "^2.36|^3.0|^4.0",
"phpstan/phpstan": "^2.0",
- "symfony/var-dumper": "^6.2.0|^7.0.0"
+ "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0"
},
"type": "library",
"extra": {
@@ -1462,20 +1508,20 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
- "time": "2026-01-08T16:22:46+00:00"
+ "time": "2026-02-03T06:55:34+00:00"
},
{
"name": "laravel/tinker",
- "version": "v2.11.0",
+ "version": "v2.11.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/tinker.git",
- "reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468"
+ "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/tinker/zipball/3d34b97c9a1747a81a3fde90482c092bd8b66468",
- "reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468",
+ "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741",
+ "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741",
"shasum": ""
},
"require": {
@@ -1526,9 +1572,9 @@
],
"support": {
"issues": "https://github.com/laravel/tinker/issues",
- "source": "https://github.com/laravel/tinker/tree/v2.11.0"
+ "source": "https://github.com/laravel/tinker/tree/v2.11.1"
},
- "time": "2025-12-19T19:16:45+00:00"
+ "time": "2026-02-06T14:12:35+00:00"
},
{
"name": "league/commonmark",
@@ -2299,16 +2345,16 @@
},
{
"name": "nette/schema",
- "version": "v1.3.3",
+ "version": "v1.3.4",
"source": {
"type": "git",
"url": "https://github.com/nette/schema.git",
- "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004"
+ "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004",
- "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004",
+ "url": "https://api.github.com/repos/nette/schema/zipball/086497a2f34b82fede9b5a41cc8e131d087cd8f7",
+ "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7",
"shasum": ""
},
"require": {
@@ -2316,8 +2362,8 @@
"php": "8.1 - 8.5"
},
"require-dev": {
- "nette/tester": "^2.5.2",
- "phpstan/phpstan-nette": "^2.0@stable",
+ "nette/tester": "^2.6",
+ "phpstan/phpstan": "^2.0@stable",
"tracy/tracy": "^2.8"
},
"type": "library",
@@ -2358,22 +2404,22 @@
],
"support": {
"issues": "https://github.com/nette/schema/issues",
- "source": "https://github.com/nette/schema/tree/v1.3.3"
+ "source": "https://github.com/nette/schema/tree/v1.3.4"
},
- "time": "2025-10-30T22:57:59+00:00"
+ "time": "2026-02-08T02:54:00+00:00"
},
{
"name": "nette/utils",
- "version": "v4.1.1",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
- "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72"
+ "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/utils/zipball/c99059c0315591f1a0db7ad6002000288ab8dc72",
- "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72",
+ "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe",
+ "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe",
"shasum": ""
},
"require": {
@@ -2385,8 +2431,10 @@
},
"require-dev": {
"jetbrains/phpstorm-attributes": "^1.2",
+ "nette/phpstan-rules": "^1.0",
"nette/tester": "^2.5",
- "phpstan/phpstan-nette": "^2.0@stable",
+ "phpstan/extension-installer": "^1.4@stable",
+ "phpstan/phpstan": "^2.1@stable",
"tracy/tracy": "^2.9"
},
"suggest": {
@@ -2447,9 +2495,9 @@
],
"support": {
"issues": "https://github.com/nette/utils/issues",
- "source": "https://github.com/nette/utils/tree/v4.1.1"
+ "source": "https://github.com/nette/utils/tree/v4.1.3"
},
- "time": "2025-12-22T12:14:32+00:00"
+ "time": "2026-02-13T03:05:33+00:00"
},
{
"name": "nikic/php-parser",
@@ -3085,16 +3133,16 @@
},
{
"name": "psy/psysh",
- "version": "v0.12.18",
+ "version": "v0.12.20",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
- "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196"
+ "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ddff0ac01beddc251786fe70367cd8bbdb258196",
- "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/19678eb6b952a03b8a1d96ecee9edba518bb0373",
+ "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373",
"shasum": ""
},
"require": {
@@ -3158,9 +3206,9 @@
],
"support": {
"issues": "https://github.com/bobthecow/psysh/issues",
- "source": "https://github.com/bobthecow/psysh/tree/v0.12.18"
+ "source": "https://github.com/bobthecow/psysh/tree/v0.12.20"
},
- "time": "2025-12-17T14:35:46+00:00"
+ "time": "2026-02-11T15:05:28+00:00"
},
{
"name": "ralouphie/getallheaders",
@@ -6067,6 +6115,161 @@
}
],
"packages-dev": [
+ {
+ "name": "dompdf/dompdf",
+ "version": "v3.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dompdf/dompdf.git",
+ "reference": "db712c90c5b9868df3600e64e68da62e78a34623"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dompdf/dompdf/zipball/db712c90c5b9868df3600e64e68da62e78a34623",
+ "reference": "db712c90c5b9868df3600e64e68da62e78a34623",
+ "shasum": ""
+ },
+ "require": {
+ "dompdf/php-font-lib": "^1.0.0",
+ "dompdf/php-svg-lib": "^1.0.0",
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "masterminds/html5": "^2.0",
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "ext-gd": "*",
+ "ext-json": "*",
+ "ext-zip": "*",
+ "mockery/mockery": "^1.3",
+ "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11",
+ "squizlabs/php_codesniffer": "^3.5",
+ "symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0"
+ },
+ "suggest": {
+ "ext-gd": "Needed to process images",
+ "ext-gmagick": "Improves image processing performance",
+ "ext-imagick": "Improves image processing performance",
+ "ext-zlib": "Needed for pdf stream compression"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Dompdf\\": "src/"
+ },
+ "classmap": [
+ "lib/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1"
+ ],
+ "authors": [
+ {
+ "name": "The Dompdf Community",
+ "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md"
+ }
+ ],
+ "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
+ "homepage": "https://github.com/dompdf/dompdf",
+ "support": {
+ "issues": "https://github.com/dompdf/dompdf/issues",
+ "source": "https://github.com/dompdf/dompdf/tree/v3.1.4"
+ },
+ "time": "2025-10-29T12:43:30+00:00"
+ },
+ {
+ "name": "dompdf/php-font-lib",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dompdf/php-font-lib.git",
+ "reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a6e9a688a2a80016ac080b97be73d3e10c444c9a",
+ "reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11 || ^12"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "FontLib\\": "src/FontLib"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "The FontLib Community",
+ "homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md"
+ }
+ ],
+ "description": "A library to read, parse, export and make subsets of different types of font files.",
+ "homepage": "https://github.com/dompdf/php-font-lib",
+ "support": {
+ "issues": "https://github.com/dompdf/php-font-lib/issues",
+ "source": "https://github.com/dompdf/php-font-lib/tree/1.0.2"
+ },
+ "time": "2026-01-20T14:10:26+00:00"
+ },
+ {
+ "name": "dompdf/php-svg-lib",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dompdf/php-svg-lib.git",
+ "reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/8259ffb930817e72b1ff1caef5d226501f3dfeb1",
+ "reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^7.1 || ^8.0",
+ "sabberworm/php-css-parser": "^8.4 || ^9.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Svg\\": "src/Svg"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "The SvgLib Community",
+ "homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md"
+ }
+ ],
+ "description": "A library to read, parse and export to PDF SVG files.",
+ "homepage": "https://github.com/dompdf/php-svg-lib",
+ "support": {
+ "issues": "https://github.com/dompdf/php-svg-lib/issues",
+ "source": "https://github.com/dompdf/php-svg-lib/tree/1.0.2"
+ },
+ "time": "2026-01-02T16:01:13+00:00"
+ },
{
"name": "fakerphp/faker",
"version": "v1.24.1",
@@ -6254,37 +6457,38 @@
},
{
"name": "laravel/pail",
- "version": "v1.2.4",
+ "version": "v1.2.6",
"source": {
"type": "git",
"url": "https://github.com/laravel/pail.git",
- "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30"
+ "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/pail/zipball/49f92285ff5d6fc09816e976a004f8dec6a0ea30",
- "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30",
+ "url": "https://api.github.com/repos/laravel/pail/zipball/aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf",
+ "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
- "illuminate/console": "^10.24|^11.0|^12.0",
- "illuminate/contracts": "^10.24|^11.0|^12.0",
- "illuminate/log": "^10.24|^11.0|^12.0",
- "illuminate/process": "^10.24|^11.0|^12.0",
- "illuminate/support": "^10.24|^11.0|^12.0",
+ "illuminate/console": "^10.24|^11.0|^12.0|^13.0",
+ "illuminate/contracts": "^10.24|^11.0|^12.0|^13.0",
+ "illuminate/log": "^10.24|^11.0|^12.0|^13.0",
+ "illuminate/process": "^10.24|^11.0|^12.0|^13.0",
+ "illuminate/support": "^10.24|^11.0|^12.0|^13.0",
"nunomaduro/termwind": "^1.15|^2.0",
"php": "^8.2",
- "symfony/console": "^6.0|^7.0"
+ "symfony/console": "^6.0|^7.0|^8.0"
},
"require-dev": {
- "laravel/framework": "^10.24|^11.0|^12.0",
+ "laravel/framework": "^10.24|^11.0|^12.0|^13.0",
"laravel/pint": "^1.13",
- "orchestra/testbench-core": "^8.13|^9.17|^10.8",
+ "orchestra/testbench-core": "^8.13|^9.17|^10.8|^11.0",
"pestphp/pest": "^2.20|^3.0|^4.0",
"pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0",
"phpstan/phpstan": "^1.12.27",
- "symfony/var-dumper": "^6.3|^7.0"
+ "symfony/var-dumper": "^6.3|^7.0|^8.0",
+ "symfony/yaml": "^6.3|^7.0|^8.0"
},
"type": "library",
"extra": {
@@ -6329,20 +6533,20 @@
"issues": "https://github.com/laravel/pail/issues",
"source": "https://github.com/laravel/pail"
},
- "time": "2025-11-20T16:29:35+00:00"
+ "time": "2026-02-09T13:44:54+00:00"
},
{
"name": "laravel/pint",
- "version": "v1.27.0",
+ "version": "v1.27.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/pint.git",
- "reference": "c67b4195b75491e4dfc6b00b1c78b68d86f54c90"
+ "reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/pint/zipball/c67b4195b75491e4dfc6b00b1c78b68d86f54c90",
- "reference": "c67b4195b75491e4dfc6b00b1c78b68d86f54c90",
+ "url": "https://api.github.com/repos/laravel/pint/zipball/54cca2de13790570c7b6f0f94f37896bee4abcb5",
+ "reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5",
"shasum": ""
},
"require": {
@@ -6353,13 +6557,13 @@
"php": "^8.2.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^3.92.4",
- "illuminate/view": "^12.44.0",
- "larastan/larastan": "^3.8.1",
- "laravel-zero/framework": "^12.0.4",
+ "friendsofphp/php-cs-fixer": "^3.93.1",
+ "illuminate/view": "^12.51.0",
+ "larastan/larastan": "^3.9.2",
+ "laravel-zero/framework": "^12.0.5",
"mockery/mockery": "^1.6.12",
"nunomaduro/termwind": "^2.3.3",
- "pestphp/pest": "^3.8.4"
+ "pestphp/pest": "^3.8.5"
},
"bin": [
"builds/pint"
@@ -6396,32 +6600,32 @@
"issues": "https://github.com/laravel/pint/issues",
"source": "https://github.com/laravel/pint"
},
- "time": "2026-01-05T16:49:17+00:00"
+ "time": "2026-02-10T20:00:20+00:00"
},
{
"name": "laravel/sail",
- "version": "v1.52.0",
+ "version": "v1.53.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/sail.git",
- "reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3"
+ "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/sail/zipball/64ac7d8abb2dbcf2b76e61289451bae79066b0b3",
- "reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3",
+ "url": "https://api.github.com/repos/laravel/sail/zipball/e340eaa2bea9b99192570c48ed837155dbf24fbb",
+ "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb",
"shasum": ""
},
"require": {
- "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0",
- "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0",
- "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0",
+ "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0",
+ "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0",
+ "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0",
"php": "^8.0",
- "symfony/console": "^6.0|^7.0",
- "symfony/yaml": "^6.0|^7.0"
+ "symfony/console": "^6.0|^7.0|^8.0",
+ "symfony/yaml": "^6.0|^7.0|^8.0"
},
"require-dev": {
- "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0",
+ "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0",
"phpstan/phpstan": "^2.0"
},
"bin": [
@@ -6459,7 +6663,152 @@
"issues": "https://github.com/laravel/sail/issues",
"source": "https://github.com/laravel/sail"
},
- "time": "2026-01-01T02:46:03+00:00"
+ "time": "2026-02-06T12:16:02+00:00"
+ },
+ {
+ "name": "maennchen/zipstream-php",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/maennchen/ZipStream-PHP.git",
+ "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/682f1098a8fddbaf43edac2306a691c7ad508ec5",
+ "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "ext-zlib": "*",
+ "php-64bit": "^8.3"
+ },
+ "require-dev": {
+ "brianium/paratest": "^7.7",
+ "ext-zip": "*",
+ "friendsofphp/php-cs-fixer": "^3.86",
+ "guzzlehttp/guzzle": "^7.5",
+ "mikey179/vfsstream": "^1.6",
+ "php-coveralls/php-coveralls": "^2.5",
+ "phpunit/phpunit": "^12.0",
+ "vimeo/psalm": "^6.0"
+ },
+ "suggest": {
+ "guzzlehttp/psr7": "^2.4",
+ "psr/http-message": "^2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ZipStream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paul Duncan",
+ "email": "pabs@pablotron.org"
+ },
+ {
+ "name": "Jonatan Männchen",
+ "email": "jonatan@maennchen.ch"
+ },
+ {
+ "name": "Jesse Donat",
+ "email": "donatj@gmail.com"
+ },
+ {
+ "name": "András Kolesár",
+ "email": "kolesar@kolesar.hu"
+ }
+ ],
+ "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
+ "keywords": [
+ "stream",
+ "zip"
+ ],
+ "support": {
+ "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
+ "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/maennchen",
+ "type": "github"
+ }
+ ],
+ "time": "2025-12-10T09:58:31+00:00"
+ },
+ {
+ "name": "masterminds/html5",
+ "version": "2.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Masterminds/html5-php.git",
+ "reference": "fcf91eb64359852f00d921887b219479b4f21251"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251",
+ "reference": "fcf91eb64359852f00d921887b219479b4f21251",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Masterminds\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matt Butcher",
+ "email": "technosophos@gmail.com"
+ },
+ {
+ "name": "Matt Farina",
+ "email": "matt@mattfarina.com"
+ },
+ {
+ "name": "Asmir Mustafic",
+ "email": "goetas@gmail.com"
+ }
+ ],
+ "description": "An HTML5 parser and serializer.",
+ "homepage": "http://masterminds.github.io/html5-php",
+ "keywords": [
+ "HTML5",
+ "dom",
+ "html",
+ "parser",
+ "querypath",
+ "serializer",
+ "xml"
+ ],
+ "support": {
+ "issues": "https://github.com/Masterminds/html5-php/issues",
+ "source": "https://github.com/Masterminds/html5-php/tree/2.10.0"
+ },
+ "time": "2025-07-25T09:04:22+00:00"
},
{
"name": "mockery/mockery",
@@ -6913,28 +7262,28 @@
},
{
"name": "phpunit/php-file-iterator",
- "version": "5.1.0",
+ "version": "5.1.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6"
+ "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6",
- "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903",
+ "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903",
"shasum": ""
},
"require": {
"php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^11.0"
+ "phpunit/phpunit": "^11.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.0-dev"
+ "dev-main": "5.1-dev"
}
},
"autoload": {
@@ -6962,15 +7311,27 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
"security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
- "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0"
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator",
+ "type": "tidelift"
}
],
- "time": "2024-08-27T05:02:59+00:00"
+ "time": "2026-02-02T13:52:54+00:00"
},
{
"name": "phpunit/php-invoker",
@@ -7158,16 +7519,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "11.5.50",
+ "version": "11.5.53",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "fdfc727f0fcacfeb8fcb30c7e5da173125b58be3"
+ "reference": "a997a653a82845f1240d73ee73a8a4e97e4b0607"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fdfc727f0fcacfeb8fcb30c7e5da173125b58be3",
- "reference": "fdfc727f0fcacfeb8fcb30c7e5da173125b58be3",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a997a653a82845f1240d73ee73a8a4e97e4b0607",
+ "reference": "a997a653a82845f1240d73ee73a8a4e97e4b0607",
"shasum": ""
},
"require": {
@@ -7182,7 +7543,7 @@
"phar-io/version": "^3.2.1",
"php": ">=8.2",
"phpunit/php-code-coverage": "^11.0.12",
- "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-file-iterator": "^5.1.1",
"phpunit/php-invoker": "^5.0.1",
"phpunit/php-text-template": "^4.0.1",
"phpunit/php-timer": "^7.0.1",
@@ -7194,6 +7555,7 @@
"sebastian/exporter": "^6.3.2",
"sebastian/global-state": "^7.0.2",
"sebastian/object-enumerator": "^6.0.1",
+ "sebastian/recursion-context": "^6.0.3",
"sebastian/type": "^5.1.3",
"sebastian/version": "^5.0.2",
"staabm/side-effects-detector": "^1.0.5"
@@ -7239,7 +7601,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.50"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.53"
},
"funding": [
{
@@ -7263,7 +7625,81 @@
"type": "tidelift"
}
],
- "time": "2026-01-27T05:59:18+00:00"
+ "time": "2026-02-10T12:28:25+00:00"
+ },
+ {
+ "name": "sabberworm/php-css-parser",
+ "version": "v9.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git",
+ "reference": "1b363fdbdc6dd0ca0f4bf98d3a4d7f388133f1fb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/1b363fdbdc6dd0ca0f4bf98d3a4d7f388133f1fb",
+ "reference": "1b363fdbdc6dd0ca0f4bf98d3a4d7f388133f1fb",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": "^7.2.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0",
+ "thecodingmachine/safe": "^1.3 || ^2.5 || ^3.3"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "1.4.0",
+ "phpstan/extension-installer": "1.4.3",
+ "phpstan/phpstan": "1.12.28 || 2.1.25",
+ "phpstan/phpstan-phpunit": "1.4.2 || 2.0.7",
+ "phpstan/phpstan-strict-rules": "1.6.2 || 2.0.6",
+ "phpunit/phpunit": "8.5.46",
+ "rawr/phpunit-data-provider": "3.3.1",
+ "rector/rector": "1.2.10 || 2.1.7",
+ "rector/type-perfect": "1.0.0 || 2.1.0"
+ },
+ "suggest": {
+ "ext-mbstring": "for parsing UTF-8 CSS"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "9.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Sabberworm\\CSS\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Raphael Schweikert"
+ },
+ {
+ "name": "Oliver Klee",
+ "email": "github@oliverklee.de"
+ },
+ {
+ "name": "Jake Hotson",
+ "email": "jake.github@qzdesign.co.uk"
+ }
+ ],
+ "description": "Parser for CSS Files written in PHP",
+ "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser",
+ "keywords": [
+ "css",
+ "parser",
+ "stylesheet"
+ ],
+ "support": {
+ "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues",
+ "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v9.1.0"
+ },
+ "time": "2025-09-14T07:37:21+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -8251,6 +8687,120 @@
],
"time": "2024-10-09T05:16:32+00:00"
},
+ {
+ "name": "setasign/fpdf",
+ "version": "1.8.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Setasign/FPDF.git",
+ "reference": "d77904018090c17dc9f3ab6e944679a7a47e710a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Setasign/FPDF/zipball/d77904018090c17dc9f3ab6e944679a7a47e710a",
+ "reference": "d77904018090c17dc9f3ab6e944679a7a47e710a",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "fpdf.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Olivier Plathey",
+ "email": "oliver@fpdf.org",
+ "homepage": "http://fpdf.org/"
+ }
+ ],
+ "description": "FPDF is a PHP class which allows to generate PDF files with pure PHP. F from FPDF stands for Free: you may use it for any kind of usage and modify it to suit your needs.",
+ "homepage": "http://www.fpdf.org",
+ "keywords": [
+ "fpdf",
+ "pdf"
+ ],
+ "support": {
+ "source": "https://github.com/Setasign/FPDF/tree/1.8.2"
+ },
+ "time": "2019-12-08T10:32:10+00:00"
+ },
+ {
+ "name": "setasign/fpdi",
+ "version": "v2.6.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Setasign/FPDI.git",
+ "reference": "4b53852fde2734ec6a07e458a085db627c60eada"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Setasign/FPDI/zipball/4b53852fde2734ec6a07e458a085db627c60eada",
+ "reference": "4b53852fde2734ec6a07e458a085db627c60eada",
+ "shasum": ""
+ },
+ "require": {
+ "ext-zlib": "*",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "setasign/tfpdf": "<1.31"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7",
+ "setasign/fpdf": "~1.8.6",
+ "setasign/tfpdf": "~1.33",
+ "squizlabs/php_codesniffer": "^3.5",
+ "tecnickcom/tcpdf": "^6.8"
+ },
+ "suggest": {
+ "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "setasign\\Fpdi\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jan Slabon",
+ "email": "jan.slabon@setasign.com",
+ "homepage": "https://www.setasign.com"
+ },
+ {
+ "name": "Maximilian Kresse",
+ "email": "maximilian.kresse@setasign.com",
+ "homepage": "https://www.setasign.com"
+ }
+ ],
+ "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.",
+ "homepage": "https://www.setasign.com/fpdi",
+ "keywords": [
+ "fpdf",
+ "fpdi",
+ "pdf"
+ ],
+ "support": {
+ "issues": "https://github.com/Setasign/FPDI/issues",
+ "source": "https://github.com/Setasign/FPDI/tree/v2.6.4"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/setasign/fpdi",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-05T09:57:14+00:00"
+ },
{
"name": "staabm/side-effects-detector",
"version": "1.0.5",
@@ -8305,28 +8855,27 @@
},
{
"name": "symfony/yaml",
- "version": "v7.4.1",
+ "version": "v8.0.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "24dd4de28d2e3988b311751ac49e684d783e2345"
+ "reference": "7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345",
- "reference": "24dd4de28d2e3988b311751ac49e684d783e2345",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14",
+ "reference": "7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14",
"shasum": ""
},
"require": {
- "php": ">=8.2",
- "symfony/deprecation-contracts": "^2.5|^3",
+ "php": ">=8.4",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
- "symfony/console": "<6.4"
+ "symfony/console": "<7.4"
},
"require-dev": {
- "symfony/console": "^6.4|^7.0|^8.0"
+ "symfony/console": "^7.4|^8.0"
},
"bin": [
"Resources/bin/yaml-lint"
@@ -8357,7 +8906,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v7.4.1"
+ "source": "https://github.com/symfony/yaml/tree/v8.0.1"
},
"funding": [
{
@@ -8377,7 +8926,146 @@
"type": "tidelift"
}
],
- "time": "2025-12-04T18:11:45+00:00"
+ "time": "2025-12-04T18:17:06+00:00"
+ },
+ {
+ "name": "thecodingmachine/safe",
+ "version": "v3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thecodingmachine/safe.git",
+ "reference": "2cdd579eeaa2e78e51c7509b50cc9fb89a956236"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/2cdd579eeaa2e78e51c7509b50cc9fb89a956236",
+ "reference": "2cdd579eeaa2e78e51c7509b50cc9fb89a956236",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.4",
+ "phpstan/phpstan": "^2",
+ "phpunit/phpunit": "^10",
+ "squizlabs/php_codesniffer": "^3.2"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/special_cases.php",
+ "generated/apache.php",
+ "generated/apcu.php",
+ "generated/array.php",
+ "generated/bzip2.php",
+ "generated/calendar.php",
+ "generated/classobj.php",
+ "generated/com.php",
+ "generated/cubrid.php",
+ "generated/curl.php",
+ "generated/datetime.php",
+ "generated/dir.php",
+ "generated/eio.php",
+ "generated/errorfunc.php",
+ "generated/exec.php",
+ "generated/fileinfo.php",
+ "generated/filesystem.php",
+ "generated/filter.php",
+ "generated/fpm.php",
+ "generated/ftp.php",
+ "generated/funchand.php",
+ "generated/gettext.php",
+ "generated/gmp.php",
+ "generated/gnupg.php",
+ "generated/hash.php",
+ "generated/ibase.php",
+ "generated/ibmDb2.php",
+ "generated/iconv.php",
+ "generated/image.php",
+ "generated/imap.php",
+ "generated/info.php",
+ "generated/inotify.php",
+ "generated/json.php",
+ "generated/ldap.php",
+ "generated/libxml.php",
+ "generated/lzf.php",
+ "generated/mailparse.php",
+ "generated/mbstring.php",
+ "generated/misc.php",
+ "generated/mysql.php",
+ "generated/mysqli.php",
+ "generated/network.php",
+ "generated/oci8.php",
+ "generated/opcache.php",
+ "generated/openssl.php",
+ "generated/outcontrol.php",
+ "generated/pcntl.php",
+ "generated/pcre.php",
+ "generated/pgsql.php",
+ "generated/posix.php",
+ "generated/ps.php",
+ "generated/pspell.php",
+ "generated/readline.php",
+ "generated/rnp.php",
+ "generated/rpminfo.php",
+ "generated/rrd.php",
+ "generated/sem.php",
+ "generated/session.php",
+ "generated/shmop.php",
+ "generated/sockets.php",
+ "generated/sodium.php",
+ "generated/solr.php",
+ "generated/spl.php",
+ "generated/sqlsrv.php",
+ "generated/ssdeep.php",
+ "generated/ssh2.php",
+ "generated/stream.php",
+ "generated/strings.php",
+ "generated/swoole.php",
+ "generated/uodbc.php",
+ "generated/uopz.php",
+ "generated/url.php",
+ "generated/var.php",
+ "generated/xdiff.php",
+ "generated/xml.php",
+ "generated/xmlrpc.php",
+ "generated/yaml.php",
+ "generated/yaz.php",
+ "generated/zip.php",
+ "generated/zlib.php"
+ ],
+ "classmap": [
+ "lib/DateTime.php",
+ "lib/DateTimeImmutable.php",
+ "lib/Exceptions/",
+ "generated/Exceptions/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHP core functions that throw exceptions instead of returning FALSE on error",
+ "support": {
+ "issues": "https://github.com/thecodingmachine/safe/issues",
+ "source": "https://github.com/thecodingmachine/safe/tree/v3.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/OskarStark",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/shish",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/staabm",
+ "type": "github"
+ }
+ ],
+ "time": "2025-05-14T06:15:44+00:00"
},
{
"name": "theseer/tokenizer",
@@ -8436,7 +9124,9 @@
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
- "php": "^8.5"
+ "php": "^8.5",
+ "ext-dom": "*",
+ "ext-zip": "*"
},
"platform-dev": {},
"plugin-api-version": "2.9.0"
diff --git a/database/migrations/2026_01_30_140001_create_tenants.php b/database/migrations/2026_01_30_140001_create_tenants.php
index 10982f2..3cdcf41 100644
--- a/database/migrations/2026_01_30_140001_create_tenants.php
+++ b/database/migrations/2026_01_30_140001_create_tenants.php
@@ -12,9 +12,13 @@ return new class extends Migration {
$table->string('name');
$table->string('email');
$table->string('url');
+ $table->string('account_name');
$table->string('account_iban');
+ $table->string('account_bic');
$table->string('city');
$table->string('postcode');
+ $table->boolean('download_exports')->default(false);
+ $table->boolean('upload_exports')->default(true);
$table->string('gdpr_text')-> nullable();
$table->string('impress_text')->nullable();
$table->string('url_participation_rules')->nullable();
diff --git a/database/migrations/2026_01_30_140010_create_invoices.php b/database/migrations/2026_01_30_140010_create_invoices.php
index bc95432..8611ff9 100644
--- a/database/migrations/2026_01_30_140010_create_invoices.php
+++ b/database/migrations/2026_01_30_140010_create_invoices.php
@@ -38,7 +38,7 @@ return new class extends Migration {
$table->float('amount', 2);
$table->integer('distance')->nullable();
$table->string('comment')->nullable();
- $table->string('changes')->nullable();
+ $table->longText('changes')->nullable();
$table->string('travel_direction')->nullable();
$table->boolean('passengers')->nullable();
$table->boolean('transportation')->nullable();