diff --git a/.env.dist b/.env.dist index 2ccc39f4..0a9bdd3f 100644 --- a/.env.dist +++ b/.env.dist @@ -16,10 +16,10 @@ # For MySQL that would be "serverVersion=5.7" as in: # DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=5.7 # -# For MariaDB it would be "serverVersion=mariadb-10.5.8": -# DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=mariadb-10.5.8 +# For MariaDB it would be "serverVersion=10.5.8-MariaDB": +# DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=10.5.8-MariaDB # -DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=5.7 +DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=10.5.8-MariaDB #================================================================================ # The full documentation can be found at https://www.kimai.org/documentation/emails.html diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 9a3c267d..b4866bf9 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -33,7 +33,7 @@ $fixer 'no_break_comment' => true, 'no_closing_tag' => true, 'no_spaces_after_function_name' => true, - 'no_spaces_inside_parenthesis' => true, + 'spaces_inside_parentheses' => ['space' => 'none'], 'no_trailing_whitespace' => true, 'no_trailing_whitespace_in_comment' => true, 'single_blank_line_at_eof' => true, @@ -54,7 +54,7 @@ $fixer 'class_attributes_separation' => ['elements' => ['method' => 'one']], 'concat_space' => ['spacing' => 'one'], 'declare_equal_normalize' => true, - 'function_typehint_space' => true, + 'type_declaration_spaces' => ['elements' => ['function', 'property']], 'include' => true, 'lowercase_cast' => true, 'lowercase_static_reference' => true, @@ -123,7 +123,7 @@ $fixer 'return_type_declaration' => true, 'semicolon_after_instruction' => true, 'short_scalar_cast' => true, - 'single_blank_line_before_namespace' => true, + 'blank_lines_before_namespace' => ['min_line_breaks' => 2, 'max_line_breaks' => 2], 'single_line_comment_style' => [ 'comment_types' => ['hash'], ], diff --git a/UPGRADING.md b/UPGRADING.md index b5697f79..034e2d0b 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -11,7 +11,7 @@ Perform EACH version specific task between your version and the new one, otherwi ## [2.0.30](https://github.com/kimai/kimai/releases/tag/2.0.30) The `DATABASE_URL` in your environment settings ([.env](https://github.com/kimai/kimai/issues/4246) or in your [Docker](https://github.com/tobybatch/kimai2/issues/531) or webserver config) -now requires the `charset` and `serverVersion` params, e.g.: `DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=5.7` (examples in `.env`). +now requires the `charset` and `serverVersion` params, e.g.: `DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=10.5.8-MariaDB` (examples in `.env`). ## [2.0](https://github.com/kimai/kimai/releases/tag/2.0) diff --git a/assets/sass/forms.scss b/assets/sass/forms.scss index f765e88a..49034e70 100644 --- a/assets/sass/forms.scss +++ b/assets/sass/forms.scss @@ -37,10 +37,6 @@ border-radius: var(--tblr-border-radius); } -fieldset:empty { - display: none; -} - /* e.g. the work contract settings is user profile render rows with mb-3 and the last row doesn't need that */ fieldset > .mb-3.row:last-child { margin-bottom: 0!important; diff --git a/assets/sass/tabler-fixes.scss b/assets/sass/tabler-fixes.scss index 02dabab8..e6e50f1d 100644 --- a/assets/sass/tabler-fixes.scss +++ b/assets/sass/tabler-fixes.scss @@ -15,4 +15,20 @@ fieldset.form-fieldset legend { } .dropdown-divider { --tblr-dropdown-divider-margin-y: .5rem; -} \ No newline at end of file +} + +/* +fixes translucent scroll border, e.g. in timesheet modal duration dropdown +https://github.com/tabler/tabler/issues/1606 +*/ +.dropdown-menu { + background-clip: border-box; +} + +/* +hide empty fieldset +https://github.com/tabler/tabler/issues/1650 +*/ +fieldset:empty { + display: none; +} diff --git a/composer.json b/composer.json index 92ebf7ab..d8f312b5 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "doctrine/doctrine-bundle": "^2.7", "doctrine/doctrine-migrations-bundle": "^3.0", "doctrine/orm": "^2.8", - "endroid/qr-code": "^4.4.9", + "endroid/qr-code": "^4.8", "erusev/parsedown": "^1.6", "friendsofsymfony/rest-bundle": "^3.0", "gedmo/doctrine-extensions": "^3.6", @@ -44,8 +44,8 @@ "pagerfanta/pagerfanta": "^3.0", "phpoffice/phpspreadsheet": "^1.16", "phpoffice/phpword": "^1.0", - "psr/container": "^1.0||^2.0", - "psr/log": "^2.0||^3.0", + "psr/container": "^2.0", + "psr/log": "^3.0", "scheb/2fa-backup-code": "^6.2", "scheb/2fa-bundle": "^6.2", "scheb/2fa-totp": "^6.2", @@ -68,7 +68,7 @@ "symfony/translation": "^6.0", "symfony/twig-bundle": "^6.0", "symfony/validator": "^6.0", - "symfony/webpack-encore-bundle": "^1.16", + "symfony/webpack-encore-bundle": "^2.0", "symfony/yaml": "^6.0", "twig/cssinliner-extra": "^3.0", "twig/extra-bundle": "^3.0", @@ -201,7 +201,7 @@ "symfony": { "id": "01C3FWRDJJEX9K6Y3A4XDFXPBR", "allow-contrib": true, - "require": "6.2.*" + "require": "6.3.*" } } } diff --git a/composer.lock b/composer.lock index 7553cc1c..2494b665 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ea0cac01bf542aa09f23052e82090ec8", + "content-hash": "9159cc3cf1d749c412d1353e921de6fc", "packages": [ { "name": "azuyalabs/yasumi", @@ -4068,16 +4068,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.0", + "version": "1.24.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "3510b0a6274cc42f7219367cb3abfc123ffa09d6" + "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/3510b0a6274cc42f7219367cb3abfc123ffa09d6", - "reference": "3510b0a6274cc42f7219367cb3abfc123ffa09d6", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", + "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", "shasum": "" }, "require": { @@ -4109,9 +4109,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.24.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.1" }, - "time": "2023-09-07T20:46:32+00:00" + "time": "2023-09-18T12:18:02+00:00" }, { "name": "psr/cache", @@ -4162,6 +4162,54 @@ }, "time": "2021-02-03T23:26:27+00:00" }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", "version": "2.0.2", @@ -4889,16 +4937,16 @@ }, { "name": "symfony/asset", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "223df790e684ecc7bc37323c2d1e265129ca02de" + "reference": "b77a4cc8e266b7e0db688de740f9ee7253aa411c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/223df790e684ecc7bc37323c2d1e265129ca02de", - "reference": "223df790e684ecc7bc37323c2d1e265129ca02de", + "url": "https://api.github.com/repos/symfony/asset/zipball/b77a4cc8e266b7e0db688de740f9ee7253aa411c", + "reference": "b77a4cc8e266b7e0db688de740f9ee7253aa411c", "shasum": "" }, "require": { @@ -4912,9 +4960,6 @@ "symfony/http-foundation": "^5.4|^6.0", "symfony/http-kernel": "^5.4|^6.0" }, - "suggest": { - "symfony/http-foundation": "" - }, "type": "library", "autoload": { "psr-4": { @@ -4941,7 +4986,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v6.2.7" + "source": "https://github.com/symfony/asset/tree/v6.3.0" }, "funding": [ { @@ -4957,28 +5002,28 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-04-21T14:41:17+00:00" }, { "name": "symfony/cache", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "c47f4a9e9d172359516c35490d6b649d2d44c50d" + "reference": "e60d00b4f633efa4c1ef54e77c12762d9073e7b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/c47f4a9e9d172359516c35490d6b649d2d44c50d", - "reference": "c47f4a9e9d172359516c35490d6b649d2d44c50d", + "url": "https://api.github.com/repos/symfony/cache/zipball/e60d00b4f633efa4c1ef54e77c12762d9073e7b3", + "reference": "e60d00b4f633efa4c1ef54e77c12762d9073e7b3", "shasum": "" }, "require": { "php": ">=8.1", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2|^3", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/var-exporter": "^6.2.10" }, "conflict": { @@ -4995,7 +5040,7 @@ "require-dev": { "cache/integration-tests": "dev-master", "doctrine/dbal": "^2.13.1|^3.0", - "predis/predis": "^1.1", + "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", "symfony/config": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", @@ -5037,7 +5082,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.2.13" + "source": "https://github.com/symfony/cache/tree/v6.3.4" }, "funding": [ { @@ -5053,7 +5098,7 @@ "type": "tidelift" } ], - "time": "2023-07-27T16:12:47+00:00" + "time": "2023-08-05T09:10:27+00:00" }, { "name": "symfony/cache-contracts", @@ -5132,38 +5177,109 @@ "time": "2023-05-23T14:45:45+00:00" }, { - "name": "symfony/config", - "version": "v6.2.13", + "name": "symfony/clock", + "version": "v6.3.4", "source": { "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "26a3db700baf625d86d0ec669d893ed9da3fa868" + "url": "https://github.com/symfony/clock.git", + "reference": "a74086d3db70d0f06ffd84480daa556248706e98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/26a3db700baf625d86d0ec669d893ed9da3fa868", - "reference": "26a3db700baf625d86d0ec669d893ed9da3fa868", + "url": "https://api.github.com/repos/symfony/clock/zipball/a74086d3db70d0f06ffd84480daa556248706e98", + "reference": "a74086d3db70d0f06ffd84480daa556248706e98", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v6.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-31T11:35:03+00:00" + }, + { + "name": "symfony/config", + "version": "v6.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/filesystem": "^5.4|^6.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4" + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { "symfony/event-dispatcher": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, "type": "library", "autoload": { "psr-4": { @@ -5190,7 +5306,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.2.13" + "source": "https://github.com/symfony/config/tree/v6.3.2" }, "funding": [ { @@ -5206,27 +5322,27 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:22:10+00:00" + "time": "2023-07-19T20:22:16+00:00" }, { "name": "symfony/console", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e30dfbceadb96cb67605b69b1277c41332fae185" + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e30dfbceadb96cb67605b69b1277c41332fae185", - "reference": "e30dfbceadb96cb67605b69b1277c41332fae185", + "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/string": "^5.4|^6.0" }, "conflict": { @@ -5248,12 +5364,6 @@ "symfony/process": "^5.4|^6.0", "symfony/var-dumper": "^5.4|^6.0" }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, "type": "library", "autoload": { "psr-4": { @@ -5286,7 +5396,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.2.13" + "source": "https://github.com/symfony/console/tree/v6.3.4" }, "funding": [ { @@ -5302,20 +5412,20 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:17:04+00:00" + "time": "2023-08-16T10:10:12+00:00" }, { "name": "symfony/css-selector", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "61444c8e4cbe80217a233364d8254fa6df247f50" + "reference": "883d961421ab1709877c10ac99451632a3d6fa57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/61444c8e4cbe80217a233364d8254fa6df247f50", - "reference": "61444c8e4cbe80217a233364d8254fa6df247f50", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57", "shasum": "" }, "require": { @@ -5351,7 +5461,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.2.13" + "source": "https://github.com/symfony/css-selector/tree/v6.3.2" }, "funding": [ { @@ -5367,34 +5477,34 @@ "type": "tidelift" } ], - "time": "2023-07-12T15:50:46+00:00" + "time": "2023-07-12T16:00:22+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "d977404486b419bedf450739a9f8992a88c1d6e3" + "reference": "68a5a9570806a087982f383f6109c5e925892a49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d977404486b419bedf450739a9f8992a88c1d6e3", - "reference": "d977404486b419bedf450739a9f8992a88c1d6e3", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/68a5a9570806a087982f383f6109c5e925892a49", + "reference": "68a5a9570806a087982f383f6109c5e925892a49", "shasum": "" }, "require": { "php": ">=8.1", "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/service-contracts": "^1.1.6|^2.0|^3.0", - "symfony/var-exporter": "^6.2.7" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.2.10" }, "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<6.1", "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.2", + "symfony/proxy-manager-bridge": "<6.3", "symfony/yaml": "<5.4" }, "provide": { @@ -5406,12 +5516,6 @@ "symfony/expression-language": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/yaml": "" - }, "type": "library", "autoload": { "psr-4": { @@ -5438,7 +5542,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.13" + "source": "https://github.com/symfony/dependency-injection/tree/v6.3.4" }, "funding": [ { @@ -5454,7 +5558,7 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:17:04+00:00" + "time": "2023-08-16T17:55:17+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5525,35 +5629,38 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "98b275bff5fe26a6b450172b1f28956aed6c3422" + "reference": "589eeeb93669739ec1d8bd4593e4972d94e0981d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/98b275bff5fe26a6b450172b1f28956aed6c3422", - "reference": "98b275bff5fe26a6b450172b1f28956aed6c3422", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/589eeeb93669739ec1d8bd4593e4972d94e0981d", + "reference": "589eeeb93669739ec1d8bd4593e4972d94e0981d", "shasum": "" }, "require": { "doctrine/event-manager": "^1.2|^2", "doctrine/persistence": "^2|^3", "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "doctrine/annotations": "<1.13.1", "doctrine/dbal": "<2.13.1", "doctrine/lexer": "<1.1", - "doctrine/orm": "<2.7.4", + "doctrine/orm": "<2.12", "symfony/cache": "<5.4", - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.2", "symfony/form": "<5.4.21|>=6,<6.2.7", + "symfony/http-foundation": "<6.3", "symfony/http-kernel": "<6.2", + "symfony/lock": "<6.3", "symfony/messenger": "<5.4", "symfony/property-info": "<5.4", "symfony/security-bundle": "<5.4", @@ -5561,19 +5668,20 @@ "symfony/validator": "<5.4.25|>=6,<6.2.12|>=6.3,<6.3.1" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", + "doctrine/annotations": "^1.13.1|^2", "doctrine/collections": "^1.0|^2.0", "doctrine/data-fixtures": "^1.1", "doctrine/dbal": "^2.13.1|^3.0", - "doctrine/orm": "^2.7.4", + "doctrine/orm": "^2.12", "psr/log": "^1|^2|^3", "symfony/cache": "^5.4|^6.0", "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", + "symfony/dependency-injection": "^6.2", "symfony/doctrine-messenger": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/form": "^5.4.21|^6.2.7", - "symfony/http-kernel": "^6.2", + "symfony/http-kernel": "^6.3", + "symfony/lock": "^6.3", "symfony/messenger": "^5.4|^6.0", "symfony/property-access": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", @@ -5585,14 +5693,6 @@ "symfony/validator": "^5.4.25|~6.2.12|^6.3.1", "symfony/var-dumper": "^5.4|^6.0" }, - "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/property-info": "", - "symfony/validator": "" - }, "type": "symfony-bridge", "autoload": { "psr-4": { @@ -5619,7 +5719,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.13" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.3.4" }, "funding": [ { @@ -5635,20 +5735,20 @@ "type": "tidelift" } ], - "time": "2023-07-20T14:50:55+00:00" + "time": "2023-08-08T10:40:25+00:00" }, { "name": "symfony/dotenv", - "version": "v6.2.8", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "4481aa45be7a11d2335c1d5b5bbe2f0c6199b105" + "reference": "ceadb434fe2a6763a03d2d110441745834f3dd1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/4481aa45be7a11d2335c1d5b5bbe2f0c6199b105", - "reference": "4481aa45be7a11d2335c1d5b5bbe2f0c6199b105", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/ceadb434fe2a6763a03d2d110441745834f3dd1e", + "reference": "ceadb434fe2a6763a03d2d110441745834f3dd1e", "shasum": "" }, "require": { @@ -5693,7 +5793,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.2.8" + "source": "https://github.com/symfony/dotenv/tree/v6.3.0" }, "funding": [ { @@ -5709,20 +5809,20 @@ "type": "tidelift" } ], - "time": "2023-03-10T10:06:03+00:00" + "time": "2023-04-21T14:41:17+00:00" }, { "name": "symfony/error-handler", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "69f92a208efc45a98fa240d0792d210ef5eef987" + "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/69f92a208efc45a98fa240d0792d210ef5eef987", - "reference": "69f92a208efc45a98fa240d0792d210ef5eef987", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/85fd65ed295c4078367c784e8a5a6cee30348b7a", + "reference": "85fd65ed295c4078367c784e8a5a6cee30348b7a", "shasum": "" }, "require": { @@ -5730,8 +5830,11 @@ "psr/log": "^1|^2|^3", "symfony/var-dumper": "^5.4|^6.0" }, + "conflict": { + "symfony/deprecation-contracts": "<2.5" + }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^5.4|^6.0", "symfony/serializer": "^5.4|^6.0" }, @@ -5764,7 +5867,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.13" + "source": "https://github.com/symfony/error-handler/tree/v6.3.2" }, "funding": [ { @@ -5780,28 +5883,29 @@ "type": "tidelift" } ], - "time": "2023-07-16T16:55:01+00:00" + "time": "2023-07-16T17:05:46+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a6e533212c6c298c6a4d1e892e4cdbf45ea21f1c" + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a6e533212c6c298c6a4d1e892e4cdbf45ea21f1c", - "reference": "a6e533212c6c298c6a4d1e892e4cdbf45ea21f1c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -5814,13 +5918,9 @@ "symfony/error-handler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/stopwatch": "^5.4|^6.0" }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, "type": "library", "autoload": { "psr-4": { @@ -5847,7 +5947,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.13" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" }, "funding": [ { @@ -5863,7 +5963,7 @@ "type": "tidelift" } ], - "time": "2023-07-06T06:53:05+00:00" + "time": "2023-07-06T06:56:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5943,22 +6043,23 @@ }, { "name": "symfony/expression-language", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "83e1fee4c018aa60bcbbecd585a2c54af6aca905" + "reference": "6d560c4c80e7e328708efd923f93ad67e6a0c1c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/83e1fee4c018aa60bcbbecd585a2c54af6aca905", - "reference": "83e1fee4c018aa60bcbbecd585a2c54af6aca905", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/6d560c4c80e7e328708efd923f93ad67e6a0c1c0", + "reference": "6d560c4c80e7e328708efd923f93ad67e6a0c1c0", "shasum": "" }, "require": { "php": ">=8.1", "symfony/cache": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -5986,7 +6087,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v6.2.7" + "source": "https://github.com/symfony/expression-language/tree/v6.3.0" }, "funding": [ { @@ -6002,20 +6103,20 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:57:23+00:00" + "time": "2023-04-28T16:05:33+00:00" }, { "name": "symfony/filesystem", - "version": "v6.2.12", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b0818e7203e53540f2a5c9a5017d97897df1e9bb" + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b0818e7203e53540f2a5c9a5017d97897df1e9bb", - "reference": "b0818e7203e53540f2a5c9a5017d97897df1e9bb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "shasum": "" }, "require": { @@ -6049,7 +6150,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.12" + "source": "https://github.com/symfony/filesystem/tree/v6.3.1" }, "funding": [ { @@ -6065,20 +6166,20 @@ "type": "tidelift" } ], - "time": "2023-06-01T08:29:37+00:00" + "time": "2023-06-01T08:30:39+00:00" }, { "name": "symfony/finder", - "version": "v6.2.14", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8ccb900489183bd5ec3d04f92e28ee0c0af543dd" + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8ccb900489183bd5ec3d04f92e28ee0c0af543dd", - "reference": "8ccb900489183bd5ec3d04f92e28ee0c0af543dd", + "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", "shasum": "" }, "require": { @@ -6113,7 +6214,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.2.14" + "source": "https://github.com/symfony/finder/tree/v6.3.3" }, "funding": [ { @@ -6129,7 +6230,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T10:27:17+00:00" + "time": "2023-07-31T08:31:44+00:00" }, { "name": "symfony/flex", @@ -6198,28 +6299,28 @@ }, { "name": "symfony/form", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "14276bc6226f75ef0482dd17a22dd773149f6af3" + "reference": "afdadf511e08bc6d4752afb869ce084276aca4e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/14276bc6226f75ef0482dd17a22dd773149f6af3", - "reference": "14276bc6226f75ef0482dd17a22dd773149f6af3", + "url": "https://api.github.com/repos/symfony/form/zipball/afdadf511e08bc6d4752afb869ce084276aca4e2", + "reference": "afdadf511e08bc6d4752afb869ce084276aca4e2", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher": "^5.4|^6.0", "symfony/options-resolver": "^5.4|^6.0", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-mbstring": "~1.0", "symfony/property-access": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/console": "<5.4", @@ -6229,8 +6330,8 @@ "symfony/framework-bundle": "<5.4", "symfony/http-kernel": "<5.4", "symfony/translation": "<5.4", - "symfony/translation-contracts": "<1.1.7", - "symfony/twig-bridge": "<5.4.21|>=6,<6.2.7" + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.3" }, "require-dev": { "doctrine/collections": "^1.0|^2.0", @@ -6249,12 +6350,6 @@ "symfony/validator": "^5.4|^6.0", "symfony/var-dumper": "^5.4|^6.0" }, - "suggest": { - "symfony/security-core": "For hashing users passwords.", - "symfony/security-csrf": "For protecting forms against CSRF attacks.", - "symfony/twig-bridge": "For templating with Twig.", - "symfony/validator": "For form validation." - }, "type": "library", "autoload": { "psr-4": { @@ -6281,7 +6376,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.13" + "source": "https://github.com/symfony/form/tree/v6.3.2" }, "funding": [ { @@ -6297,20 +6392,20 @@ "type": "tidelift" } ], - "time": "2023-07-26T17:38:53+00:00" + "time": "2023-07-26T17:39:03+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "331d13a47e5f1d95c0064cfa043421051af7c56b" + "reference": "f822f54ff05cd88878910b4559f66c12176d952c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/331d13a47e5f1d95c0064cfa043421051af7c56b", - "reference": "331d13a47e5f1d95c0064cfa043421051af7c56b", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/f822f54ff05cd88878910b4559f66c12176d952c", + "reference": "f822f54ff05cd88878910b4559f66c12176d952c", "shasum": "" }, "require": { @@ -6319,14 +6414,14 @@ "php": ">=8.1", "symfony/cache": "^5.4|^6.0", "symfony/config": "^6.1", - "symfony/dependency-injection": "^6.2.8", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/dependency-injection": "^6.3.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.1", "symfony/event-dispatcher": "^5.4|^6.0", "symfony/filesystem": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", - "symfony/http-foundation": "^6.2.11", - "symfony/http-kernel": "^6.2.1", + "symfony/http-foundation": "^6.3", + "symfony/http-kernel": "^6.3", "symfony/polyfill-mbstring": "~1.0", "symfony/routing": "^5.4|^6.0" }, @@ -6336,25 +6431,26 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/asset": "<5.4", + "symfony/clock": "<6.3", "symfony/console": "<5.4", - "symfony/dom-crawler": "<5.4", + "symfony/dom-crawler": "<6.3", "symfony/dotenv": "<5.4", "symfony/form": "<5.4", - "symfony/http-client": "<5.4", + "symfony/http-client": "<6.3", "symfony/lock": "<5.4", "symfony/mailer": "<5.4", - "symfony/messenger": "<6.2", + "symfony/messenger": "<6.3", "symfony/mime": "<6.2", "symfony/property-access": "<5.4", "symfony/property-info": "<5.4", "symfony/security-core": "<5.4", "symfony/security-csrf": "<5.4", - "symfony/serializer": "<6.1", + "symfony/serializer": "<6.3", "symfony/stopwatch": "<5.4", "symfony/translation": "<6.2.8", "symfony/twig-bridge": "<5.4", "symfony/twig-bundle": "<5.4", - "symfony/validator": "<5.4", + "symfony/validator": "<6.3", "symfony/web-profiler-bundle": "<5.4", "symfony/workflow": "<5.4" }, @@ -6363,48 +6459,41 @@ "doctrine/persistence": "^1.3|^2|^3", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/asset": "^5.4|^6.0", + "symfony/asset-mapper": "^6.3", "symfony/browser-kit": "^5.4|^6.0", + "symfony/clock": "^6.2", "symfony/console": "^5.4.9|^6.0.9", "symfony/css-selector": "^5.4|^6.0", - "symfony/dom-crawler": "^5.4|^6.0", + "symfony/dom-crawler": "^6.3", "symfony/dotenv": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/form": "^5.4|^6.0", "symfony/html-sanitizer": "^6.1", - "symfony/http-client": "^5.4|^6.0", + "symfony/http-client": "^6.3", "symfony/lock": "^5.4|^6.0", "symfony/mailer": "^5.4|^6.0", - "symfony/messenger": "^6.2", + "symfony/messenger": "^6.3", "symfony/mime": "^6.2", "symfony/notifier": "^5.4|^6.0", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", "symfony/rate-limiter": "^5.4|^6.0", + "symfony/scheduler": "^6.3", "symfony/security-bundle": "^5.4|^6.0", "symfony/semaphore": "^5.4|^6.0", - "symfony/serializer": "^6.1", + "symfony/serializer": "^6.3", "symfony/stopwatch": "^5.4|^6.0", "symfony/string": "^5.4|^6.0", "symfony/translation": "^6.2.8", "symfony/twig-bundle": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", + "symfony/validator": "^6.3", "symfony/web-link": "^5.4|^6.0", "symfony/workflow": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0", "twig/twig": "^2.10|^3.0" }, - "suggest": { - "ext-apcu": "For best performance of the system caches", - "symfony/console": "For using the console commands", - "symfony/form": "For using forms", - "symfony/property-info": "For using the property_info service", - "symfony/serializer": "For using the serializer service", - "symfony/validator": "For using validation", - "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", - "symfony/yaml": "For using the debug:config and lint:yaml commands" - }, "type": "symfony-bundle", "autoload": { "psr-4": { @@ -6431,7 +6520,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.13" + "source": "https://github.com/symfony/framework-bundle/tree/v6.3.4" }, "funding": [ { @@ -6447,28 +6536,32 @@ "type": "tidelift" } ], - "time": "2023-07-26T17:38:53+00:00" + "time": "2023-08-16T18:04:38+00:00" }, { "name": "symfony/http-client", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "297374a399ce6852d5905d92a1351df00bb9dd10" + "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/297374a399ce6852d5905d92a1351df00bb9dd10", - "reference": "297374a399ce6852d5905d92a1351df00bb9dd10", + "url": "https://api.github.com/repos/symfony/http-client/zipball/15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", + "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "^3", - "symfony/service-contracts": "^1.0|^2|^3" + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.3" }, "provide": { "php-http/async-client-implementation": "*", @@ -6484,7 +6577,6 @@ "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", @@ -6520,7 +6612,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.2.13" + "source": "https://github.com/symfony/http-client/tree/v6.3.2" }, "funding": [ { @@ -6536,7 +6628,7 @@ "type": "tidelift" } ], - "time": "2023-07-03T12:13:45+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/http-client-contracts", @@ -6618,28 +6710,30 @@ }, { "name": "symfony/http-foundation", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "d64109065a5283c96f1ccbe2f2eeedf75ef7d490" + "reference": "cac1556fdfdf6719668181974104e6fcfa60e844" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d64109065a5283c96f1ccbe2f2eeedf75ef7d490", - "reference": "d64109065a5283c96f1ccbe2f2eeedf75ef7d490", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cac1556fdfdf6719668181974104e6fcfa60e844", + "reference": "cac1556fdfdf6719668181974104e6fcfa60e844", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.1" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" }, "conflict": { "symfony/cache": "<6.2" }, "require-dev": { - "predis/predis": "~1.0", + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1|^2.0", "symfony/cache": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", @@ -6647,9 +6741,6 @@ "symfony/mime": "^5.4|^6.0", "symfony/rate-limiter": "^5.2|^6.0" }, - "suggest": { - "symfony/mime": "To use the file extension guesser" - }, "type": "library", "autoload": { "psr-4": { @@ -6676,7 +6767,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.13" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.4" }, "funding": [ { @@ -6692,29 +6783,29 @@ "type": "tidelift" } ], - "time": "2023-07-23T21:58:00+00:00" + "time": "2023-08-22T08:20:46+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.2.14", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "d05cebbc07478d37ff1e0f0079f06298a096b870" + "reference": "36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d05cebbc07478d37ff1e0f0079f06298a096b870", - "reference": "d05cebbc07478d37ff1e0f0079f06298a096b870", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb", + "reference": "36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^6.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.3", "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^5.4.21|^6.2.7", + "symfony/http-foundation": "^6.3.4", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -6722,15 +6813,18 @@ "symfony/cache": "<5.4", "symfony/config": "<6.1", "symfony/console": "<5.4", - "symfony/dependency-injection": "<6.2", + "symfony/dependency-injection": "<6.3.4", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", "symfony/mailer": "<5.4", "symfony/messenger": "<5.4", "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", "symfony/twig-bridge": "<5.4", "symfony/validator": "<5.4", + "symfony/var-dumper": "<6.3", "twig/twig": "<2.13" }, "provide": { @@ -6739,29 +6833,27 @@ "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "symfony/browser-kit": "^5.4|^6.0", + "symfony/clock": "^6.2", "symfony/config": "^6.1", "symfony/console": "^5.4|^6.0", "symfony/css-selector": "^5.4|^6.0", - "symfony/dependency-injection": "^6.2", + "symfony/dependency-injection": "^6.3.4", "symfony/dom-crawler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/http-client-contracts": "^2.5|^3", "symfony/process": "^5.4|^6.0", + "symfony/property-access": "^5.4.5|^6.0.5", "symfony/routing": "^5.4|^6.0", + "symfony/serializer": "^6.3", "symfony/stopwatch": "^5.4|^6.0", "symfony/translation": "^5.4|^6.0", - "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/translation-contracts": "^2.5|^3", "symfony/uid": "^5.4|^6.0", + "symfony/validator": "^6.3", "symfony/var-exporter": "^6.2", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, "type": "library", "autoload": { "psr-4": { @@ -6788,7 +6880,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.14" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.4" }, "funding": [ { @@ -6804,20 +6896,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T10:40:35+00:00" + "time": "2023-08-26T13:54:49+00:00" }, { "name": "symfony/intl", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "9f95c845f49d4467d7a8471cadd4c7c0fd2ad7a9" + "reference": "1f8cb145c869ed089a8531c51a6a4b31ed0b3c69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/9f95c845f49d4467d7a8471cadd4c7c0fd2ad7a9", - "reference": "9f95c845f49d4467d7a8471cadd4c7c0fd2ad7a9", + "url": "https://api.github.com/repos/symfony/intl/zipball/1f8cb145c869ed089a8531c51a6a4b31ed0b3c69", + "reference": "1f8cb145c869ed089a8531c51a6a4b31ed0b3c69", "shasum": "" }, "require": { @@ -6870,7 +6962,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.2.13" + "source": "https://github.com/symfony/intl/tree/v6.3.2" }, "funding": [ { @@ -6886,20 +6978,20 @@ "type": "tidelift" } ], - "time": "2023-07-13T14:28:09+00:00" + "time": "2023-07-20T07:43:09+00:00" }, { "name": "symfony/mailer", - "version": "v6.2.12", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "47cfaeba096eec5d1aee117f2acbab8e8a8573e5" + "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/47cfaeba096eec5d1aee117f2acbab8e8a8573e5", - "reference": "47cfaeba096eec5d1aee117f2acbab8e8a8573e5", + "url": "https://api.github.com/repos/symfony/mailer/zipball/7b03d9be1dea29bfec0a6c7b603f5072a4c97435", + "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435", "shasum": "" }, "require": { @@ -6909,9 +7001,10 @@ "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^5.4|^6.0", "symfony/mime": "^6.2", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4", "symfony/messenger": "<6.2", "symfony/mime": "<6.2", @@ -6949,7 +7042,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.2.12" + "source": "https://github.com/symfony/mailer/tree/v6.3.0" }, "funding": [ { @@ -6965,24 +7058,25 @@ "type": "tidelift" } ], - "time": "2023-05-29T12:46:33+00:00" + "time": "2023-05-29T12:49:39+00:00" }, { "name": "symfony/mime", - "version": "v6.2.13", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "32f2c5f8114fd778ed00fc54f684e805d7e48508" + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/32f2c5f8114fd778ed00fc54f684e805d7e48508", - "reference": "32f2c5f8114fd778ed00fc54f684e805d7e48508", + "url": "https://api.github.com/repos/symfony/mime/zipball/9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -7032,7 +7126,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.2.13" + "source": "https://github.com/symfony/mime/tree/v6.3.3" }, "funding": [ { @@ -7048,27 +7142,27 @@ "type": "tidelift" } ], - "time": "2023-07-27T06:30:34+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v6.2.8", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "34700f2e5c7e9eae78f8e59fc02399dd8f110cae" + "reference": "04b04b8e465e0fa84940e5609b6796a8b4e51bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/34700f2e5c7e9eae78f8e59fc02399dd8f110cae", - "reference": "34700f2e5c7e9eae78f8e59fc02399dd8f110cae", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/04b04b8e465e0fa84940e5609b6796a8b4e51bf1", + "reference": "04b04b8e465e0fa84940e5609b6796a8b4e51bf1", "shasum": "" }, "require": { "monolog/monolog": "^1.25.1|^2|^3", "php": ">=8.1", "symfony/http-kernel": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/console": "<5.4", @@ -7084,11 +7178,6 @@ "symfony/security-core": "^6.0", "symfony/var-dumper": "^5.4|^6.0" }, - "suggest": { - "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", - "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", - "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." - }, "type": "symfony-bridge", "autoload": { "psr-4": { @@ -7115,7 +7204,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v6.2.8" + "source": "https://github.com/symfony/monolog-bridge/tree/v6.3.1" }, "funding": [ { @@ -7131,7 +7220,7 @@ "type": "tidelift" } ], - "time": "2023-03-09T16:20:02+00:00" + "time": "2023-06-08T11:13:32+00:00" }, { "name": "symfony/monolog-bundle", @@ -7216,21 +7305,21 @@ }, { "name": "symfony/options-resolver", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629" + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/aa0e85b53bbb2b4951960efd61d295907eacd629", - "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3" + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -7263,7 +7352,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.2.7" + "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" }, "funding": [ { @@ -7279,20 +7368,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-05-12T14:21:09+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "67820d8570bf1c2c2cd87cb76d9d12a9d52ab808" + "reference": "d23ad221989e6b8278d050cabfd7b569eee84590" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/67820d8570bf1c2c2cd87cb76d9d12a9d52ab808", - "reference": "67820d8570bf1c2c2cd87cb76d9d12a9d52ab808", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/d23ad221989e6b8278d050cabfd7b569eee84590", + "reference": "d23ad221989e6b8278d050cabfd7b569eee84590", "shasum": "" }, "require": { @@ -7335,7 +7424,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.2.7" + "source": "https://github.com/symfony/password-hasher/tree/v6.3.0" }, "funding": [ { @@ -7351,7 +7440,7 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-02-14T09:04:20+00:00" }, { "name": "symfony/polyfill-ctype", @@ -7775,30 +7864,107 @@ "time": "2023-01-26T09:26:14+00:00" }, { - "name": "symfony/property-access", - "version": "v6.2.13", + "name": "symfony/polyfill-php83", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/property-access.git", - "reference": "9b118241be87010f4cec8dbc26879994e29bff3e" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/9b118241be87010f4cec8dbc26879994e29bff3e", - "reference": "9b118241be87010f4cec8dbc26879994e29bff3e", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-16T06:22:46+00:00" + }, + { + "name": "symfony/property-access", + "version": "v6.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "2dc4f9da444b8f8ff592e95d570caad67924f1d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/2dc4f9da444b8f8ff592e95d570caad67924f1d0", + "reference": "2dc4f9da444b8f8ff592e95d570caad67924f1d0", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/property-info": "^5.4|^6.0" }, "require-dev": { "symfony/cache": "^5.4|^6.0" }, - "suggest": { - "psr/cache-implementation": "To cache access methods." - }, "type": "library", "autoload": { "psr-4": { @@ -7836,7 +8002,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.2.13" + "source": "https://github.com/symfony/property-access/tree/v6.3.2" }, "funding": [ { @@ -7852,20 +8018,20 @@ "type": "tidelift" } ], - "time": "2023-07-13T15:25:49+00:00" + "time": "2023-07-13T15:26:11+00:00" }, { "name": "symfony/property-info", - "version": "v6.2.11", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "ee0a0de5a6866c15af8495b2534d650b388bdeca" + "reference": "7f3a03716112269741fe2a809f8f791a371d1fcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/ee0a0de5a6866c15af8495b2534d650b388bdeca", - "reference": "ee0a0de5a6866c15af8495b2534d650b388bdeca", + "url": "https://api.github.com/repos/symfony/property-info/zipball/7f3a03716112269741fe2a809f8f791a371d1fcd", + "reference": "7f3a03716112269741fe2a809f8f791a371d1fcd", "shasum": "" }, "require": { @@ -7885,12 +8051,6 @@ "symfony/dependency-injection": "^5.4|^6.0", "symfony/serializer": "^5.4|^6.0" }, - "suggest": { - "phpdocumentor/reflection-docblock": "To use the PHPDoc", - "psr/cache-implementation": "To cache results", - "symfony/doctrine-bridge": "To use Doctrine metadata", - "symfony/serializer": "To use Serializer metadata" - }, "type": "library", "autoload": { "psr-4": { @@ -7925,7 +8085,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.2.11" + "source": "https://github.com/symfony/property-info/tree/v6.3.0" }, "funding": [ { @@ -7941,20 +8101,20 @@ "type": "tidelift" } ], - "time": "2023-05-19T07:42:48+00:00" + "time": "2023-05-19T08:06:44+00:00" }, { "name": "symfony/rate-limiter", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "a659a52cec6622e488cab9b5f2054e90626ffbad" + "reference": "5223387e4017f26c8c61c46d8e39c11fe4d504b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/a659a52cec6622e488cab9b5f2054e90626ffbad", - "reference": "a659a52cec6622e488cab9b5f2054e90626ffbad", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/5223387e4017f26c8c61c46d8e39c11fe4d504b7", + "reference": "5223387e4017f26c8c61c46d8e39c11fe4d504b7", "shasum": "" }, "require": { @@ -7965,9 +8125,6 @@ "psr/cache": "^1.0|^2.0|^3.0", "symfony/lock": "^5.4|^6.0" }, - "suggest": { - "symfony/lock": "For preventing race conditions in rate limiters" - }, "type": "library", "autoload": { "psr-4": { @@ -7998,7 +8155,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v6.2.13" + "source": "https://github.com/symfony/rate-limiter/tree/v6.3.2" }, "funding": [ { @@ -8014,24 +8171,25 @@ "type": "tidelift" } ], - "time": "2023-07-13T14:28:09+00:00" + "time": "2023-07-13T14:29:38+00:00" }, { "name": "symfony/routing", - "version": "v6.2.13", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "1e54cc8e769d9aba461f0848bcbd17c81696bec9" + "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/1e54cc8e769d9aba461f0848bcbd17c81696bec9", - "reference": "1e54cc8e769d9aba461f0848bcbd17c81696bec9", + "url": "https://api.github.com/repos/symfony/routing/zipball/e7243039ab663822ff134fbc46099b5fdfa16f6a", + "reference": "e7243039ab663822ff134fbc46099b5fdfa16f6a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.12", @@ -8048,12 +8206,6 @@ "symfony/http-foundation": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, "type": "library", "autoload": { "psr-4": { @@ -8086,7 +8238,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.2.13" + "source": "https://github.com/symfony/routing/tree/v6.3.3" }, "funding": [ { @@ -8102,20 +8254,20 @@ "type": "tidelift" } ], - "time": "2023-07-24T13:51:53+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/runtime", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "ed451a8863b33b487ae328cf3a6fae8d4f004e7e" + "reference": "d5c09493647a0c1a16e6c8da308098e840d1164f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/ed451a8863b33b487ae328cf3a6fae8d4f004e7e", - "reference": "ed451a8863b33b487ae328cf3a6fae8d4f004e7e", + "url": "https://api.github.com/repos/symfony/runtime/zipball/d5c09493647a0c1a16e6c8da308098e840d1164f", + "reference": "d5c09493647a0c1a16e6c8da308098e840d1164f", "shasum": "" }, "require": { @@ -8165,7 +8317,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v6.2.13" + "source": "https://github.com/symfony/runtime/tree/v6.3.2" }, "funding": [ { @@ -8181,40 +8333,43 @@ "type": "tidelift" } ], - "time": "2023-07-16T16:55:01+00:00" + "time": "2023-07-16T17:05:46+00:00" }, { "name": "symfony/security-bundle", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "76ebbcda13831c183642fca36ee601c9f1255d15" + "reference": "31957477b289220a47880ead3727bf5cc059fa08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/76ebbcda13831c183642fca36ee601c9f1255d15", - "reference": "76ebbcda13831c183642fca36ee601c9f1255d15", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/31957477b289220a47880ead3727bf5cc059fa08", + "reference": "31957477b289220a47880ead3727bf5cc059fa08", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", "php": ">=8.1", + "symfony/clock": "^6.3", "symfony/config": "^6.1", "symfony/dependency-injection": "^6.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher": "^5.4|^6.0", "symfony/http-foundation": "^6.2", "symfony/http-kernel": "^6.2", "symfony/password-hasher": "^5.4|^6.0", "symfony/security-core": "^6.2", "symfony/security-csrf": "^5.4|^6.0", - "symfony/security-http": "^6.2.10" + "symfony/security-http": "^6.3" }, "conflict": { "symfony/browser-kit": "<5.4", "symfony/console": "<5.4", - "symfony/framework-bundle": "<5.4", + "symfony/framework-bundle": "<6.3", + "symfony/http-client": "<5.4", "symfony/ldap": "<5.4", "symfony/twig-bundle": "<5.4" }, @@ -8227,7 +8382,8 @@ "symfony/dom-crawler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/form": "^5.4|^6.0", - "symfony/framework-bundle": "^5.4|^6.0", + "symfony/framework-bundle": "^6.3", + "symfony/http-client": "^5.4|^6.0", "symfony/ldap": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/rate-limiter": "^5.4|^6.0", @@ -8237,7 +8393,13 @@ "symfony/twig-bundle": "^5.4|^6.0", "symfony/validator": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0", - "twig/twig": "^2.13|^3.0.4" + "twig/twig": "^2.13|^3.0.4", + "web-token/jwt-checker": "^3.1", + "web-token/jwt-signature-algorithm-ecdsa": "^3.1", + "web-token/jwt-signature-algorithm-eddsa": "^3.1", + "web-token/jwt-signature-algorithm-hmac": "^3.1", + "web-token/jwt-signature-algorithm-none": "^3.1", + "web-token/jwt-signature-algorithm-rsa": "^3.1" }, "type": "symfony-bundle", "autoload": { @@ -8265,7 +8427,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.13" + "source": "https://github.com/symfony/security-bundle/tree/v6.3.4" }, "funding": [ { @@ -8281,27 +8443,28 @@ "type": "tidelift" } ], - "time": "2023-06-29T10:01:21+00:00" + "time": "2023-08-25T08:46:23+00:00" }, { "name": "symfony/security-core", - "version": "v6.2.8", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "c141337bc7451f9a9e464733f1e536bf38d1d2fb" + "reference": "b86ce012cc9a62a15ed43af5037eebc3e6de4d7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/c141337bc7451f9a9e464733f1e536bf38d1d2fb", - "reference": "c141337bc7451f9a9e464733f1e536bf38d1d2fb", + "url": "https://api.github.com/repos/symfony/security-core/zipball/b86ce012cc9a62a15ed43af5037eebc3e6de4d7f", + "reference": "b86ce012cc9a62a15ed43af5037eebc3e6de4d7f", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^1.1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher-contracts": "^2.5|^3", "symfony/password-hasher": "^5.4|^6.0", - "symfony/service-contracts": "^1.1.6|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/event-dispatcher": "<5.4", @@ -8319,17 +8482,10 @@ "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", "symfony/ldap": "^5.4|^6.0", + "symfony/string": "^5.4|^6.0", "symfony/translation": "^5.4|^6.0", "symfony/validator": "^5.4|^6.0" }, - "suggest": { - "psr/container-implementation": "To instantiate the Security class", - "symfony/event-dispatcher": "", - "symfony/expression-language": "For using the expression voter", - "symfony/http-foundation": "", - "symfony/ldap": "For using LDAP integration", - "symfony/validator": "For using the user password constraint" - }, "type": "library", "autoload": { "psr-4": { @@ -8356,7 +8512,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.2.8" + "source": "https://github.com/symfony/security-core/tree/v6.3.3" }, "funding": [ { @@ -8372,20 +8528,20 @@ "type": "tidelift" } ], - "time": "2023-03-10T10:06:03+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/security-csrf", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "5f2850e2dcd003424f2bb36f11522c5820fea561" + "reference": "63d7b098c448cbddb46ea5eda33b68c1ece6eb5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/5f2850e2dcd003424f2bb36f11522c5820fea561", - "reference": "5f2850e2dcd003424f2bb36f11522c5820fea561", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/63d7b098c448cbddb46ea5eda33b68c1ece6eb5b", + "reference": "63d7b098c448cbddb46ea5eda33b68c1ece6eb5b", "shasum": "" }, "require": { @@ -8398,9 +8554,6 @@ "require-dev": { "symfony/http-foundation": "^5.4|^6.0" }, - "suggest": { - "symfony/http-foundation": "For using the class SessionTokenStorage." - }, "type": "library", "autoload": { "psr-4": { @@ -8427,7 +8580,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v6.2.13" + "source": "https://github.com/symfony/security-csrf/tree/v6.3.2" }, "funding": [ { @@ -8443,48 +8596,50 @@ "type": "tidelift" } ], - "time": "2023-07-05T08:41:15+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/security-http", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "d6231dbabc17f24caa7ae174a9e37518caaf987a" + "reference": "0afb37c1120c1c46219bdbd1dd912fb4d48eaf7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/d6231dbabc17f24caa7ae174a9e37518caaf987a", - "reference": "d6231dbabc17f24caa7ae174a9e37518caaf987a", + "url": "https://api.github.com/repos/symfony/security-http/zipball/0afb37c1120c1c46219bdbd1dd912fb4d48eaf7d", + "reference": "0afb37c1120c1c46219bdbd1dd912fb4d48eaf7d", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^6.2", + "symfony/http-kernel": "^6.3", "symfony/polyfill-mbstring": "~1.0", "symfony/property-access": "^5.4|^6.0", - "symfony/security-core": "~6.0.19|~6.1.11|^6.2.5" + "symfony/security-core": "^6.3" }, "conflict": { + "symfony/clock": "<6.3", "symfony/event-dispatcher": "<5.4.9|>=6,<6.0.9", + "symfony/http-client-contracts": "<3.0", "symfony/security-bundle": "<5.4", "symfony/security-csrf": "<5.4" }, "require-dev": { "psr/log": "^1|^2|^3", "symfony/cache": "^5.4|^6.0", + "symfony/clock": "^6.3", "symfony/expression-language": "^5.4|^6.0", + "symfony/http-client-contracts": "^3.0", "symfony/rate-limiter": "^5.4|^6.0", "symfony/routing": "^5.4|^6.0", "symfony/security-csrf": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0" - }, - "suggest": { - "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", - "symfony/security-csrf": "For using tokens to protect authentication/logout attempts" + "symfony/translation": "^5.4|^6.0", + "web-token/jwt-checker": "^3.1", + "web-token/jwt-signature-algorithm-ecdsa": "^3.1" }, "type": "library", "autoload": { @@ -8512,7 +8667,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.2.13" + "source": "https://github.com/symfony/security-http/tree/v6.3.4" }, "funding": [ { @@ -8528,24 +8683,25 @@ "type": "tidelift" } ], - "time": "2023-07-13T14:28:09+00:00" + "time": "2023-08-25T19:43:09+00:00" }, { "name": "symfony/serializer", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "19083104e606ecf8a48baa8ed310c7a073887037" + "reference": "96d28a58d5a128bf77c54534b380eb7c92c8f846" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/19083104e606ecf8a48baa8ed310c7a073887037", - "reference": "19083104e606ecf8a48baa8ed310c7a073887037", + "url": "https://api.github.com/repos/symfony/serializer/zipball/96d28a58d5a128bf77c54534b380eb7c92c8f846", + "reference": "96d28a58d5a128bf77c54534b380eb7c92c8f846", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -8563,6 +8719,7 @@ "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", "symfony/cache": "^5.4|^6.0", "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/error-handler": "^5.4|^6.0", "symfony/filesystem": "^5.4|^6.0", @@ -8578,15 +8735,6 @@ "symfony/var-exporter": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "psr/cache-implementation": "For using the metadata cache.", - "symfony/config": "For using the XML mapping loader.", - "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", - "symfony/property-access": "For using the ObjectNormalizer.", - "symfony/property-info": "To deserialize relations.", - "symfony/var-exporter": "For using the metadata compiler.", - "symfony/yaml": "For using the default YAML mapping loader." - }, "type": "library", "autoload": { "psr-4": { @@ -8613,7 +8761,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.13" + "source": "https://github.com/symfony/serializer/tree/v6.3.4" }, "funding": [ { @@ -8629,7 +8777,7 @@ "type": "tidelift" } ], - "time": "2023-07-27T16:18:16+00:00" + "time": "2023-08-24T14:35:28+00:00" }, { "name": "symfony/service-contracts", @@ -8715,21 +8863,21 @@ }, { "name": "symfony/stopwatch", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f" + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", - "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/service-contracts": "^1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -8757,7 +8905,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.2.7" + "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" }, "funding": [ { @@ -8773,20 +8921,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-02-16T10:14:28+00:00" }, { "name": "symfony/string", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d0a29e15c4225c128d8de89241f923345393c0cf" + "reference": "53d1a83225002635bca3482fcbf963001313fb68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d0a29e15c4225c128d8de89241f923345393c0cf", - "reference": "d0a29e15c4225c128d8de89241f923345393c0cf", + "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", + "reference": "53d1a83225002635bca3482fcbf963001313fb68", "shasum": "" }, "require": { @@ -8797,13 +8945,13 @@ "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.0|^3.0", + "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", @@ -8843,7 +8991,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.2.13" + "source": "https://github.com/symfony/string/tree/v6.3.2" }, "funding": [ { @@ -8859,32 +9007,35 @@ "type": "tidelift" } ], - "time": "2023-07-05T08:41:15+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/translation", - "version": "v6.2.11", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "64113df3e8b009f92fad63014f4ec647e65bc927" + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/64113df3e8b009f92fad63014f4ec647e65bc927", - "reference": "64113df3e8b009f92fad63014f4ec647e65bc927", + "url": "https://api.github.com/repos/symfony/translation/zipball/3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.3|^3.0" + "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { "symfony/config": "<5.4", "symfony/console": "<5.4", "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", "symfony/twig-bundle": "<5.4", "symfony/yaml": "<5.4" }, @@ -8898,20 +9049,14 @@ "symfony/console": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-client-contracts": "^2.5|^3.0", "symfony/http-kernel": "^5.4|^6.0", "symfony/intl": "^5.4|^6.0", "symfony/polyfill-intl-icu": "^1.21", "symfony/routing": "^5.4|^6.0", - "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "nikic/php-parser": "To use PhpAstExtractor", - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" - }, "type": "library", "autoload": { "files": [ @@ -8941,7 +9086,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.2.11" + "source": "https://github.com/symfony/translation/tree/v6.3.3" }, "funding": [ { @@ -8957,7 +9102,7 @@ "type": "tidelift" } ], - "time": "2023-05-19T12:37:14+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/translation-contracts", @@ -9039,28 +9184,28 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "14fd236ede61bd5559c5eecb2fd8309d8c3e6d7f" + "reference": "6f8435db76a2d79917489a19a82679276c1b4e32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/14fd236ede61bd5559c5eecb2fd8309d8c3e6d7f", - "reference": "14fd236ede61bd5559c5eecb2fd8309d8c3e6d7f", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/6f8435db76a2d79917489a19a82679276c1b4e32", + "reference": "6f8435db76a2d79917489a19a82679276c1b4e32", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/translation-contracts": "^2.5|^3", "twig/twig": "^2.13|^3.0.4" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/console": "<5.4", - "symfony/form": "<6.2.7", + "symfony/form": "<6.3", "symfony/http-foundation": "<5.4", "symfony/http-kernel": "<6.2", "symfony/mime": "<6.2", @@ -9073,11 +9218,12 @@ "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/asset": "^5.4|^6.0", + "symfony/asset-mapper": "^6.3", "symfony/console": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", - "symfony/form": "^6.2.7", + "symfony/form": "^6.3", "symfony/html-sanitizer": "^6.1", "symfony/http-foundation": "^5.4|^6.0", "symfony/http-kernel": "^6.2", @@ -9092,7 +9238,7 @@ "symfony/security-http": "^5.4|^6.0", "symfony/serializer": "^6.2", "symfony/stopwatch": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", + "symfony/translation": "^6.1", "symfony/web-link": "^5.4|^6.0", "symfony/workflow": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0", @@ -9100,23 +9246,6 @@ "twig/inky-extra": "^2.12|^3", "twig/markdown-extra": "^2.12|^3" }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/html-sanitizer": "For using the HtmlSanitizerExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, "type": "symfony-bridge", "autoload": { "psr-4": { @@ -9143,7 +9272,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.2.13" + "source": "https://github.com/symfony/twig-bridge/tree/v6.3.2" }, "funding": [ { @@ -9159,20 +9288,20 @@ "type": "tidelift" } ], - "time": "2023-07-20T16:42:25+00:00" + "time": "2023-07-20T16:42:33+00:00" }, { "name": "symfony/twig-bundle", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "8bb562655c6ae4b8fae9cf72077591f38b961566" + "reference": "d0cd4d1675c0582d27c2e8bb0dc27c0303d8e3ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/8bb562655c6ae4b8fae9cf72077591f38b961566", - "reference": "8bb562655c6ae4b8fae9cf72077591f38b961566", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/d0cd4d1675c0582d27c2e8bb0dc27c0303d8e3ea", + "reference": "d0cd4d1675c0582d27c2e8bb0dc27c0303d8e3ea", "shasum": "" }, "require": { @@ -9182,7 +9311,7 @@ "symfony/dependency-injection": "^6.1", "symfony/http-foundation": "^5.4|^6.0", "symfony/http-kernel": "^6.2", - "symfony/twig-bridge": "^6.2", + "symfony/twig-bridge": "^6.3", "twig/twig": "^2.13|^3.0.4" }, "conflict": { @@ -9228,7 +9357,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v6.2.7" + "source": "https://github.com/symfony/twig-bundle/tree/v6.3.0" }, "funding": [ { @@ -9244,28 +9373,29 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-05-06T09:53:41+00:00" }, { "name": "symfony/validator", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "f7c4a05e3f5bcbef2fb8a02bc41a2f4121cb3b79" + "reference": "0c8435154920b9bbe93bece675234c244cadf73b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/f7c4a05e3f5bcbef2fb8a02bc41a2f4121cb3b79", - "reference": "f7c4a05e3f5bcbef2fb8a02bc41a2f4121cb3b79", + "url": "https://api.github.com/repos/symfony/validator/zipball/0c8435154920b9bbe93bece675234c244cadf73b", + "reference": "0c8435154920b9bbe93bece675234c244cadf73b", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^1.1|^2|^3" + "symfony/polyfill-php83": "^1.27", + "symfony/translation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.13", @@ -9297,18 +9427,6 @@ "symfony/translation": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "egulias/email-validator": "Strict (RFC compliant) email validation", - "psr/cache-implementation": "For using the mapping cache.", - "symfony/config": "", - "symfony/expression-language": "For using the Expression validator and the ExpressionLanguageSyntax constraints", - "symfony/http-foundation": "", - "symfony/intl": "", - "symfony/property-access": "For accessing properties within comparison constraints", - "symfony/property-info": "To automatically add NotNull and Type constraints", - "symfony/translation": "For translating validation errors.", - "symfony/yaml": "" - }, "type": "library", "autoload": { "psr-4": { @@ -9335,7 +9453,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.2.13" + "source": "https://github.com/symfony/validator/tree/v6.3.4" }, "funding": [ { @@ -9351,24 +9469,25 @@ "type": "tidelift" } ], - "time": "2023-07-26T17:38:53+00:00" + "time": "2023-08-17T15:49:05+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "297051faddf4fd701dea09df1bf9da47a387346c" + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/297051faddf4fd701dea09df1bf9da47a387346c", - "reference": "297051faddf4fd701dea09df1bf9da47a387346c", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2027be14f8ae8eae999ceadebcda5b4909b81d45", + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -9382,11 +9501,6 @@ "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -9423,7 +9537,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.13" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.4" }, "funding": [ { @@ -9439,20 +9553,20 @@ "type": "tidelift" } ], - "time": "2023-07-21T07:04:05+00:00" + "time": "2023-08-24T14:51:05+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "e14c23915fdb9dfb4343d82e0094dec41a466c0a" + "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/e14c23915fdb9dfb4343d82e0094dec41a466c0a", - "reference": "e14c23915fdb9dfb4343d82e0094dec41a466c0a", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df1f8aac5751871b83d30bf3e2c355770f8f0691", + "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691", "shasum": "" }, "require": { @@ -9497,7 +9611,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.2.13" + "source": "https://github.com/symfony/var-exporter/tree/v6.3.4" }, "funding": [ { @@ -9513,37 +9627,35 @@ "type": "tidelift" } ], - "time": "2023-07-26T17:35:55+00:00" + "time": "2023-08-16T18:14:47+00:00" }, { "name": "symfony/webpack-encore-bundle", - "version": "v1.17.1", + "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/symfony/webpack-encore-bundle.git", - "reference": "7e3b6f69bcfcbb40ecfe83ad7a77e44316d26573" + "reference": "150fe022740fef908f4ca3d5950ce85ab040ec76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/7e3b6f69bcfcbb40ecfe83ad7a77e44316d26573", - "reference": "7e3b6f69bcfcbb40ecfe83ad7a77e44316d26573", + "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/150fe022740fef908f4ca3d5950ce85ab040ec76", + "reference": "150fe022740fef908f4ca3d5950ce85ab040ec76", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/asset": "^4.4 || ^5.0 || ^6.0", - "symfony/config": "^4.4 || ^5.0 || ^6.0", - "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.25.0", - "symfony/service-contracts": "^1.0 || ^2.0 || ^3.0" + "php": ">=8.1.0", + "symfony/asset": "^5.4 || ^6.2", + "symfony/config": "^5.4 || ^6.2", + "symfony/dependency-injection": "^5.4 || ^6.2", + "symfony/http-kernel": "^5.4 || ^6.2", + "symfony/service-contracts": "^1.1.9 || ^2.1.3 || ^3.0" }, "require-dev": { - "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.3 || ^6.0", - "symfony/twig-bundle": "^4.4 || ^5.0 || ^6.0", - "symfony/web-link": "^4.4 || ^5.0 || ^6.0" + "symfony/framework-bundle": "^5.4 || ^6.2", + "symfony/phpunit-bridge": "^5.4 || ^6.2", + "symfony/twig-bundle": "^5.4 || ^6.2", + "symfony/web-link": "^5.4 || ^6.2" }, "type": "symfony-bundle", "extra": { @@ -9570,7 +9682,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.17.1" + "source": "https://github.com/symfony/webpack-encore-bundle/tree/v2.0.1" }, "funding": [ { @@ -9586,24 +9698,25 @@ "type": "tidelift" } ], - "time": "2023-05-29T00:18:01+00:00" + "time": "2023-05-31T14:28:33+00:00" }, { "name": "symfony/yaml", - "version": "v6.2.10", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "61916f3861b1e9705b18cfde723921a71dd1559d" + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/61916f3861b1e9705b18cfde723921a71dd1559d", - "reference": "61916f3861b1e9705b18cfde723921a71dd1559d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -9612,9 +9725,6 @@ "require-dev": { "symfony/console": "^5.4|^6.0" }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, "bin": [ "Resources/bin/yaml-lint" ], @@ -9644,7 +9754,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.2.10" + "source": "https://github.com/symfony/yaml/tree/v6.3.3" }, "funding": [ { @@ -9660,7 +9770,7 @@ "type": "tidelift" } ], - "time": "2023-04-28T13:25:36+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -10798,16 +10908,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.26.1", + "version": "v3.27.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "d023ba6684055f6ea1da1352d8a02baca0426983" + "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d023ba6684055f6ea1da1352d8a02baca0426983", - "reference": "d023ba6684055f6ea1da1352d8a02baca0426983", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/e73ccaae1208f017bb7860986eebb3da48bd25d6", + "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6", "shasum": "" }, "require": { @@ -10881,7 +10991,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.26.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.27.0" }, "funding": [ { @@ -10889,7 +10999,7 @@ "type": "github" } ], - "time": "2023-09-08T19:09:07+00:00" + "time": "2023-09-17T14:37:54+00:00" }, { "name": "masterminds/html5", @@ -12816,16 +12926,16 @@ }, { "name": "symfony/browser-kit", - "version": "v6.2.7", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "87bd43240e6cc855f70ea1c7a448ab3bd442633c" + "reference": "ca4a988488f61ac18f8f845445eabdd36f89aa8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/87bd43240e6cc855f70ea1c7a448ab3bd442633c", - "reference": "87bd43240e6cc855f70ea1c7a448ab3bd442633c", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/ca4a988488f61ac18f8f845445eabdd36f89aa8d", + "reference": "ca4a988488f61ac18f8f845445eabdd36f89aa8d", "shasum": "" }, "require": { @@ -12838,9 +12948,6 @@ "symfony/mime": "^5.4|^6.0", "symfony/process": "^5.4|^6.0" }, - "suggest": { - "symfony/process": "" - }, "type": "library", "autoload": { "psr-4": { @@ -12867,7 +12974,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v6.2.7" + "source": "https://github.com/symfony/browser-kit/tree/v6.3.2" }, "funding": [ { @@ -12883,20 +12990,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-07-06T06:56:43+00:00" }, { "name": "symfony/debug-bundle", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "f48bf7c1bd1b5ac946599970b94b1087cfebed5e" + "reference": "3f04a578e1a9f1d7da84a87b690c03123e5d8c31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/f48bf7c1bd1b5ac946599970b94b1087cfebed5e", - "reference": "f48bf7c1bd1b5ac946599970b94b1087cfebed5e", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/3f04a578e1a9f1d7da84a87b690c03123e5d8c31", + "reference": "3f04a578e1a9f1d7da84a87b690c03123e5d8c31", "shasum": "" }, "require": { @@ -12915,10 +13022,6 @@ "symfony/config": "^5.4|^6.0", "symfony/web-profiler-bundle": "^5.4|^6.0" }, - "suggest": { - "symfony/config": "For service container configuration", - "symfony/dependency-injection": "For using as a service from the container" - }, "type": "symfony-bundle", "autoload": { "psr-4": { @@ -12945,7 +13048,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v6.2.13" + "source": "https://github.com/symfony/debug-bundle/tree/v6.3.2" }, "funding": [ { @@ -12961,20 +13064,20 @@ "type": "tidelift" } ], - "time": "2023-07-13T14:28:09+00:00" + "time": "2023-07-13T14:29:38+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.2.12", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "dde84bcbe9d39958b34ee6065d2fb82170552039" + "reference": "3fdd2a3d5fdc363b2e8dbf817f9726a4d013cbd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/dde84bcbe9d39958b34ee6065d2fb82170552039", - "reference": "dde84bcbe9d39958b34ee6065d2fb82170552039", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/3fdd2a3d5fdc363b2e8dbf817f9726a4d013cbd1", + "reference": "3fdd2a3d5fdc363b2e8dbf817f9726a4d013cbd1", "shasum": "" }, "require": { @@ -12986,9 +13089,6 @@ "require-dev": { "symfony/css-selector": "^5.4|^6.0" }, - "suggest": { - "symfony/css-selector": "" - }, "type": "library", "autoload": { "psr-4": { @@ -13015,7 +13115,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.2.12" + "source": "https://github.com/symfony/dom-crawler/tree/v6.3.4" }, "funding": [ { @@ -13031,7 +13131,7 @@ "type": "tidelift" } ], - "time": "2023-06-05T15:29:05+00:00" + "time": "2023-08-01T07:43:40+00:00" }, { "name": "symfony/phpunit-bridge", @@ -13116,16 +13216,16 @@ }, { "name": "symfony/process", - "version": "v6.2.13", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "1603ae32487981c11b8d0bf5d7551b8b00f5a99b" + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/1603ae32487981c11b8d0bf5d7551b8b00f5a99b", - "reference": "1603ae32487981c11b8d0bf5d7551b8b00f5a99b", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "shasum": "" }, "require": { @@ -13157,7 +13257,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.2.13" + "source": "https://github.com/symfony/process/tree/v6.3.4" }, "funding": [ { @@ -13173,27 +13273,27 @@ "type": "tidelift" } ], - "time": "2023-07-12T15:50:46+00:00" + "time": "2023-08-07T10:39:22+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v6.2.13", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "89a78db2bd961d7fa63865e52f79c7d505702427" + "reference": "6101b5ab7857c373d237e121f9060c68b32e1373" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/89a78db2bd961d7fa63865e52f79c7d505702427", - "reference": "89a78db2bd961d7fa63865e52f79c7d505702427", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6101b5ab7857c373d237e121f9060c68b32e1373", + "reference": "6101b5ab7857c373d237e121f9060c68b32e1373", "shasum": "" }, "require": { "php": ">=8.1", "symfony/config": "^5.4|^6.0", "symfony/framework-bundle": "^5.4|^6.0", - "symfony/http-kernel": "^6.1", + "symfony/http-kernel": "^6.3", "symfony/routing": "^5.4|^6.0", "symfony/twig-bundle": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" @@ -13234,8 +13334,11 @@ ], "description": "Provides a development tool that gives detailed information about the execution of any request", "homepage": "https://symfony.com", + "keywords": [ + "dev" + ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.2.13" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.3.2" }, "funding": [ { @@ -13251,7 +13354,7 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:17:04+00:00" + "time": "2023-07-19T20:17:28+00:00" }, { "name": "theseer/tokenizer", diff --git a/phpstan.neon b/phpstan.neon index 2e56d289..6f9b535c 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -226,16 +226,6 @@ parameters: count: 2 path: src/Command/AbstractBundleInstallerCommand.php - - - message: "#^Method App\\\\Command\\\\AbstractBundleInstallerCommand\\:\\:importMigrations\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Command/AbstractBundleInstallerCommand.php - - - - message: "#^Method App\\\\Command\\\\AbstractBundleInstallerCommand\\:\\:installAssets\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Command/AbstractBundleInstallerCommand.php - - message: "#^Parameter \\#1 \\$directory of function chdir expects string, string\\|false given\\.$#" count: 1 @@ -256,11 +246,6 @@ parameters: count: 1 path: src/Command/AbstractResetCommand.php - - - message: "#^Method App\\\\Command\\\\AbstractRoleCommand\\:\\:executeRoleCommand\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Command/AbstractRoleCommand.php - - message: "#^Method App\\\\Command\\\\AbstractRoleCommand\\:\\:executeRoleCommand\\(\\) has parameter \\$role with no type specified\\.$#" count: 1 @@ -331,11 +316,6 @@ parameters: count: 2 path: src/Command/DeactivateUserCommand.php - - - message: "#^Method App\\\\Command\\\\DemoteUserCommand\\:\\:executeRoleCommand\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Command/DemoteUserCommand.php - - message: "#^Method App\\\\Command\\\\DemoteUserCommand\\:\\:executeRoleCommand\\(\\) has parameter \\$role with no type specified\\.$#" count: 1 @@ -351,11 +331,6 @@ parameters: count: 2 path: src/Command/ExportCreateCommand.php - - - message: "#^Method App\\\\Command\\\\ExportCreateCommand\\:\\:configure\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Command/ExportCreateCommand.php - - message: "#^Parameter \\#1 \\$customerIDs of method App\\\\Repository\\\\CustomerRepository\\:\\:findByIds\\(\\) expects array\\, mixed given\\.$#" count: 1 @@ -561,11 +536,6 @@ parameters: count: 1 path: src/Command/PluginCommand.php - - - message: "#^Method App\\\\Command\\\\PromoteUserCommand\\:\\:executeRoleCommand\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Command/PromoteUserCommand.php - - message: "#^Method App\\\\Command\\\\PromoteUserCommand\\:\\:executeRoleCommand\\(\\) has parameter \\$role with no type specified\\.$#" count: 1 @@ -586,11 +556,6 @@ parameters: count: 4 path: src/Command/ReloadCommand.php - - - message: "#^Method App\\\\Command\\\\ReloadCommand\\:\\:rebuildCaches\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Command/ReloadCommand.php - - message: "#^Parameter \\#1 \\$directory of function chdir expects string, string\\|false given\\.$#" count: 1 @@ -886,16 +851,6 @@ parameters: count: 1 path: src/Configuration/SystemConfiguration.php - - - message: "#^Method App\\\\Configuration\\\\SystemConfiguration\\:\\:offsetSet\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Configuration/SystemConfiguration.php - - - - message: "#^Method App\\\\Configuration\\\\SystemConfiguration\\:\\:offsetUnset\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Configuration/SystemConfiguration.php - - message: "#^Parameter \\#1 \\$key of method App\\\\Configuration\\\\SystemConfiguration\\:\\:set\\(\\) expects string, mixed given\\.$#" count: 1 @@ -941,26 +896,6 @@ parameters: count: 1 path: src/Controller/ActivityController.php - - - message: "#^Method App\\\\Controller\\\\Auth\\\\SamlController\\:\\:assertionConsumerServiceAction\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/Auth/SamlController.php - - - - message: "#^Method App\\\\Controller\\\\Auth\\\\SamlController\\:\\:loginAction\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/Auth/SamlController.php - - - - message: "#^Method App\\\\Controller\\\\Auth\\\\SamlController\\:\\:logoutAction\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/Auth/SamlController.php - - - - message: "#^Method App\\\\Controller\\\\Auth\\\\SamlController\\:\\:metadataAction\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/Auth/SamlController.php - - message: "#^Parameter \\#1 \\$returnTo of method OneLogin\\\\Saml2\\\\Auth\\:\\:login\\(\\) expects string\\|null, mixed given\\.$#" count: 1 @@ -1106,11 +1041,6 @@ parameters: count: 1 path: src/Controller/InvoiceController.php - - - message: "#^Method App\\\\Controller\\\\InvoiceController\\:\\:exportAction\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/InvoiceController.php - - message: "#^Parameter \\#1 \\$string of function substr expects string, string\\|false given\\.$#" count: 1 @@ -1121,11 +1051,6 @@ parameters: count: 1 path: src/Controller/InvoiceController.php - - - message: "#^Method App\\\\Controller\\\\PermissionController\\:\\:permissions\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/PermissionController.php - - message: "#^Parameter \\#1 \\$callback of function array_map expects \\(callable\\(string\\|null\\)\\: mixed\\)\\|null, 'strtoupper' given\\.$#" count: 1 @@ -1186,11 +1111,6 @@ parameters: count: 3 path: src/Controller/QuickEntryController.php - - - message: "#^Method App\\\\Controller\\\\QuickEntryController\\:\\:quickEntry\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/QuickEntryController.php - - message: "#^Method App\\\\Controller\\\\Reporting\\\\AbstractUserReportController\\:\\:getStatisticDataRaw\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -1331,16 +1251,6 @@ parameters: count: 1 path: src/Controller/Security/PasswordResetController.php - - - message: "#^Method App\\\\Controller\\\\Security\\\\SecurityController\\:\\:checkAction\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/Security/SecurityController.php - - - - message: "#^Method App\\\\Controller\\\\Security\\\\SecurityController\\:\\:logoutAction\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/Security/SecurityController.php - - message: "#^Method App\\\\Controller\\\\Security\\\\SelfRegistrationController\\:\\:getTargetUrlFromSession\\(\\) should return string\\|null but returns mixed\\.$#" count: 1 @@ -1371,16 +1281,6 @@ parameters: count: 1 path: src/Controller/TimesheetAbstractController.php - - - message: "#^Method App\\\\Controller\\\\TimesheetAbstractController\\:\\:multiDelete\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/TimesheetAbstractController.php - - - - message: "#^Method App\\\\Controller\\\\TimesheetAbstractController\\:\\:prepareQuery\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/TimesheetAbstractController.php - - message: "#^Parameter \\#1 \\$id of method App\\\\Export\\\\ServiceExport\\:\\:getTimesheetExporterById\\(\\) expects string, bool\\|float\\|int\\|string given\\.$#" count: 1 @@ -1391,11 +1291,6 @@ parameters: count: 1 path: src/Controller/TimesheetAbstractController.php - - - message: "#^Method App\\\\Controller\\\\TimesheetTeamController\\:\\:prepareQuery\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/TimesheetTeamController.php - - message: "#^PHPDoc tag @var for variable \\$teams contains generic class Doctrine\\\\Common\\\\Collections\\\\ArrayCollection but does not specify its types\\: TKey, T$#" count: 1 @@ -1406,11 +1301,6 @@ parameters: count: 1 path: src/Controller/TimesheetTeamController.php - - - message: "#^Method App\\\\Controller\\\\UserController\\:\\:exportAction\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Controller/UserController.php - - message: "#^Parameter \\#1 \\$entries of method App\\\\Export\\\\Spreadsheet\\\\UserExporter\\:\\:export\\(\\) expects array\\, iterable\\ given\\.$#" count: 1 @@ -1546,16 +1436,6 @@ parameters: count: 1 path: src/DependencyInjection/AppExtension.php - - - message: "#^Method App\\\\DependencyInjection\\\\Configuration\\:\\:getProjectNode\\(\\) has no return type specified\\.$#" - count: 1 - path: src/DependencyInjection/Configuration.php - - - - message: "#^Method App\\\\Doctrine\\\\AbstractMigration\\:\\:abortIfPlatformNotSupported\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Doctrine/AbstractMigration.php - - message: "#^Method App\\\\Doctrine\\\\TimesheetSubscriber\\:\\:calculateFields\\(\\) has parameter \\$changes with no value type specified in iterable type array\\.$#" count: 1 @@ -2036,11 +1916,6 @@ parameters: count: 1 path: src/Event/ThemeJavascriptTranslationsEvent.php - - - message: "#^Method App\\\\Event\\\\UserPreferenceDisplayEvent\\:\\:addPreference\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Event/UserPreferenceDisplayEvent.php - - message: "#^Parameter \\#1 \\$string of function strtolower expects string, string\\|null given\\.$#" count: 2 @@ -2451,11 +2326,6 @@ parameters: count: 1 path: src/Form/API/TimesheetApiEditForm.php - - - message: "#^Method App\\\\Form\\\\AbstractRateForm\\:\\:addFields\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Form/AbstractRateForm.php - - message: "#^Cannot access offset mixed on mixed\\.$#" count: 1 @@ -3841,11 +3711,6 @@ parameters: count: 1 path: src/Invoice/Hydrator/InvoiceItemDefaultHydrator.php - - - message: "#^Method App\\\\Invoice\\\\Hydrator\\\\InvoiceItemDefaultHydrator\\:\\:setInvoiceModel\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Invoice/Hydrator/InvoiceItemDefaultHydrator.php - - message: "#^Parameter \\#1 \\$date of method App\\\\Invoice\\\\InvoiceFormatter\\:\\:getFormattedDateTime\\(\\) expects DateTimeInterface, DateTime\\|null given\\.$#" count: 3 @@ -4021,11 +3886,6 @@ parameters: count: 1 path: src/Invoice/InvoiceItemHydrator.php - - - message: "#^Method App\\\\Invoice\\\\InvoiceItemHydrator\\:\\:setInvoiceModel\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Invoice/InvoiceItemHydrator.php - - message: "#^Method App\\\\Invoice\\\\InvoiceModel\\:\\:itemToArray\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -4066,11 +3926,6 @@ parameters: count: 1 path: src/Invoice/Renderer/AbstractSpreadsheetRenderer.php - - - message: "#^Method App\\\\Invoice\\\\Renderer\\\\AbstractSpreadsheetRenderer\\:\\:addTemplateRows\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Invoice/Renderer/AbstractSpreadsheetRenderer.php - - message: "#^Parameter \\#1 \\$haystack of function stripos expects string, mixed given\\.$#" count: 5 @@ -4151,21 +4006,6 @@ parameters: count: 1 path: src/Invoice/ServiceInvoice.php - - - message: "#^Method App\\\\Invoice\\\\ServiceInvoice\\:\\:changeInvoiceStatus\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Invoice/ServiceInvoice.php - - - - message: "#^Method App\\\\Invoice\\\\ServiceInvoice\\:\\:deleteInvoice\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Invoice/ServiceInvoice.php - - - - message: "#^Method App\\\\Invoice\\\\ServiceInvoice\\:\\:markEntriesAsExported\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Invoice/ServiceInvoice.php - - message: "#^Parameter \\#1 \\$key of function array_key_exists expects int\\|string, int\\|null given\\.$#" count: 1 @@ -4206,11 +4046,6 @@ parameters: count: 2 path: src/Kernel.php - - - message: "#^Method App\\\\Kernel\\:\\:build\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Kernel.php - - message: "#^Method App\\\\Kernel\\:\\:configureContainer\\(\\) has no return type specified\\.$#" count: 1 @@ -6291,51 +6126,6 @@ parameters: count: 1 path: src/Widget/DataProvider/DailyWorkingTimeChartProvider.php - - - message: "#^Method App\\\\Widget\\\\Type\\\\AbstractActiveUsers\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AbstractActiveUsers.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AbstractAmountPeriod\\:\\:getRevenue\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Widget/Type/AbstractAmountPeriod.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AbstractAmountPeriod\\:\\:getRevenue\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AbstractAmountPeriod.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AbstractCounterDuration\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AbstractCounterDuration.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AbstractCounterYear\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AbstractCounterYear.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AbstractSimpleStatisticChart\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AbstractSimpleStatisticChart.php - - - - message: "#^Strict comparison using \\!\\=\\= between null and App\\\\Entity\\\\User will always evaluate to true\\.$#" - count: 1 - path: src/Widget/Type/AbstractSimpleStatisticChart.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AbstractUserRevenuePeriod\\:\\:getRevenue\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Widget/Type/AbstractUserRevenuePeriod.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AbstractUserRevenuePeriod\\:\\:getRevenue\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AbstractUserRevenuePeriod.php - - message: "#^Method App\\\\Widget\\\\Type\\\\AbstractWidget\\:\\:getUser\\(\\) should return App\\\\Entity\\\\User but returns App\\\\Entity\\\\User\\|null\\.$#" count: 1 @@ -6356,106 +6146,6 @@ parameters: count: 1 path: src/Widget/Type/AbstractWidgetType.php - - - message: "#^Method App\\\\Widget\\\\Type\\\\ActiveTimesheets\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/ActiveTimesheets.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\ActiveUsersMonth\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/ActiveUsersMonth.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\ActiveUsersToday\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/ActiveUsersToday.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\ActiveUsersTotal\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/ActiveUsersTotal.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\ActiveUsersWeek\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/ActiveUsersWeek.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\ActiveUsersYear\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/ActiveUsersYear.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AmountMonth\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AmountMonth.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AmountToday\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AmountToday.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AmountTotal\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AmountTotal.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AmountWeek\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AmountWeek.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\AmountYear\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/AmountYear.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\DailyWorkingTimeChart\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/DailyWorkingTimeChart.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\DurationMonth\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/DurationMonth.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\DurationToday\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/DurationToday.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\DurationTotal\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/DurationTotal.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\DurationWeek\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/DurationWeek.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\DurationYear\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/DurationYear.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\More\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/More.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\More\\:\\:setData\\(\\) has parameter \\$data with no type specified\\.$#" - count: 1 - path: src/Widget/Type/More.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\PaginatedWorkingTimeChart\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/PaginatedWorkingTimeChart.php - - message: "#^Method App\\\\Widget\\\\Type\\\\PaginatedWorkingTimeChart\\:\\:getLastWeekInYear\\(\\) has parameter \\$year with no type specified\\.$#" count: 1 @@ -6466,101 +6156,16 @@ parameters: count: 1 path: src/Widget/Type/PaginatedWorkingTimeChart.php - - - message: "#^Method App\\\\Widget\\\\Type\\\\TotalsActivity\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/TotalsActivity.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\TotalsCustomer\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/TotalsCustomer.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\TotalsProject\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/TotalsProject.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\TotalsUser\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/TotalsUser.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserAmountMonth\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserAmountMonth.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserAmountToday\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserAmountToday.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserAmountTotal\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserAmountTotal.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserAmountWeek\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserAmountWeek.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserAmountYear\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserAmountYear.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserDurationMonth\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserDurationMonth.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserDurationToday\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserDurationToday.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserDurationTotal\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserDurationTotal.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserDurationWeek\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserDurationWeek.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserDurationYear\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserDurationYear.php - - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserTeamProjects\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserTeamProjects.php - - message: "#^Parameter \\#1 \\$results of method App\\\\Repository\\\\Loader\\\\TeamLoader\\:\\:loadResults\\(\\) expects array\\, iterable\\ given\\.$#" count: 1 path: src/Widget/Type/UserTeamProjects.php - - - message: "#^Method App\\\\Widget\\\\Type\\\\UserTeams\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/Type/UserTeams.php - - message: "#^Parameter \\#1 \\$results of method App\\\\Repository\\\\Loader\\\\UserLoader\\:\\:loadResults\\(\\) expects array\\, array\\ given\\.$#" count: 1 path: src/Widget/Type/UserTeams.php - - - message: "#^Method App\\\\Widget\\\\WidgetInterface\\:\\:getData\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Widget/WidgetInterface.php - - message: "#^Property App\\\\Widget\\\\WidgetService\\:\\:\\$widgets type has no value type specified in iterable type array\\.$#" count: 1 diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 83589363..2ca592c4 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -15,7 +15,7 @@ - + diff --git a/public/build/app.405a508c.css b/public/build/app.fc41168c.css similarity index 66% rename from public/build/app.405a508c.css rename to public/build/app.fc41168c.css index 87d5c815..22a15657 100644 --- a/public/build/app.405a508c.css +++ b/public/build/app.fc41168c.css @@ -1 +1 @@ -.inline-search{max-width:200px}.inline-search #searchTerm{border-right:0}@media (min-width:360px){.inline-search{max-width:235px}}@media (min-width:768px){.inline-search{max-width:325px}.search-dropdown{width:500px}}h1.navbar-brand a span{display:inline-block;padding-top:.5rem}h1.navbar-brand a:hover{text-decoration:none}#export-buttons .dropdown-menu,.inline-search .dropdown-menu,.page-actions .dropdown-menu{z-index:1021}.navbar{--tblr-navbar-brand-font-size:1rem}.error-page{margin-bottom:50px}@media print{.control-sidebar,.sf-toolbar{display:none!important}.col-print-12{width:100%}.content-wrapper{margin:0!important}section.content{margin:0;padding:0}span i.dot{display:none;margin-right:0!important}}.page-center{justify-content:center}.hidden-no-space{margin:0;padding:0}.pre-scrollable{max-height:340px;overflow-y:scroll}td.timesheet-description ul{padding-left:15px}td.timesheet-description p{margin:0}td.badges{line-height:22px}.open-edit{cursor:pointer}td.w-min,th.w-min{white-space:nowrap;width:1%}table.dataTable thead>tr>th.hw-min{white-space:normal;width:1%}.w-avatar{width:40px}.w-avatar img.avatar{max-width:40px}.list-group-item.danger{border-left:.2rem solid #d63939!important;padding-left:1.3rem}.list-group-item.success{border-left:.2rem solid #2fb344!important;padding-left:1.3rem}.box-body-scrollable{max-height:340px;overflow:auto}#activity_details_box th,#customer_details_box th,#project_details_box th{width:30%}.overlay{background:hsla(0,0%,100%,.7);height:100%;left:0;position:fixed;top:0;width:100%;z-index:1021}.overlay>.fas{color:#000;font-size:30px;left:50vw;margin-left:-15px;margin-top:-15px;position:absolute;top:50vh}table.dataTable{clear:both;margin-bottom:0!important;max-width:none!important}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer;position:relative}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{font-weight:700}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after{font-family:Font Awesome\ 5 Free;font-size:12px;opacity:.5;padding-left:5px}table.dataTable thead .sorting:after{content:"\f0dc";opacity:.2}table.dataTable thead .sorting_asc:after{content:"\f077"}table.dataTable thead .sorting_desc:after{content:"\f078"}table.dataTable thead>tr>th{vertical-align:top;white-space:nowrap}table.dataTable th:active{outline:none}table.table-bordered thead td,table.table-bordered thead th{border-left-width:0;border-top-width:0}table.table-bordered tbody td,table.table-bordered tbody th,table.table-bordered tfoot td,table.table-bordered tfoot th{border-bottom-width:0;border-left-width:0}table.table-bordered td:last-child,table.table-bordered th:last-child{border-right-width:0}@media (min-width:1200px){table.dataTable.table>tbody>tr>td{vertical-align:middle}}table.dataTable .actions{width:40px}table.dataTable tr.summary td{background-color:var(--tblr-bg-surface-secondary);border:0;font-weight:700}table.dataTable tr th.multiCheckbox{width:15px}table.dataTable tr.overlapping{border-top:2px solid rgba(214,57,57,.1)}table.dataTable tr.exported{opacity:.7}table.dataTable td .btn-group{display:flex}table.dataTable td .label{font-size:85%;line-height:24px;padding:.3em .6em}table.dataTable td span.label-invisible{opacity:.6}table.dataTable td.weekend,table.dataTable th.weekend{background-color:var(--tblr-bg-surface-secondary)}table.dataTable th.today{background-color:var(--tblr-highlight-bg)}table.dataTable td.total,table.dataTable th.total{font-weight:700}.form-dataTable table.dataTable .form-group{margin-bottom:0}table.table-hover tr.exported:hover{opacity:1}.calendar-entry ul{list-style-type:none;padding:0}.calendar-entry div{white-space:pre-line}.draggable{cursor:grab}#timesheet_calendar{--bs-gray-400:var(--tblr-border-color);--bs-gray-200:var(--tblr-gray-200)}.fc-day-sat,.fc-day-sun{background-color:var(--tblr-bg-surface-secondary)}@keyframes ticktac-blink{0%{opacity:1}5%{opacity:.95}10%{opacity:.9}15%{opacity:.85}20%{opacity:.8}25%{opacity:.75}30%{opacity:.7}35%{opacity:.65}40%{opacity:.6}45%{opacity:.65}50%{opacity:.7}55%{opacity:.75}60%{opacity:.8}65%{opacity:.85}70%{opacity:.9}75%{opacity:.95}to{opacity:1}}.ticktac-start i,.ticktac-stop i{animation:ticktac-blink 2s step-end infinite;font-size:140%}@media (max-width:991.98px){aside.navbar .btn-outline-white,header.navbar .btn-outline-white{border-color:hsla(0,0%,100%,.2)}}.ts-dropdown{z-index:1021}.ts-control>input{min-width:unset}.ts-dropdown .optgroup [data-selectable].option{padding-left:20px}.checkbox-menu.show{z-index:1021}.duration-widget .input-group{min-width:110px}.duration-widget input.duration-input{min-width:55px}#report-form div.btn-list{width:100%}#report-form div.btn-list div.selectpicker{max-width:400px;min-width:200px}#report-form div.btn-list li.dropdown-item .form-check{margin-bottom:0}.color-choice-item{border-radius:var(--tblr-border-radius);display:inline-block;height:20px;margin-right:10px;width:20px}fieldset:empty{display:none}fieldset>.mb-3.row:last-child{margin-bottom:0!important}.form-fieldset-light{background-color:unset;border-left:none;border-radius:0;border-right:none;border-top:none;margin-bottom:0}.form-fieldset-light:last-child{border:none}.modal-content{box-shadow:0 10px 80px rgba(0,0,0,.6)}.progress-group .progress-title{white-space:nowrap;width:100%}.progress-group .progress-title .progress-text{display:inline-block;width:1%}.progress-group .progress-title .progress-number{display:inline-block;float:none;width:98%}.initials{font-size:13px;font-weight:700}.avatar-xs{height:23px;width:23px}.avatar-xs .initials{font-size:10px}.avatar-sm{height:38px;width:38px}.avatar-sm .initials{font-size:17px}.avatar-md{height:45px;width:45px}.avatar-md .initials{font-size:21px}.avatar-lg{height:60px;width:60px}.avatar-lg .initials{font-size:28px}.widget-user-image{border:3px solid #fff;border-radius:50%}.widget-user-image .avatar{height:83px;width:83px}.widget-user-image .avatar .initials{font-size:40px}table.dataTable.table>tbody>tr>td.avatars .avatar{margin:1px}.avatar-list-stacked .avatar{margin-right:calc(var(--tblr-avatar-size)*-.2)!important}[data-bs-theme=dark] table.dataTable th.today{color:var(--tblr-muted)}[data-bs-theme=dark] .overlay{background:rgba(0,0,0,.5)}[data-bs-theme=dark] .overlay>.fas{color:var(--tblr-white)}section.quick-entry-page #quick_entry_form{display:none}section.quick-entry-page .ts-wrapper{display:table;table-layout:fixed}section.quick-entry-page #quick_entry_box .duration-widget .input-group{min-width:85px}section.quick-entry-page #quick_entry_box .duration-widget .btn-duration-preset{padding:7px 8px 7px 5px}section.quick-entry-page #quick_entry_box .duration-widget input{padding:7px 3px 7px 7px}fieldset legend.col-form-label{padding-top:0}fieldset.form-fieldset legend{font-size:1rem;font-weight:700}.ts-dropdown .optgroup:before{--tblr-spacer:.5rem}.dropdown-divider{--tblr-dropdown-divider-margin-y:.5rem}.float-help{background-color:var(--tblr-body-color);border-radius:50px;bottom:20px;height:50px;position:fixed;right:20px;text-align:center;width:50px;z-index:1021}.float-help i{color:var(--tblr-body-bg);font-size:30px;margin-top:11px}@media (max-width:767.98px){.float-help{border-radius:36px;height:36px;width:36px}.float-help i{font-size:20px;margin-top:8px}}html[dir=rtl] .fa-chevron-left:before{content:"\f054"}html[dir=rtl] .fa-chevron-right:before{content:"\f053"} \ No newline at end of file +.inline-search{max-width:200px}.inline-search #searchTerm{border-right:0}@media (min-width:360px){.inline-search{max-width:235px}}@media (min-width:768px){.inline-search{max-width:325px}.search-dropdown{width:500px}}h1.navbar-brand a span{display:inline-block;padding-top:.5rem}h1.navbar-brand a:hover{text-decoration:none}#export-buttons .dropdown-menu,.inline-search .dropdown-menu,.page-actions .dropdown-menu{z-index:1021}.navbar{--tblr-navbar-brand-font-size:1rem}.error-page{margin-bottom:50px}@media print{.control-sidebar,.sf-toolbar{display:none!important}.col-print-12{width:100%}.content-wrapper{margin:0!important}section.content{margin:0;padding:0}span i.dot{display:none;margin-right:0!important}}.page-center{justify-content:center}.hidden-no-space{margin:0;padding:0}.pre-scrollable{max-height:340px;overflow-y:scroll}td.timesheet-description ul{padding-left:15px}td.timesheet-description p{margin:0}td.badges{line-height:22px}.open-edit{cursor:pointer}td.w-min,th.w-min{white-space:nowrap;width:1%}table.dataTable thead>tr>th.hw-min{white-space:normal;width:1%}.w-avatar{width:40px}.w-avatar img.avatar{max-width:40px}.list-group-item.danger{border-left:.2rem solid #d63939!important;padding-left:1.3rem}.list-group-item.success{border-left:.2rem solid #2fb344!important;padding-left:1.3rem}.box-body-scrollable{max-height:340px;overflow:auto}#activity_details_box th,#customer_details_box th,#project_details_box th{width:30%}.overlay{background:hsla(0,0%,100%,.7);height:100%;left:0;position:fixed;top:0;width:100%;z-index:1021}.overlay>.fas{color:#000;font-size:30px;left:50vw;margin-left:-15px;margin-top:-15px;position:absolute;top:50vh}table.dataTable{clear:both;margin-bottom:0!important;max-width:none!important}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer;position:relative}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{font-weight:700}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after{font-family:Font Awesome\ 5 Free;font-size:12px;opacity:.5;padding-left:5px}table.dataTable thead .sorting:after{content:"\f0dc";opacity:.2}table.dataTable thead .sorting_asc:after{content:"\f077"}table.dataTable thead .sorting_desc:after{content:"\f078"}table.dataTable thead>tr>th{vertical-align:top;white-space:nowrap}table.dataTable th:active{outline:none}table.table-bordered thead td,table.table-bordered thead th{border-left-width:0;border-top-width:0}table.table-bordered tbody td,table.table-bordered tbody th,table.table-bordered tfoot td,table.table-bordered tfoot th{border-bottom-width:0;border-left-width:0}table.table-bordered td:last-child,table.table-bordered th:last-child{border-right-width:0}@media (min-width:1200px){table.dataTable.table>tbody>tr>td{vertical-align:middle}}table.dataTable .actions{width:40px}table.dataTable tr.summary td{background-color:var(--tblr-bg-surface-secondary);border:0;font-weight:700}table.dataTable tr th.multiCheckbox{width:15px}table.dataTable tr.overlapping{border-top:2px solid rgba(214,57,57,.1)}table.dataTable tr.exported{opacity:.7}table.dataTable td .btn-group{display:flex}table.dataTable td .label{font-size:85%;line-height:24px;padding:.3em .6em}table.dataTable td span.label-invisible{opacity:.6}table.dataTable td.weekend,table.dataTable th.weekend{background-color:var(--tblr-bg-surface-secondary)}table.dataTable th.today{background-color:var(--tblr-highlight-bg)}table.dataTable td.total,table.dataTable th.total{font-weight:700}.form-dataTable table.dataTable .form-group{margin-bottom:0}table.table-hover tr.exported:hover{opacity:1}.calendar-entry ul{list-style-type:none;padding:0}.calendar-entry div{white-space:pre-line}.draggable{cursor:grab}#timesheet_calendar{--bs-gray-400:var(--tblr-border-color);--bs-gray-200:var(--tblr-gray-200)}.fc-day-sat,.fc-day-sun{background-color:var(--tblr-bg-surface-secondary)}@keyframes ticktac-blink{0%{opacity:1}5%{opacity:.95}10%{opacity:.9}15%{opacity:.85}20%{opacity:.8}25%{opacity:.75}30%{opacity:.7}35%{opacity:.65}40%{opacity:.6}45%{opacity:.65}50%{opacity:.7}55%{opacity:.75}60%{opacity:.8}65%{opacity:.85}70%{opacity:.9}75%{opacity:.95}to{opacity:1}}.ticktac-start i,.ticktac-stop i{animation:ticktac-blink 2s step-end infinite;font-size:140%}@media (max-width:991.98px){aside.navbar .btn-outline-white,header.navbar .btn-outline-white{border-color:hsla(0,0%,100%,.2)}}.ts-dropdown{z-index:1021}.ts-control>input{min-width:unset}.ts-dropdown .optgroup [data-selectable].option{padding-left:20px}.checkbox-menu.show{z-index:1021}.duration-widget .input-group{min-width:110px}.duration-widget input.duration-input{min-width:55px}#report-form div.btn-list{width:100%}#report-form div.btn-list div.selectpicker{max-width:400px;min-width:200px}#report-form div.btn-list li.dropdown-item .form-check{margin-bottom:0}.color-choice-item{border-radius:var(--tblr-border-radius);display:inline-block;height:20px;margin-right:10px;width:20px}fieldset>.mb-3.row:last-child{margin-bottom:0!important}.form-fieldset-light{background-color:unset;border-left:none;border-radius:0;border-right:none;border-top:none;margin-bottom:0}.form-fieldset-light:last-child{border:none}.modal-content{box-shadow:0 10px 80px rgba(0,0,0,.6)}.progress-group .progress-title{white-space:nowrap;width:100%}.progress-group .progress-title .progress-text{display:inline-block;width:1%}.progress-group .progress-title .progress-number{display:inline-block;float:none;width:98%}.initials{font-size:13px;font-weight:700}.avatar-xs{height:23px;width:23px}.avatar-xs .initials{font-size:10px}.avatar-sm{height:38px;width:38px}.avatar-sm .initials{font-size:17px}.avatar-md{height:45px;width:45px}.avatar-md .initials{font-size:21px}.avatar-lg{height:60px;width:60px}.avatar-lg .initials{font-size:28px}.widget-user-image{border:3px solid #fff;border-radius:50%}.widget-user-image .avatar{height:83px;width:83px}.widget-user-image .avatar .initials{font-size:40px}table.dataTable.table>tbody>tr>td.avatars .avatar{margin:1px}.avatar-list-stacked .avatar{margin-right:calc(var(--tblr-avatar-size)*-.2)!important}[data-bs-theme=dark] table.dataTable th.today{color:var(--tblr-muted)}[data-bs-theme=dark] .overlay{background:rgba(0,0,0,.5)}[data-bs-theme=dark] .overlay>.fas{color:var(--tblr-white)}section.quick-entry-page #quick_entry_form{display:none}section.quick-entry-page .ts-wrapper{display:table;table-layout:fixed}section.quick-entry-page #quick_entry_box .duration-widget .input-group{min-width:85px}section.quick-entry-page #quick_entry_box .duration-widget .btn-duration-preset{padding:7px 8px 7px 5px}section.quick-entry-page #quick_entry_box .duration-widget input{padding:7px 3px 7px 7px}fieldset legend.col-form-label{padding-top:0}fieldset.form-fieldset legend{font-size:1rem;font-weight:700}.ts-dropdown .optgroup:before{--tblr-spacer:.5rem}.dropdown-divider{--tblr-dropdown-divider-margin-y:.5rem}.dropdown-menu{background-clip:border-box}fieldset:empty{display:none}.float-help{background-color:var(--tblr-body-color);border-radius:50px;bottom:20px;height:50px;position:fixed;right:20px;text-align:center;width:50px;z-index:1021}.float-help i{color:var(--tblr-body-bg);font-size:30px;margin-top:11px}@media (max-width:767.98px){.float-help{border-radius:36px;height:36px;width:36px}.float-help i{font-size:20px;margin-top:8px}}html[dir=rtl] .fa-chevron-left:before{content:"\f054"}html[dir=rtl] .fa-chevron-right:before{content:"\f053"} \ No newline at end of file diff --git a/public/build/entrypoints.json b/public/build/entrypoints.json index 82a7357e..d82f25ff 100644 --- a/public/build/entrypoints.json +++ b/public/build/entrypoints.json @@ -6,7 +6,7 @@ "/build/app.9acfcfc8.js" ], "css": [ - "/build/app.405a508c.css" + "/build/app.fc41168c.css" ] }, "export-pdf": { @@ -64,7 +64,7 @@ "integrity": { "/build/runtime.f0079159.js": "sha384-H22sAW1aTvyIPqvHOvGXWSWTxf0y6mptp+MsVmyXCfjx/WJjBbhX9gbUZ+qIuihV", "/build/app.9acfcfc8.js": "sha384-tzbF0uEmHghIo+D5IuKarLYkwB3AyrLMTEFqR5mqaXCP5VSOWx3t+ZfD81kd80T+", - "/build/app.405a508c.css": "sha384-D8LqbrX2x0UHuxQasN8nli7f/tzVYlNeJleATqXW1o0Pjwycyo0t1jKRe1h1MeIV", + "/build/app.fc41168c.css": "sha384-3Td9W7KogJoBiywzWOgpkPPNHEIT8/a/SkMZM5NgIRmuChj/3PeOKkOHVJQlhP2E", "/build/export-pdf.d367a32e.js": "sha384-Z5baqnzjI636nYFs4g63ViIKBZKRW4Jhv/7PQmTEQlqhfA7eK0vUMUtiyy0R5A9u", "/build/export-pdf.d8a6c23b.css": "sha384-ztepocHE4rnGE9eKZ4kL6jTKaePUyiwiB9TjJjstjpf/ckcKg1HedrEOOk/8ElJg", "/build/invoice.2604495e.js": "sha384-D6JvhGSqlx7z72b/qD3nF3QDXPy+XsCSRGtWfs1icjDKOcd2UzuXwuSa/E1Fg2TJ", diff --git a/public/build/manifest.json b/public/build/manifest.json index 68ccbfe2..4f2c527e 100644 --- a/public/build/manifest.json +++ b/public/build/manifest.json @@ -1,5 +1,5 @@ { - "build/app.css": "/build/app.405a508c.css", + "build/app.css": "/build/app.fc41168c.css", "build/app.js": "/build/app.9acfcfc8.js", "build/export-pdf.css": "/build/export-pdf.d8a6c23b.css", "build/export-pdf.js": "/build/export-pdf.d367a32e.js", diff --git a/src/Command/AbstractBundleInstallerCommand.php b/src/Command/AbstractBundleInstallerCommand.php index 8c2cb829..a3acf932 100755 --- a/src/Command/AbstractBundleInstallerCommand.php +++ b/src/Command/AbstractBundleInstallerCommand.php @@ -148,7 +148,7 @@ abstract class AbstractBundleInstallerCommand extends Command return Command::SUCCESS; } - protected function installAssets(SymfonyStyle $io, OutputInterface $output) + protected function installAssets(SymfonyStyle $io, OutputInterface $output): void { $command = $this->getApplication()->find('assets:install'); $cmdInput = new ArrayInput([]); @@ -160,12 +160,12 @@ abstract class AbstractBundleInstallerCommand extends Command $io->writeln(''); } - protected function importMigrations(SymfonyStyle $io, OutputInterface $output) + protected function importMigrations(SymfonyStyle $io, OutputInterface $output): void { $config = $this->getMigrationConfigFilename(); if (null === $config) { - return false; + return; } if (!file_exists($config)) { diff --git a/src/Command/AbstractRoleCommand.php b/src/Command/AbstractRoleCommand.php index e2c86ada..8125827c 100644 --- a/src/Command/AbstractRoleCommand.php +++ b/src/Command/AbstractRoleCommand.php @@ -56,5 +56,5 @@ abstract class AbstractRoleCommand extends Command return Command::SUCCESS; } - abstract protected function executeRoleCommand(UserService $manipulator, SymfonyStyle $output, User $user, bool $super, $role); + abstract protected function executeRoleCommand(UserService $manipulator, SymfonyStyle $output, User $user, bool $super, $role): void; } diff --git a/src/Command/DemoteUserCommand.php b/src/Command/DemoteUserCommand.php index 1b5db58e..eb2c218b 100644 --- a/src/Command/DemoteUserCommand.php +++ b/src/Command/DemoteUserCommand.php @@ -36,7 +36,7 @@ final class DemoteUserCommand extends AbstractRoleCommand /** * {@inheritdoc} */ - protected function executeRoleCommand(UserService $manipulator, SymfonyStyle $output, User $user, bool $super, $role) + protected function executeRoleCommand(UserService $manipulator, SymfonyStyle $output, User $user, bool $super, $role): void { $username = $user->getUserIdentifier(); if ($super) { diff --git a/src/Command/ExportCreateCommand.php b/src/Command/ExportCreateCommand.php index 8ef61f6b..41eea9a2 100644 --- a/src/Command/ExportCreateCommand.php +++ b/src/Command/ExportCreateCommand.php @@ -46,10 +46,7 @@ final class ExportCreateCommand extends Command parent::__construct(); } - /** - * {@inheritdoc} - */ - protected function configure() + protected function configure(): void { $this ->setDescription('Create exports') diff --git a/src/Command/PromoteUserCommand.php b/src/Command/PromoteUserCommand.php index d6141fcc..900c16d9 100644 --- a/src/Command/PromoteUserCommand.php +++ b/src/Command/PromoteUserCommand.php @@ -33,7 +33,7 @@ final class PromoteUserCommand extends AbstractRoleCommand ); } - protected function executeRoleCommand(UserService $manipulator, SymfonyStyle $output, User $user, bool $super, $role) + protected function executeRoleCommand(UserService $manipulator, SymfonyStyle $output, User $user, bool $super, $role): void { $username = $user->getUserIdentifier(); if ($super) { diff --git a/src/Command/ReloadCommand.php b/src/Command/ReloadCommand.php index 153a175d..2c2c87b0 100644 --- a/src/Command/ReloadCommand.php +++ b/src/Command/ReloadCommand.php @@ -106,7 +106,7 @@ final class ReloadCommand extends Command ] ); - return (int) $cacheResult; + return $cacheResult; } $io->success( @@ -116,7 +116,7 @@ final class ReloadCommand extends Command return Command::SUCCESS; } - private function rebuildCaches(string $environment, SymfonyStyle $io, InputInterface $input, OutputInterface $output) + private function rebuildCaches(string $environment, SymfonyStyle $io, InputInterface $input, OutputInterface $output): int { $io->text('Rebuilding your cache, please be patient ...'); diff --git a/src/Configuration/SystemConfiguration.php b/src/Configuration/SystemConfiguration.php index 09f08825..18a1c991 100644 --- a/src/Configuration/SystemConfiguration.php +++ b/src/Configuration/SystemConfiguration.php @@ -32,14 +32,11 @@ final class SystemConfiguration /** * Set an array item to a given value using "dot" notation. - * * If no key is given to the method, the entire array will be replaced. * - * @param string $key - * @param mixed $value - * @return void + * @internal */ - private function set(string $key, $value): void + public function set(string $key, mixed $value): void { if (\array_key_exists($key, $this->settings)) { if (\is_bool($this->settings[$key])) { @@ -125,31 +122,35 @@ final class SystemConfiguration // ========== Array access methods ========== + /** + * @deprecated since 2.0.35 + */ public function offsetExists($offset): bool { return $this->has($offset); } + /** + * @deprecated since 2.0.35 + */ public function offsetGet($offset): mixed { return $this->find($offset); } /** - * @param mixed $offset - * @param mixed $value - * @throws \BadMethodCallException + * @deprecated since 2.0.35 */ - public function offsetSet($offset, $value) + public function offsetSet(mixed $offset, mixed $value): void { $this->set($offset, $value); } /** - * @param mixed $offset + * @deprecated since 2.0.35 * @throws \BadMethodCallException */ - public function offsetUnset($offset) + public function offsetUnset(mixed $offset): void { throw new \BadMethodCallException('SystemBundleConfiguration does not support offsetUnset()'); } diff --git a/src/Constants.php b/src/Constants.php index 8e6115a4..9b6a49bb 100644 --- a/src/Constants.php +++ b/src/Constants.php @@ -17,11 +17,11 @@ class Constants /** * The current release version */ - public const VERSION = '2.0.34'; + public const VERSION = '2.0.35'; /** * The current release: major * 10000 + minor * 100 + patch */ - public const VERSION_ID = 20034; + public const VERSION_ID = 20035; /** * The software name */ diff --git a/src/Controller/Auth/SamlController.php b/src/Controller/Auth/SamlController.php index b8f14eaf..9d43c801 100644 --- a/src/Controller/Auth/SamlController.php +++ b/src/Controller/Auth/SamlController.php @@ -25,7 +25,7 @@ final class SamlController extends AbstractController } #[Route(path: '/login', name: 'saml_login')] - public function loginAction(Request $request) + public function loginAction(Request $request): Response { if (!$this->samlConfiguration->isActivated()) { throw $this->createNotFoundException('SAML deactivated'); @@ -50,11 +50,19 @@ final class SamlController extends AbstractController throw new \RuntimeException($error); } - $this->authFactory->create()->login($session->get('_security.main.target_path')); + // this does set headers and exit as $stay is not set to true + $url = $this->authFactory->create()->login($session->get('_security.main.target_path')); + + if ($url === null) { + throw new \RuntimeException('SAML login failed'); + } + + // this line is not (yet) reached, as the previous call will exit + return $this->redirect($url); } #[Route(path: '/metadata', name: 'saml_metadata')] - public function metadataAction() + public function metadataAction(): Response { if (!$this->samlConfiguration->isActivated()) { throw $this->createNotFoundException('SAML deactivated'); @@ -69,7 +77,7 @@ final class SamlController extends AbstractController } #[Route(path: '/acs', name: 'saml_acs')] - public function assertionConsumerServiceAction() + public function assertionConsumerServiceAction(): Response { if (!$this->samlConfiguration->isActivated()) { throw $this->createNotFoundException('SAML deactivated'); @@ -79,7 +87,7 @@ final class SamlController extends AbstractController } #[Route(path: '/logout', name: 'saml_logout')] - public function logoutAction() + public function logoutAction(): Response { if (!$this->samlConfiguration->isActivated()) { throw $this->createNotFoundException('SAML deactivated'); diff --git a/src/Controller/InvoiceController.php b/src/Controller/InvoiceController.php index b7565a68..9c85bce5 100644 --- a/src/Controller/InvoiceController.php +++ b/src/Controller/InvoiceController.php @@ -387,7 +387,7 @@ final class InvoiceController extends AbstractController #[Route(path: '/export', name: 'invoice_export', methods: ['GET'])] #[IsGranted('view_invoice')] - public function exportAction(Request $request, EntityWithMetaFieldsExporter $exporter) + public function exportAction(Request $request, EntityWithMetaFieldsExporter $exporter): Response { $query = new InvoiceArchiveQuery(); $query->setCurrentUser($this->getUser()); diff --git a/src/Controller/PermissionController.php b/src/Controller/PermissionController.php index 876c2e9d..aa8c7a80 100644 --- a/src/Controller/PermissionController.php +++ b/src/Controller/PermissionController.php @@ -46,7 +46,7 @@ final class PermissionController extends AbstractController #[Route(path: '', name: 'admin_user_permissions', methods: ['GET', 'POST'])] #[IsGranted('role_permissions')] - public function permissions(EventDispatcherInterface $dispatcher, CsrfTokenManagerInterface $csrfTokenManager, RoleService $roleService) + public function permissions(EventDispatcherInterface $dispatcher, CsrfTokenManagerInterface $csrfTokenManager, RoleService $roleService): Response { $all = $this->roleRepository->findAll(); $existing = []; diff --git a/src/Controller/QuickEntryController.php b/src/Controller/QuickEntryController.php index 5c3a1c16..455b3671 100644 --- a/src/Controller/QuickEntryController.php +++ b/src/Controller/QuickEntryController.php @@ -18,6 +18,7 @@ use App\Repository\TimesheetRepository; use App\Timesheet\TimesheetService; use App\Utils\PageSetup; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Security\Http\Attribute\IsGranted; @@ -33,7 +34,7 @@ final class QuickEntryController extends AbstractController } #[Route(path: '/{begin}', name: 'quick_entry', methods: ['GET', 'POST'])] - public function quickEntry(Request $request, ?string $begin = null) + public function quickEntry(Request $request, ?string $begin = null): Response { $factory = $this->getDateTimeFactory(); diff --git a/src/Controller/Security/SecurityController.php b/src/Controller/Security/SecurityController.php index e00ee152..da68c7ef 100644 --- a/src/Controller/Security/SecurityController.php +++ b/src/Controller/Security/SecurityController.php @@ -49,13 +49,13 @@ final class SecurityController extends AbstractController } #[Route(path: '/login_check', name: 'security_check', methods: ['POST'])] - public function checkAction() + public function checkAction(): Response { throw new \RuntimeException('You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.'); } #[Route(path: '/logout', name: 'logout', methods: ['GET', 'POST'])] - public function logoutAction() + public function logoutAction(): Response { throw new \RuntimeException('You must activate the logout in your security firewall configuration.'); } diff --git a/src/Controller/TimesheetAbstractController.php b/src/Controller/TimesheetAbstractController.php index 5f4529f3..0433e7cb 100644 --- a/src/Controller/TimesheetAbstractController.php +++ b/src/Controller/TimesheetAbstractController.php @@ -418,7 +418,7 @@ abstract class TimesheetAbstractController extends AbstractController ]); } - protected function multiDelete(Request $request) + protected function multiDelete(Request $request): Response { $form = $this->getMultiUpdateActionForm(); $form->handleRequest($request); @@ -446,7 +446,7 @@ abstract class TimesheetAbstractController extends AbstractController return $this->redirectToRoute($this->getTimesheetRoute()); } - protected function prepareQuery(TimesheetQuery $query) + protected function prepareQuery(TimesheetQuery $query): void { $query->setUser($this->getUser()); } diff --git a/src/Controller/TimesheetTeamController.php b/src/Controller/TimesheetTeamController.php index a42df00f..f06e57b4 100644 --- a/src/Controller/TimesheetTeamController.php +++ b/src/Controller/TimesheetTeamController.php @@ -164,7 +164,7 @@ final class TimesheetTeamController extends TimesheetAbstractController return $this->multiDelete($request); } - protected function prepareQuery(TimesheetQuery $query) + protected function prepareQuery(TimesheetQuery $query): void { $query->setCurrentUser($this->getUser()); } diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 0862d4f6..bd0f5785 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -193,7 +193,7 @@ final class UserController extends AbstractController #[Route(path: '/export', name: 'user_export', methods: ['GET'])] #[IsGranted('view_user')] - public function exportAction(Request $request, UserExporter $exporter) + public function exportAction(Request $request, UserExporter $exporter): Response { $query = new UserQuery(); $query->setCurrentUser($this->getUser()); diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 2c28423c..6ea601e2 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -105,7 +105,7 @@ final class Configuration implements ConfigurationInterface return $node; } - private function getProjectNode() + private function getProjectNode(): ArrayNodeDefinition { $builder = new TreeBuilder('project'); /** @var ArrayNodeDefinition $node */ diff --git a/src/Doctrine/AbstractMigration.php b/src/Doctrine/AbstractMigration.php index a4de4183..7294d0be 100644 --- a/src/Doctrine/AbstractMigration.php +++ b/src/Doctrine/AbstractMigration.php @@ -52,7 +52,7 @@ abstract class AbstractMigration extends BaseAbstractMigration * * @throws Exception */ - protected function abortIfPlatformNotSupported() + protected function abortIfPlatformNotSupported(): void { $platform = $this->connection->getDatabasePlatform(); if (!($platform instanceof MySQLPlatform)) { diff --git a/src/Event/RevenueStatisticEvent.php b/src/Event/RevenueStatisticEvent.php index 11508aa4..b1c4c854 100644 --- a/src/Event/RevenueStatisticEvent.php +++ b/src/Event/RevenueStatisticEvent.php @@ -21,16 +21,16 @@ final class RevenueStatisticEvent extends Event */ private array $revenue = []; - public function __construct(private ?\DateTime $begin, private ?\DateTime $end) + public function __construct(private ?\DateTimeInterface $begin, private ?\DateTimeInterface $end) { } - public function getBegin(): ?\DateTime + public function getBegin(): ?\DateTimeInterface { return $this->begin; } - public function getEnd(): ?\DateTime + public function getEnd(): ?\DateTimeInterface { return $this->end; } diff --git a/src/Event/UserPreferenceDisplayEvent.php b/src/Event/UserPreferenceDisplayEvent.php index 2e0a29e7..dd74fad7 100644 --- a/src/Event/UserPreferenceDisplayEvent.php +++ b/src/Event/UserPreferenceDisplayEvent.php @@ -37,7 +37,7 @@ final class UserPreferenceDisplayEvent extends Event return $this->preferences; } - public function addPreference(UserPreference $preference) + public function addPreference(UserPreference $preference): void { $this->preferences[] = $preference; } diff --git a/src/Event/UserRevenueStatisticEvent.php b/src/Event/UserRevenueStatisticEvent.php index 5959d9a6..b593f376 100644 --- a/src/Event/UserRevenueStatisticEvent.php +++ b/src/Event/UserRevenueStatisticEvent.php @@ -19,17 +19,17 @@ final class UserRevenueStatisticEvent extends Event { private RevenueStatisticEvent $event; - public function __construct(private User $user, ?\DateTime $begin, ?\DateTime $end) + public function __construct(private User $user, ?\DateTimeInterface $begin, ?\DateTimeInterface $end) { $this->event = new RevenueStatisticEvent($begin, $end); } - public function getBegin(): ?\DateTime + public function getBegin(): ?\DateTimeInterface { return $this->event->getBegin(); } - public function getEnd(): ?\DateTime + public function getEnd(): ?\DateTimeInterface { return $this->event->getEnd(); } diff --git a/src/Form/AbstractRateForm.php b/src/Form/AbstractRateForm.php index f3c137b5..0cffd5d7 100644 --- a/src/Form/AbstractRateForm.php +++ b/src/Form/AbstractRateForm.php @@ -17,7 +17,7 @@ use Symfony\Component\Form\FormBuilderInterface; abstract class AbstractRateForm extends AbstractType { - protected function addFields(FormBuilderInterface $builder, ?string $currency) + protected function addFields(FormBuilderInterface $builder, ?string $currency): void { $builder ->add('user', UserType::class, [ diff --git a/src/Form/Type/DateTimePickerType.php b/src/Form/Type/DateTimePickerType.php index 242f6ad1..4dafdeba 100644 --- a/src/Form/Type/DateTimePickerType.php +++ b/src/Form/Type/DateTimePickerType.php @@ -113,8 +113,8 @@ class DateTimePickerType extends AbstractType 'example' => (new \DateTime())->format(BaseApiController::DATE_FORMAT_PHP), ], 'input' => 'datetime', - 'model_timezone' => null, - 'view_timezone' => null, + 'model_timezone' => date_default_timezone_get(), + 'view_timezone' => date_default_timezone_get(), // Don't modify \DateTime classes by reference, we treat // them like immutable value objects 'by_reference' => false, diff --git a/src/Invoice/Hydrator/InvoiceItemDefaultHydrator.php b/src/Invoice/Hydrator/InvoiceItemDefaultHydrator.php index 023f9c07..1dd3d5a3 100644 --- a/src/Invoice/Hydrator/InvoiceItemDefaultHydrator.php +++ b/src/Invoice/Hydrator/InvoiceItemDefaultHydrator.php @@ -17,7 +17,7 @@ final class InvoiceItemDefaultHydrator implements InvoiceItemHydrator { private InvoiceModel $model; - public function setInvoiceModel(InvoiceModel $model) + public function setInvoiceModel(InvoiceModel $model): void { $this->model = $model; } diff --git a/src/Invoice/InvoiceItemHydrator.php b/src/Invoice/InvoiceItemHydrator.php index 714c330c..6bcac48d 100644 --- a/src/Invoice/InvoiceItemHydrator.php +++ b/src/Invoice/InvoiceItemHydrator.php @@ -11,7 +11,7 @@ namespace App\Invoice; interface InvoiceItemHydrator { - public function setInvoiceModel(InvoiceModel $model); + public function setInvoiceModel(InvoiceModel $model): void; public function hydrate(InvoiceItem $item): array; } diff --git a/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php b/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php index 19231884..78401369 100644 --- a/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php +++ b/src/Invoice/Renderer/AbstractSpreadsheetRenderer.php @@ -120,11 +120,9 @@ abstract class AbstractSpreadsheetRenderer extends AbstractRenderer } /** - * @param Worksheet $worksheet - * @param int $invoiceItemCount * @throws \PhpOffice\PhpSpreadsheet\Exception */ - protected function addTemplateRows(Worksheet $worksheet, int $invoiceItemCount) + protected function addTemplateRows(Worksheet $worksheet, int $invoiceItemCount): void { $startRow = null; $rowCounter = 0; diff --git a/src/Invoice/ServiceInvoice.php b/src/Invoice/ServiceInvoice.php index 7ff3518f..01dd51bc 100644 --- a/src/Invoice/ServiceInvoice.php +++ b/src/Invoice/ServiceInvoice.php @@ -229,7 +229,7 @@ final class ServiceInvoice return $filename; } - public function changeInvoiceStatus(Invoice $invoice, string $status) + public function changeInvoiceStatus(Invoice $invoice, string $status): void { switch ($status) { case Invoice::STATUS_NEW: @@ -256,7 +256,6 @@ final class ServiceInvoice } /** - * @param InvoiceQuery $query * @return ExportableItem[] */ public function getInvoiceItems(InvoiceQuery $query): array @@ -273,7 +272,7 @@ final class ServiceInvoice /** * @param ExportableItem[] $entries */ - private function markEntriesAsExported(array $entries) + private function markEntriesAsExported(array $entries): void { foreach ($this->getInvoiceItemRepositories() as $repository) { $repository->setExported($entries); @@ -309,9 +308,6 @@ final class ServiceInvoice } /** - * @param InvoiceModel $model - * @param EventDispatcherInterface $dispatcher - * @return Invoice * @throws \Exception */ public function createInvoice(InvoiceModel $model, EventDispatcherInterface $dispatcher): Invoice @@ -362,7 +358,7 @@ final class ServiceInvoice ); } - public function deleteInvoice(Invoice $invoice, EventDispatcherInterface $dispatcher) + public function deleteInvoice(Invoice $invoice, EventDispatcherInterface $dispatcher): void { $invoiceDirectory = $this->getInvoicesDirectory(); @@ -377,8 +373,6 @@ final class ServiceInvoice } /** - * @param InvoiceQuery $query - * @return InvoiceModel * @throws \Exception */ public function createModel(InvoiceQuery $query): InvoiceModel @@ -485,7 +479,6 @@ final class ServiceInvoice } /** - * @param InvoiceQuery $query * @return InvoiceModel[] * @throws \Exception */ diff --git a/src/Kernel.php b/src/Kernel.php index a5ebad52..b136ffbd 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -72,7 +72,7 @@ class Kernel extends BaseKernel return $this->getProjectDir() . '/var/log'; } - protected function build(ContainerBuilder $container) + protected function build(ContainerBuilder $container): void { $container->registerForAutoconfiguration(TimesheetCalculator::class)->addTag(self::TAG_TIMESHEET_CALCULATOR); $container->registerForAutoconfiguration(ExportRendererInterface::class)->addTag(self::TAG_EXPORT_RENDERER); diff --git a/src/Repository/TimesheetRepository.php b/src/Repository/TimesheetRepository.php index 0be57ffe..6a99ece3 100644 --- a/src/Repository/TimesheetRepository.php +++ b/src/Repository/TimesheetRepository.php @@ -42,10 +42,15 @@ class TimesheetRepository extends EntityRepository { use RepositorySearchTrait; + /** @deprecated since 2.0.35 */ public const STATS_QUERY_DURATION = 'duration'; + /** @deprecated since 2.0.35 */ public const STATS_QUERY_RATE = 'rate'; + /** @deprecated since 2.0.35 */ public const STATS_QUERY_USER = 'users'; + /** @deprecated since 2.0.35 */ public const STATS_QUERY_AMOUNT = 'amount'; + /** @deprecated since 2.0.35 */ public const STATS_QUERY_ACTIVE = 'active'; /** @@ -152,42 +157,44 @@ class TimesheetRepository extends EntityRepository /** * @param self::STATS_QUERY_* $type - * @param DateTime|null $begin - * @param DateTime|null $end - * @param User|null $user * @return int|mixed - * @throws \Doctrine\ORM\NonUniqueResultException + * @deprecated since 2.0.35 */ - public function getStatistic(string $type, ?DateTime $begin, ?DateTime $end, ?User $user, ?bool $billable = null): mixed + public function getStatistic(string $type, ?\DateTimeInterface $begin, ?\DateTimeInterface $end, ?User $user, ?bool $billable = null): mixed { + @trigger_error('Repository method getStatistic() is deprecated, use explicit methods instead', E_USER_DEPRECATED); + switch ($type) { - case self::STATS_QUERY_ACTIVE: - return \count($this->getActiveEntries($user)); - case self::STATS_QUERY_DURATION: - $what = 'COALESCE(SUM(t.duration), 0)'; - break; - case self::STATS_QUERY_RATE: + case 'active': + return $this->countActiveEntries($user); + case 'duration': + return $this->getDurationForTimeRange($begin, $end, $user, $billable); + case 'rate': return $this->getRevenue($begin, $end, $user); - case self::STATS_QUERY_USER: - $what = 'COUNT(DISTINCT(t.user))'; - break; - case self::STATS_QUERY_AMOUNT: - $what = 'COUNT(t.id)'; - break; - default: - throw new InvalidArgumentException('Invalid query type: ' . $type); + case 'users': + return $this->countActiveUsers($begin, $end, $billable); + case 'amount': + return $this->queryTimeRange('COUNT(t.id)', $begin, $end, $user, $billable); } - return $this->queryTimeRange($what, $begin, $end, $user, $billable); + throw new InvalidArgumentException('Invalid query type: ' . $type); // @phpstan-ignore-line + } + + public function getDurationForTimeRange(?\DateTimeInterface $begin, ?\DateTimeInterface $end, ?User $user, ?bool $billable = null): int + { + $tmp = $this->queryTimeRange('COALESCE(SUM(t.duration), 0)', $begin, $end, $user, $billable); + + if (!is_numeric($tmp)) { + return 0; + } + + return (int) $tmp; } /** - * @param DateTime|null $begin - * @param DateTime|null $end - * @param User|null $user * @return array */ - public function getRevenue(?DateTime $begin, ?DateTime $end, ?User $user): array + public function getRevenue(?\DateTimeInterface $begin, ?\DateTimeInterface $end, ?User $user): array { $qb = $this->getEntityManager()->createQueryBuilder(); @@ -198,9 +205,8 @@ class TimesheetRepository extends EntityRepository ->leftJoin('t.project', 'p') ->leftJoin('p.customer', 'c') ->groupBy('c.currency') - ; - - // TODO only billable? + ->andWhere($qb->expr()->eq('t.billable', ':billable')) + ->setParameter('billable', true); if ($begin !== null) { $qb->andWhere($qb->expr()->between('t.begin', ':from', ':to')) @@ -223,14 +229,10 @@ class TimesheetRepository extends EntityRepository /** * @param string|string[] $select - * @param DateTime|null $begin - * @param DateTime|null $end - * @param User|null $user - * @param bool|null $billable * @return int|mixed * @throws \Doctrine\ORM\NonUniqueResultException */ - protected function queryTimeRange(string|array $select, ?DateTime $begin, ?DateTime $end, ?User $user, ?bool $billable = null): mixed + private function queryTimeRange(string|array $select, ?\DateTimeInterface $begin, ?\DateTimeInterface $end, ?User $user, ?bool $billable = null): mixed { $selects = $select; if (!\is_array($select)) { @@ -349,6 +351,34 @@ class TimesheetRepository extends EntityRepository return $this->getHydratedResultsByQuery($qb, false); } + public function countActiveEntries(?User $user = null): int + { + $qb = $this->getEntityManager()->createQueryBuilder(); + + $qb->select('COUNT(t)') + ->from(Timesheet::class, 't') + ->andWhere($qb->expr()->isNull('t.end')) + ->orderBy('t.begin', 'DESC'); + + if (null !== $user) { + $qb->andWhere('t.user = :user'); + $qb->setParameter('user', $user); + } + + return (int) $qb->getQuery()->getSingleScalarResult(); + } + + public function countActiveUsers(?\DateTimeInterface $begin, ?\DateTimeInterface $end, ?bool $billable = null): int + { + $tmp = $this->queryTimeRange('COUNT(DISTINCT(t.user))', $begin, $end, null, $billable); + + if (!is_numeric($tmp)) { + return 0; + } + + return (int) $tmp; + } + /** * This method causes me some headaches ... * @@ -411,7 +441,7 @@ class TimesheetRepository extends EntityRepository return new Pagination($this->getPaginatorForQuery($query), $query); } - protected function getPaginatorForQuery(TimesheetQuery $query): PaginatorInterface + private function getPaginatorForQuery(TimesheetQuery $query): PaginatorInterface { $qb = $this->getQueryBuilderForQuery($query); $qb diff --git a/src/Saml/SamlProvider.php b/src/Saml/SamlProvider.php index 8b18a050..36e0a8d4 100644 --- a/src/Saml/SamlProvider.php +++ b/src/Saml/SamlProvider.php @@ -134,11 +134,9 @@ final class SamlProvider throw new \RuntimeException('Missing user attribute: ' . $key); } - if (!\array_key_exists(0, $attributes[$key])) { - throw new \RuntimeException('Missing user attribute value: ' . $key); + if (\is_array($attributes[$key]) && isset($attributes[$key][0])) { + $results[] = $attributes[$key][0]; } - - $results[] = $attributes[$key][0]; } else { $results[] = $part; } diff --git a/src/Timesheet/FavoriteRecordService.php b/src/Timesheet/FavoriteRecordService.php index 1307a2de..d0f2915a 100644 --- a/src/Timesheet/FavoriteRecordService.php +++ b/src/Timesheet/FavoriteRecordService.php @@ -21,6 +21,8 @@ use App\Repository\TimesheetRepository; */ final class FavoriteRecordService { + public const MAX_FAVORITES = 5; + public function __construct(private TimesheetRepository $repository, private BookmarkRepository $bookmarkRepository) { } @@ -35,7 +37,7 @@ final class FavoriteRecordService /** @var array $favIds */ $favIds = $this->getBookmark($user)->getContent(); $recentIds = []; - if (\count($favIds) < 5) { + if (\count($favIds) < $limit) { $recentIds = $this->repository->getRecentActivityIds($user, null, $limit); } /** @var array $ids */ @@ -98,7 +100,7 @@ final class FavoriteRecordService return; } - if (\count($ids) >= 5) { + if (\count($ids) >= self::MAX_FAVORITES) { array_pop($ids); // remove the last element and make space for a new id } array_unshift($ids, $timesheet->getId()); diff --git a/src/Widget/Type/AbstractActiveUsers.php b/src/Widget/Type/AbstractActiveUsers.php index 39d08530..b7a12d0f 100644 --- a/src/Widget/Type/AbstractActiveUsers.php +++ b/src/Widget/Type/AbstractActiveUsers.php @@ -9,10 +9,12 @@ namespace App\Widget\Type; -use App\Repository\TimesheetRepository; - -abstract class AbstractActiveUsers extends AbstractSimpleStatisticChart +abstract class AbstractActiveUsers extends AbstractWidgetType { + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -20,14 +22,6 @@ abstract class AbstractActiveUsers extends AbstractSimpleStatisticChart ], parent::getOptions($options)); } - public function getData(array $options = []): mixed - { - $this->setQueryWithUser(false); - $this->setQuery(TimesheetRepository::STATS_QUERY_USER); - - return parent::getData($options); - } - public function getTitle(): string { return 'stats.' . lcfirst($this->getId()); diff --git a/src/Widget/Type/AbstractAmountPeriod.php b/src/Widget/Type/AbstractAmountPeriod.php index 4f435e7c..6072ec6d 100644 --- a/src/Widget/Type/AbstractAmountPeriod.php +++ b/src/Widget/Type/AbstractAmountPeriod.php @@ -29,6 +29,10 @@ abstract class AbstractAmountPeriod extends AbstractWidget return 'widget/widget-counter-money.html.twig'; } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -36,19 +40,12 @@ abstract class AbstractAmountPeriod extends AbstractWidget ], parent::getOptions($options)); } - protected function getRevenue(?string $begin, ?string $end, array $options = []) + /** + * @param array $options + * @return array + */ + protected function getRevenue(?\DateTimeInterface $begin, ?\DateTimeInterface $end, array $options = []): array { - $user = $this->getUser(); - $timezone = new \DateTimeZone($user->getTimezone()); - - if ($begin !== null) { - $begin = new \DateTime($begin, $timezone); - } - - if ($end !== null) { - $end = new \DateTime($end, $timezone); - } - $data = $this->repository->getRevenue($begin, $end, null); $event = new RevenueStatisticEvent($begin, $end); diff --git a/src/Widget/Type/AbstractCounterDuration.php b/src/Widget/Type/AbstractCounterDuration.php index d711c5b3..7abcd195 100644 --- a/src/Widget/Type/AbstractCounterDuration.php +++ b/src/Widget/Type/AbstractCounterDuration.php @@ -9,10 +9,12 @@ namespace App\Widget\Type; -use App\Repository\TimesheetRepository; - -abstract class AbstractCounterDuration extends AbstractSimpleStatisticChart +abstract class AbstractCounterDuration extends AbstractWidgetType { + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -20,13 +22,6 @@ abstract class AbstractCounterDuration extends AbstractSimpleStatisticChart ], parent::getOptions($options)); } - public function getData(array $options = []): mixed - { - $this->setQuery(TimesheetRepository::STATS_QUERY_DURATION); - - return parent::getData($options); - } - public function getTitle(): string { return 'stats.' . lcfirst($this->getId()); diff --git a/src/Widget/Type/AbstractCounterYear.php b/src/Widget/Type/AbstractCounterYear.php index 7a3eddb9..c86ba561 100644 --- a/src/Widget/Type/AbstractCounterYear.php +++ b/src/Widget/Type/AbstractCounterYear.php @@ -10,34 +10,39 @@ namespace App\Widget\Type; use App\Configuration\SystemConfiguration; -use App\Repository\TimesheetRepository; use App\Timesheet\DateTimeFactory; -abstract class AbstractCounterYear extends AbstractSimpleStatisticChart +abstract class AbstractCounterYear extends AbstractWidgetType { private bool $isFinancialYear = false; - public function __construct(TimesheetRepository $repository, private SystemConfiguration $systemConfiguration) + public function __construct(private SystemConfiguration $systemConfiguration) { - parent::__construct($repository); } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setBegin('01 january this year 00:00:00'); - $this->setEnd('31 december this year 23:59:59'); + $begin = $this->createDate('01 january this year 00:00:00'); + $end = $this->createDate('31 december this year 23:59:59'); if (null !== ($financialYear = $this->systemConfiguration->getFinancialYearStart())) { $factory = new DateTimeFactory($this->getTimezone()); $begin = $factory->createStartOfFinancialYear($financialYear); - $this->setBegin($begin); - $this->setEnd($factory->createEndOfFinancialYear($begin)); + $end = $factory->createEndOfFinancialYear($begin); $this->isFinancialYear = true; } - return parent::getData($options); + return $this->getYearData($begin, $end, $options); } + /** + * @param array $options + */ + abstract protected function getYearData(\DateTimeInterface $begin, \DateTimeInterface $end, array $options = []): mixed; + abstract protected function getFinancialYearTitle(): string; public function getTitle(): string diff --git a/src/Widget/Type/AbstractSimpleStatisticChart.php b/src/Widget/Type/AbstractSimpleStatisticChart.php deleted file mode 100644 index 1a1c3e73..00000000 --- a/src/Widget/Type/AbstractSimpleStatisticChart.php +++ /dev/null @@ -1,139 +0,0 @@ -query = $query; - } - - public function setBegin(null|string|\DateTime $begin): self - { - $this->begin = $begin; - - return $this; - } - - public function getBegin(): ?\DateTime - { - if ($this->begin === null) { - return null; - } - - if ($this->begin instanceof \DateTime) { - return $this->begin; - } - - return new \DateTime($this->begin, $this->getTimezone()); - } - - public function setEnd(null|string|\DateTime $end): self - { - $this->end = $end; - - return $this; - } - - public function getEnd(): ?\DateTime - { - if ($this->end === null) { - return null; - } - - if ($this->end instanceof \DateTime) { - return $this->end; - } - - return new \DateTime($this->end, $this->getTimezone()); - } - - public function setQueryWithUser(bool $queryWithUser): self - { - $this->queryWithUser = $queryWithUser; - - return $this; - } - - public function getTimezone(): \DateTimeZone - { - $timezone = date_default_timezone_get(); - if (null !== $this->getUser()) { - $timezone = $this->getUser()->getTimezone(); - } - - return new \DateTimeZone($timezone); - } - - /** - * @param array $options - * @return mixed|null - * @throws WidgetException - */ - public function getData(array $options = []): mixed - { - try { - $user = null; - if (true === $this->queryWithUser) { - $user = $this->getUser(); - } - - return $this->repository->getStatistic($this->query, $this->getBegin(), $this->getEnd(), $user); - } catch (\Exception $ex) { - throw new WidgetException( - 'Failed loading widget data: ' . $ex->getMessage() - ); - } - } - - public function getTemplateName(): string - { - $name = (new \ReflectionClass($this))->getShortName(); - - return sprintf('widget/widget-%s.html.twig', strtolower($name)); - } -} diff --git a/src/Widget/Type/AbstractUserRevenuePeriod.php b/src/Widget/Type/AbstractUserRevenuePeriod.php index 1ae6dd16..4c693eca 100644 --- a/src/Widget/Type/AbstractUserRevenuePeriod.php +++ b/src/Widget/Type/AbstractUserRevenuePeriod.php @@ -34,6 +34,10 @@ abstract class AbstractUserRevenuePeriod extends AbstractWidget return ['view_rate_own_timesheet']; } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -41,18 +45,13 @@ abstract class AbstractUserRevenuePeriod extends AbstractWidget ], parent::getOptions($options)); } - protected function getRevenue(?string $begin, ?string $end, array $options = []) + /** + * @param array $options + * @return array + */ + protected function getRevenue(?\DateTimeInterface $begin, ?\DateTimeInterface $end, array $options = []): array { $user = $this->getUser(); - $timezone = new \DateTimeZone($user->getTimezone()); - - if ($begin !== null) { - $begin = new \DateTime($begin, $timezone); - } - - if ($end !== null) { - $end = new \DateTime($end, $timezone); - } $data = $this->repository->getRevenue($begin, $end, $user); diff --git a/src/Widget/Type/AbstractWidget.php b/src/Widget/Type/AbstractWidget.php index a187b853..172133bf 100644 --- a/src/Widget/Type/AbstractWidget.php +++ b/src/Widget/Type/AbstractWidget.php @@ -67,6 +67,10 @@ abstract class AbstractWidget implements WidgetInterface $this->options[$name] = $value; } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge($this->options, $options); @@ -76,4 +80,56 @@ abstract class AbstractWidget implements WidgetInterface { return false; } + + protected function createDate(string $date): \DateTime + { + return new \DateTime($date, $this->getTimezone()); + } + + protected function createMonthStartDate(): \DateTime + { + return $this->createDate('first day of this month 00:00:00'); + } + + protected function createMonthEndDate(): \DateTime + { + return $this->createDate('last day of this month 23:59:59'); + } + + protected function createWeekStartDate(): \DateTime + { + return $this->createDate('monday this week 00:00:00'); + } + + protected function createWeekEndDate(): \DateTime + { + return $this->createDate('sunday this week 23:59:59'); + } + + protected function createTodayStartDate(): \DateTime + { + return $this->createDate('00:00:00'); + } + + protected function createTodayEndDate(): \DateTime + { + return $this->createDate('23:59:59'); + } + + public function getTimezone(): \DateTimeZone + { + $timezone = date_default_timezone_get(); + if (null !== $this->user) { + $timezone = $this->user->getTimezone(); + } + + return new \DateTimeZone($timezone); + } + + public function getTemplateName(): string + { + $name = (new \ReflectionClass($this))->getShortName(); + + return sprintf('widget/widget-%s.html.twig', strtolower($name)); + } } diff --git a/src/Widget/Type/AbstractWidgetType.php b/src/Widget/Type/AbstractWidgetType.php index 5fdaa2fa..225fb50b 100644 --- a/src/Widget/Type/AbstractWidgetType.php +++ b/src/Widget/Type/AbstractWidgetType.php @@ -9,48 +9,18 @@ namespace App\Widget\Type; -use App\Widget\WidgetInterface; - abstract class AbstractWidgetType extends AbstractWidget { private ?string $id = null; private string $title = ''; - private int $height = WidgetInterface::HEIGHT_SMALL; - private int $width = WidgetInterface::WIDTH_SMALL; /** * @var array */ private array $permissions = []; - public function getHeight(): int - { - return $this->height; - } - - public function setHeight(int $height): AbstractWidgetType - { - $this->height = $height; - - return $this; - } - - public function getWidth(): int - { - return $this->width; - } - - public function setWidth(int $width): AbstractWidgetType - { - $this->width = $width; - - return $this; - } - - public function setId(string $id): self + public function setId(string $id): void { $this->id = $id; - - return $this; } public function getId(): string @@ -62,11 +32,9 @@ abstract class AbstractWidgetType extends AbstractWidget return (new \ReflectionClass($this))->getShortName(); } - public function setTitle(string $title): self + public function setTitle(string $title): void { $this->title = $title; - - return $this; } public function getTitle(): string @@ -74,13 +42,11 @@ abstract class AbstractWidgetType extends AbstractWidget return $this->title; } - public function setOptions(array $options): self + public function setOptions(array $options): void { foreach ($options as $key => $value) { $this->setOption($key, $value); } - - return $this; } public function getPermissions(): array @@ -88,10 +54,8 @@ abstract class AbstractWidgetType extends AbstractWidget return $this->permissions; } - public function setPermissions(array $permissions): AbstractWidgetType + public function setPermissions(array $permissions): void { $this->permissions = $permissions; - - return $this; } } diff --git a/src/Widget/Type/ActiveTimesheets.php b/src/Widget/Type/ActiveTimesheets.php index 55a53768..36cd02ae 100644 --- a/src/Widget/Type/ActiveTimesheets.php +++ b/src/Widget/Type/ActiveTimesheets.php @@ -10,10 +10,19 @@ namespace App\Widget\Type; use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; -final class ActiveTimesheets extends AbstractSimpleStatisticChart +final class ActiveTimesheets extends AbstractWidgetType { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TOTAL, 'icon' => 'duration'], parent::getOptions($options)); @@ -34,12 +43,18 @@ final class ActiveTimesheets extends AbstractSimpleStatisticChart return 'stats.activeRecordings'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setQueryWithUser(false); - $this->setQuery(TimesheetRepository::STATS_QUERY_ACTIVE); - - return parent::getData($options); + try { + return $this->repository->countActiveEntries(); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } public function getTemplateName(): string diff --git a/src/Widget/Type/ActiveUsersMonth.php b/src/Widget/Type/ActiveUsersMonth.php index f2531513..19afc82a 100644 --- a/src/Widget/Type/ActiveUsersMonth.php +++ b/src/Widget/Type/ActiveUsersMonth.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class ActiveUsersMonth extends AbstractActiveUsers { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_MONTH], parent::getOptions($options)); @@ -23,11 +33,17 @@ final class ActiveUsersMonth extends AbstractActiveUsers return 'activeUsersMonth'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setBegin('first day of this month 00:00:00'); - $this->setEnd('last day of this month 23:59:59'); - - return parent::getData($options); + try { + return $this->repository->countActiveUsers($this->createMonthStartDate(), $this->createMonthEndDate(), null); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/ActiveUsersToday.php b/src/Widget/Type/ActiveUsersToday.php index d4e7f3fb..ed68fffc 100644 --- a/src/Widget/Type/ActiveUsersToday.php +++ b/src/Widget/Type/ActiveUsersToday.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class ActiveUsersToday extends AbstractActiveUsers { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TODAY], parent::getOptions($options)); @@ -23,11 +33,17 @@ final class ActiveUsersToday extends AbstractActiveUsers return 'activeUsersToday'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setBegin('00:00:00'); - $this->setEnd('23:59:59'); - - return parent::getData($options); + try { + return $this->repository->countActiveUsers($this->createTodayStartDate(), $this->createTodayEndDate(), null); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/ActiveUsersTotal.php b/src/Widget/Type/ActiveUsersTotal.php index 86ffab42..9dfcb5fc 100644 --- a/src/Widget/Type/ActiveUsersTotal.php +++ b/src/Widget/Type/ActiveUsersTotal.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class ActiveUsersTotal extends AbstractActiveUsers { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TOTAL], parent::getOptions($options)); @@ -23,8 +33,17 @@ final class ActiveUsersTotal extends AbstractActiveUsers return 'activeUsersTotal'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - return parent::getData($options); + try { + return $this->repository->countActiveUsers(null, null, null); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/ActiveUsersWeek.php b/src/Widget/Type/ActiveUsersWeek.php index fcf31364..cc0ca9eb 100644 --- a/src/Widget/Type/ActiveUsersWeek.php +++ b/src/Widget/Type/ActiveUsersWeek.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class ActiveUsersWeek extends AbstractActiveUsers { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_WEEK], parent::getOptions($options)); @@ -23,11 +33,17 @@ final class ActiveUsersWeek extends AbstractActiveUsers return 'activeUsersWeek'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setBegin('monday this week 00:00:00'); - $this->setEnd('sunday this week 23:59:59'); - - return parent::getData($options); + try { + return $this->repository->countActiveUsers($this->createWeekStartDate(), $this->createWeekEndDate(), null); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/ActiveUsersYear.php b/src/Widget/Type/ActiveUsersYear.php index e7776245..76ed8b6a 100644 --- a/src/Widget/Type/ActiveUsersYear.php +++ b/src/Widget/Type/ActiveUsersYear.php @@ -9,11 +9,22 @@ namespace App\Widget\Type; +use App\Configuration\SystemConfiguration; use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class ActiveUsersYear extends AbstractCounterYear { + public function __construct(private TimesheetRepository $repository, SystemConfiguration $systemConfiguration) + { + parent::__construct($systemConfiguration); + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -22,12 +33,18 @@ final class ActiveUsersYear extends AbstractCounterYear ], parent::getOptions($options)); } - public function getData(array $options = []): mixed + /** + * @param array $options + */ + protected function getYearData(\DateTimeInterface $begin, \DateTimeInterface $end, array $options = []): mixed { - $this->setQuery(TimesheetRepository::STATS_QUERY_USER); - $this->setQueryWithUser(false); - - return parent::getData($options); + try { + return $this->repository->countActiveUsers($begin, $end, null); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } protected function getFinancialYearTitle(): string diff --git a/src/Widget/Type/AmountMonth.php b/src/Widget/Type/AmountMonth.php index 048bbe3c..c8d2d123 100644 --- a/src/Widget/Type/AmountMonth.php +++ b/src/Widget/Type/AmountMonth.php @@ -13,6 +13,10 @@ use App\Widget\WidgetInterface; final class AmountMonth extends AbstractAmountPeriod { + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_MONTH], parent::getOptions($options)); @@ -23,9 +27,12 @@ final class AmountMonth extends AbstractAmountPeriod return 'AmountMonth'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - return $this->getRevenue('first day of this month 00:00:00', 'last day of this month 23:59:59', $options); + return $this->getRevenue($this->createMonthStartDate(), $this->createMonthEndDate(), $options); } public function getPermissions(): array diff --git a/src/Widget/Type/AmountToday.php b/src/Widget/Type/AmountToday.php index b7ae98ce..fdb0947c 100644 --- a/src/Widget/Type/AmountToday.php +++ b/src/Widget/Type/AmountToday.php @@ -13,6 +13,10 @@ use App\Widget\WidgetInterface; final class AmountToday extends AbstractAmountPeriod { + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TODAY], parent::getOptions($options)); @@ -23,9 +27,12 @@ final class AmountToday extends AbstractAmountPeriod return 'AmountToday'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - return $this->getRevenue('00:00:00', '23:59:59', $options); + return $this->getRevenue($this->createTodayStartDate(), $this->createTodayEndDate(), $options); } public function getPermissions(): array diff --git a/src/Widget/Type/AmountTotal.php b/src/Widget/Type/AmountTotal.php index 26eddf90..d3bc6ec8 100644 --- a/src/Widget/Type/AmountTotal.php +++ b/src/Widget/Type/AmountTotal.php @@ -13,6 +13,10 @@ use App\Widget\WidgetInterface; final class AmountTotal extends AbstractAmountPeriod { + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TOTAL], parent::getOptions($options)); @@ -28,6 +32,9 @@ final class AmountTotal extends AbstractAmountPeriod return ['view_all_data']; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { return $this->getRevenue(null, null, $options); diff --git a/src/Widget/Type/AmountWeek.php b/src/Widget/Type/AmountWeek.php index f7cbed4f..38ecded3 100644 --- a/src/Widget/Type/AmountWeek.php +++ b/src/Widget/Type/AmountWeek.php @@ -13,6 +13,10 @@ use App\Widget\WidgetInterface; final class AmountWeek extends AbstractAmountPeriod { + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_WEEK], parent::getOptions($options)); @@ -23,9 +27,12 @@ final class AmountWeek extends AbstractAmountPeriod return 'AmountWeek'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - return $this->getRevenue('monday this week 00:00:00', 'sunday this week 23:59:59', $options); + return $this->getRevenue($this->createWeekStartDate(), $this->createWeekEndDate(), $options); } public function getPermissions(): array diff --git a/src/Widget/Type/AmountYear.php b/src/Widget/Type/AmountYear.php index c538f68a..e18ebfb9 100644 --- a/src/Widget/Type/AmountYear.php +++ b/src/Widget/Type/AmountYear.php @@ -13,16 +13,21 @@ use App\Configuration\SystemConfiguration; use App\Event\RevenueStatisticEvent; use App\Model\Revenue; use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; final class AmountYear extends AbstractCounterYear { - public function __construct(TimesheetRepository $repository, SystemConfiguration $systemConfiguration, private EventDispatcherInterface $dispatcher) + public function __construct(private TimesheetRepository $repository, SystemConfiguration $systemConfiguration, private EventDispatcherInterface $dispatcher) { - parent::__construct($repository, $systemConfiguration); + parent::__construct($systemConfiguration); } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -31,21 +36,27 @@ final class AmountYear extends AbstractCounterYear ], parent::getOptions($options)); } - public function getData(array $options = []): mixed + /** + * @param array $options + */ + protected function getYearData(\DateTimeInterface $begin, \DateTimeInterface $end, array $options = []): mixed { - $this->setQuery(TimesheetRepository::STATS_QUERY_RATE); - $this->setQueryWithUser(false); + try { + /** @var array $data */ + $data = $this->repository->getRevenue($begin, $end, null); - /** @var array $data */ - $data = parent::getData($options); + $event = new RevenueStatisticEvent($begin, $end); + foreach ($data as $row) { + $event->addRevenue($row->getCurrency(), $row->getAmount()); + } + $this->dispatcher->dispatch($event); - $event = new RevenueStatisticEvent($this->getBegin(), $this->getEnd()); - foreach ($data as $row) { - $event->addRevenue($row->getCurrency(), $row->getAmount()); + return $event->getRevenue(); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); } - $this->dispatcher->dispatch($event); - - return $event->getRevenue(); } public function getId(): string diff --git a/src/Widget/Type/Counter.php b/src/Widget/Type/Counter.php deleted file mode 100644 index eeb72ceb..00000000 --- a/src/Widget/Type/Counter.php +++ /dev/null @@ -1,18 +0,0 @@ - $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -56,30 +60,30 @@ final class DailyWorkingTimeChart extends AbstractWidget ], parent::getOptions($options)); } + /** + * @param array $options + */ public function getData(array $options = []): mixed { $user = $this->getUser(); - $dateTimeFactory = DateTimeFactory::createByUser($user); - if ($options['begin'] === null) { - $options['begin'] = $dateTimeFactory->getStartOfWeek(); + $begin = $options['begin']; + if (!($begin instanceof \DateTimeInterface)) { + if (\is_string($begin)) { + $begin = new DateTime($begin, new \DateTimeZone($user->getTimezone())); + } else { + $begin = $dateTimeFactory->getStartOfWeek(); + } } - if ($options['begin'] instanceof \DateTimeInterface) { - $begin = $options['begin']; - } else { - $begin = new DateTime($options['begin'], new \DateTimeZone($user->getTimezone())); - } - - if ($options['end'] === null) { - $options['end'] = $dateTimeFactory->getEndOfWeek($begin); - } - - if ($options['end'] instanceof \DateTimeInterface) { - $end = $options['end']; - } else { - $end = new DateTime($options['end'], new \DateTimeZone($user->getTimezone())); + $end = $options['end']; + if (!($end instanceof \DateTimeInterface)) { + if (\is_string($end)) { + $end = new DateTime($end, new \DateTimeZone($user->getTimezone())); + } else { + $end = $dateTimeFactory->getEndOfWeek($begin); + } } $activities = []; diff --git a/src/Widget/Type/DurationMonth.php b/src/Widget/Type/DurationMonth.php index 85fb3667..d9645f60 100644 --- a/src/Widget/Type/DurationMonth.php +++ b/src/Widget/Type/DurationMonth.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class DurationMonth extends AbstractCounterDuration { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_MONTH], parent::getOptions($options)); @@ -33,12 +43,17 @@ final class DurationMonth extends AbstractCounterDuration return 'stats.durationMonth'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setQueryWithUser(false); - $this->setBegin('first day of this month 00:00:00'); - $this->setEnd('last day of this month 23:59:59'); - - return parent::getData($options); + try { + return $this->repository->getDurationForTimeRange($this->createMonthStartDate(), $this->createMonthEndDate(), null); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/DurationToday.php b/src/Widget/Type/DurationToday.php index 609d4cff..4ed11138 100644 --- a/src/Widget/Type/DurationToday.php +++ b/src/Widget/Type/DurationToday.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class DurationToday extends AbstractCounterDuration { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TODAY], parent::getOptions($options)); @@ -33,12 +43,17 @@ final class DurationToday extends AbstractCounterDuration return 'stats.durationToday'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setQueryWithUser(false); - $this->setBegin('00:00:00'); - $this->setEnd('23:59:59'); - - return parent::getData($options); + try { + return $this->repository->getDurationForTimeRange($this->createTodayStartDate(), $this->createTodayEndDate(), null); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/DurationTotal.php b/src/Widget/Type/DurationTotal.php index 8d71218d..298f959b 100644 --- a/src/Widget/Type/DurationTotal.php +++ b/src/Widget/Type/DurationTotal.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class DurationTotal extends AbstractCounterDuration { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TOTAL], parent::getOptions($options)); @@ -33,10 +43,17 @@ final class DurationTotal extends AbstractCounterDuration return 'stats.durationTotal'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setQueryWithUser(false); - - return parent::getData($options); + try { + return $this->repository->getDurationForTimeRange(null, null, null); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/DurationWeek.php b/src/Widget/Type/DurationWeek.php index 57fdc256..1a98dba0 100644 --- a/src/Widget/Type/DurationWeek.php +++ b/src/Widget/Type/DurationWeek.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class DurationWeek extends AbstractCounterDuration { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_WEEK], parent::getOptions($options)); @@ -33,12 +43,17 @@ final class DurationWeek extends AbstractCounterDuration return 'stats.durationWeek'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setQueryWithUser(false); - $this->setBegin('monday this week 00:00:00'); - $this->setEnd('sunday this week 23:59:59'); - - return parent::getData($options); + try { + return $this->repository->getDurationForTimeRange($this->createWeekStartDate(), $this->createWeekEndDate(), null); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/DurationYear.php b/src/Widget/Type/DurationYear.php index 2bb7d184..2e366f9b 100644 --- a/src/Widget/Type/DurationYear.php +++ b/src/Widget/Type/DurationYear.php @@ -9,11 +9,22 @@ namespace App\Widget\Type; +use App\Configuration\SystemConfiguration; use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class DurationYear extends AbstractCounterYear { + public function __construct(private TimesheetRepository $repository, SystemConfiguration $systemConfiguration) + { + parent::__construct($systemConfiguration); + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -22,12 +33,18 @@ final class DurationYear extends AbstractCounterYear ], parent::getOptions($options)); } - public function getData(array $options = []): mixed + /** + * @param array $options + */ + protected function getYearData(\DateTimeInterface $begin, \DateTimeInterface $end, array $options = []): mixed { - $this->setQuery(TimesheetRepository::STATS_QUERY_DURATION); - $this->setQueryWithUser(false); - - return parent::getData($options); + try { + return $this->repository->getDurationForTimeRange($begin, $end, null); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } public function getPermissions(): array diff --git a/src/Widget/Type/PaginatedWorkingTimeChart.php b/src/Widget/Type/PaginatedWorkingTimeChart.php index 045904b0..9a65e45d 100644 --- a/src/Widget/Type/PaginatedWorkingTimeChart.php +++ b/src/Widget/Type/PaginatedWorkingTimeChart.php @@ -12,6 +12,7 @@ namespace App\Widget\Type; use App\Configuration\SystemConfiguration; use App\Repository\TimesheetRepository; use App\Timesheet\DateTimeFactory; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; use DateTime; @@ -46,6 +47,10 @@ final class PaginatedWorkingTimeChart extends AbstractWidget return 'widget/widget-paginatedworkingtimechart.html.twig'; } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { $options = parent::getOptions($options); @@ -81,6 +86,9 @@ final class PaginatedWorkingTimeChart extends AbstractWidget return $lastWeekInYear->format('W') === '53' ? 53 : 52; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { $user = $this->getUser(); @@ -88,7 +96,18 @@ final class PaginatedWorkingTimeChart extends AbstractWidget $dateTimeFactory = DateTimeFactory::createByUser($user); $year = $options['year']; + if (\is_string($year)) { + $year = (int) $year; + } elseif (!\is_int($year)) { + throw new WidgetException('Invalid year given'); + } + $week = $options['week']; + if (\is_string($week)) { + $week = (int) $week; + } elseif (!\is_int($week)) { + throw new WidgetException('Invalid week given'); + } $weekBegin = ($dateTimeFactory->createDateTime())->setISODate($year, $week, 1)->setTime(0, 0, 0); @@ -99,7 +118,7 @@ final class PaginatedWorkingTimeChart extends AbstractWidget $lastWeekInLastYear = $this->getLastWeekInYear($year - 1); $thisMonth = clone $weekBegin; - if ((int) $week === 1) { + if ($week === 1) { $thisMonth = ($dateTimeFactory->createDateTime())->setISODate($year, $week, 1)->setTime(0, 0, 0); } @@ -111,7 +130,7 @@ final class PaginatedWorkingTimeChart extends AbstractWidget $yearBegin = $dateTimeFactory->createDateTime(sprintf('01 january %s 00:00:00', $year)); $yearEnd = $dateTimeFactory->createDateTime(sprintf('31 december %s 23:59:59', $year)); - $yearData = $this->repository->getStatistic(TimesheetRepository::STATS_QUERY_DURATION, $yearBegin, $yearEnd, $user); + $yearData = $this->repository->getDurationForTimeRange($yearBegin, $yearEnd, $user); $financialYearData = null; $financialYearBegin = null; @@ -119,7 +138,7 @@ final class PaginatedWorkingTimeChart extends AbstractWidget if (null !== ($financialYear = $this->systemConfiguration->getFinancialYearStart())) { $financialYearBegin = $dateTimeFactory->createStartOfFinancialYear($financialYear); $financialYearEnd = $dateTimeFactory->createEndOfFinancialYear($financialYearBegin); - $financialYearData = $this->repository->getStatistic(TimesheetRepository::STATS_QUERY_DURATION, $financialYearBegin, $financialYearEnd, $user); + $financialYearData = $this->repository->getDurationForTimeRange($financialYearBegin, $financialYearEnd, $user); } return [ @@ -128,9 +147,9 @@ final class PaginatedWorkingTimeChart extends AbstractWidget 'thisMonth' => $thisMonth, 'lastWeekInYear' => $lastWeekInYear, 'lastWeekInLastYear' => $lastWeekInLastYear, - 'day' => $this->repository->getStatistic(TimesheetRepository::STATS_QUERY_DURATION, $dayBegin, $dayEnd, $user), - 'week' => $this->repository->getStatistic(TimesheetRepository::STATS_QUERY_DURATION, $weekBegin, $weekEnd, $user), - 'month' => $this->repository->getStatistic(TimesheetRepository::STATS_QUERY_DURATION, $monthBegin, $monthEnd, $user), + 'day' => $this->repository->getDurationForTimeRange($dayBegin, $dayEnd, $user), + 'week' => $this->repository->getDurationForTimeRange($weekBegin, $weekEnd, $user), + 'month' => $this->repository->getDurationForTimeRange($monthBegin, $monthEnd, $user), 'year' => $yearData, 'financial' => $financialYearData, 'financialBegin' => $financialYearBegin, diff --git a/src/Widget/Type/TotalsActivity.php b/src/Widget/Type/TotalsActivity.php index db68d3fb..c6adfa26 100644 --- a/src/Widget/Type/TotalsActivity.php +++ b/src/Widget/Type/TotalsActivity.php @@ -24,6 +24,10 @@ final class TotalsActivity extends AbstractWidget return 'stats.activityTotal'; } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -33,6 +37,9 @@ final class TotalsActivity extends AbstractWidget ], parent::getOptions($options)); } + /** + * @param array $options + */ public function getData(array $options = []): mixed { $user = $this->getUser(); diff --git a/src/Widget/Type/TotalsCustomer.php b/src/Widget/Type/TotalsCustomer.php index e61de44e..78e3db72 100644 --- a/src/Widget/Type/TotalsCustomer.php +++ b/src/Widget/Type/TotalsCustomer.php @@ -24,6 +24,10 @@ final class TotalsCustomer extends AbstractWidget return 'stats.customerTotal'; } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -33,6 +37,9 @@ final class TotalsCustomer extends AbstractWidget ], parent::getOptions($options)); } + /** + * @param array $options + */ public function getData(array $options = []): mixed { $user = $this->getUser(); diff --git a/src/Widget/Type/TotalsProject.php b/src/Widget/Type/TotalsProject.php index a49c3a86..74f81e3a 100644 --- a/src/Widget/Type/TotalsProject.php +++ b/src/Widget/Type/TotalsProject.php @@ -24,6 +24,10 @@ final class TotalsProject extends AbstractWidget return 'stats.projectTotal'; } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -33,6 +37,9 @@ final class TotalsProject extends AbstractWidget ], parent::getOptions($options)); } + /** + * @param array $options + */ public function getData(array $options = []): mixed { $user = $this->getUser(); diff --git a/src/Widget/Type/TotalsUser.php b/src/Widget/Type/TotalsUser.php index 445dd018..e78af8ef 100644 --- a/src/Widget/Type/TotalsUser.php +++ b/src/Widget/Type/TotalsUser.php @@ -19,6 +19,10 @@ final class TotalsUser extends AbstractWidget { } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -28,6 +32,9 @@ final class TotalsUser extends AbstractWidget ], parent::getOptions($options)); } + /** + * @param array $options + */ public function getData(array $options = []): mixed { $user = $this->getUser(); diff --git a/src/Widget/Type/UserAmountMonth.php b/src/Widget/Type/UserAmountMonth.php index d841f2a7..d7fc862b 100644 --- a/src/Widget/Type/UserAmountMonth.php +++ b/src/Widget/Type/UserAmountMonth.php @@ -13,6 +13,10 @@ use App\Widget\WidgetInterface; final class UserAmountMonth extends AbstractUserRevenuePeriod { + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_MONTH], parent::getOptions($options)); @@ -23,8 +27,11 @@ final class UserAmountMonth extends AbstractUserRevenuePeriod return 'UserAmountMonth'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - return $this->getRevenue('first day of this month 00:00:00', 'last day of this month 23:59:59', $options); + return $this->getRevenue($this->createMonthStartDate(), $this->createMonthEndDate(), $options); } } diff --git a/src/Widget/Type/UserAmountToday.php b/src/Widget/Type/UserAmountToday.php index 3f0ffa7c..914b460c 100644 --- a/src/Widget/Type/UserAmountToday.php +++ b/src/Widget/Type/UserAmountToday.php @@ -13,6 +13,10 @@ use App\Widget\WidgetInterface; final class UserAmountToday extends AbstractUserRevenuePeriod { + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TODAY], parent::getOptions($options)); @@ -23,8 +27,11 @@ final class UserAmountToday extends AbstractUserRevenuePeriod return 'UserAmountToday'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - return $this->getRevenue('00:00:00', '23:59:59', $options); + return $this->getRevenue($this->createTodayStartDate(), $this->createTodayEndDate(), $options); } } diff --git a/src/Widget/Type/UserAmountTotal.php b/src/Widget/Type/UserAmountTotal.php index 3d53b638..96601c36 100644 --- a/src/Widget/Type/UserAmountTotal.php +++ b/src/Widget/Type/UserAmountTotal.php @@ -13,6 +13,10 @@ use App\Widget\WidgetInterface; final class UserAmountTotal extends AbstractUserRevenuePeriod { + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TOTAL], parent::getOptions($options)); @@ -23,6 +27,9 @@ final class UserAmountTotal extends AbstractUserRevenuePeriod return 'UserAmountTotal'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { return $this->getRevenue(null, null, $options); diff --git a/src/Widget/Type/UserAmountWeek.php b/src/Widget/Type/UserAmountWeek.php index 24833127..a9ab5991 100644 --- a/src/Widget/Type/UserAmountWeek.php +++ b/src/Widget/Type/UserAmountWeek.php @@ -13,6 +13,10 @@ use App\Widget\WidgetInterface; final class UserAmountWeek extends AbstractUserRevenuePeriod { + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_WEEK], parent::getOptions($options)); @@ -23,8 +27,11 @@ final class UserAmountWeek extends AbstractUserRevenuePeriod return 'UserAmountWeek'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - return $this->getRevenue('monday this week 00:00:00', 'sunday this week 23:59:59', $options); + return $this->getRevenue($this->createWeekStartDate(), $this->createWeekEndDate(), $options); } } diff --git a/src/Widget/Type/UserAmountYear.php b/src/Widget/Type/UserAmountYear.php index 973f7c65..00a1566b 100644 --- a/src/Widget/Type/UserAmountYear.php +++ b/src/Widget/Type/UserAmountYear.php @@ -13,14 +13,15 @@ use App\Configuration\SystemConfiguration; use App\Event\UserRevenueStatisticEvent; use App\Model\Revenue; use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; final class UserAmountYear extends AbstractCounterYear { - public function __construct(TimesheetRepository $repository, SystemConfiguration $systemConfiguration, private EventDispatcherInterface $dispatcher) + public function __construct(private TimesheetRepository $repository, SystemConfiguration $systemConfiguration, private EventDispatcherInterface $dispatcher) { - parent::__construct($repository, $systemConfiguration); + parent::__construct($systemConfiguration); } public function getTemplateName(): string @@ -43,6 +44,10 @@ final class UserAmountYear extends AbstractCounterYear return 'UserAmountYear'; } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -51,20 +56,26 @@ final class UserAmountYear extends AbstractCounterYear ], parent::getOptions($options)); } - public function getData(array $options = []): mixed + /** + * @param array $options + */ + protected function getYearData(\DateTimeInterface $begin, \DateTimeInterface $end, array $options = []): mixed { - $this->setQuery(TimesheetRepository::STATS_QUERY_RATE); - $this->setQueryWithUser(true); + try { + /** @var array $data */ + $data = $this->repository->getRevenue($begin, $end, $this->getUser()); - /** @var array $data */ - $data = parent::getData($options); + $event = new UserRevenueStatisticEvent($this->getUser(), $begin, $end); + foreach ($data as $row) { + $event->addRevenue($row->getCurrency(), $row->getAmount()); + } + $this->dispatcher->dispatch($event); - $event = new UserRevenueStatisticEvent($this->getUser(), $this->getBegin(), $this->getEnd()); - foreach ($data as $row) { - $event->addRevenue($row->getCurrency(), $row->getAmount()); + return $event->getRevenue(); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); } - $this->dispatcher->dispatch($event); - - return $event->getRevenue(); } } diff --git a/src/Widget/Type/UserDurationMonth.php b/src/Widget/Type/UserDurationMonth.php index 0e18ac03..89d7fae4 100644 --- a/src/Widget/Type/UserDurationMonth.php +++ b/src/Widget/Type/UserDurationMonth.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class UserDurationMonth extends AbstractCounterDuration { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_MONTH], parent::getOptions($options)); @@ -28,12 +38,17 @@ final class UserDurationMonth extends AbstractCounterDuration return 'userDurationMonth'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setQueryWithUser(true); - $this->setBegin('first day of this month 00:00:00'); - $this->setEnd('last day of this month 23:59:59'); - - return parent::getData($options); + try { + return $this->repository->getDurationForTimeRange($this->createMonthStartDate(), $this->createMonthEndDate(), $this->getUser()); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/UserDurationToday.php b/src/Widget/Type/UserDurationToday.php index b31801fe..2e6fcbf8 100644 --- a/src/Widget/Type/UserDurationToday.php +++ b/src/Widget/Type/UserDurationToday.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class UserDurationToday extends AbstractCounterDuration { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TODAY], parent::getOptions($options)); @@ -28,12 +38,17 @@ final class UserDurationToday extends AbstractCounterDuration return 'userDurationToday'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setQueryWithUser(true); - $this->setBegin('00:00:00'); - $this->setEnd('23:59:59'); - - return parent::getData($options); + try { + return $this->repository->getDurationForTimeRange($this->createTodayStartDate(), $this->createTodayEndDate(), $this->getUser()); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/UserDurationTotal.php b/src/Widget/Type/UserDurationTotal.php index f3b1dc11..9fe86e89 100644 --- a/src/Widget/Type/UserDurationTotal.php +++ b/src/Widget/Type/UserDurationTotal.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class UserDurationTotal extends AbstractCounterDuration { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_TOTAL], parent::getOptions($options)); @@ -28,10 +38,17 @@ final class UserDurationTotal extends AbstractCounterDuration return 'userDurationTotal'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setQueryWithUser(true); - - return parent::getData($options); + try { + return $this->repository->getDurationForTimeRange(null, null, $this->getUser()); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/UserDurationWeek.php b/src/Widget/Type/UserDurationWeek.php index 3c013ae7..0b086836 100644 --- a/src/Widget/Type/UserDurationWeek.php +++ b/src/Widget/Type/UserDurationWeek.php @@ -9,10 +9,20 @@ namespace App\Widget\Type; +use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class UserDurationWeek extends AbstractCounterDuration { + public function __construct(private TimesheetRepository $repository) + { + } + + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge(['color' => WidgetInterface::COLOR_WEEK], parent::getOptions($options)); @@ -28,12 +38,17 @@ final class UserDurationWeek extends AbstractCounterDuration return 'userDurationWeek'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { - $this->setQueryWithUser(true); - $this->setBegin('monday this week 00:00:00'); - $this->setEnd('sunday this week 23:59:59'); - - return parent::getData($options); + try { + return $this->repository->getDurationForTimeRange($this->createWeekStartDate(), $this->createWeekEndDate(), $this->getUser()); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } } diff --git a/src/Widget/Type/UserDurationYear.php b/src/Widget/Type/UserDurationYear.php index 3e6ffa2d..207cb8a4 100644 --- a/src/Widget/Type/UserDurationYear.php +++ b/src/Widget/Type/UserDurationYear.php @@ -9,11 +9,18 @@ namespace App\Widget\Type; +use App\Configuration\SystemConfiguration; use App\Repository\TimesheetRepository; +use App\Widget\WidgetException; use App\Widget\WidgetInterface; final class UserDurationYear extends AbstractCounterYear { + public function __construct(private TimesheetRepository $repository, SystemConfiguration $systemConfiguration) + { + parent::__construct($systemConfiguration); + } + public function getId(): string { return 'userDurationYear'; @@ -24,6 +31,10 @@ final class UserDurationYear extends AbstractCounterYear return 'widget/widget-counter-duration.html.twig'; } + /** + * @param array $options + * @return array + */ public function getOptions(array $options = []): array { return array_merge([ @@ -32,12 +43,18 @@ final class UserDurationYear extends AbstractCounterYear ], parent::getOptions($options)); } - public function getData(array $options = []): mixed + /** + * @param array $options + */ + protected function getYearData(\DateTimeInterface $begin, \DateTimeInterface $end, array $options = []): mixed { - $this->setQuery(TimesheetRepository::STATS_QUERY_DURATION); - $this->setQueryWithUser(true); - - return parent::getData($options); + try { + return $this->repository->getDurationForTimeRange($begin, $end, $this->getUser()); + } catch (\Exception $ex) { + throw new WidgetException( + 'Failed loading widget data: ' . $ex->getMessage() + ); + } } protected function getFinancialYearTitle(): string diff --git a/src/Widget/Type/UserTeamProjects.php b/src/Widget/Type/UserTeamProjects.php index f7d7f49f..0409db7e 100644 --- a/src/Widget/Type/UserTeamProjects.php +++ b/src/Widget/Type/UserTeamProjects.php @@ -59,6 +59,9 @@ final class UserTeamProjects extends AbstractWidget return 'UserTeamProjects'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { $user = $this->getUser(); diff --git a/src/Widget/Type/UserTeams.php b/src/Widget/Type/UserTeams.php index 3612116e..5a135c1d 100644 --- a/src/Widget/Type/UserTeams.php +++ b/src/Widget/Type/UserTeams.php @@ -52,6 +52,9 @@ final class UserTeams extends AbstractWidget return 'UserTeams'; } + /** + * @param array $options + */ public function getData(array $options = []): mixed { $user = $this->getUser(); diff --git a/src/Widget/WidgetInterface.php b/src/Widget/WidgetInterface.php index 82990ae7..ee1672fd 100644 --- a/src/Widget/WidgetInterface.php +++ b/src/Widget/WidgetInterface.php @@ -71,10 +71,10 @@ interface WidgetInterface * make sure that the given $options will overwrite the internal option for * this one call. * - * @param array $options + * @param array $options * @return mixed|null */ - public function getData(array $options = []); + public function getData(array $options = []): mixed; /** * Returns all widget options to be used in the frontend. @@ -86,7 +86,7 @@ interface WidgetInterface * return array_merge($this->options, $options); * * @param array $options - * @return array + * @return array */ public function getOptions(array $options = []): array; diff --git a/templates/plugin/index.html.twig b/templates/plugin/index.html.twig index b649089d..52f4557e 100644 --- a/templates/plugin/index.html.twig +++ b/templates/plugin/index.html.twig @@ -12,10 +12,9 @@ {% block box_body_class %}p-0{% endblock %} {% block box_body %} {% set columns = { - 'name': {'class': 'alwaysVisible'}, + 'name': {'class': 'alwaysVisible w-25'}, 'description': {'class': 'd-none d-md-table-cell'}, 'version': {'class': 'text-center w-min'}, - 'actions': {'class': 'actions alwaysVisible'}, } %} {% set tableName = 'plugins' %} @@ -26,17 +25,13 @@ {% for plugin in plugins|sort((p1, p2) => p1.name|lower <=> p2.name|lower) %} - {% if plugin.id != plugin.name %} - {{ plugin.name }} - {% else %} - {{ plugin.name }} - {% endif %} + {{ plugin.name }} - {{ plugin.metadata.description }} - {{ widgets.label(plugin.metadata.version, 'primary') }} - - {% set event = actions(app.user, 'plugin', 'index', {'plugin': plugin}) %} - {{ widgets.table_actions(event.actions) }} + + {{ plugin.metadata.description }} + + + {{ widgets.label(plugin.metadata.version, 'primary', plugin.id) }} {% endfor %} @@ -55,9 +50,9 @@ {% endblock %} {% block box_body %} {% set columns = { - 'name': {'class': 'alwaysVisible'}, + 'name': {'class': 'alwaysVisible w-25'}, 'description': {'class': 'd-none d-md-table-cell'}, - 'actions': {'class': 'actions alwaysVisible'}, + 'shop': {'class': 'w-min alwaysVisible'}, } %} {% set tableName = 'extensions' %} @@ -71,7 +66,7 @@ {{ extension.name }} {{ extension.description }} - + {% if extension.buy is defined and extension.buy is not empty and (extension.minimum_version is not defined or (extension.minimum_version is not empty and constant('App\\Constants::VERSION') >= extension.minimum_version)) %} {{ icon('shop') }} {% endif %} diff --git a/templates/system-configuration/index.html.twig b/templates/system-configuration/index.html.twig index 26460c5d..553729b0 100644 --- a/templates/system-configuration/index.html.twig +++ b/templates/system-configuration/index.html.twig @@ -3,8 +3,8 @@ {% block main %}
-
-
+
+
{% set sorted = [] %} {% for section in sections %} @@ -15,7 +15,7 @@ {% set sorted = sorted|merge([{'name': title, 'id': section.model.section, 'counter': section.form.children.configuration|length}]) %} {% endfor %} {% for section in sorted|sort((a, b) => a.name <=> b.name) %} - + {{ section.name }} {{ section.counter }} @@ -24,7 +24,7 @@
-
+
{% set formEditTemplate = kimai_context.modalRequest ? 'default/_form_modal.html.twig' : 'default/_form.html.twig' %} diff --git a/tests/Command/BundleInstallerCommandTest.php b/tests/Command/BundleInstallerCommandTest.php index 5421ffcb..69a34e57 100644 --- a/tests/Command/BundleInstallerCommandTest.php +++ b/tests/Command/BundleInstallerCommandTest.php @@ -25,23 +25,21 @@ use Symfony\Component\Console\Tester\CommandTester; */ class BundleInstallerCommandTest extends KernelTestCase { - /** - * @var Application - */ - protected $application; + private Application $application; + /** + * @param class-string $className + */ protected function getCommand(string $className): Command { $kernel = self::bootKernel(); $this->application = new Application($kernel); - $container = self::$kernel->getContainer(); - $this->application->add(new $className()); return $this->application->find('kimai:bundle:test:install'); } - public function testFullRun() + public function testFullRun(): void { $command = $this->getCommand(TestBundleInstallerCommand::class); $commandTester = new CommandTester($command); @@ -53,7 +51,7 @@ class BundleInstallerCommandTest extends KernelTestCase self::assertEquals(0, $commandTester->getStatusCode()); } - public function testMissingMigrationThrowsException() + public function testMissingMigrationThrowsException(): void { $command = $this->getCommand(InstallerWithMissingMigrationsCommand::class); $commandTester = new CommandTester($command); @@ -64,7 +62,7 @@ class BundleInstallerCommandTest extends KernelTestCase self::assertEquals(1, $commandTester->getStatusCode()); } - public function testAssetsInstallationFailure() + public function testAssetsInstallationFailure(): void { $command = $this->getCommand(AssetsInstallerFailureCommand::class); $commandTester = new CommandTester($command); @@ -75,7 +73,7 @@ class BundleInstallerCommandTest extends KernelTestCase self::assertEquals(1, $commandTester->getStatusCode()); } - public function testInvalidNamespaceWillRaiseException() + public function testInvalidNamespaceWillRaiseException(): void { $this->expectException(LogicException::class); $this->expectExceptionMessage('Unsupported namespace given, expected "KimaiPlugin" but received "App". Please overwrite getBundleName() and return the correct bundle name.'); @@ -85,7 +83,7 @@ class BundleInstallerCommandTest extends KernelTestCase $commandTester->execute(['command' => $command->getName()]); } - public function testAssetsInstallIsOk() + public function testAssetsInstallIsOk(): void { $command = $this->getCommand(InstallerWithAssetsCommand::class); @@ -99,7 +97,7 @@ class BundleInstallerCommandTest extends KernelTestCase self::assertEquals(0, $commandTester->getStatusCode()); } - public function testAssetsInstallReturnsNonZeroExitCode() + public function testAssetsInstallReturnsNonZeroExitCode(): void { $command = $this->getCommand(InstallerWithAssetsCommand::class); @@ -171,7 +169,7 @@ class AssetsInstallerFailureCommand extends TestBundleInstallerCommand return true; } - protected function installAssets(SymfonyStyle $io, OutputInterface $output) + protected function installAssets(SymfonyStyle $io, OutputInterface $output): void { throw new \Exception('Problem occurred while installing assets.'); } diff --git a/tests/Configuration/SystemConfigurationTest.php b/tests/Configuration/SystemConfigurationTest.php index c5c27e61..cbd8eb8e 100644 --- a/tests/Configuration/SystemConfigurationTest.php +++ b/tests/Configuration/SystemConfigurationTest.php @@ -172,21 +172,14 @@ class SystemConfigurationTest extends TestCase (new Configuration())->setName('timesheet.foo')->setValue('hello'), ]); $this->assertEquals('hello', $sut->find('timesheet.foo')); - $this->assertEquals('hello', $sut->offsetGet('timesheet.foo')); $this->assertTrue($sut->has('timesheet.foo')); - $this->assertTrue($sut->offsetExists('timesheet.foo')); $this->assertFalse($sut->has('timesheet.yyyyyyyyy')); - $this->assertFalse($sut->offsetExists('timesheet.yyyyyyyyy')); $this->assertFalse($sut->has('xxxxxxxx.yyyyyyyyy')); - $this->assertFalse($sut->offsetExists('xxxxxxxx.yyyyyyyyy')); $this->assertNull($sut->find('xxxxxxxx.yyyyyyyyy')); - $this->assertNull($sut->offsetGet('xxxxxxxx.yyyyyyyyy')); - $sut->offsetSet('xxxxxxxx.yyyyyyyyy', 'foooo-bar!'); + $sut->set('xxxxxxxx.yyyyyyyyy', 'foooo-bar!'); $this->assertTrue($sut->has('xxxxxxxx.yyyyyyyyy')); - $this->assertTrue($sut->offsetExists('xxxxxxxx.yyyyyyyyy')); $this->assertEquals('foooo-bar!', $sut->find('xxxxxxxx.yyyyyyyyy')); - $this->assertEquals('foooo-bar!', $sut->offsetGet('xxxxxxxx.yyyyyyyyy')); } public function testCalendarWithoutLoader() diff --git a/tests/Controller/PluginControllerTest.php b/tests/Controller/PluginControllerTest.php index f9e881f2..1399e156 100644 --- a/tests/Controller/PluginControllerTest.php +++ b/tests/Controller/PluginControllerTest.php @@ -18,29 +18,29 @@ use App\Tests\Plugin\Fixtures\TestPlugin\TestPlugin; */ class PluginControllerTest extends ControllerBaseTest { - public function testIsSecure() + public function testIsSecure(): void { $this->assertUrlIsSecured('/admin/plugins/'); } - public function testIsSecureForRole() + public function testIsSecureForRole(): void { $this->assertUrlIsSecuredForRole(User::ROLE_ADMIN, '/admin/plugins/'); } - public function testIndexAction() + public function testIndexAction(): void { $client = $this->getClientForAuthenticatedUser(User::ROLE_SUPER_ADMIN); $this->assertAccessIsGranted($client, '/admin/plugins/'); $this->assertCalloutWidgetWithMessage($client, 'You have no plugins installed yet'); } - public function testIndexActionWithInstalledPlugins() + public function testIndexActionWithInstalledPlugins(): void { $client = $this->getClientForAuthenticatedUser(User::ROLE_SUPER_ADMIN); - /** @var PluginManager $manager */ - $manager = self::getContainer()->set(PluginManager::class, new PluginManager([new TestPlugin()])); + $manager = new PluginManager([new TestPlugin()]); + self::getContainer()->set(PluginManager::class, $manager); $this->assertAccessIsGranted($client, '/admin/plugins/'); $this->assertHasDataTable($client); diff --git a/tests/Invoice/Renderer/DebugRendererTest.php b/tests/Invoice/Renderer/DebugRendererTest.php index bed276d2..30a97de9 100644 --- a/tests/Invoice/Renderer/DebugRendererTest.php +++ b/tests/Invoice/Renderer/DebugRendererTest.php @@ -30,10 +30,10 @@ class DebugRendererTest extends TestCase /** * @dataProvider getTestModel */ - public function testRender(InvoiceModel $model, $expectedRate, $expectedRows, $expectedDescriptions, $expectedUser1, $expectedUser2, $expectedUser3, $hasProject, $metaFields = []) + public function testRender(InvoiceModel $model, $expectedRate, $expectedRows, $expectedDescriptions, $expectedUser1, $expectedUser2, $expectedUser3, $hasProject, $metaFields = []): void { $itemHydrator = new class() implements InvoiceItemHydrator { - public function setInvoiceModel(InvoiceModel $model) + public function setInvoiceModel(InvoiceModel $model): void { } @@ -75,7 +75,7 @@ class DebugRendererTest extends TestCase self::assertEquals('21.03.12', $data['model']['invoice.last']); } - protected function assertModelStructure(array $model, int $projectCounter = 0, int $activityCounter = 0) + protected function assertModelStructure(array $model, int $projectCounter = 0, int $activityCounter = 0): void { $keys = [ 'invoice.due_date', @@ -243,7 +243,7 @@ class DebugRendererTest extends TestCase $this->assertEquals($keys, $givenKeys); } - protected function assertEntryStructure(array $model, array $metaFields) + protected function assertEntryStructure(array $model, array $metaFields): void { $keys = [ 'entry.row', diff --git a/tests/Invoice/Renderer/RendererTestTrait.php b/tests/Invoice/Renderer/RendererTestTrait.php index 20e578ef..868d9185 100644 --- a/tests/Invoice/Renderer/RendererTestTrait.php +++ b/tests/Invoice/Renderer/RendererTestTrait.php @@ -26,6 +26,7 @@ use App\Invoice\DefaultInvoiceFormatter; use App\Invoice\InvoiceFormatter; use App\Invoice\InvoiceModel; use App\Invoice\NumberGenerator\DateNumberGenerator; +use App\Invoice\NumberGeneratorInterface; use App\Invoice\Renderer\AbstractRenderer; use App\Model\InvoiceDocument; use App\Repository\InvoiceRepository; @@ -255,7 +256,7 @@ trait RendererTestTrait return $model; } - private function getNumberGeneratorSut() + private function getNumberGeneratorSut(): NumberGeneratorInterface { $repository = $this->createMock(InvoiceRepository::class); $repository diff --git a/tests/Security/TestUserEntity.php b/tests/Security/TestUserEntity.php index 4e77a8e1..aad065d5 100644 --- a/tests/Security/TestUserEntity.php +++ b/tests/Security/TestUserEntity.php @@ -23,11 +23,11 @@ class TestUserEntity implements UserInterface return 'foo'; } - public function eraseCredentials() + public function eraseCredentials(): void { } - public function getTimeFormat() + public function getTimeFormat(): string { return 'H:i'; } diff --git a/tests/Twig/Runtime/WidgetExtensionTest.php b/tests/Twig/Runtime/WidgetExtensionTest.php index 8eb9b7fb..2a4015eb 100644 --- a/tests/Twig/Runtime/WidgetExtensionTest.php +++ b/tests/Twig/Runtime/WidgetExtensionTest.php @@ -10,8 +10,8 @@ namespace App\Tests\Twig\Runtime; use App\Entity\User; +use App\Tests\Widget\Type\More; use App\Twig\Runtime\WidgetExtension; -use App\Widget\Type\More; use App\Widget\WidgetService; use PHPUnit\Framework\TestCase; use Symfony\Bundle\SecurityBundle\Security; diff --git a/tests/Validator/Constraints/DurationValidatorTest.php b/tests/Validator/Constraints/DurationValidatorTest.php index 7a766918..7184acec 100644 --- a/tests/Validator/Constraints/DurationValidatorTest.php +++ b/tests/Validator/Constraints/DurationValidatorTest.php @@ -28,7 +28,10 @@ class DurationValidatorTest extends ConstraintValidatorTestCase return new DurationValidator(); } - public function getValidData() + /** + * @return array> + */ + public function getValidData(): array { return [ ['2h'], @@ -55,7 +58,7 @@ class DurationValidatorTest extends ConstraintValidatorTestCase ]; } - public function testConstraintIsInvalid() + public function testConstraintIsInvalid(): void { $this->expectException(UnexpectedTypeException::class); @@ -65,7 +68,7 @@ class DurationValidatorTest extends ConstraintValidatorTestCase /** * @dataProvider getValidData */ - public function testConstraintWithValidData(string|int|null $input) + public function testConstraintWithValidData(string|int|null $input): void { $constraint = new Duration(); $this->validator->validate($input, $constraint); @@ -75,7 +78,10 @@ class DurationValidatorTest extends ConstraintValidatorTestCase $this->assertNoViolation(); } - public function getInvalidData() + /** + * @return array> + */ + public function getInvalidData(): array { return [ ['13-13'], @@ -96,7 +102,7 @@ class DurationValidatorTest extends ConstraintValidatorTestCase /** * @dataProvider getInvalidData */ - public function testValidationError(string $input) + public function testValidationError(string $input): void { $constraint = new Duration([ 'message' => 'myMessage', @@ -106,6 +112,7 @@ class DurationValidatorTest extends ConstraintValidatorTestCase $this->buildViolation('myMessage') ->setParameter('{{ value }}', '"' . $input . '"') + ->setParameter('{{ pattern }}', '/^-?[0-9]{1,}$|^-?[0-9]{1,}[,.]{1}[0-9]{1,}$|^-?[0-9]{1,}:[0-9]{1,}:[0-9]{1,}$|^-?[0-9]{1,}:[0-9]{1,}$|^[0-9]{1,}[hHmMsS]{1}$|^[0-9]{1,}[hH]{1}[0-9]{1,}[mM]{1}$|^[0-9]{1,}[hHmM]{1}[0-9]{1,}[sS]{1}$|^[0-9]{1,}[mM]{1}[0-9]{1,}[sS]{1}$|^[0-9]{1,}[hH]{1}[0-9]{1,}[mM]{1}[0-9]{1,}[sS]{1}$/') ->setCode(Regex::REGEX_FAILED_ERROR) ->assertRaised(); } @@ -113,7 +120,7 @@ class DurationValidatorTest extends ConstraintValidatorTestCase /** * @dataProvider getInvalidData */ - public function testValidationErrorUpperCase(string $input) + public function testValidationErrorUpperCase(string $input): void { $input = strtoupper($input); $constraint = new Duration([ @@ -124,6 +131,7 @@ class DurationValidatorTest extends ConstraintValidatorTestCase $this->buildViolation('myMessage') ->setParameter('{{ value }}', '"' . $input . '"') + ->setParameter('{{ pattern }}', '/^-?[0-9]{1,}$|^-?[0-9]{1,}[,.]{1}[0-9]{1,}$|^-?[0-9]{1,}:[0-9]{1,}:[0-9]{1,}$|^-?[0-9]{1,}:[0-9]{1,}$|^[0-9]{1,}[hHmMsS]{1}$|^[0-9]{1,}[hH]{1}[0-9]{1,}[mM]{1}$|^[0-9]{1,}[hHmM]{1}[0-9]{1,}[sS]{1}$|^[0-9]{1,}[mM]{1}[0-9]{1,}[sS]{1}$|^[0-9]{1,}[hH]{1}[0-9]{1,}[mM]{1}[0-9]{1,}[sS]{1}$/') ->setCode(Regex::REGEX_FAILED_ERROR) ->assertRaised(); } diff --git a/tests/Widget/Type/AbstractSimpleStatisticsWidgetTypeTest.php b/tests/Widget/Type/AbstractSimpleStatisticsWidgetTypeTest.php deleted file mode 100644 index fa134e0c..00000000 --- a/tests/Widget/Type/AbstractSimpleStatisticsWidgetTypeTest.php +++ /dev/null @@ -1,17 +0,0 @@ -getData()); } - public function testDefaultData() + public function testDefaultData(): void { $sut = $this->createSut(); self::assertInstanceOf(AbstractWidgetType::class, $sut); @@ -33,15 +33,7 @@ abstract class AbstractWidgetTypeTest extends AbstractWidgetTest $this->assertDefaultData($sut); } - public function testFluentInterface() - { - $sut = $this->createSut(); - self::assertInstanceOf(AbstractWidgetType::class, $sut->setOptions([])); - self::assertInstanceOf(AbstractWidgetType::class, $sut->setId('')); - self::assertInstanceOf(AbstractWidgetType::class, $sut->setTitle('')); - } - - public function testSetter() + public function testSetter(): void { $sut = $this->createSut(); diff --git a/tests/Widget/Type/ActiveUsersYearTest.php b/tests/Widget/Type/ActiveUsersYearTest.php index 4bd0a449..d19d654d 100644 --- a/tests/Widget/Type/ActiveUsersYearTest.php +++ b/tests/Widget/Type/ActiveUsersYearTest.php @@ -13,6 +13,7 @@ use App\Entity\User; use App\Repository\TimesheetRepository; use App\Tests\Mocks\SystemConfigurationFactory; use App\Widget\Type\AbstractCounterYear; +use App\Widget\Type\AbstractWidget; use App\Widget\Type\AbstractWidgetType; use App\Widget\Type\ActiveUsersYear; @@ -36,6 +37,11 @@ class ActiveUsersYearTest extends AbstractWidgetTypeTest return $sut; } + protected function assertDefaultData(AbstractWidget $sut): void + { + self::assertEquals(0, $sut->getData()); + } + public function getDefaultOptions(): array { return [ @@ -44,7 +50,7 @@ class ActiveUsersYearTest extends AbstractWidgetTypeTest ]; } - public function testSettings() + public function testSettings(): void { $sut = $this->createSut(); diff --git a/tests/Widget/Type/AmountMonthTest.php b/tests/Widget/Type/AmountMonthTest.php index ecdd5e94..e6b8fbdb 100644 --- a/tests/Widget/Type/AmountMonthTest.php +++ b/tests/Widget/Type/AmountMonthTest.php @@ -22,7 +22,7 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; */ class AmountMonthTest extends AbstractWidgetTest { - protected function assertDefaultData(AbstractWidget $sut) + protected function assertDefaultData(AbstractWidget $sut): void { self::assertEquals(0.0, $sut->getData()); } diff --git a/tests/Widget/Type/AmountTodayTest.php b/tests/Widget/Type/AmountTodayTest.php index 227496d8..1ce350fd 100644 --- a/tests/Widget/Type/AmountTodayTest.php +++ b/tests/Widget/Type/AmountTodayTest.php @@ -22,7 +22,7 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; */ class AmountTodayTest extends AbstractWidgetTest { - protected function assertDefaultData(AbstractWidget $sut) + protected function assertDefaultData(AbstractWidget $sut): void { self::assertEquals(0.0, $sut->getData()); } diff --git a/tests/Widget/Type/AmountTotalTest.php b/tests/Widget/Type/AmountTotalTest.php index ce398cc7..0e29eecf 100644 --- a/tests/Widget/Type/AmountTotalTest.php +++ b/tests/Widget/Type/AmountTotalTest.php @@ -22,7 +22,7 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; */ class AmountTotalTest extends AbstractWidgetTest { - protected function assertDefaultData(AbstractWidget $sut) + protected function assertDefaultData(AbstractWidget $sut): void { self::assertEquals(0.0, $sut->getData()); } diff --git a/tests/Widget/Type/AmountWeekTest.php b/tests/Widget/Type/AmountWeekTest.php index 85e70b26..fb74472e 100644 --- a/tests/Widget/Type/AmountWeekTest.php +++ b/tests/Widget/Type/AmountWeekTest.php @@ -22,7 +22,7 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; */ class AmountWeekTest extends AbstractWidgetTest { - protected function assertDefaultData(AbstractWidget $sut) + protected function assertDefaultData(AbstractWidget $sut): void { self::assertEquals(0.0, $sut->getData()); } diff --git a/tests/Widget/Type/AmountYearTest.php b/tests/Widget/Type/AmountYearTest.php index e374df34..0877912b 100644 --- a/tests/Widget/Type/AmountYearTest.php +++ b/tests/Widget/Type/AmountYearTest.php @@ -24,7 +24,7 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; */ class AmountYearTest extends AbstractWidgetTypeTest { - protected function assertDefaultData(AbstractWidgetType $sut) + protected function assertDefaultData(AbstractWidgetType $sut): void { self::assertEquals([], $sut->getData()); } diff --git a/tests/Widget/Type/CounterTest.php b/tests/Widget/Type/CounterTest.php deleted file mode 100644 index c7a97a40..00000000 --- a/tests/Widget/Type/CounterTest.php +++ /dev/null @@ -1,76 +0,0 @@ -createMock(TimesheetRepository::class)); - $sut->setQuery(TimesheetRepository::STATS_QUERY_AMOUNT); - - return $sut; - } - - public function testQueryWithUser() - { - $user = new User(); - $user->setAlias('foo'); - - $repository = $this->createMock(TimesheetRepository::class); - $repository->expects($this->once())->method('getStatistic')->willReturnCallback(function (string $type, ?DateTime $begin, ?DateTime $end, ?User $user) { - self::assertNull($begin); - self::assertNull($end); - self::assertNull($user); - }); - $sut = new Counter($repository); - $sut->setQuery(TimesheetRepository::STATS_QUERY_AMOUNT); - $sut->setUser($user); - $sut->getData([]); - - $user = new User(); - $user->setAlias('bar'); - - $repository = $this->createMock(TimesheetRepository::class); - $repository->expects($this->once())->method('getStatistic')->willReturnCallback(function (string $type, ?DateTime $begin, ?DateTime $end, ?User $user) { - self::assertNull($begin); - self::assertNull($end); - self::assertNotNull($user); - self::assertEquals('bar', $user->getAlias()); - }); - $sut = new Counter($repository); - $sut->setQuery(TimesheetRepository::STATS_QUERY_AMOUNT); - $sut->setUser($user); - $sut->setQueryWithUser(true); - $sut->getData([]); - } - - public function getDefaultOptions(): array - { - return []; - } - - public function testTemplateName() - { - /** @var Counter $sut */ - $sut = $this->createSut(); - self::assertEquals('widget/widget-counter.html.twig', $sut->getTemplateName()); - } -} diff --git a/tests/Widget/Type/CounterYearTest.php b/tests/Widget/Type/CounterYearTest.php deleted file mode 100644 index 6b8a4538..00000000 --- a/tests/Widget/Type/CounterYearTest.php +++ /dev/null @@ -1,89 +0,0 @@ - ['financial_year' => $financialYear]]); - - $sut = new DurationYear($this->createMock(TimesheetRepository::class), $configuration); - $sut->setQuery(TimesheetRepository::STATS_QUERY_AMOUNT); - $sut->setUser(new User()); - - return $sut; - } - - public function testQueryWithUser() - { - $user = new User(); - $user->setAlias('foo'); - - $repository = $this->createMock(TimesheetRepository::class); - $repository->expects($this->once())->method('getStatistic')->willReturnCallback(function (string $type, ?DateTime $begin, ?DateTime $end, ?User $user) { - self::assertNull($begin); - self::assertNull($end); - self::assertNull($user); - }); - $sut = new Counter($repository); - $sut->setQuery(TimesheetRepository::STATS_QUERY_AMOUNT); - $sut->setUser($user); - $sut->getData([]); - - $user = new User(); - $user->setAlias('bar'); - - $repository = $this->createMock(TimesheetRepository::class); - $repository->expects($this->once())->method('getStatistic')->willReturnCallback(function (string $type, ?DateTime $begin, ?DateTime $end, ?User $user) { - self::assertNull($begin); - self::assertNull($end); - self::assertNotNull($user); - self::assertEquals('bar', $user->getAlias()); - }); - $sut = new Counter($repository); - $sut->setQuery(TimesheetRepository::STATS_QUERY_AMOUNT); - $sut->setUser($user); - $sut->setQueryWithUser(true); - $sut->getData([]); - } - - public function getDefaultOptions(): array - { - return ['icon' => 'duration', 'color' => 'yellow']; - } - - public function testTemplateName() - { - /** @var Counter $sut */ - $sut = $this->createSut(); - self::assertEquals('widget/widget-counter-duration.html.twig', $sut->getTemplateName()); - } - - public function testTemplateNameWithFinancialYear() - { - /** @var Counter $sut */ - $sut = $this->createSut('2020-01-01'); - self::assertEquals('widget/widget-counter-duration.html.twig', $sut->getTemplateName()); - } -} diff --git a/tests/Widget/Type/DurationYearTest.php b/tests/Widget/Type/DurationYearTest.php index a80ff4f0..5aad5f35 100644 --- a/tests/Widget/Type/DurationYearTest.php +++ b/tests/Widget/Type/DurationYearTest.php @@ -13,6 +13,7 @@ use App\Entity\User; use App\Repository\TimesheetRepository; use App\Tests\Mocks\SystemConfigurationFactory; use App\Widget\Type\AbstractCounterYear; +use App\Widget\Type\AbstractWidget; use App\Widget\Type\AbstractWidgetType; use App\Widget\Type\DurationYear; @@ -36,6 +37,11 @@ class DurationYearTest extends AbstractWidgetTypeTest return $sut; } + protected function assertDefaultData(AbstractWidget $sut): void + { + self::assertEquals(0, $sut->getData()); + } + public function getDefaultOptions(): array { return [ diff --git a/src/Widget/Type/More.php b/tests/Widget/Type/More.php similarity index 75% rename from src/Widget/Type/More.php rename to tests/Widget/Type/More.php index 08401955..1c9a6d49 100644 --- a/src/Widget/Type/More.php +++ b/tests/Widget/Type/More.php @@ -7,13 +7,15 @@ * file that was distributed with this source code. */ -namespace App\Widget\Type; +namespace App\Tests\Widget\Type; + +use App\Widget\Type\AbstractWidgetType; class More extends AbstractWidgetType { private mixed $data = null; - public function setData($data): self + public function setData(mixed $data): self { $this->data = $data; @@ -21,8 +23,7 @@ class More extends AbstractWidgetType } /** - * @param array $options - * @return mixed|null + * @param array $options */ public function getData(array $options = []): mixed { diff --git a/tests/Widget/Type/MoreTest.php b/tests/Widget/Type/MoreTest.php index eb8bd96b..238a01cc 100644 --- a/tests/Widget/Type/MoreTest.php +++ b/tests/Widget/Type/MoreTest.php @@ -10,10 +10,9 @@ namespace App\Tests\Widget\Type; use App\Widget\Type\AbstractWidgetType; -use App\Widget\Type\More; /** - * @covers \App\Widget\Type\More + * @covers \App\Tests\Widget\Type\More */ class MoreTest extends AbstractWidgetTypeTest { @@ -27,13 +26,13 @@ class MoreTest extends AbstractWidgetTypeTest return []; } - public function testTemplateName() + public function testTemplateName(): void { $sut = new More(); self::assertEquals('widget/widget-more.html.twig', $sut->getTemplateName()); } - public function testData() + public function testData(): void { $sut = $this->createSut(); diff --git a/tests/Widget/Type/TotalsActivityTest.php b/tests/Widget/Type/TotalsActivityTest.php index 11b427d5..b8432fe6 100644 --- a/tests/Widget/Type/TotalsActivityTest.php +++ b/tests/Widget/Type/TotalsActivityTest.php @@ -56,7 +56,7 @@ class TotalsActivityTest extends AbstractWidgetTest ]; } - protected function assertDefaultData(AbstractWidgetType $sut) + protected function assertDefaultData(AbstractWidgetType $sut): void { self::assertEquals(1, $sut->getData()); } diff --git a/tests/Widget/Type/TotalsCustomerTest.php b/tests/Widget/Type/TotalsCustomerTest.php index 9828e6e2..5fdb2b49 100644 --- a/tests/Widget/Type/TotalsCustomerTest.php +++ b/tests/Widget/Type/TotalsCustomerTest.php @@ -56,7 +56,7 @@ class TotalsCustomerTest extends AbstractWidgetTest ]; } - protected function assertDefaultData(AbstractWidgetType $sut) + protected function assertDefaultData(AbstractWidgetType $sut): void { self::assertEquals(1, $sut->getData()); } diff --git a/tests/Widget/Type/TotalsProjectTest.php b/tests/Widget/Type/TotalsProjectTest.php index f235f198..d57b636c 100644 --- a/tests/Widget/Type/TotalsProjectTest.php +++ b/tests/Widget/Type/TotalsProjectTest.php @@ -56,7 +56,7 @@ class TotalsProjectTest extends AbstractWidgetTest ]; } - protected function assertDefaultData(AbstractWidgetType $sut) + protected function assertDefaultData(AbstractWidgetType $sut): void { self::assertEquals(1, $sut->getData()); } diff --git a/tests/Widget/Type/TotalsUserTest.php b/tests/Widget/Type/TotalsUserTest.php index 1061a84c..e83d7351 100644 --- a/tests/Widget/Type/TotalsUserTest.php +++ b/tests/Widget/Type/TotalsUserTest.php @@ -56,7 +56,7 @@ class TotalsUserTest extends AbstractWidgetTest ]; } - protected function assertDefaultData(AbstractWidgetType $sut) + protected function assertDefaultData(AbstractWidgetType $sut): void { self::assertEquals(1, $sut->getData()); } diff --git a/tests/Widget/Type/UserAmountMonthTest.php b/tests/Widget/Type/UserAmountMonthTest.php index d31f308a..e1d2324d 100644 --- a/tests/Widget/Type/UserAmountMonthTest.php +++ b/tests/Widget/Type/UserAmountMonthTest.php @@ -23,7 +23,7 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; */ class UserAmountMonthTest extends AbstractWidgetTest { - protected function assertDefaultData(AbstractWidget $sut) + protected function assertDefaultData(AbstractWidget $sut): void { self::assertEquals(0.0, $sut->getData()); } diff --git a/tests/Widget/Type/UserAmountTodayTest.php b/tests/Widget/Type/UserAmountTodayTest.php index 08deeb18..5dc52f60 100644 --- a/tests/Widget/Type/UserAmountTodayTest.php +++ b/tests/Widget/Type/UserAmountTodayTest.php @@ -23,7 +23,7 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; */ class UserAmountTodayTest extends AbstractWidgetTest { - protected function assertDefaultData(AbstractWidget $sut) + protected function assertDefaultData(AbstractWidget $sut): void { self::assertEquals(0.0, $sut->getData()); } diff --git a/tests/Widget/Type/UserAmountTotalTest.php b/tests/Widget/Type/UserAmountTotalTest.php index d5e912a6..945f64a1 100644 --- a/tests/Widget/Type/UserAmountTotalTest.php +++ b/tests/Widget/Type/UserAmountTotalTest.php @@ -23,7 +23,7 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; */ class UserAmountTotalTest extends AbstractWidgetTest { - protected function assertDefaultData(AbstractWidget $sut) + protected function assertDefaultData(AbstractWidget $sut): void { self::assertEquals(0.0, $sut->getData()); } diff --git a/tests/Widget/Type/UserAmountWeekTest.php b/tests/Widget/Type/UserAmountWeekTest.php index f02294e7..a817bbd6 100644 --- a/tests/Widget/Type/UserAmountWeekTest.php +++ b/tests/Widget/Type/UserAmountWeekTest.php @@ -23,7 +23,7 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; */ class UserAmountWeekTest extends AbstractWidgetTest { - protected function assertDefaultData(AbstractWidget $sut) + protected function assertDefaultData(AbstractWidget $sut): void { self::assertEquals(0.0, $sut->getData()); } diff --git a/tests/Widget/Type/UserAmountYearTest.php b/tests/Widget/Type/UserAmountYearTest.php index 4f7b3c40..715d8d73 100644 --- a/tests/Widget/Type/UserAmountYearTest.php +++ b/tests/Widget/Type/UserAmountYearTest.php @@ -24,7 +24,7 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; */ class UserAmountYearTest extends AbstractWidgetTypeTest { - protected function assertDefaultData(AbstractWidgetType $sut) + protected function assertDefaultData(AbstractWidgetType $sut): void { self::assertEquals([], $sut->getData()); } diff --git a/tests/Widget/Type/UserDurationYearTest.php b/tests/Widget/Type/UserDurationYearTest.php index f4c4241a..b6f4c926 100644 --- a/tests/Widget/Type/UserDurationYearTest.php +++ b/tests/Widget/Type/UserDurationYearTest.php @@ -13,6 +13,7 @@ use App\Entity\User; use App\Repository\TimesheetRepository; use App\Tests\Mocks\SystemConfigurationFactory; use App\Widget\Type\AbstractCounterYear; +use App\Widget\Type\AbstractWidget; use App\Widget\Type\AbstractWidgetType; use App\Widget\Type\UserDurationYear; @@ -36,6 +37,11 @@ class UserDurationYearTest extends AbstractWidgetTypeTest return $sut; } + protected function assertDefaultData(AbstractWidget $sut): void + { + self::assertEquals(0, $sut->getData()); + } + public function getDefaultOptions(): array { return [ diff --git a/tests/Widget/WidgetServiceTest.php b/tests/Widget/WidgetServiceTest.php index 70412659..d748ac9e 100644 --- a/tests/Widget/WidgetServiceTest.php +++ b/tests/Widget/WidgetServiceTest.php @@ -9,7 +9,7 @@ namespace App\Tests\Widget; -use App\Widget\Type\More; +use App\Tests\Widget\Type\More; use App\Widget\WidgetService; use PHPUnit\Framework\TestCase; diff --git a/tests/phpstan.neon b/tests/phpstan.neon index ec8e43ed..24e0b8c5 100644 --- a/tests/phpstan.neon +++ b/tests/phpstan.neon @@ -1342,41 +1342,6 @@ parameters: count: 1 path: Command/ActivateUserCommandTest.php - - - message: "#^Method App\\\\Tests\\\\Command\\\\AssetsInstallerFailureCommand\\:\\:installAssets\\(\\) has no return type specified\\.$#" - count: 1 - path: Command/BundleInstallerCommandTest.php - - - - message: "#^Method App\\\\Tests\\\\Command\\\\BundleInstallerCommandTest\\:\\:testAssetsInstallIsOk\\(\\) has no return type specified\\.$#" - count: 1 - path: Command/BundleInstallerCommandTest.php - - - - message: "#^Method App\\\\Tests\\\\Command\\\\BundleInstallerCommandTest\\:\\:testAssetsInstallReturnsNonZeroExitCode\\(\\) has no return type specified\\.$#" - count: 1 - path: Command/BundleInstallerCommandTest.php - - - - message: "#^Method App\\\\Tests\\\\Command\\\\BundleInstallerCommandTest\\:\\:testAssetsInstallationFailure\\(\\) has no return type specified\\.$#" - count: 1 - path: Command/BundleInstallerCommandTest.php - - - - message: "#^Method App\\\\Tests\\\\Command\\\\BundleInstallerCommandTest\\:\\:testFullRun\\(\\) has no return type specified\\.$#" - count: 1 - path: Command/BundleInstallerCommandTest.php - - - - message: "#^Method App\\\\Tests\\\\Command\\\\BundleInstallerCommandTest\\:\\:testInvalidNamespaceWillRaiseException\\(\\) has no return type specified\\.$#" - count: 1 - path: Command/BundleInstallerCommandTest.php - - - - message: "#^Method App\\\\Tests\\\\Command\\\\BundleInstallerCommandTest\\:\\:testMissingMigrationThrowsException\\(\\) has no return type specified\\.$#" - count: 1 - path: Command/BundleInstallerCommandTest.php - - message: "#^Parameter \\#1 \\$command of method Symfony\\\\Bundle\\\\FrameworkBundle\\\\Console\\\\Application\\:\\:add\\(\\) expects Symfony\\\\Component\\\\Console\\\\Command\\\\Command, object given\\.$#" count: 1 @@ -2762,26 +2727,6 @@ parameters: count: 1 path: Controller/PermissionControllerTest.php - - - message: "#^Method App\\\\Tests\\\\Controller\\\\PluginControllerTest\\:\\:testIndexAction\\(\\) has no return type specified\\.$#" - count: 1 - path: Controller/PluginControllerTest.php - - - - message: "#^Method App\\\\Tests\\\\Controller\\\\PluginControllerTest\\:\\:testIndexActionWithInstalledPlugins\\(\\) has no return type specified\\.$#" - count: 1 - path: Controller/PluginControllerTest.php - - - - message: "#^Method App\\\\Tests\\\\Controller\\\\PluginControllerTest\\:\\:testIsSecure\\(\\) has no return type specified\\.$#" - count: 1 - path: Controller/PluginControllerTest.php - - - - message: "#^Method App\\\\Tests\\\\Controller\\\\PluginControllerTest\\:\\:testIsSecureForRole\\(\\) has no return type specified\\.$#" - count: 1 - path: Controller/PluginControllerTest.php - - message: "#^Method App\\\\Tests\\\\Controller\\\\ProfileControllerTest\\:\\:testEditActionTabs\\(\\) has parameter \\$role with no type specified\\.$#" count: 1 @@ -6162,11 +6107,6 @@ parameters: count: 1 path: Invoice/Hydrator/InvoiceItemDefaultHydratorTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceItemDefaultHydratorTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Hydrator/InvoiceItemDefaultHydratorTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceItemDefaultHydratorTest\\:\\:testHydrate\\(\\) has no return type specified\\.$#" count: 1 @@ -6187,11 +6127,6 @@ parameters: count: 1 path: Invoice/Hydrator/InvoiceModelActivityHydratorTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceModelActivityHydratorTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Hydrator/InvoiceModelActivityHydratorTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceModelActivityHydratorTest\\:\\:testHydrate\\(\\) has no return type specified\\.$#" count: 1 @@ -6207,11 +6142,6 @@ parameters: count: 1 path: Invoice/Hydrator/InvoiceModelCustomerHydratorTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceModelCustomerHydratorTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Hydrator/InvoiceModelCustomerHydratorTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceModelDefaultHydratorTest\\:\\:assertModelStructure\\(\\) has parameter \\$model with no value type specified in iterable type array\\.$#" count: 1 @@ -6222,11 +6152,6 @@ parameters: count: 1 path: Invoice/Hydrator/InvoiceModelDefaultHydratorTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceModelDefaultHydratorTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Hydrator/InvoiceModelDefaultHydratorTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceModelProjectHydratorTest\\:\\:assertModelStructure\\(\\) has no return type specified\\.$#" count: 1 @@ -6242,11 +6167,6 @@ parameters: count: 1 path: Invoice/Hydrator/InvoiceModelProjectHydratorTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceModelProjectHydratorTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Hydrator/InvoiceModelProjectHydratorTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceModelProjectHydratorTest\\:\\:testHydrate\\(\\) has no return type specified\\.$#" count: 1 @@ -6267,11 +6187,6 @@ parameters: count: 1 path: Invoice/Hydrator/InvoiceModelUserHydratorTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceModelUserHydratorTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Hydrator/InvoiceModelUserHydratorTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Hydrator\\\\InvoiceModelUserHydratorTest\\:\\:testHydrate\\(\\) has no return type specified\\.$#" count: 1 @@ -6372,11 +6287,6 @@ parameters: count: 1 path: Invoice/Renderer/DebugRendererTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\DebugRendererTest\\:\\:assertEntryStructure\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Renderer/DebugRendererTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\DebugRendererTest\\:\\:assertEntryStructure\\(\\) has parameter \\$metaFields with no value type specified in iterable type array\\.$#" count: 1 @@ -6387,11 +6297,6 @@ parameters: count: 1 path: Invoice/Renderer/DebugRendererTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\DebugRendererTest\\:\\:assertModelStructure\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Renderer/DebugRendererTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\DebugRendererTest\\:\\:assertModelStructure\\(\\) has parameter \\$model with no value type specified in iterable type array\\.$#" count: 1 @@ -6402,21 +6307,11 @@ parameters: count: 1 path: Invoice/Renderer/DebugRendererTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\DebugRendererTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Renderer/DebugRendererTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\DebugRendererTest\\:\\:getTestModel\\(\\) has no return type specified\\.$#" count: 1 path: Invoice/Renderer/DebugRendererTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\DebugRendererTest\\:\\:testRender\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Renderer/DebugRendererTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\DebugRendererTest\\:\\:testRender\\(\\) has parameter \\$expectedDescriptions with no type specified\\.$#" count: 1 @@ -6462,11 +6357,6 @@ parameters: count: 1 path: Invoice/Renderer/DebugRendererTest.php - - - message: "#^Method class@anonymous/Invoice/Renderer/DebugRendererTest\\.php\\:35\\:\\:setInvoiceModel\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Renderer/DebugRendererTest.php - - message: "#^Method class@anonymous/Invoice/Renderer/DebugRendererTest\\.php\\:47\\:\\:hydrate\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -6497,11 +6387,6 @@ parameters: count: 1 path: Invoice/Renderer/DocxRendererTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\DocxRendererTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Renderer/DocxRendererTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\DocxRendererTest\\:\\:testRender\\(\\) has no return type specified\\.$#" count: 1 @@ -6517,11 +6402,6 @@ parameters: count: 1 path: Invoice/Renderer/OdsRendererTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\OdsRendererTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Renderer/OdsRendererTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\OdsRendererTest\\:\\:getTestModel\\(\\) has no return type specified\\.$#" count: 1 @@ -6577,11 +6457,6 @@ parameters: count: 1 path: Invoice/Renderer/PdfRendererTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\PdfRendererTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Renderer/PdfRendererTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\PdfRendererTest\\:\\:testRender\\(\\) has no return type specified\\.$#" count: 1 @@ -6617,11 +6492,6 @@ parameters: count: 1 path: Invoice/Renderer/TwigRendererTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\TwigRendererTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Renderer/TwigRendererTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\TwigRendererTest\\:\\:testRender\\(\\) has no return type specified\\.$#" count: 1 @@ -6647,11 +6517,6 @@ parameters: count: 1 path: Invoice/Renderer/XlsxRendererTest.php - - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\XlsxRendererTest\\:\\:getNumberGeneratorSut\\(\\) has no return type specified\\.$#" - count: 1 - path: Invoice/Renderer/XlsxRendererTest.php - - message: "#^Method App\\\\Tests\\\\Invoice\\\\Renderer\\\\XlsxRendererTest\\:\\:getTestModel\\(\\) has no return type specified\\.$#" count: 1 @@ -7932,16 +7797,6 @@ parameters: count: 1 path: Security/SessionHandlerTest.php - - - message: "#^Method App\\\\Tests\\\\Security\\\\TestUserEntity\\:\\:eraseCredentials\\(\\) has no return type specified\\.$#" - count: 1 - path: Security/TestUserEntity.php - - - - message: "#^Method App\\\\Tests\\\\Security\\\\TestUserEntity\\:\\:getTimeFormat\\(\\) has no return type specified\\.$#" - count: 1 - path: Security/TestUserEntity.php - - message: "#^Method App\\\\Tests\\\\Security\\\\UserCheckerTest\\:\\:testCheckPostAuthReturnsOnUnknownUserClass\\(\\) has no return type specified\\.$#" count: 1 @@ -9617,36 +9472,6 @@ parameters: count: 1 path: Validator/Constraints/DateTimeFormatValidatorTest.php - - - message: "#^Method App\\\\Tests\\\\Validator\\\\Constraints\\\\DurationValidatorTest\\:\\:getInvalidData\\(\\) has no return type specified\\.$#" - count: 1 - path: Validator/Constraints/DurationValidatorTest.php - - - - message: "#^Method App\\\\Tests\\\\Validator\\\\Constraints\\\\DurationValidatorTest\\:\\:getValidData\\(\\) has no return type specified\\.$#" - count: 1 - path: Validator/Constraints/DurationValidatorTest.php - - - - message: "#^Method App\\\\Tests\\\\Validator\\\\Constraints\\\\DurationValidatorTest\\:\\:testConstraintIsInvalid\\(\\) has no return type specified\\.$#" - count: 1 - path: Validator/Constraints/DurationValidatorTest.php - - - - message: "#^Method App\\\\Tests\\\\Validator\\\\Constraints\\\\DurationValidatorTest\\:\\:testConstraintWithValidData\\(\\) has no return type specified\\.$#" - count: 1 - path: Validator/Constraints/DurationValidatorTest.php - - - - message: "#^Method App\\\\Tests\\\\Validator\\\\Constraints\\\\DurationValidatorTest\\:\\:testValidationError\\(\\) has no return type specified\\.$#" - count: 1 - path: Validator/Constraints/DurationValidatorTest.php - - - - message: "#^Method App\\\\Tests\\\\Validator\\\\Constraints\\\\DurationValidatorTest\\:\\:testValidationErrorUpperCase\\(\\) has no return type specified\\.$#" - count: 1 - path: Validator/Constraints/DurationValidatorTest.php - - message: "#^Parameter \\#1 \\$string of function strtoupper expects string, int\\|string given\\.$#" count: 1 @@ -10592,46 +10417,16 @@ parameters: count: 1 path: Widget/Type/AbstractWidgetTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AbstractWidgetTypeTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/AbstractWidgetTypeTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AbstractWidgetTypeTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 path: Widget/Type/AbstractWidgetTypeTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AbstractWidgetTypeTest\\:\\:testDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/AbstractWidgetTypeTest.php - - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AbstractWidgetTypeTest\\:\\:testFluentInterface\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/AbstractWidgetTypeTest.php - - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AbstractWidgetTypeTest\\:\\:testSetter\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/AbstractWidgetTypeTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\ActiveUsersYearTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 path: Widget/Type/ActiveUsersYearTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\ActiveUsersYearTest\\:\\:testSettings\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/ActiveUsersYearTest.php - - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AmountMonthTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/AmountMonthTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AmountMonthTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10642,11 +10437,6 @@ parameters: count: 1 path: Widget/Type/AmountMonthTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AmountTodayTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/AmountTodayTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AmountTodayTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10657,11 +10447,6 @@ parameters: count: 1 path: Widget/Type/AmountTodayTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AmountTotalTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/AmountTotalTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AmountTotalTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10672,11 +10457,6 @@ parameters: count: 1 path: Widget/Type/AmountTotalTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AmountWeekTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/AmountWeekTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AmountWeekTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10687,11 +10467,6 @@ parameters: count: 1 path: Widget/Type/AmountWeekTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AmountYearTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/AmountYearTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\AmountYearTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10702,41 +10477,6 @@ parameters: count: 1 path: Widget/Type/AmountYearTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\CounterTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: Widget/Type/CounterTest.php - - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\CounterTest\\:\\:testQueryWithUser\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/CounterTest.php - - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\CounterTest\\:\\:testTemplateName\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/CounterTest.php - - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\CounterYearTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: Widget/Type/CounterYearTest.php - - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\CounterYearTest\\:\\:testQueryWithUser\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/CounterYearTest.php - - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\CounterYearTest\\:\\:testTemplateName\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/CounterYearTest.php - - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\CounterYearTest\\:\\:testTemplateNameWithFinancialYear\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/CounterYearTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\DailyWorkingTimeChartTest\\:\\:testDefaultValues\\(\\) has no return type specified\\.$#" count: 1 @@ -10782,16 +10522,6 @@ parameters: count: 1 path: Widget/Type/MoreTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\MoreTest\\:\\:testData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/MoreTest.php - - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\MoreTest\\:\\:testTemplateName\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/MoreTest.php - - message: "#^Cannot access offset 'financialBegin' on mixed\\.$#" count: 2 @@ -10832,11 +10562,6 @@ parameters: count: 2 path: Widget/Type/PaginatedWorkingTimeChartTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\TotalsActivityTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/TotalsActivityTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\TotalsActivityTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10847,11 +10572,6 @@ parameters: count: 1 path: Widget/Type/TotalsActivityTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\TotalsCustomerTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/TotalsCustomerTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\TotalsCustomerTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10862,11 +10582,6 @@ parameters: count: 1 path: Widget/Type/TotalsCustomerTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\TotalsProjectTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/TotalsProjectTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\TotalsProjectTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10877,11 +10592,6 @@ parameters: count: 1 path: Widget/Type/TotalsProjectTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\TotalsUserTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/TotalsUserTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\TotalsUserTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10892,11 +10602,6 @@ parameters: count: 1 path: Widget/Type/TotalsUserTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\UserAmountMonthTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/UserAmountMonthTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\UserAmountMonthTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10907,11 +10612,6 @@ parameters: count: 1 path: Widget/Type/UserAmountMonthTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\UserAmountTodayTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/UserAmountTodayTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\UserAmountTodayTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10922,11 +10622,6 @@ parameters: count: 1 path: Widget/Type/UserAmountTodayTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\UserAmountTotalTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/UserAmountTotalTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\UserAmountTotalTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10937,11 +10632,6 @@ parameters: count: 1 path: Widget/Type/UserAmountTotalTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\UserAmountWeekTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/UserAmountWeekTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\UserAmountWeekTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -10952,11 +10642,6 @@ parameters: count: 1 path: Widget/Type/UserAmountWeekTest.php - - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\UserAmountYearTest\\:\\:assertDefaultData\\(\\) has no return type specified\\.$#" - count: 1 - path: Widget/Type/UserAmountYearTest.php - - message: "#^Method App\\\\Tests\\\\Widget\\\\Type\\\\UserAmountYearTest\\:\\:getDefaultOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1