From 0663995d06b318710e162aaed3361d8f117c1dca Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Tue, 6 Jun 2023 23:05:20 +0200 Subject: [PATCH] Release 2.0.25 (#4066) * added support for hourly rate column in detail table * allow to register icon in extension * allow to show QR code secret * new translations * bump theme and packages * fix validation for invoice-document-filenames with uppercase character * max upload size 1MB * fix last month in daterange-picker in certain situations, more years in quick-select * remove unused package-versions-deprecated * link preferences from contract warning message * added page_setup page layout * prevent DROP TABLE in addSQL() and replace drop table with schema call * added azuyalabs/yasumi --- composer.json | 6 +- composer.lock | 678 ++++++++++----------- config/packages/tabler.yaml | 1 + migrations/Version20210316224358.php | 2 +- phpstan.neon | 35 -- src/Constants.php | 4 +- src/Controller/ContractController.php | 4 +- src/Controller/DoctorController.php | 32 +- src/Controller/ProfileController.php | 1 + src/Customer/CustomerService.php | 14 + src/Doctrine/AbstractMigration.php | 16 + src/Entity/User.php | 7 +- src/Form/InvoiceDocumentUploadForm.php | 3 +- src/Form/Model/Configuration.php | 13 +- src/Form/Type/DateRangeType.php | 28 +- src/Plugin/AbstractPluginExtension.php | 11 + src/Timesheet/DateTimeFactory.php | 16 + src/Utils/DataTable.php | 2 +- src/Utils/PageSetup.php | 19 + symfony.lock | 3 - templates/contract/status.html.twig | 35 +- templates/datatable.html.twig | 4 + templates/export/pdf-layout.html.twig | 35 +- templates/form/blocks.html.twig | 5 +- templates/macros/datatables.html.twig | 1 + templates/page_setup.html.twig | 28 + templates/permission/edit_role.html.twig | 1 - templates/user/2fa.html.twig | 3 +- tests/Controller/ProfileControllerTest.php | 4 +- tests/Entity/UserTest.php | 5 + translations/actions.de.xlf | 8 + translations/actions.en.xlf | 8 + translations/messages.de.xlf | 32 + translations/messages.en.xlf | 32 + 34 files changed, 629 insertions(+), 467 deletions(-) create mode 100644 templates/page_setup.html.twig diff --git a/composer.json b/composer.json index efb09570..6fd224df 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,8 @@ "ext-xml": "*", "ext-xsl": "*", "ext-zip": "*", - "composer/package-versions-deprecated": "^1.8", + "composer-runtime-api": "^2.0", + "azuyalabs/yasumi": "^2.6", "composer/semver": "^3.3", "doctrine/doctrine-bundle": "^2.7", "doctrine/doctrine-migrations-bundle": "^3.0", @@ -34,7 +35,7 @@ "friendsofsymfony/rest-bundle": "^3.0", "gedmo/doctrine-extensions": "^3.6", "jms/serializer-bundle": "^5.0", - "kevinpapst/tabler-bundle": "^0.19", + "kevinpapst/tabler-bundle": "^0.20", "league/csv": "^9.4", "mpdf/mpdf": "^8.0", "nelmio/api-doc-bundle": "^4.0", @@ -104,7 +105,6 @@ ], "config": { "allow-plugins": { - "composer/package-versions-deprecated": true, "symfony/flex": true, "symfony/runtime": true }, diff --git a/composer.lock b/composer.lock index 5b19af8a..4d6d89d3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,82 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e99c671bcf2fcd2909aa81c5f4c24828", + "content-hash": "964ff2d76fe260ae39826660e6335625", "packages": [ + { + "name": "azuyalabs/yasumi", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/azuyalabs/yasumi.git", + "reference": "a73f198d796100c237adf94f3fca1d15eb82b22b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/azuyalabs/yasumi/zipball/a73f198d796100c237adf94f3fca1d15eb82b22b", + "reference": "a73f198d796100c237adf94f3fca1d15eb82b22b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.4" + }, + "require-dev": { + "ext-intl": "*", + "friendsofphp/php-cs-fixer": "^2.19 || ^3.16", + "infection/infection": "^0.17 || ^0.26", + "mikey179/vfsstream": "^1.6", + "phan/phan": "^5.4", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5 || ^9.6", + "vimeo/psalm": "^5.9" + }, + "suggest": { + "ext-calendar": "For calculating the date of Easter" + }, + "type": "library", + "autoload": { + "psr-4": { + "Yasumi\\": "src/Yasumi/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sacha Telgenhof", + "email": "me@sachatelgenhof.com", + "role": "Maintainer" + } + ], + "description": "The easy PHP Library for calculating holidays.", + "homepage": "https://www.yasumi.dev", + "keywords": [ + "Bank", + "calculation", + "calendar", + "celebration", + "date", + "holiday", + "holidays", + "national", + "time" + ], + "support": { + "docs": "https://www.yasumi.dev", + "issues": "https://github.com/azuyalabs/yasumi/issues", + "source": "https://github.com/azuyalabs/yasumi" + }, + "funding": [ + { + "url": "https://www.buymeacoffee.com/sachatelgenhof", + "type": "other" + } + ], + "time": "2023-04-26T15:35:45+00:00" + }, { "name": "bacon/bacon-qr-code", "version": "2.0.8", @@ -109,79 +183,6 @@ }, "time": "2022-03-30T09:27:43+00:00" }, - { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.5", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-01-17T14:14:24+00:00" - }, { "name": "composer/semver", "version": "3.3.2", @@ -661,16 +662,16 @@ }, { "name": "doctrine/dbal", - "version": "3.6.2", + "version": "3.6.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "b4bd1cfbd2b916951696d82e57d054394d84864c" + "reference": "9a747d29e7e6b39509b8f1847e37a23a0163ea6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b4bd1cfbd2b916951696d82e57d054394d84864c", - "reference": "b4bd1cfbd2b916951696d82e57d054394d84864c", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/9a747d29e7e6b39509b8f1847e37a23a0163ea6a", + "reference": "9a747d29e7e6b39509b8f1847e37a23a0163ea6a", "shasum": "" }, "require": { @@ -683,12 +684,12 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "11.1.0", + "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2022.3", - "phpstan/phpstan": "1.10.9", + "phpstan/phpstan": "1.10.14", "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.6", + "phpunit/phpunit": "9.6.7", "psalm/plugin-phpunit": "0.18.4", "squizlabs/php_codesniffer": "3.7.2", "symfony/cache": "^5.4|^6.0", @@ -753,7 +754,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.6.2" + "source": "https://github.com/doctrine/dbal/tree/3.6.3" }, "funding": [ { @@ -769,29 +770,33 @@ "type": "tidelift" } ], - "time": "2023-04-14T07:25:38+00:00" + "time": "2023-06-01T05:46:46+00:00" }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -810,9 +815,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" }, - "time": "2022-05-02T15:47:09+00:00" + "time": "2023-06-03T09:27:29+00:00" }, { "name": "doctrine/doctrine-bundle", @@ -932,16 +937,16 @@ }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.2.2", + "version": "3.2.4", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "3393f411ba25ade21969c33f2053220044854d01" + "reference": "94e6b0fe1a50901d52f59dbb9b4b0737718b2c1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/3393f411ba25ade21969c33f2053220044854d01", - "reference": "3393f411ba25ade21969c33f2053220044854d01", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/94e6b0fe1a50901d52f59dbb9b4b0737718b2c1e", + "reference": "94e6b0fe1a50901d52f59dbb9b4b0737718b2c1e", "shasum": "" }, "require": { @@ -951,15 +956,15 @@ "symfony/framework-bundle": "~3.4|~4.0|~5.0|~6.0" }, "require-dev": { - "doctrine/coding-standard": "^8.0", + "doctrine/coding-standard": "^9", "doctrine/orm": "^2.6", "doctrine/persistence": "^1.3||^2.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^8.0|^9.0", - "vimeo/psalm": "^4.11" + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5|^9.5", + "vimeo/psalm": "^4.22" }, "type": "symfony-bundle", "autoload": { @@ -997,7 +1002,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.2.2" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.2.4" }, "funding": [ { @@ -1013,7 +1018,7 @@ "type": "tidelift" } ], - "time": "2022-02-01T18:08:07+00:00" + "time": "2023-06-02T08:19:26+00:00" }, { "name": "doctrine/event-manager", @@ -1449,16 +1454,16 @@ }, { "name": "doctrine/orm", - "version": "2.15.1", + "version": "2.15.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "9bc6f5b4ac6f1e7d4248b2efbd01a748782075bc" + "reference": "bf449bef7ddc47e62c22f9a06dacc1736abe1c0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/9bc6f5b4ac6f1e7d4248b2efbd01a748782075bc", - "reference": "9bc6f5b4ac6f1e7d4248b2efbd01a748782075bc", + "url": "https://api.github.com/repos/doctrine/orm/zipball/bf449bef7ddc47e62c22f9a06dacc1736abe1c0b", + "reference": "bf449bef7ddc47e62c22f9a06dacc1736abe1c0b", "shasum": "" }, "require": { @@ -1544,9 +1549,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.15.1" + "source": "https://github.com/doctrine/orm/tree/2.15.2" }, - "time": "2023-05-07T18:56:25+00:00" + "time": "2023-06-01T09:35:50+00:00" }, { "name": "doctrine/persistence", @@ -2416,16 +2421,16 @@ }, { "name": "kevinpapst/tabler-bundle", - "version": "0.19", + "version": "0.20", "source": { "type": "git", "url": "https://github.com/kevinpapst/TablerBundle.git", - "reference": "8225d1f7f14f13c3fc7b1b570719da074c0235c3" + "reference": "ed21fc9b1ef0183781799f1f21cca11ceb29eb47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kevinpapst/TablerBundle/zipball/8225d1f7f14f13c3fc7b1b570719da074c0235c3", - "reference": "8225d1f7f14f13c3fc7b1b570719da074c0235c3", + "url": "https://api.github.com/repos/kevinpapst/TablerBundle/zipball/ed21fc9b1ef0183781799f1f21cca11ceb29eb47", + "reference": "ed21fc9b1ef0183781799f1f21cca11ceb29eb47", "shasum": "" }, "require": { @@ -2474,7 +2479,7 @@ "description": "Admin/Backend theme bundle for Symfony based on Tabler.io", "support": { "issues": "https://github.com/kevinpapst/TablerBundle/issues", - "source": "https://github.com/kevinpapst/TablerBundle/tree/0.19" + "source": "https://github.com/kevinpapst/TablerBundle/tree/0.20" }, "funding": [ { @@ -2486,7 +2491,7 @@ "type": "github" } ], - "time": "2023-05-25T17:54:25+00:00" + "time": "2023-05-30T16:33:49+00:00" }, { "name": "laminas/laminas-escaper", @@ -3781,16 +3786,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.7.1", + "version": "1.7.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "dfc078e8af9c99210337325ff5aa152872c98714" + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/dfc078e8af9c99210337325ff5aa152872c98714", - "reference": "dfc078e8af9c99210337325ff5aa152872c98714", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d", + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d", "shasum": "" }, "require": { @@ -3833,9 +3838,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.1" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.2" }, - "time": "2023-03-27T19:02:04+00:00" + "time": "2023-05-30T18:13:47+00:00" }, { "name": "phpoffice/phpspreadsheet", @@ -3944,16 +3949,16 @@ }, { "name": "phpoffice/phpword", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PHPWord.git", - "reference": "8521612b39edeec9055d3688ad555342a40857dd" + "reference": "90a55955e6a772bb4cd9b1ef6a7e88c8976c2561" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PHPWord/zipball/8521612b39edeec9055d3688ad555342a40857dd", - "reference": "8521612b39edeec9055d3688ad555342a40857dd", + "url": "https://api.github.com/repos/PHPOffice/PHPWord/zipball/90a55955e6a772bb4cd9b1ef6a7e88c8976c2561", + "reference": "90a55955e6a772bb4cd9b1ef6a7e88c8976c2561", "shasum": "" }, "require": { @@ -3968,8 +3973,8 @@ "ext-gd": "*", "ext-libxml": "*", "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.3", "mpdf/mpdf": "^8.1", - "php-coveralls/php-coveralls": "^2.5", "phpmd/phpmd": "^2.13", "phpunit/phpunit": ">=7.0", "symfony/process": "^4.4", @@ -3983,11 +3988,6 @@ "ext-zip": "Allows writing OOXML and ODF" }, "type": "library", - "extra": { - "branch-alias": { - "dev-develop": "0.19-dev" - } - }, "autoload": { "psr-4": { "PhpOffice\\PhpWord\\": "src/PhpWord" @@ -4051,28 +4051,29 @@ ], "support": { "issues": "https://github.com/PHPOffice/PHPWord/issues", - "source": "https://github.com/PHPOffice/PHPWord/tree/1.0.0" + "source": "https://github.com/PHPOffice/PHPWord/tree/1.1.0" }, - "time": "2022-11-15T20:24:50+00:00" + "time": "2023-05-30T07:59:14+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.21.0", + "version": "1.22.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "6df62b08faef4f899772bc7c3bbabb93d2b7a21c" + "reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6df62b08faef4f899772bc7c3bbabb93d2b7a21c", - "reference": "6df62b08faef4f899772bc7c3bbabb93d2b7a21c", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/ec58baf7b3c7f1c81b3b00617c953249fb8cf30c", + "reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", @@ -4097,9 +4098,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.21.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.22.0" }, - "time": "2023-05-17T13:13:44+00:00" + "time": "2023-06-01T12:35:21+00:00" }, { "name": "psr/cache", @@ -5045,29 +5046,26 @@ }, { "name": "symfony/cache-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "eeb71f04b6f7f34ca6d15633df82e014528b1632" + "reference": "ad945640ccc0ae6e208bcea7d7de4b39b569896b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/eeb71f04b6f7f34ca6d15633df82e014528b1632", - "reference": "eeb71f04b6f7f34ca6d15633df82e014528b1632", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/ad945640ccc0ae6e208bcea7d7de4b39b569896b", + "reference": "ad945640ccc0ae6e208bcea7d7de4b39b569896b", "shasum": "" }, "require": { "php": ">=8.1", "psr/cache": "^3.0" }, - "suggest": { - "symfony/cache-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5104,7 +5102,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/cache-contracts/tree/v3.3.0" }, "funding": [ { @@ -5120,7 +5118,7 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/config", @@ -5201,16 +5199,16 @@ }, { "name": "symfony/console", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "12288d9f4500f84a4d02254d4aa968b15488476f" + "reference": "5aa03db8ef0a5457c316ec580e69562d97734c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/12288d9f4500f84a4d02254d4aa968b15488476f", - "reference": "12288d9f4500f84a4d02254d4aa968b15488476f", + "url": "https://api.github.com/repos/symfony/console/zipball/5aa03db8ef0a5457c316ec580e69562d97734c77", + "reference": "5aa03db8ef0a5457c316ec580e69562d97734c77", "shasum": "" }, "require": { @@ -5277,7 +5275,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.2.10" + "source": "https://github.com/symfony/console/tree/v6.2.11" }, "funding": [ { @@ -5293,7 +5291,7 @@ "type": "tidelift" } ], - "time": "2023-04-28T13:37:43+00:00" + "time": "2023-05-26T08:16:21+00:00" }, { "name": "symfony/css-selector", @@ -5362,16 +5360,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "d732a66a2672669232c0b4536c8c96724a679780" + "reference": "2dff40fdc5ff1647c5561eb8e4fe574bc58c849d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d732a66a2672669232c0b4536c8c96724a679780", - "reference": "d732a66a2672669232c0b4536c8c96724a679780", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2dff40fdc5ff1647c5561eb8e4fe574bc58c849d", + "reference": "2dff40fdc5ff1647c5561eb8e4fe574bc58c849d", "shasum": "" }, "require": { @@ -5429,7 +5427,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.2.10" + "source": "https://github.com/symfony/dependency-injection/tree/v6.2.11" }, "funding": [ { @@ -5445,20 +5443,20 @@ "type": "tidelift" } ], - "time": "2023-04-21T15:42:15+00:00" + "time": "2023-05-05T15:52:57+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { @@ -5467,7 +5465,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5496,7 +5494,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -5512,20 +5510,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:25:55+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v6.2.9", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "4b3aeaa90d41c5527d7ba211d12102cedf06936e" + "reference": "db48a583e5e38e152af8a60c2677c8de76367701" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/4b3aeaa90d41c5527d7ba211d12102cedf06936e", - "reference": "4b3aeaa90d41c5527d7ba211d12102cedf06936e", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/db48a583e5e38e152af8a60c2677c8de76367701", + "reference": "db48a583e5e38e152af8a60c2677c8de76367701", "shasum": "" }, "require": { @@ -5541,7 +5539,6 @@ "doctrine/dbal": "<2.13.1", "doctrine/lexer": "<1.1", "doctrine/orm": "<2.7.4", - "phpunit/phpunit": "<5.4.3", "symfony/cache": "<5.4", "symfony/dependency-injection": "<5.4", "symfony/form": "<5.4.21|>=6,<6.2.7", @@ -5611,7 +5608,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.2.9" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.2.11" }, "funding": [ { @@ -5627,7 +5624,7 @@ "type": "tidelift" } ], - "time": "2023-04-11T16:08:35+00:00" + "time": "2023-05-25T13:08:43+00:00" }, { "name": "symfony/dotenv", @@ -5705,16 +5702,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8b7e9f124640cb0611624a9383176c3e5f7d8cfb" + "reference": "e847ba47e7a8f9708082990cb40ab4ff0440a11e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8b7e9f124640cb0611624a9383176c3e5f7d8cfb", - "reference": "8b7e9f124640cb0611624a9383176c3e5f7d8cfb", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e847ba47e7a8f9708082990cb40ab4ff0440a11e", + "reference": "e847ba47e7a8f9708082990cb40ab4ff0440a11e", "shasum": "" }, "require": { @@ -5756,7 +5753,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.2.10" + "source": "https://github.com/symfony/error-handler/tree/v6.2.11" }, "funding": [ { @@ -5772,7 +5769,7 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2023-05-05T11:55:01+00:00" }, { "name": "symfony/event-dispatcher", @@ -5859,29 +5856,26 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5918,7 +5912,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" }, "funding": [ { @@ -5934,7 +5928,7 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/expression-language", @@ -6128,16 +6122,16 @@ }, { "name": "symfony/flex", - "version": "v2.2.5", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "2ff8465e7172790a47ab3c129f2b514eb2d8a286" + "reference": "3c9c3424efdafe33e0e3cfb5e87e50b34711fedf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/2ff8465e7172790a47ab3c129f2b514eb2d8a286", - "reference": "2ff8465e7172790a47ab3c129f2b514eb2d8a286", + "url": "https://api.github.com/repos/symfony/flex/zipball/3c9c3424efdafe33e0e3cfb5e87e50b34711fedf", + "reference": "3c9c3424efdafe33e0e3cfb5e87e50b34711fedf", "shasum": "" }, "require": { @@ -6173,7 +6167,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.2.5" + "source": "https://github.com/symfony/flex/tree/v2.3.1" }, "funding": [ { @@ -6189,20 +6183,20 @@ "type": "tidelift" } ], - "time": "2023-02-18T08:03:15+00:00" + "time": "2023-05-27T07:38:25+00:00" }, { "name": "symfony/form", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "a123512b46caea497ab8d96d9dbdbdaaf416a606" + "reference": "494e21cc84781e7557682617e7ef80f598da20dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/a123512b46caea497ab8d96d9dbdbdaaf416a606", - "reference": "a123512b46caea497ab8d96d9dbdbdaaf416a606", + "url": "https://api.github.com/repos/symfony/form/zipball/494e21cc84781e7557682617e7ef80f598da20dc", + "reference": "494e21cc84781e7557682617e7ef80f598da20dc", "shasum": "" }, "require": { @@ -6217,7 +6211,6 @@ "symfony/service-contracts": "^1.1|^2|^3" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4", "symfony/dependency-injection": "<5.4", "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7", @@ -6277,7 +6270,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.2.10" + "source": "https://github.com/symfony/form/tree/v6.2.11" }, "funding": [ { @@ -6293,20 +6286,20 @@ "type": "tidelift" } ], - "time": "2023-04-19T08:03:37+00:00" + "time": "2023-05-25T13:08:43+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "823f285befde4e97bb70d97cae57997c38e4d6fd" + "reference": "c02f2298d03ab083d4036cf18b151d131a113ccd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/823f285befde4e97bb70d97cae57997c38e4d6fd", - "reference": "823f285befde4e97bb70d97cae57997c38e4d6fd", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c02f2298d03ab083d4036cf18b151d131a113ccd", + "reference": "c02f2298d03ab083d4036cf18b151d131a113ccd", "shasum": "" }, "require": { @@ -6321,7 +6314,7 @@ "symfony/event-dispatcher": "^5.4|^6.0", "symfony/filesystem": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", - "symfony/http-foundation": "^6.2", + "symfony/http-foundation": "^6.2.11", "symfony/http-kernel": "^6.2.1", "symfony/polyfill-mbstring": "~1.0", "symfony/routing": "^5.4|^6.0" @@ -6331,7 +6324,6 @@ "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "phpunit/phpunit": "<5.4.3", "symfony/asset": "<5.4", "symfony/console": "<5.4", "symfony/dom-crawler": "<5.4", @@ -6428,7 +6420,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.2.10" + "source": "https://github.com/symfony/framework-bundle/tree/v6.2.11" }, "funding": [ { @@ -6444,20 +6436,20 @@ "type": "tidelift" } ], - "time": "2023-04-23T08:23:35+00:00" + "time": "2023-05-25T13:08:43+00:00" }, { "name": "symfony/http-client", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "3f5545a91c8e79dedd1a06c4b04e1682c80c42f9" + "reference": "39f679c12648cc43bd9f0db12cc69b82041b91a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/3f5545a91c8e79dedd1a06c4b04e1682c80c42f9", - "reference": "3f5545a91c8e79dedd1a06c4b04e1682c80c42f9", + "url": "https://api.github.com/repos/symfony/http-client/zipball/39f679c12648cc43bd9f0db12cc69b82041b91a1", + "reference": "39f679c12648cc43bd9f0db12cc69b82041b91a1", "shasum": "" }, "require": { @@ -6481,6 +6473,7 @@ "guzzlehttp/promises": "^1.4", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", + "php-http/message-factory": "^1.0", "psr/http-client": "^1.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/http-kernel": "^5.4|^6.0", @@ -6516,7 +6509,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.2.10" + "source": "https://github.com/symfony/http-client/tree/v6.2.11" }, "funding": [ { @@ -6532,32 +6525,29 @@ "type": "tidelift" } ], - "time": "2023-04-20T13:12:48+00:00" + "time": "2023-05-12T08:48:34+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "df2ecd6cb70e73c1080e6478aea85f5f4da2c48b" + "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/df2ecd6cb70e73c1080e6478aea85f5f4da2c48b", - "reference": "df2ecd6cb70e73c1080e6478aea85f5f4da2c48b", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/3b66325d0176b4ec826bffab57c9037d759c31fb", + "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb", "shasum": "" }, "require": { "php": ">=8.1" }, - "suggest": { - "symfony/http-client-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6597,7 +6587,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.3.0" }, "funding": [ { @@ -6613,20 +6603,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "49adbb92bcb4e3c2943719d2756271e8b9602acc" + "reference": "df27f4191a4292d01fd062296e09cbc8b657cb57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49adbb92bcb4e3c2943719d2756271e8b9602acc", - "reference": "49adbb92bcb4e3c2943719d2756271e8b9602acc", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/df27f4191a4292d01fd062296e09cbc8b657cb57", + "reference": "df27f4191a4292d01fd062296e09cbc8b657cb57", "shasum": "" }, "require": { @@ -6675,7 +6665,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.2.10" + "source": "https://github.com/symfony/http-foundation/tree/v6.2.11" }, "funding": [ { @@ -6691,20 +6681,20 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2023-05-19T12:39:53+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "81064a65a5496f17d2b6984f6519406f98864215" + "reference": "954a1a3b178309b216261eedc735c079709e4ab3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/81064a65a5496f17d2b6984f6519406f98864215", - "reference": "81064a65a5496f17d2b6984f6519406f98864215", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/954a1a3b178309b216261eedc735c079709e4ab3", + "reference": "954a1a3b178309b216261eedc735c079709e4ab3", "shasum": "" }, "require": { @@ -6752,6 +6742,7 @@ "symfony/translation": "^5.4|^6.0", "symfony/translation-contracts": "^1.1|^2|^3", "symfony/uid": "^5.4|^6.0", + "symfony/var-exporter": "^6.2", "twig/twig": "^2.13|^3.0.4" }, "suggest": { @@ -6786,7 +6777,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.2.10" + "source": "https://github.com/symfony/http-kernel/tree/v6.2.11" }, "funding": [ { @@ -6802,7 +6793,7 @@ "type": "tidelift" } ], - "time": "2023-04-28T13:50:28+00:00" + "time": "2023-05-27T21:12:52+00:00" }, { "name": "symfony/intl", @@ -7773,16 +7764,16 @@ }, { "name": "symfony/property-access", - "version": "v6.2.8", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "2ad1e0a07b8cab3e09905659d14f3b248e916374" + "reference": "77442a960c3bc2cacc3d1cd300908a31a2eb30ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/2ad1e0a07b8cab3e09905659d14f3b248e916374", - "reference": "2ad1e0a07b8cab3e09905659d14f3b248e916374", + "url": "https://api.github.com/repos/symfony/property-access/zipball/77442a960c3bc2cacc3d1cd300908a31a2eb30ad", + "reference": "77442a960c3bc2cacc3d1cd300908a31a2eb30ad", "shasum": "" }, "require": { @@ -7833,7 +7824,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.2.8" + "source": "https://github.com/symfony/property-access/tree/v6.2.11" }, "funding": [ { @@ -7849,20 +7840,20 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:00:05+00:00" + "time": "2023-05-09T22:46:35+00:00" }, { "name": "symfony/property-info", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "617177c24e1a92e011851948ba973758429a68b2" + "reference": "ee0a0de5a6866c15af8495b2534d650b388bdeca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/617177c24e1a92e011851948ba973758429a68b2", - "reference": "617177c24e1a92e011851948ba973758429a68b2", + "url": "https://api.github.com/repos/symfony/property-info/zipball/ee0a0de5a6866c15af8495b2534d650b388bdeca", + "reference": "ee0a0de5a6866c15af8495b2534d650b388bdeca", "shasum": "" }, "require": { @@ -7922,7 +7913,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.2.10" + "source": "https://github.com/symfony/property-info/tree/v6.2.11" }, "funding": [ { @@ -7938,7 +7929,7 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2023-05-19T07:42:48+00:00" }, { "name": "symfony/rate-limiter", @@ -8182,16 +8173,16 @@ }, { "name": "symfony/security-bundle", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "b12dcedbcf423ae6d34d79cfaa6791a21c90bd14" + "reference": "43faa9bc3c7ee7e97ffa53320947a074971d159b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/b12dcedbcf423ae6d34d79cfaa6791a21c90bd14", - "reference": "b12dcedbcf423ae6d34d79cfaa6791a21c90bd14", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/43faa9bc3c7ee7e97ffa53320947a074971d159b", + "reference": "43faa9bc3c7ee7e97ffa53320947a074971d159b", "shasum": "" }, "require": { @@ -8262,7 +8253,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v6.2.10" + "source": "https://github.com/symfony/security-bundle/tree/v6.2.11" }, "funding": [ { @@ -8278,7 +8269,7 @@ "type": "tidelift" } ], - "time": "2023-04-21T15:49:06+00:00" + "time": "2023-05-26T15:38:40+00:00" }, { "name": "symfony/security-core", @@ -8444,16 +8435,16 @@ }, { "name": "symfony/security-http", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "c468f059fac27680acf7e84cea07ba5ffff8942a" + "reference": "ef5d875c6d0d141c7247fab24bd55a94e02b8478" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/c468f059fac27680acf7e84cea07ba5ffff8942a", - "reference": "c468f059fac27680acf7e84cea07ba5ffff8942a", + "url": "https://api.github.com/repos/symfony/security-http/zipball/ef5d875c6d0d141c7247fab24bd55a94e02b8478", + "reference": "ef5d875c6d0d141c7247fab24bd55a94e02b8478", "shasum": "" }, "require": { @@ -8509,7 +8500,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.2.10" + "source": "https://github.com/symfony/security-http/tree/v6.2.11" }, "funding": [ { @@ -8525,20 +8516,20 @@ "type": "tidelift" } ], - "time": "2023-04-21T11:56:14+00:00" + "time": "2023-05-19T15:58:23+00:00" }, { "name": "symfony/serializer", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "0732edf0ad28dd3faacde4f1200ab9d7a4d5f40d" + "reference": "7777df2b00dd2f3ee332b4b000c4b21743df64b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/0732edf0ad28dd3faacde4f1200ab9d7a4d5f40d", - "reference": "0732edf0ad28dd3faacde4f1200ab9d7a4d5f40d", + "url": "https://api.github.com/repos/symfony/serializer/zipball/7777df2b00dd2f3ee332b4b000c4b21743df64b7", + "reference": "7777df2b00dd2f3ee332b4b000c4b21743df64b7", "shasum": "" }, "require": { @@ -8610,7 +8601,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v6.2.10" + "source": "https://github.com/symfony/serializer/tree/v6.2.11" }, "funding": [ { @@ -8626,20 +8617,20 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:57:49+00:00" + "time": "2023-05-19T07:59:25+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { @@ -8649,13 +8640,10 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -8695,7 +8683,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -8711,7 +8699,7 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/stopwatch", @@ -8863,16 +8851,16 @@ }, { "name": "symfony/translation", - "version": "v6.2.8", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "817535dbb1721df8b3a8f2489dc7e50bcd6209b5" + "reference": "64113df3e8b009f92fad63014f4ec647e65bc927" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/817535dbb1721df8b3a8f2489dc7e50bcd6209b5", - "reference": "817535dbb1721df8b3a8f2489dc7e50bcd6209b5", + "url": "https://api.github.com/repos/symfony/translation/zipball/64113df3e8b009f92fad63014f4ec647e65bc927", + "reference": "64113df3e8b009f92fad63014f4ec647e65bc927", "shasum": "" }, "require": { @@ -8941,7 +8929,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.2.8" + "source": "https://github.com/symfony/translation/tree/v6.2.11" }, "funding": [ { @@ -8957,32 +8945,29 @@ "type": "tidelift" } ], - "time": "2023-03-31T09:14:44+00:00" + "time": "2023-05-19T12:37:14+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "dfec258b9dd17a6b24420d464c43bffe347441c8" + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/dfec258b9dd17a6b24420d464c43bffe347441c8", - "reference": "dfec258b9dd17a6b24420d464c43bffe347441c8", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", "shasum": "" }, "require": { "php": ">=8.1" }, - "suggest": { - "symfony/translation-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -9022,7 +9007,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" }, "funding": [ { @@ -9038,7 +9023,7 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-30T17:17:10+00:00" }, { "name": "symfony/twig-bridge", @@ -9251,16 +9236,16 @@ }, { "name": "symfony/validator", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "c02ea86844926f04247bc1f5db5f85bb53330823" + "reference": "14998e41b1e65e15cbe23466e5a5c2edd8ad3584" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/c02ea86844926f04247bc1f5db5f85bb53330823", - "reference": "c02ea86844926f04247bc1f5db5f85bb53330823", + "url": "https://api.github.com/repos/symfony/validator/zipball/14998e41b1e65e15cbe23466e5a5c2edd8ad3584", + "reference": "14998e41b1e65e15cbe23466e5a5c2edd8ad3584", "shasum": "" }, "require": { @@ -9273,7 +9258,6 @@ "conflict": { "doctrine/annotations": "<1.13", "doctrine/lexer": "<1.1", - "phpunit/phpunit": "<5.4.3", "symfony/dependency-injection": "<5.4", "symfony/expression-language": "<5.4", "symfony/http-kernel": "<5.4", @@ -9339,7 +9323,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.2.10" + "source": "https://github.com/symfony/validator/tree/v6.2.11" }, "funding": [ { @@ -9355,20 +9339,20 @@ "type": "tidelift" } ], - "time": "2023-04-19T09:54:16+00:00" + "time": "2023-05-25T13:08:43+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "41a750a23412ca76fdbbf5096943b4134272c1ab" + "reference": "7d10f2a5a452bda385692fc7d38cd6eccfebe756" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41a750a23412ca76fdbbf5096943b4134272c1ab", - "reference": "41a750a23412ca76fdbbf5096943b4134272c1ab", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7d10f2a5a452bda385692fc7d38cd6eccfebe756", + "reference": "7d10f2a5a452bda385692fc7d38cd6eccfebe756", "shasum": "" }, "require": { @@ -9376,7 +9360,6 @@ "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4" }, "require-dev": { @@ -9427,7 +9410,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.10" + "source": "https://github.com/symfony/var-dumper/tree/v6.2.11" }, "funding": [ { @@ -9443,7 +9426,7 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2023-05-25T13:08:43+00:00" }, { "name": "symfony/var-exporter", @@ -9521,16 +9504,16 @@ }, { "name": "symfony/webpack-encore-bundle", - "version": "v1.16.1", + "version": "v1.17.1", "source": { "type": "git", "url": "https://github.com/symfony/webpack-encore-bundle.git", - "reference": "1862d71e483769b40278548a30e756ce13ef9d4c" + "reference": "7e3b6f69bcfcbb40ecfe83ad7a77e44316d26573" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/1862d71e483769b40278548a30e756ce13ef9d4c", - "reference": "1862d71e483769b40278548a30e756ce13ef9d4c", + "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/7e3b6f69bcfcbb40ecfe83ad7a77e44316d26573", + "reference": "7e3b6f69bcfcbb40ecfe83ad7a77e44316d26573", "shasum": "" }, "require": { @@ -9574,7 +9557,7 @@ "description": "Integration with your Symfony app & Webpack Encore!", "support": { "issues": "https://github.com/symfony/webpack-encore-bundle/issues", - "source": "https://github.com/symfony/webpack-encore-bundle/tree/v1.16.1" + "source": "https://github.com/symfony/webpack-encore-bundle/tree/v1.17.1" }, "funding": [ { @@ -9590,7 +9573,7 @@ "type": "tidelift" } ], - "time": "2023-01-18T19:37:55+00:00" + "time": "2023-05-29T00:18:01+00:00" }, { "name": "symfony/yaml", @@ -11264,16 +11247,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.3.12", + "version": "1.3.13", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "c44246879d692d3b2cf2a21d65be4b4715d6ef21" + "reference": "d8bdab0218c5eb0964338d24a8511b65e9c94fa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/c44246879d692d3b2cf2a21d65be4b4715d6ef21", - "reference": "c44246879d692d3b2cf2a21d65be4b4715d6ef21", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d8bdab0218c5eb0964338d24a8511b65e9c94fa5", + "reference": "d8bdab0218c5eb0964338d24a8511b65e9c94fa5", "shasum": "" }, "require": { @@ -11310,9 +11293,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.12" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.13" }, - "time": "2023-05-23T11:58:47+00:00" + "time": "2023-05-26T11:05:59+00:00" }, { "name": "phpstan/phpstan-strict-rules", @@ -13039,16 +13022,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.2.10", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "552950db2919421ad917e29e76d1999a2a31a8e3" + "reference": "f8d75b4d9bf7243979b2c2e5e6cd73f03e10579f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/552950db2919421ad917e29e76d1999a2a31a8e3", - "reference": "552950db2919421ad917e29e76d1999a2a31a8e3", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f8d75b4d9bf7243979b2c2e5e6cd73f03e10579f", + "reference": "f8d75b4d9bf7243979b2c2e5e6cd73f03e10579f", "shasum": "" }, "require": { @@ -13058,11 +13041,9 @@ "phpunit/phpunit": "<7.5|9.1.2" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3.0", - "symfony/error-handler": "^5.4|^6.0" - }, - "suggest": { - "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/polyfill-php81": "^1.27" }, "bin": [ "bin/simple-phpunit" @@ -13102,7 +13083,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.2.10" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.3.0" }, "funding": [ { @@ -13118,20 +13099,20 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:46:08+00:00" + "time": "2023-05-30T09:01:24+00:00" }, { "name": "symfony/process", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e" + "reference": "97ae9721bead9d1a39b5650e2f4b7834b93b539c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e", - "reference": "b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e", + "url": "https://api.github.com/repos/symfony/process/zipball/97ae9721bead9d1a39b5650e2f4b7834b93b539c", + "reference": "97ae9721bead9d1a39b5650e2f4b7834b93b539c", "shasum": "" }, "require": { @@ -13163,7 +13144,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.2.10" + "source": "https://github.com/symfony/process/tree/v6.2.11" }, "funding": [ { @@ -13179,20 +13160,20 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:56:57+00:00" + "time": "2023-05-19T07:42:48+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v6.2.10", + "version": "v6.2.11", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "24b6f4370f1cd59aacfc5e799c8614b40776e9c8" + "reference": "1338ad6486f7ce22401a1c0d799ccb5f499b7f8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/24b6f4370f1cd59aacfc5e799c8614b40776e9c8", - "reference": "24b6f4370f1cd59aacfc5e799c8614b40776e9c8", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/1338ad6486f7ce22401a1c0d799ccb5f499b7f8f", + "reference": "1338ad6486f7ce22401a1c0d799ccb5f499b7f8f", "shasum": "" }, "require": { @@ -13241,7 +13222,7 @@ "description": "Provides a development tool that gives detailed information about the execution of any request", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.2.10" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.2.11" }, "funding": [ { @@ -13257,7 +13238,7 @@ "type": "tidelift" } ], - "time": "2023-04-24T13:41:17+00:00" + "time": "2023-05-05T15:52:57+00:00" }, { "name": "theseer/tokenizer", @@ -13325,7 +13306,8 @@ "ext-tokenizer": "*", "ext-xml": "*", "ext-xsl": "*", - "ext-zip": "*" + "ext-zip": "*", + "composer-runtime-api": "^2.0" }, "platform-dev": { "ext-simplexml": "*" diff --git a/config/packages/tabler.yaml b/config/packages/tabler.yaml index aa28e4ab..39904ff3 100644 --- a/config/packages/tabler.yaml +++ b/config/packages/tabler.yaml @@ -78,6 +78,7 @@ tabler: filter: fas fa-filter help: far fa-question-circle home: fas fa-home + import: fas fa-file-import invoice: fas fa-file-contract invoice-template: fas fa-file-signature left: fas fa-chevron-left diff --git a/migrations/Version20210316224358.php b/migrations/Version20210316224358.php index 19696082..4337288a 100644 --- a/migrations/Version20210316224358.php +++ b/migrations/Version20210316224358.php @@ -41,6 +41,6 @@ final class Version20210316224358 extends AbstractMigration public function down(Schema $schema): void { - $this->addSql('DROP TABLE kimai2_bookmarks'); + $schema->dropTable('kimai2_bookmarks'); } } diff --git a/phpstan.neon b/phpstan.neon index cfbb3190..301b3fac 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1391,11 +1391,6 @@ parameters: count: 1 path: src/Controller/Security/SelfRegistrationController.php - - - message: "#^Parameter \\#1 \\$value of method App\\\\Form\\\\Model\\\\Configuration\\:\\:setValue\\(\\) expects bool\\|int\\|object\\|string\\|null, bool\\|float\\|int\\|string given\\.$#" - count: 1 - path: src/Controller/SystemConfigurationController.php - - message: "#^Cannot call method getData\\(\\) on Symfony\\\\Component\\\\Form\\\\FormInterface\\|null\\.$#" count: 1 @@ -3006,36 +3001,6 @@ parameters: count: 1 path: src/Form/InvoiceDocumentUploadForm.php - - - message: "#^Method App\\\\Form\\\\Model\\\\Configuration\\:\\:getOptions\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Model/Configuration.php - - - - message: "#^Method App\\\\Form\\\\Model\\\\Configuration\\:\\:getValue\\(\\) should return bool\\|int\\|object\\|string\\|null but returns array\\|bool\\|int\\|string\\|null\\.$#" - count: 1 - path: src/Form/Model/Configuration.php - - - - message: "#^Method App\\\\Form\\\\Model\\\\Configuration\\:\\:setOptions\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Model/Configuration.php - - - - message: "#^Property App\\\\Form\\\\Model\\\\Configuration\\:\\:\\$options type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Model/Configuration.php - - - - message: "#^Property App\\\\Form\\\\Model\\\\Configuration\\:\\:\\$value \\(array\\|bool\\|int\\|string\\|null\\) does not accept bool\\|int\\|object\\|string\\|null\\.$#" - count: 1 - path: src/Form/Model/Configuration.php - - - - message: "#^Property App\\\\Form\\\\Model\\\\Configuration\\:\\:\\$value type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Model/Configuration.php - - message: "#^Method App\\\\Form\\\\Model\\\\MultiUserTimesheet\\:\\:getTeams\\(\\) return type with generic interface Doctrine\\\\Common\\\\Collections\\\\Collection does not specify its types\\: TKey, T$#" count: 1 diff --git a/src/Constants.php b/src/Constants.php index 0622b548..ba888861 100644 --- a/src/Constants.php +++ b/src/Constants.php @@ -17,11 +17,11 @@ class Constants /** * The current release version */ - public const VERSION = '2.0.24'; + public const VERSION = '2.0.25'; /** * The current release: major * 10000 + minor * 100 + patch */ - public const VERSION_ID = 20024; + public const VERSION_ID = 20025; /** * The software name */ diff --git a/src/Controller/ContractController.php b/src/Controller/ContractController.php index 0756aed9..da21728f 100644 --- a/src/Controller/ContractController.php +++ b/src/Controller/ContractController.php @@ -64,8 +64,10 @@ final class ContractController extends AbstractController $yearDate = $values->getDate(); $year = $workingTimeService->getYear($profile, $yearDate); - $page = new PageSetup('status'); + $page = new PageSetup('work_times'); $page->setHelp('contract.html'); + $page->setActionName('contract'); + $page->setPaginationForm($form); // additional boxes by plugins $controllerEvent = new WorkContractDetailControllerEvent($year); diff --git a/src/Controller/DoctorController.php b/src/Controller/DoctorController.php index 1cedeb97..ee0f0a2e 100644 --- a/src/Controller/DoctorController.php +++ b/src/Controller/DoctorController.php @@ -120,27 +120,25 @@ final class DoctorController extends AbstractController /** @var array $versions */ $versions = []; - if (class_exists(InstalledVersions::class)) { - $rootPackage = InstalledVersions::getRootPackage()['name']; - foreach (InstalledVersions::getInstalledPackages() as $package) { - $versions[$package] = InstalledVersions::getPrettyVersion($package); + $rootPackage = InstalledVersions::getRootPackage()['name']; + foreach (InstalledVersions::getInstalledPackages() as $package) { + $versions[$package] = InstalledVersions::getPrettyVersion($package); + } + + // remove kimai from the package list + $versions = array_filter($versions, function ($version, $name) use ($rootPackage): bool { + if ($name === $rootPackage) { + return false; } - // remove kimai from the package list - $versions = array_filter($versions, function ($version, $name) use ($rootPackage): bool { - if ($name === $rootPackage) { - return false; - } + if ($version === null || $version === '*') { + return false; + } - if ($version === null || $version === '*') { - return false; - } + return true; + }, ARRAY_FILTER_USE_BOTH); - return true; - }, ARRAY_FILTER_USE_BOTH); - - ksort($versions); - } + ksort($versions); return $versions; } diff --git a/src/Controller/ProfileController.php b/src/Controller/ProfileController.php index edd07cd7..6e8d9229 100644 --- a/src/Controller/ProfileController.php +++ b/src/Controller/ProfileController.php @@ -413,6 +413,7 @@ final class ProfileController extends AbstractController 'form' => $form->createView(), 'deactivate' => $this->getTwoFactorDeactivationForm($profile)->createView(), 'qr_code' => $result, + 'secret' => $profile->getTotpSecret(), ]); } diff --git a/src/Customer/CustomerService.php b/src/Customer/CustomerService.php index 146505c7..167810bb 100644 --- a/src/Customer/CustomerService.php +++ b/src/Customer/CustomerService.php @@ -18,6 +18,7 @@ use App\Event\CustomerMetaDefinitionEvent; use App\Event\CustomerUpdatePostEvent; use App\Event\CustomerUpdatePreEvent; use App\Repository\CustomerRepository; +use App\Repository\Query\CustomerQuery; use App\Utils\NumberGenerator; use App\Validator\ValidationFailedException; use InvalidArgumentException; @@ -107,6 +108,19 @@ final class CustomerService return $this->repository->findOneBy(['number' => $number]); } + /** + * @return iterable + */ + public function findCustomer(CustomerQuery $query): iterable + { + return $this->repository->getCustomersForQuery($query); + } + + public function countCustomer(bool $visible = true): int + { + return $this->repository->countCustomer($visible); + } + public function calculateNextCustomerNumber(): string { $format = $this->configuration->find('customer.number_format'); diff --git a/src/Doctrine/AbstractMigration.php b/src/Doctrine/AbstractMigration.php index 960c4405..a4de4183 100644 --- a/src/Doctrine/AbstractMigration.php +++ b/src/Doctrine/AbstractMigration.php @@ -64,4 +64,20 @@ abstract class AbstractMigration extends BaseAbstractMigration { $this->addSql('#prevent empty warning - no SQL to execute'); } + + /** + * I don't know how often I accidentally dropped database tables, + * because a generated "left-over" migration was executed. + * + * @param mixed[] $params + * @param mixed[] $types + */ + protected function addSql(string $sql, array $params = [], array $types = []): void + { + if (str_starts_with($sql, 'DROP TABLE ')) { + throw new \InvalidArgumentException('Cannot use addSql() with DROP TABLE'); + } + + parent::addSql($sql, $params, $types); + } } diff --git a/src/Entity/User.php b/src/Entity/User.php index f3374500..a0ce98f5 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -211,7 +211,7 @@ class User implements UserInterface, EquatableInterface, ThemeUserInterface, Pas * If not empty two-factor authentication is enabled. */ #[ORM\Column(name: 'totp_secret', type: 'string', nullable: true)] - private ?string $totpSecret; + private ?string $totpSecret = null; #[ORM\Column(name: 'totp_enabled', type: 'boolean', nullable: false, options: ['default' => false])] private bool $totpEnabled = false; #[ORM\Column(name: 'system_account', type: 'boolean', nullable: false, options: ['default' => false])] @@ -1109,6 +1109,11 @@ class User implements UserInterface, EquatableInterface, ThemeUserInterface, Pas return $this->totpSecret !== null; } + public function getTotpSecret(): ?string + { + return $this->totpSecret; + } + public function isTotpAuthenticationEnabled(): bool { return $this->totpEnabled; diff --git a/src/Form/InvoiceDocumentUploadForm.php b/src/Form/InvoiceDocumentUploadForm.php index 20693761..856ba358 100644 --- a/src/Form/InvoiceDocumentUploadForm.php +++ b/src/Form/InvoiceDocumentUploadForm.php @@ -65,6 +65,7 @@ final class InvoiceDocumentUploadForm extends AbstractType new File([ 'mimeTypes' => $mimetypes, 'mimeTypesMessage' => 'This file type is not allowed', + 'maxSize' => '1024k', ]), new Callback([$this, 'validateDocument']) ], @@ -117,7 +118,7 @@ final class InvoiceDocumentUploadForm extends AbstractType $safeFilename = transliterator_transliterate(self::FILENAME_RULE, $nameWithoutExtension); - if ($safeFilename !== $nameWithoutExtension) { + if ($safeFilename === false || strtolower($safeFilename) !== strtolower($nameWithoutExtension)) { $context->buildViolation('This invoice document cannot be used, filename may only contain the following ascii character: %character%') ->setParameters(['%character%' => 'A-Z a-z 0-9 _ -']) ->setTranslationDomain('validators') diff --git a/src/Form/Model/Configuration.php b/src/Form/Model/Configuration.php index 4cf0df52..2d62b4f7 100644 --- a/src/Form/Model/Configuration.php +++ b/src/Form/Model/Configuration.php @@ -17,8 +17,9 @@ final class Configuration { private ?string $label = null; private string $translationDomain = 'messages'; - private string|int|null|bool|array $value = null; + private string|int|null|bool|float $value = null; private ?string $type = null; + /** @var array */ private array $options = []; private bool $enabled = true; private bool $required = true; @@ -36,12 +37,12 @@ final class Configuration return $this->name; } - public function getValue(): string|int|null|bool|object + public function getValue(): string|int|null|bool|float { return $this->value; } - public function setValue(string|int|null|bool|object $value): Configuration + public function setValue(string|int|null|bool|float $value): Configuration { if ($this->type === CheckboxType::class || $this->type === YesNoType::class) { $value = (bool) $value; @@ -131,11 +132,17 @@ final class Configuration return $this; } + /** + * @return array + */ public function getOptions(): array { return $this->options; } + /** + * @param array $options + */ public function setOptions(array $options): Configuration { $this->options = $options; diff --git a/src/Form/Type/DateRangeType.php b/src/Form/Type/DateRangeType.php index 7588abe4..4c857686 100644 --- a/src/Form/Type/DateRangeType.php +++ b/src/Form/Type/DateRangeType.php @@ -61,18 +61,24 @@ final class DateRangeType extends AbstractType $user = $options['user']; $factory = DateTimeFactory::createByUser($user); - $view->vars['ranges'] = [ - 'today' => [$factory->createDateTime('00:00:00'), $factory->createDateTime('23:59:59')], - 'yesterday' => [$factory->createDateTime('-1 day 00:00:00'), $factory->createDateTime('-1 day 23:59:59')], - 'thisWeek' => [$factory->getStartOfWeek(), $factory->getEndOfWeek()], - 'lastWeek' => [$factory->getStartOfWeek('-1 week'), $factory->getEndOfWeek('-1 week')], - 'thisMonth' => [$factory->getStartOfMonth(), $factory->getEndOfMonth()], - 'lastMonth' => [$factory->getStartOfMonth('-1 month'), $factory->getEndOfMonth('-1 month')], - 'thisYear' => [$factory->createStartOfYear(), $factory->createEndOfYear()], - 'thisYearUntilNow' => [$factory->createStartOfYear(), $factory->createDateTime('23:59:59')], - 'lastYear' => [$factory->createStartOfYear('-1 year'), $factory->createEndOfYear('-1 year')], - 'allTime' => [null, null], + $ranges = [ + 'daterangepicker.allTime' => [null, null], + 'daterangepicker.today' => [$factory->createDateTime('00:00:00'), $factory->createDateTime('23:59:59')], + 'daterangepicker.yesterday' => [$factory->createDateTime('-1 day 00:00:00'), $factory->createDateTime('-1 day 23:59:59')], + 'daterangepicker.thisWeek' => [$factory->getStartOfWeek(), $factory->getEndOfWeek()], + 'daterangepicker.lastWeek' => [$factory->getStartOfWeek('-1 week'), $factory->getEndOfWeek('-1 week')], + 'daterangepicker.thisMonth' => [$factory->getStartOfMonth(), $factory->getEndOfMonth()], + 'daterangepicker.lastMonth' => [$factory->getStartOfLastMonth(), $factory->getEndOfLastMonth()], + 'daterangepicker.thisYearUntilNow' => [$factory->createStartOfYear(), $factory->createDateTime('23:59:59')], ]; + + $thisYear = (int) $factory->createStartOfYear()->format('Y'); + for ($i = 0; $i < 3; $i++) { + $year = $thisYear - $i; + $ranges[$year] = [$year . '-01-01', $year . '-12-31']; + } + + $view->vars['ranges'] = $ranges; $view->vars['rangeFormat'] = $options['format']; $view->vars['attr'] = array_merge($view->vars['attr'], [ diff --git a/src/Plugin/AbstractPluginExtension.php b/src/Plugin/AbstractPluginExtension.php index ceda0b1c..ba92cc47 100644 --- a/src/Plugin/AbstractPluginExtension.php +++ b/src/Plugin/AbstractPluginExtension.php @@ -14,6 +14,17 @@ use Symfony\Component\HttpKernel\DependencyInjection\Extension; abstract class AbstractPluginExtension extends Extension { + protected function registerIcon(ContainerBuilder $container, string $name, string $icon): void + { + $container->setParameter( + 'tabler_bundle.icons', + array_merge( + $container->getParameter('tabler_bundle.icons'), + [$name => $icon] + ) + ); + } + protected function registerBundleConfiguration(ContainerBuilder $container, array $configs): void { $bundleConfig = [$this->getAlias() => $configs]; diff --git a/src/Timesheet/DateTimeFactory.php b/src/Timesheet/DateTimeFactory.php index 00aec436..f13e9e51 100644 --- a/src/Timesheet/DateTimeFactory.php +++ b/src/Timesheet/DateTimeFactory.php @@ -48,6 +48,14 @@ final class DateTimeFactory return $date; } + public function getStartOfLastMonth(): DateTimeInterface + { + $newDate = $this->createDateTime('first day of -1 month'); + $newDate->setTime(0, 0, 0); + + return $newDate; + } + private function getDate(DateTimeInterface|string|null $date = null): DateTime { if ($date === null) { @@ -105,6 +113,14 @@ final class DateTimeFactory return $date; } + public function getEndOfLastMonth(): DateTimeInterface + { + $newDate = $this->createDateTime('last day of -1 month'); + $newDate->setTime(23, 59, 59); + + return $newDate; + } + private function createWeekDateTime($year, $week, $day, $hour, $minute, $second) { $date = new DateTime('now', $this->getTimezone()); diff --git a/src/Utils/DataTable.php b/src/Utils/DataTable.php index e726109f..30ab8109 100644 --- a/src/Utils/DataTable.php +++ b/src/Utils/DataTable.php @@ -148,7 +148,7 @@ final class DataTable implements \Countable, \IteratorAggregate public function hasConfiguration(): bool { - return $this->configuration; + return $this->configuration && \count($this->columns) > 0; } public function getPaginationRoute(): ?string diff --git a/src/Utils/PageSetup.php b/src/Utils/PageSetup.php index 30a50406..7592373c 100644 --- a/src/Utils/PageSetup.php +++ b/src/Utils/PageSetup.php @@ -9,6 +9,9 @@ namespace App\Utils; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\FormView; + final class PageSetup { private ?string $help = null; @@ -17,11 +20,27 @@ final class PageSetup private string $translationDomain = 'messages'; private array $actionPayload = []; private ?DataTable $dataTable = null; + private ?FormInterface $paginationForm = null; public function __construct(private string $title) { } + public function setPaginationForm(FormInterface $paginationForm): void + { + $this->paginationForm = $paginationForm; + } + + public function hasPaginationForm(): bool + { + return $this->paginationForm !== null; + } + + public function getPaginationForm(): ?FormView + { + return $this->paginationForm?->createView(); + } + public function hasDataTable(): bool { return $this->dataTable !== null; diff --git a/symfony.lock b/symfony.lock index 4d5412c7..26cf7d7c 100644 --- a/symfony.lock +++ b/symfony.lock @@ -2,9 +2,6 @@ "behat/transliterator": { "version": "v1.2.0" }, - "composer/package-versions-deprecated": { - "version": "1.11.99.5" - }, "composer/pcre": { "version": "1.0.1" }, diff --git a/templates/contract/status.html.twig b/templates/contract/status.html.twig index a0bc3fcb..82728d9b 100644 --- a/templates/contract/status.html.twig +++ b/templates/contract/status.html.twig @@ -1,29 +1,19 @@ -{% extends 'base.html.twig' %} +{% extends 'page_setup.html.twig' %} {% import "macros/widgets.html.twig" as widgets %} {% block main %} {% set withWorkHourConfiguration = user.hasWorkHourConfiguration() %} - {% if form is defined %} -
-
- {{ form_start(form, {'attr': {'class': 'form-reporting', 'id': 'report-form'}}) }} -
- {{ form_widget(form.date) }} - {% if form.user is defined %} - {{ form_widget(form.user, {'label': false}) }} - {% elseif app.user != user %} - {{ widgets.username(user) }} - {% endif %} -
- {{ form_end(form) }} -
-
- {% endif %} - {% if not withWorkHourConfiguration %} - {{ widgets.alert('info', 'work_times_should.none_configured'|trans) }} + {% set warningMsg %} + {{ 'work_times_should.none_configured'|trans }} + {% if is_granted('contract', user) %} + {{ 'action.edit'|trans }} + {% endif %} + {% endset %} + {% from '@theme/components/alert.html.twig' import alert %} + {{ alert({type: 'info', description: warningMsg|raw}) }} {% endif %} {% if summaries|length > 0 %} @@ -299,13 +289,6 @@ document.addEventListener('kimai.initialized', function() { KimaiReloadPageWidget.create('kimai.workingTimesUpdate', true); - - const contractForm = document.getElementById('report-form'); - if (contractForm !== null) { - contractForm.addEventListener('change', () => { - contractForm.submit(); - }); - } }); {% endblock %} diff --git a/templates/datatable.html.twig b/templates/datatable.html.twig index 28a0a4a3..be66ad07 100644 --- a/templates/datatable.html.twig +++ b/templates/datatable.html.twig @@ -2,6 +2,10 @@ {% import "macros/widgets.html.twig" as widgets %} {% import "macros/datatables.html.twig" as tables %} +{% if dataTable is not defined and page_setup is defined and page_setup.hasDataTable() %} + {% set dataTable = page_setup.getDataTable() %} +{% endif %} + {% block main_before %} {{ tables.configuration(dataTable) }} {% endblock %} diff --git a/templates/export/pdf-layout.html.twig b/templates/export/pdf-layout.html.twig index 6de4e02c..5040745d 100644 --- a/templates/export/pdf-layout.html.twig +++ b/templates/export/pdf-layout.html.twig @@ -1,12 +1,13 @@ {% set showUserColumn = showUserColumn ?? true %} {% set showInternalRate = showInternalRate ?? false %} {% set showRateColumn = showRateColumn ?? is_granted('view_rate_other_timesheet') %} +{% set showHourlyRateColumn = showRateColumn and (showHourlyRateColumn ?? false) %} +{% set showSummaryHourlyRate = showRateColumn and (showSummaryHourlyRate ?? false) %} {% set showRateBudget = showRateBudget ?? false %} {% set showTimeBudget = showTimeBudget ?? false %} {% set showCustomerSummary = showCustomerSummary ?? true %} {% set showTotalSummary = showTotalSummary ?? true %} {% set showDateTimeShort = showDateTimeShort ?? false %} -{% set showSummaryHourlyRate = showSummaryHourlyRate ?? false %} {% set now = create_date('now', app.user) %} {% set decimal = decimal ?? false %} {# this is only triggered, if a user exports from his personal timesheet screen #} @@ -228,6 +229,9 @@ mpdf--> {{ 'user'|trans }} {% endif %} {{ 'description'|trans }} + {% if showHourlyRateColumn %} + {{ 'hourlyRate'|trans }} + {% endif %} {{ 'duration'|trans }} {% if showRateColumn %} {% if showInternalRate %} @@ -241,10 +245,11 @@ mpdf--> {% for entry in entries %} {% set duration = duration + entry.duration %} + {% set entryCurrency = entry.project.customer.currency %} {% if currency is same as(false) %} - {% set currency = entry.project.customer.currency %} + {% set currency = entryCurrency %} {% endif %} - {% if currency is not same as(entry.project.customer.currency) %} + {% if currency is not same as(entryCurrency) %} {% set currency = null %} {% endif %} @@ -266,14 +271,29 @@ mpdf--> {% endif %} {% endblock %} - {{ entry.duration|duration(decimal) }} + {% if showHourlyRateColumn %} + + {% if entry.fixedRate %} + - + {% else %} + {{ entry.hourlyRate|money(entryCurrency) }} + {% endif %} + + {% endif %} + + {% if entry.duration == 0 %} + - + {% else %} + {{ entry.duration|duration(decimal) }} + {% endif %} + {% if showRateColumn %} {# no check for is_granted('view_rate', entry) because it is only available for timesheets, but maybe missing for other potential export repositories #} {% set rate = rate + entry.rate %} {% set rateInternal = rateInternal + entry.internalRate %} - {% set entryRate = entry.rate|money(entry.project.customer.currency) %} - {% set entryRateInternal = entry.internalRate|money(entry.project.customer.currency) %} + {% set entryRate = entry.rate|money(entryCurrency) %} + {% set entryRateInternal = entry.internalRate|money(entryCurrency) %} {% if showInternalRate %} {{ entryRateInternal }} {% endif %} @@ -287,6 +307,9 @@ mpdf--> {% else %} {{ 'sum.total'|trans }} {% endif %} + {% if showHourlyRateColumn %} + + {% endif %} {{ duration|duration(decimal) }} {% if showRateColumn %} {% if showInternalRate %} diff --git a/templates/form/blocks.html.twig b/templates/form/blocks.html.twig index 8f0c3c9c..b83843ce 100644 --- a/templates/form/blocks.html.twig +++ b/templates/form/blocks.html.twig @@ -174,7 +174,7 @@ {% endif %} @@ -261,7 +261,6 @@ {%- endblock secret_widget %} {% block yearpicker_widget -%} - {%- set functionName = 'year_' ~ form.vars.id %}
@@ -286,7 +285,6 @@ {%- endblock yearpicker_widget %} {% block monthpicker_widget -%} - {%- set functionName = 'month_' ~ form.vars.id %}
@@ -305,7 +303,6 @@ {%- endblock monthpicker_widget %} {% block weekpicker_widget -%} - {%- set functionName = 'week_' ~ form.vars.id %}
diff --git a/templates/macros/datatables.html.twig b/templates/macros/datatables.html.twig index f316d4f6..6462785b 100644 --- a/templates/macros/datatables.html.twig +++ b/templates/macros/datatables.html.twig @@ -15,6 +15,7 @@ {{- datatable_column_class(dataTable.getTableName(), column) -}} {% endmacro %} +{# compare templates/page_setup.html.twig block table_actions #} {% macro actions(dataTable) %} {% set btnClass = '' %} {% set bgClass = '' %} diff --git a/templates/page_setup.html.twig b/templates/page_setup.html.twig new file mode 100644 index 00000000..cd620241 --- /dev/null +++ b/templates/page_setup.html.twig @@ -0,0 +1,28 @@ +{% extends 'base.html.twig' %} +{% import "macros/widgets.html.twig" as widgets %} + +{% block table_actions %} + {# compare templates/macros/datatables.html.twig macro actions(dataTable) #} + {% if page_setup is defined and page_setup.hasPaginationForm() %} +
+ {% set form = page_setup.getPaginationForm() %} + {{ form_start(form, {'attr': {'onchange': 'this.submit()'}}) }} +
+ {% if form.date is defined %} + {{ form_widget(form.date) }} + {% endif %} + {% if form.user is defined %} + {{ form_widget(form.user) }} + {% elseif user is defined and app.user != user %} + {{ widgets.username(user) }} + {% endif %} + {% for field in form %} + {% if not field.rendered %} + {{ form_widget(field) }} + {% endif %} + {% endfor %} +
+ {{ form_end(form) }} +
+ {% endif %} +{% endblock %} diff --git a/templates/permission/edit_role.html.twig b/templates/permission/edit_role.html.twig index cc52eca2..0dfe5be4 100644 --- a/templates/permission/edit_role.html.twig +++ b/templates/permission/edit_role.html.twig @@ -1,5 +1,4 @@ {% extends kimai_context.modalRequest ? 'form.html.twig' : 'base.html.twig' %} -{% import "macros/widgets.html.twig" as widgets %} {% block main %} {{ include(kimai_context.modalRequest ? 'default/_form_modal.html.twig' : 'default/_form.html.twig', { diff --git a/templates/user/2fa.html.twig b/templates/user/2fa.html.twig index ddec3f0a..6a430191 100644 --- a/templates/user/2fa.html.twig +++ b/templates/user/2fa.html.twig @@ -8,7 +8,8 @@ {{ 'profile.2fa_intro'|trans }}

- TOTP QR Code + TOTP QR Code + {{ secret }}

{% if user.totpAuthenticationEnabled %}
diff --git a/tests/Controller/ProfileControllerTest.php b/tests/Controller/ProfileControllerTest.php index 4ff6530c..f7375af6 100644 --- a/tests/Controller/ProfileControllerTest.php +++ b/tests/Controller/ProfileControllerTest.php @@ -483,7 +483,7 @@ class ProfileControllerTest extends ControllerBaseTest $content = $client->getResponse()->getContent(); $this->assertNotFalse($content); - $this->assertStringContainsString('TOTP QR Code', $content); } @@ -503,7 +503,7 @@ class ProfileControllerTest extends ControllerBaseTest $this->assertNotFalse($content); $formUrl = $this->createUrl('/profile/' . UserFixtures::USERNAME_USER . '/2fa'); - $this->assertStringContainsString('TOTP QR Code', $content); } diff --git a/tests/Entity/UserTest.php b/tests/Entity/UserTest.php index 8a2f258c..8a1c2bbf 100644 --- a/tests/Entity/UserTest.php +++ b/tests/Entity/UserTest.php @@ -41,6 +41,8 @@ class UserTest extends TestCase self::assertNull($user->getApiToken()); self::assertNull($user->getPlainApiToken()); self::assertNull($user->getPasswordRequestedAt()); + self::assertFalse($user->hasTotpSecret()); + self::assertNull($user->getTotpSecret()); self::assertEquals(User::DEFAULT_LANGUAGE, $user->getLocale()); self::assertFalse($user->hasTeamAssignment()); self::assertFalse($user->canSeeAllData()); @@ -59,6 +61,9 @@ class UserTest extends TestCase $user->setApiToken('nbvfdswe34567ujko098765rerfghbgvfcdsert'); self::assertEquals('nbvfdswe34567ujko098765rerfghbgvfcdsert', $user->getApiToken()); + $user->setTotpSecret('ertzuio878t6rtdrjfcghvjkiu87'); + self::assertEquals('ertzuio878t6rtdrjfcghvjkiu87', $user->getTotpSecret()); + $user->setPlainApiToken('https://www.gravatar.com/avatar/nbvfdswe34567ujko098765rerfghbgvfcdsert'); self::assertEquals('https://www.gravatar.com/avatar/nbvfdswe34567ujko098765rerfghbgvfcdsert', $user->getPlainApiToken()); diff --git a/translations/actions.de.xlf b/translations/actions.de.xlf index c7bb2d2e..2b4d9465 100644 --- a/translations/actions.de.xlf +++ b/translations/actions.de.xlf @@ -118,6 +118,14 @@ Remove widget Widget entfernen + + syncronisation + Syncronisierung + + + import + Import + diff --git a/translations/actions.en.xlf b/translations/actions.en.xlf index d722ea00..fe1e2454 100644 --- a/translations/actions.en.xlf +++ b/translations/actions.en.xlf @@ -118,6 +118,14 @@ Remove widget Remove widget + + syncronisation + Syncronisation + + + import + Import + diff --git a/translations/messages.de.xlf b/translations/messages.de.xlf index 465655d2..64955f9a 100644 --- a/translations/messages.de.xlf +++ b/translations/messages.de.xlf @@ -1537,6 +1537,38 @@ time Uhrzeit + + send_to + Senden an %name% + + + receive_from + Empfangen von %name% + + + public_holiday + Feiertag + + + public_holidays + Feiertage + + + public_holiday.group + Feiertags-Gruppe + + + absence + Abwesenheit + + + time_off + Freizeitausgleich + + + default + Standard + diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 122a2084..e94436ab 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -1537,6 +1537,38 @@ time Time + + send_to + Send to %name% + + + receive_from + Receive from %name% + + + public_holiday + Public holiday + + + public_holidays + Public holidays + + + public_holiday.group + Holiday group + + + absence + Absence + + + time_off + Time off + + + default + Default +