From 5f4b6d3cfade9e323a7b092dcd75dd9d036b124f Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Sun, 17 Dec 2023 16:19:50 +0100 Subject: [PATCH] Release 2.6.0 (#4472) - Added: calendar entry title combination for customer, project and activity - Added: show not_invoiced and not_exported data in detail screens - Added: force logout if user is disabled - Added: reduced amount of database queries on several screens - Fixed: open-close status on work-contract screen for users without configuration - Fixed: failsafe order/orderBy in query if manually manipulated to be null - Fixed: unify statistic calculation (not_invoiced and not_exported) across screens - Tech: bump packages - Tech: Symfony 6.4 --- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/ISSUE_TEMPLATE/docker.yml | 8 +- .php-cs-fixer.dist.php | 6 +- composer.json | 2 +- composer.lock | 1669 +++++++++-------- config/packages/framework.yaml | 7 + phpstan.neon | 82 +- .../Authentication/SessionAuthenticator.php | 4 +- src/API/Authentication/TokenAuthenticator.php | 4 +- src/Calendar/RecentActivitiesSource.php | 2 +- src/Calendar/TimesheetEntry.php | 12 +- src/Configuration/SystemConfiguration.php | 4 +- src/Constants.php | 4 +- src/Controller/ActivityController.php | 26 +- src/Controller/Auth/SamlController.php | 4 +- src/Controller/CustomerController.php | 19 +- src/Controller/ProfileController.php | 2 +- src/Controller/ProjectController.php | 19 +- .../Reporting/ProjectDateRangeController.php | 5 +- .../Security/PasswordResetController.php | 2 +- src/Controller/UserController.php | 11 +- src/Controller/WizardController.php | 4 +- src/Entity/MetaTableTypeTrait.php | 45 +- src/Entity/User.php | 4 + src/Event/PrepareUserEvent.php | 14 +- src/Event/UserPreferenceEvent.php | 16 +- .../UserPreferenceSubscriber.php | 2 +- src/Form/TimesheetEditForm.php | 32 +- src/Form/Type/CalendarTitlePatternType.php | 4 + src/Form/Type/ColorChoiceType.php | 4 + src/Ldap/LdapUserProvider.php | 3 + src/Project/ProjectStatisticService.php | 40 +- .../ProjectDateRange/ProjectDateRangeForm.php | 1 + .../ProjectDateRangeQuery.php | 8 +- .../ProjectInactive/ProjectInactiveQuery.php | 6 +- .../ProjectView/ProjectViewModel.php | 98 +- .../ProjectView/ProjectViewQuery.php | 2 +- src/Repository/Query/BaseQuery.php | 12 +- src/Repository/Query/TeamQuery.php | 104 +- src/Repository/TeamRepository.php | 31 +- src/Repository/UserRepository.php | 1 + src/Saml/SamlProvider.php | 9 +- src/Security/KimaiUserProvider.php | 7 +- src/Twig/Runtime/ThemeExtension.php | 18 +- src/User/UserService.php | 2 +- src/Utils/SearchTerm.php | 4 +- src/Validator/Constraints/Customer.php | 2 +- src/Validator/Constraints/DateTimeFormat.php | 2 +- src/Validator/Constraints/Project.php | 2 +- src/Validator/Constraints/Team.php | 2 +- src/Validator/Constraints/TimeFormat.php | 2 +- src/Validator/Constraints/Timesheet.php | 2 +- src/Validator/Constraints/TimesheetBasic.php | 2 +- .../Constraints/TimesheetDeactivated.php | 2 +- .../Constraints/TimesheetExported.php | 2 +- .../Constraints/TimesheetFutureTimes.php | 2 +- .../Constraints/TimesheetLockdown.php | 2 +- .../Constraints/TimesheetLongRunning.php | 2 +- .../Constraints/TimesheetMultiUpdate.php | 2 +- .../Constraints/TimesheetMultiUser.php | 2 +- .../Constraints/TimesheetOverlapping.php | 2 +- .../Constraints/TimesheetRestart.php | 2 +- .../Constraints/TimesheetZeroDuration.php | 2 +- src/Validator/Constraints/User.php | 2 +- templates/contract/status.html.twig | 4 +- templates/embeds/budgets.html.twig | 32 +- templates/form/blocks.html.twig | 3 +- templates/macros/widgets.html.twig | 50 +- templates/reporting/project_details.html.twig | 2 +- .../reporting/project_list_data.html.twig | 2 +- tests/Event/PrepareUserEventTest.php | 7 +- tests/Event/UserPreferenceEventTest.php | 8 +- .../ProjectView/ProjectViewModelTest.php | 45 +- tests/phpstan.neon | 30 - translations/messages.de.xlf | 8 + translations/messages.en.xlf | 8 + translations/validators.de.xlf | 4 +- 77 files changed, 1362 insertions(+), 1242 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 4692e58e..3818f8c5 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -8,4 +8,4 @@ contact_links: about: Want to discuss something with a community? Do it in discussions! - name: Get Professional support url: https://www.kimai.org/en/support.html - about: As a customer, you will always receive fast and helpful replies from the developer. + about: As a customer, you will always receive fast replies from the developer. diff --git a/.github/ISSUE_TEMPLATE/docker.yml b/.github/ISSUE_TEMPLATE/docker.yml index fd2e489e..b31a84b9 100644 --- a/.github/ISSUE_TEMPLATE/docker.yml +++ b/.github/ISSUE_TEMPLATE/docker.yml @@ -28,11 +28,9 @@ body: - Docker compose version: [e.g. 1.21.0] Docker compose file: - ```yaml - version: '3.5' - services: - image: ... - ``` + version: '3.5' + services: + image: ... validations: required: true - type: input diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 95f3b179..2e064ab3 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -60,7 +60,7 @@ $fixer 'lowercase_static_reference' => true, 'magic_constant_casing' => true, 'native_function_casing' => true, - 'new_with_braces' => true, + 'new_with_parentheses' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_empty_comment' => true, @@ -82,7 +82,7 @@ $fixer 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_around_offset' => true, 'no_trailing_comma_in_singleline' => true, - 'no_unneeded_curly_braces' => true, + 'no_unneeded_braces' => true, 'no_unneeded_final_method' => true, 'no_unused_imports' => true, 'no_whitespace_before_comma_in_array' => true, @@ -151,7 +151,7 @@ $fixer ], 'scope' => 'namespaced' ], - 'native_function_type_declaration_casing' => true, + 'native_type_declaration_casing' => true, 'no_alias_functions' => [ 'sets' => [ '@internal' diff --git a/composer.json b/composer.json index ac5fc0a2..9dc7dac9 100644 --- a/composer.json +++ b/composer.json @@ -202,7 +202,7 @@ "symfony": { "id": "01C3FWRDJJEX9K6Y3A4XDFXPBR", "allow-contrib": true, - "require": "6.3.*" + "require": "6.4.*" } } } diff --git a/composer.lock b/composer.lock index 340304e2..598c153f 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": "3573d958deb04f566945c3dbd7414fa3", + "content-hash": "a307b9a36c22711439283a3e5bc3249c", "packages": [ { "name": "azuyalabs/yasumi", @@ -1362,16 +1362,16 @@ }, { "name": "doctrine/migrations", - "version": "3.7.1", + "version": "3.7.2", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "e4e0855ea993d169c8adb50e19b014e64bbdda46" + "reference": "47af29eef49f29ebee545947e8b2a4b3be318c8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/e4e0855ea993d169c8adb50e19b014e64bbdda46", - "reference": "e4e0855ea993d169c8adb50e19b014e64bbdda46", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/47af29eef49f29ebee545947e8b2a4b3be318c8a", + "reference": "47af29eef49f29ebee545947e8b2a4b3be318c8a", "shasum": "" }, "require": { @@ -1444,7 +1444,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.7.1" + "source": "https://github.com/doctrine/migrations/tree/3.7.2" }, "funding": [ { @@ -1460,7 +1460,7 @@ "type": "tidelift" } ], - "time": "2023-11-19T06:55:22+00:00" + "time": "2023-12-05T11:35:05+00:00" }, { "name": "doctrine/orm", @@ -2073,16 +2073,16 @@ }, { "name": "gedmo/doctrine-extensions", - "version": "v3.13.0", + "version": "v3.14.0", "source": { "type": "git", "url": "https://github.com/doctrine-extensions/DoctrineExtensions.git", - "reference": "291d0c527d2dc9ee07b888c9a4e2a179893f08ab" + "reference": "3b5b5cba476b4ae32a55ef69ef2e59d64d5893cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/291d0c527d2dc9ee07b888c9a4e2a179893f08ab", - "reference": "291d0c527d2dc9ee07b888c9a4e2a179893f08ab", + "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/3b5b5cba476b4ae32a55ef69ef2e59d64d5893cf", + "reference": "3b5b5cba476b4ae32a55ef69ef2e59d64d5893cf", "shasum": "" }, "require": { @@ -2092,33 +2092,33 @@ "doctrine/common": "^2.13 || ^3.0", "doctrine/event-manager": "^1.2 || ^2.0", "doctrine/persistence": "^2.2 || ^3.0", - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "psr/cache": "^1 || ^2 || ^3", - "symfony/cache": "^4.4 || ^5.3 || ^6.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", "symfony/deprecation-contracts": "^2.1 || ^3.0" }, "conflict": { - "doctrine/dbal": "<2.13.1 || ^3.0 <3.2", + "doctrine/dbal": "<3.2", "doctrine/mongodb-odm": "<2.3", - "doctrine/orm": "<2.10.2 || 2.16.0 || 2.16.1", + "doctrine/orm": "<2.14.0 || 2.16.0 || 2.16.1", "sebastian/comparator": "<2.0" }, "require-dev": { "doctrine/cache": "^1.11 || ^2.0", - "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/dbal": "^3.2", "doctrine/doctrine-bundle": "^2.3", "doctrine/mongodb-odm": "^2.3", - "doctrine/orm": "^2.10.2", - "friendsofphp/php-cs-fixer": "^3.4.0 <3.10", - "nesbot/carbon": "^2.55", + "doctrine/orm": "^2.14.0", + "friendsofphp/php-cs-fixer": "^3.14.0", + "nesbot/carbon": "^2.71 || 3.x-dev as 3.0", "phpstan/phpstan": "^1.10.2", "phpstan/phpstan-doctrine": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^8.5 || ^9.5", - "rector/rector": "^0.15.20", - "symfony/console": "^4.4 || ^5.3 || ^6.0", - "symfony/phpunit-bridge": "^6.0", - "symfony/yaml": "^4.4 || ^5.3 || ^6.0" + "phpunit/phpunit": "^9.6", + "rector/rector": "^0.18", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "doctrine/mongodb-odm": "to use the extensions with the MongoDB ODM", @@ -2175,7 +2175,7 @@ "support": { "email": "gediminas.morkevicius@gmail.com", "issues": "https://github.com/doctrine-extensions/DoctrineExtensions/issues", - "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.13.0", + "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.14.0", "wiki": "https://github.com/Atlantic18/DoctrineExtensions/tree/main/doc" }, "funding": [ @@ -2196,7 +2196,7 @@ "type": "github" } ], - "time": "2023-09-06T13:16:12+00:00" + "time": "2023-12-03T09:10:34+00:00" }, { "name": "jms/metadata", @@ -2264,47 +2264,47 @@ }, { "name": "jms/serializer", - "version": "3.28.0", + "version": "3.29.1", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "5a5a03a71a28a480189c5a0ca95893c19f1d120c" + "reference": "111451f43abb448ce297361a8ab96a9591e848cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/5a5a03a71a28a480189c5a0ca95893c19f1d120c", - "reference": "5a5a03a71a28a480189c5a0ca95893c19f1d120c", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/111451f43abb448ce297361a8ab96a9591e848cd", + "reference": "111451f43abb448ce297361a8ab96a9591e848cd", "shasum": "" }, "require": { - "doctrine/annotations": "^1.13 || ^2.0", - "doctrine/instantiator": "^1.0.3 || ^2.0", + "doctrine/annotations": "^1.14 || ^2.0", + "doctrine/instantiator": "^1.3.1 || ^2.0", "doctrine/lexer": "^2.0 || ^3.0", "jms/metadata": "^2.6", - "php": "^7.2||^8.0", - "phpstan/phpdoc-parser": "^0.4 || ^0.5 || ^1.0" + "php": "^7.2 || ^8.0", + "phpstan/phpdoc-parser": "^1.20" }, "require-dev": { "doctrine/coding-standard": "^12.0", - "doctrine/orm": "~2.1", - "doctrine/persistence": "^1.3.3|^2.0|^3.0", - "doctrine/phpcr-odm": "^1.3|^2.0", + "doctrine/orm": "^2.14 || ^3.0", + "doctrine/persistence": "^2.5.2 || ^3.0", + "doctrine/phpcr-odm": "^1.5.2 || ^2.0", "ext-pdo_sqlite": "*", - "jackalope/jackalope-doctrine-dbal": "^1.1.5", - "ocramius/proxy-manager": "^1.0|^2.0", + "jackalope/jackalope-doctrine-dbal": "^1.3", + "ocramius/proxy-manager": "^1.0 || ^2.0", "phpbench/phpbench": "^1.0", "phpstan/phpstan": "^1.0.2", - "phpunit/phpunit": "^8.5.21||^9.0||^10.0", - "psr/container": "^1.0|^2.0", - "symfony/dependency-injection": "^3.0|^4.0|^5.0|^6.0", - "symfony/expression-language": "^3.2|^4.0|^5.0|^6.0", - "symfony/filesystem": "^3.0|^4.0|^5.0|^6.0", - "symfony/form": "^3.0|^4.0|^5.0|^6.0", - "symfony/translation": "^3.0|^4.0|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", - "symfony/validator": "^3.1.9|^4.0|^5.0|^6.0", - "symfony/yaml": "^3.3|^4.0|^5.0|^6.0", - "twig/twig": "~1.34|~2.4|^3.0" + "phpunit/phpunit": "^8.5.21 || ^9.0 || ^10.0", + "psr/container": "^1.0 || ^2.0", + "symfony/dependency-injection": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/expression-language": "^3.2 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/filesystem": "^4.2 || ^5.0 || ^6.0 || ^7.0", + "symfony/form": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/translation": "^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/uid": "^5.1 || ^6.0 || ^7.0", + "symfony/validator": "^3.1.9 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "twig/twig": "^1.34 || ^2.4 || ^3.0" }, "suggest": { "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", @@ -2348,7 +2348,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.28.0" + "source": "https://github.com/schmittjoh/serializer/tree/3.29.1" }, "funding": [ { @@ -2356,46 +2356,47 @@ "type": "github" } ], - "time": "2023-08-03T14:43:08+00:00" + "time": "2023-12-14T15:25:09+00:00" }, { "name": "jms/serializer-bundle", - "version": "5.3.1", + "version": "5.4.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/JMSSerializerBundle.git", - "reference": "3279738a958454793ca1e318a7dab6cfcff60124" + "reference": "6fa2dd0083e00fe21c5da171556d7ecabc14b437" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/JMSSerializerBundle/zipball/3279738a958454793ca1e318a7dab6cfcff60124", - "reference": "3279738a958454793ca1e318a7dab6cfcff60124", + "url": "https://api.github.com/repos/schmittjoh/JMSSerializerBundle/zipball/6fa2dd0083e00fe21c5da171556d7ecabc14b437", + "reference": "6fa2dd0083e00fe21c5da171556d7ecabc14b437", "shasum": "" }, "require": { - "jms/metadata": "^2.5", - "jms/serializer": "^3.20", - "php": "^7.2 || ^8.0", - "symfony/dependency-injection": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "symfony/framework-bundle": "^3.4 || ^4.0 || ^5.0 || ^6.0" + "jms/metadata": "^2.6", + "jms/serializer": "^3.28", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { "doctrine/coding-standard": "^8.1", - "doctrine/orm": "^2.4", + "doctrine/orm": "^2.14", "phpunit/phpunit": "^8.0 || ^9.0", - "symfony/expression-language": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "symfony/finder": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "symfony/form": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "symfony/stopwatch": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "symfony/templating": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "symfony/twig-bundle": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "symfony/uid": "^5.1 || ^6.0", - "symfony/validator": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0" + "symfony/expression-language": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/form": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/templating": "^5.4 || ^6.0", + "symfony/twig-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/uid": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { - "symfony/expression-language": "Required for opcache preloading ^3.4 || ^4.0 || ^5.0 || ^6.0", - "symfony/finder": "Required for cache warmup, supported versions ^3.4 || ^4.0 || ^5.0 || ^6.0" + "symfony/expression-language": "Required for opcache preloading ^5.4 || ^6.0 || ^7.0", + "symfony/finder": "Required for cache warmup, supported versions ^5.4 || ^6.0 || ^7.0" }, "type": "symfony-bundle", "extra": { @@ -2435,7 +2436,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/JMSSerializerBundle/issues", - "source": "https://github.com/schmittjoh/JMSSerializerBundle/tree/5.3.1" + "source": "https://github.com/schmittjoh/JMSSerializerBundle/tree/5.4.0" }, "funding": [ { @@ -2443,7 +2444,7 @@ "type": "github" } ], - "time": "2023-06-13T14:47:57+00:00" + "time": "2023-12-12T15:33:15+00:00" }, { "name": "kevinpapst/tabler-bundle", @@ -2582,35 +2583,36 @@ }, { "name": "league/csv", - "version": "9.11.0", + "version": "9.13.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "33149c4bea4949aa4fa3d03fb11ed28682168b39" + "reference": "3690cc71bfe8dc3b6daeef356939fac95348f0a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/33149c4bea4949aa4fa3d03fb11ed28682168b39", - "reference": "33149c4bea4949aa4fa3d03fb11ed28682168b39", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/3690cc71bfe8dc3b6daeef356939fac95348f0a8", + "reference": "3690cc71bfe8dc3b6daeef356939fac95348f0a8", "shasum": "" }, "require": { + "ext-filter": "*", "ext-json": "*", "ext-mbstring": "*", "php": "^8.1.2" }, "require-dev": { - "doctrine/collections": "^2.1.3", + "doctrine/collections": "^2.1.4", "ext-dom": "*", "ext-xdebug": "*", "friendsofphp/php-cs-fixer": "^v3.22.0", - "phpbench/phpbench": "^1.2.14", - "phpstan/phpstan": "^1.10.26", - "phpstan/phpstan-deprecation-rules": "^1.1.3", - "phpstan/phpstan-phpunit": "^1.3.13", - "phpstan/phpstan-strict-rules": "^1.5.1", - "phpunit/phpunit": "^10.3.1", - "symfony/var-dumper": "^6.3.3" + "phpbench/phpbench": "^1.2.15", + "phpstan/phpstan": "^1.10.50", + "phpstan/phpstan-deprecation-rules": "^1.1.4", + "phpstan/phpstan-phpunit": "^1.3.15", + "phpstan/phpstan-strict-rules": "^1.5.2", + "phpunit/phpunit": "^10.5.3", + "symfony/var-dumper": "^6.4.0" }, "suggest": { "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", @@ -2666,7 +2668,7 @@ "type": "github" } ], - "time": "2023-09-23T10:09:54+00:00" + "time": "2023-12-16T11:03:20+00:00" }, { "name": "lorenzo/pinky", @@ -4075,16 +4077,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.4", + "version": "1.24.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "6bd0c26f3786cd9b7c359675cb789e35a8e07496" + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6bd0c26f3786cd9b7c359675cb789e35a8e07496", - "reference": "6bd0c26f3786cd9b7c359675cb789e35a8e07496", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc", + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc", "shasum": "" }, "require": { @@ -4116,9 +4118,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.4" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5" }, - "time": "2023-11-26T18:29:22+00:00" + "time": "2023-12-16T09:33:33+00:00" }, { "name": "psr/cache", @@ -4625,16 +4627,16 @@ }, { "name": "scheb/2fa-backup-code", - "version": "v6.11.0", + "version": "v6.12.0", "source": { "type": "git", "url": "https://github.com/scheb/2fa-backup-code.git", - "reference": "d258a5af83b32f88484cd345b4784004766b2fe3" + "reference": "1ad84e7eb26eb425c609e03097cac99387dde44c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-backup-code/zipball/d258a5af83b32f88484cd345b4784004766b2fe3", - "reference": "d258a5af83b32f88484cd345b4784004766b2fe3", + "url": "https://api.github.com/repos/scheb/2fa-backup-code/zipball/1ad84e7eb26eb425c609e03097cac99387dde44c", + "reference": "1ad84e7eb26eb425c609e03097cac99387dde44c", "shasum": "" }, "require": { @@ -4668,22 +4670,22 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-backup-code/tree/v6.11.0" + "source": "https://github.com/scheb/2fa-backup-code/tree/v6.12.0" }, - "time": "2023-11-04T12:54:57+00:00" + "time": "2023-12-03T15:44:26+00:00" }, { "name": "scheb/2fa-bundle", - "version": "v6.11.0", + "version": "v6.12.0", "source": { "type": "git", "url": "https://github.com/scheb/2fa-bundle.git", - "reference": "fc0860b82509753f2efddfed5ade12670753b661" + "reference": "6e51477c53070f27ac3e3d36be1a991870db415a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-bundle/zipball/fc0860b82509753f2efddfed5ade12670753b661", - "reference": "fc0860b82509753f2efddfed5ade12670753b661", + "url": "https://api.github.com/repos/scheb/2fa-bundle/zipball/6e51477c53070f27ac3e3d36be1a991870db415a", + "reference": "6e51477c53070f27ac3e3d36be1a991870db415a", "shasum": "" }, "require": { @@ -4700,7 +4702,8 @@ "symfony/twig-bundle": "^5.4 || ^6.0" }, "conflict": { - "scheb/two-factor-bundle": "*" + "scheb/two-factor-bundle": "*", + "symfony/security-core": "^7" }, "suggest": { "scheb/2fa-backup-code": "Emergency codes when you have no access to other methods", @@ -4735,22 +4738,22 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-bundle/tree/v6.11.0" + "source": "https://github.com/scheb/2fa-bundle/tree/v6.12.0" }, - "time": "2023-11-23T15:37:28+00:00" + "time": "2023-12-03T16:02:15+00:00" }, { "name": "scheb/2fa-totp", - "version": "v6.11.0", + "version": "v6.12.0", "source": { "type": "git", "url": "https://github.com/scheb/2fa-totp.git", - "reference": "c90a1cf73346c973053103821f26338c6f2e22a5" + "reference": "a233f4638b75941e97f089c4c917f6101f2983e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-totp/zipball/c90a1cf73346c973053103821f26338c6f2e22a5", - "reference": "c90a1cf73346c973053103821f26338c6f2e22a5", + "url": "https://api.github.com/repos/scheb/2fa-totp/zipball/a233f4638b75941e97f089c4c917f6101f2983e3", + "reference": "a233f4638b75941e97f089c4c917f6101f2983e3", "shasum": "" }, "require": { @@ -4786,22 +4789,22 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-totp/tree/v6.11.0" + "source": "https://github.com/scheb/2fa-totp/tree/v6.12.0" }, - "time": "2023-11-23T15:37:28+00:00" + "time": "2023-12-03T15:44:26+00:00" }, { "name": "setasign/fpdi", - "version": "v2.5.0", + "version": "v2.6.0", "source": { "type": "git", "url": "https://github.com/Setasign/FPDI.git", - "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4" + "reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDI/zipball/ecf0459643ec963febfb9a5d529dcd93656006a4", - "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/a6db878129ec6c7e141316ee71872923e7f1b7ad", + "reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad", "shasum": "" }, "require": { @@ -4813,8 +4816,8 @@ }, "require-dev": { "phpunit/phpunit": "~5.7", - "setasign/fpdf": "~1.8", - "setasign/tfpdf": "~1.31", + "setasign/fpdf": "~1.8.6", + "setasign/tfpdf": "~1.33", "squizlabs/php_codesniffer": "^3.5", "tecnickcom/tcpdf": "~6.2" }, @@ -4852,7 +4855,7 @@ ], "support": { "issues": "https://github.com/Setasign/FPDI/issues", - "source": "https://github.com/Setasign/FPDI/tree/v2.5.0" + "source": "https://github.com/Setasign/FPDI/tree/v2.6.0" }, "funding": [ { @@ -4860,7 +4863,7 @@ "type": "tidelift" } ], - "time": "2023-09-28T10:46:27+00:00" + "time": "2023-12-11T16:03:32+00:00" }, { "name": "spomky-labs/otphp", @@ -4944,16 +4947,16 @@ }, { "name": "symfony/asset", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "b2382a403f2111836301623d89e9af3d84989525" + "reference": "c1108eb27a61ef4ac29504ef61c028648308036c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/b2382a403f2111836301623d89e9af3d84989525", - "reference": "b2382a403f2111836301623d89e9af3d84989525", + "url": "https://api.github.com/repos/symfony/asset/zipball/c1108eb27a61ef4ac29504ef61c028648308036c", + "reference": "c1108eb27a61ef4ac29504ef61c028648308036c", "shasum": "" }, "require": { @@ -4963,9 +4966,9 @@ "symfony/http-foundation": "<5.4" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0" + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -4993,7 +4996,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.3.8" + "source": "https://github.com/symfony/asset/tree/v6.4.0" }, "funding": [ { @@ -5009,20 +5012,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:07:48+00:00" + "time": "2023-10-31T08:40:20+00:00" }, { "name": "symfony/cache", - "version": "v6.3.9", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "8c6e84272e4febbb1fed3c5b9f3c722537c2bd55" + "reference": "ac2d25f97b17eec6e19760b6b9962a4f7c44356a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/8c6e84272e4febbb1fed3c5b9f3c722537c2bd55", - "reference": "8c6e84272e4febbb1fed3c5b9f3c722537c2bd55", + "url": "https://api.github.com/repos/symfony/cache/zipball/ac2d25f97b17eec6e19760b6b9962a4f7c44356a", + "reference": "ac2d25f97b17eec6e19760b6b9962a4f7c44356a", "shasum": "" }, "require": { @@ -5031,7 +5034,7 @@ "psr/log": "^1.1|^2|^3", "symfony/cache-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.3.6" + "symfony/var-exporter": "^6.3.6|^7.0" }, "conflict": { "doctrine/dbal": "<2.13.1", @@ -5049,12 +5052,12 @@ "doctrine/dbal": "^2.13.1|^3|^4", "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", - "symfony/filesystem": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5089,7 +5092,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.3.9" + "source": "https://github.com/symfony/cache/tree/v6.4.0" }, "funding": [ { @@ -5105,7 +5108,7 @@ "type": "tidelift" } ], - "time": "2023-11-24T13:24:35+00:00" + "time": "2023-11-24T19:28:07+00:00" }, { "name": "symfony/cache-contracts", @@ -5185,21 +5188,22 @@ }, { "name": "symfony/clock", - "version": "v6.3.4", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "a74086d3db70d0f06ffd84480daa556248706e98" + "reference": "48102bcc56b26d453c7f5e7f72829abc9df25a16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/a74086d3db70d0f06ffd84480daa556248706e98", - "reference": "a74086d3db70d0f06ffd84480daa556248706e98", + "url": "https://api.github.com/repos/symfony/clock/zipball/48102bcc56b26d453c7f5e7f72829abc9df25a16", + "reference": "48102bcc56b26d453c7f5e7f72829abc9df25a16", "shasum": "" }, "require": { "php": ">=8.1", - "psr/clock": "^1.0" + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" }, "provide": { "psr/clock-implementation": "1.0" @@ -5238,7 +5242,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v6.3.4" + "source": "https://github.com/symfony/clock/tree/v6.4.0" }, "funding": [ { @@ -5254,26 +5258,26 @@ "type": "tidelift" } ], - "time": "2023-07-31T11:35:03+00:00" + "time": "2023-10-13T14:46:14+00:00" }, { "name": "symfony/config", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "b7a63887960359e5b59b15826fa9f9be10acbe88" + "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/b7a63887960359e5b59b15826fa9f9be10acbe88", - "reference": "b7a63887960359e5b59b15826fa9f9be10acbe88", + "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", + "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", "shasum": "" }, "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -5281,11 +5285,11 @@ "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/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0" + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5313,7 +5317,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.3.8" + "source": "https://github.com/symfony/config/tree/v6.4.0" }, "funding": [ { @@ -5329,20 +5333,20 @@ "type": "tidelift" } ], - "time": "2023-11-09T08:28:21+00:00" + "time": "2023-11-09T08:28:32+00:00" }, { "name": "symfony/console", - "version": "v6.3.9", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0566dbd051f8648d980592c7849f5d90d2c7c60c" + "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0566dbd051f8648d980592c7849f5d90d2c7c60c", - "reference": "0566dbd051f8648d980592c7849f5d90d2c7c60c", + "url": "https://api.github.com/repos/symfony/console/zipball/a550a7c99daeedef3f9d23fb82e3531525ff11fd", + "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd", "shasum": "" }, "require": { @@ -5350,7 +5354,7 @@ "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0" + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/dependency-injection": "<5.4", @@ -5364,12 +5368,16 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5403,7 +5411,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.3.9" + "source": "https://github.com/symfony/console/tree/v6.4.1" }, "funding": [ { @@ -5419,20 +5427,20 @@ "type": "tidelift" } ], - "time": "2023-11-20T16:36:29+00:00" + "time": "2023-11-30T10:54:28+00:00" }, { "name": "symfony/css-selector", - "version": "v6.3.2", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "883d961421ab1709877c10ac99451632a3d6fa57" + "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", - "reference": "883d961421ab1709877c10ac99451632a3d6fa57", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/d036c6c0d0b09e24a14a35f8292146a658f986e4", + "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4", "shasum": "" }, "require": { @@ -5468,7 +5476,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.3.2" + "source": "https://github.com/symfony/css-selector/tree/v6.4.0" }, "funding": [ { @@ -5484,20 +5492,20 @@ "type": "tidelift" } ], - "time": "2023-07-12T16:00:22+00:00" + "time": "2023-10-31T08:40:20+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.3.10", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "51383a1d9d7e93d5c3c76ddc32672de1b3e82c77" + "reference": "f88ff6428afbeb17cc648c8003bd608534750baf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/51383a1d9d7e93d5c3c76ddc32672de1b3e82c77", - "reference": "51383a1d9d7e93d5c3c76ddc32672de1b3e82c77", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f88ff6428afbeb17cc648c8003bd608534750baf", + "reference": "f88ff6428afbeb17cc648c8003bd608534750baf", "shasum": "" }, "require": { @@ -5505,7 +5513,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.2.10" + "symfony/var-exporter": "^6.2.10|^7.0" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -5519,9 +5527,9 @@ "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^6.1", - "symfony/expression-language": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "symfony/config": "^6.1|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5549,7 +5557,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.3.10" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.1" }, "funding": [ { @@ -5565,7 +5573,7 @@ "type": "tidelift" } ], - "time": "2023-12-01T14:25:58+00:00" + "time": "2023-12-01T14:56:37+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5636,21 +5644,21 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "8842d289d41320a0f725e996b4e58d84af398a9e" + "reference": "bd181daf2851821c3aef20b779d37002cfd2e833" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/8842d289d41320a0f725e996b4e58d84af398a9e", - "reference": "8842d289d41320a0f725e996b4e58d84af398a9e", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/bd181daf2851821c3aef20b779d37002cfd2e833", + "reference": "bd181daf2851821c3aef20b779d37002cfd2e833", "shasum": "" }, "require": { "doctrine/event-manager": "^1.2|^2", - "doctrine/persistence": "^2|^3", + "doctrine/persistence": "^3.1", "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", @@ -5658,10 +5666,9 @@ "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "doctrine/annotations": "<1.13.1", "doctrine/dbal": "<2.13.1", "doctrine/lexer": "<1.1", - "doctrine/orm": "<2.12", + "doctrine/orm": "<2.15", "symfony/cache": "<5.4", "symfony/dependency-injection": "<6.2", "symfony/form": "<5.4.21|>=6,<6.2.7", @@ -5671,34 +5678,33 @@ "symfony/messenger": "<5.4", "symfony/property-info": "<5.4", "symfony/security-bundle": "<5.4", - "symfony/security-core": "<6.0", - "symfony/validator": "<5.4.25|>=6,<6.2.12|>=6.3,<6.3.1" + "symfony/security-core": "<6.4", + "symfony/validator": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.13.1|^2", "doctrine/collections": "^1.0|^2.0", "doctrine/data-fixtures": "^1.1", "doctrine/dbal": "^2.13.1|^3|^4", - "doctrine/orm": "^2.12|^3", + "doctrine/orm": "^2.15|^3", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0", - "symfony/config": "^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.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", - "symfony/proxy-manager-bridge": "^5.4|^6.0", - "symfony/security-core": "^6.0", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", - "symfony/validator": "^5.4.25|~6.2.12|^6.3.1", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.2|^7.0", + "symfony/doctrine-messenger": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4.21|^6.2.7|^7.0", + "symfony/http-kernel": "^6.3|^7.0", + "symfony/lock": "^6.3|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/proxy-manager-bridge": "^6.4", + "symfony/security-core": "^6.4|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "symfony-bridge", "autoload": { @@ -5726,7 +5732,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.3.8" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.0" }, "funding": [ { @@ -5742,20 +5748,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:07:48+00:00" + "time": "2023-10-31T08:40:20+00:00" }, { "name": "symfony/dotenv", - "version": "v6.3.7", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e" + "reference": "d0d584a91422ddaa2c94317200d4c4e5b935555f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e", - "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/d0d584a91422ddaa2c94317200d4c4e5b935555f", + "reference": "d0d584a91422ddaa2c94317200d4c4e5b935555f", "shasum": "" }, "require": { @@ -5766,8 +5772,8 @@ "symfony/process": "<5.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5800,7 +5806,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.3.7" + "source": "https://github.com/symfony/dotenv/tree/v6.4.0" }, "funding": [ { @@ -5816,34 +5822,35 @@ "type": "tidelift" } ], - "time": "2023-10-26T18:15:14+00:00" + "time": "2023-10-26T18:19:48+00:00" }, { "name": "symfony/error-handler", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "1f69476b64fb47105c06beef757766c376b548c4" + "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/1f69476b64fb47105c06beef757766c376b548c4", - "reference": "1f69476b64fb47105c06beef757766c376b548c4", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c873490a1c97b3a0a4838afc36ff36c112d02788", + "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "conflict": { - "symfony/deprecation-contracts": "<2.5" + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" }, "require-dev": { "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -5874,7 +5881,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.3.5" + "source": "https://github.com/symfony/error-handler/tree/v6.4.0" }, "funding": [ { @@ -5890,20 +5897,20 @@ "type": "tidelift" } ], - "time": "2023-09-12T06:57:20+00:00" + "time": "2023-10-18T09:43:34+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.3.2", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" + "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d76d2632cfc2206eecb5ad2b26cd5934082941b6", + "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6", "shasum": "" }, "require": { @@ -5920,13 +5927,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5954,7 +5961,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.0" }, "funding": [ { @@ -5970,7 +5977,7 @@ "type": "tidelift" } ], - "time": "2023-07-06T06:56:43+00:00" + "time": "2023-07-27T06:52:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -6050,21 +6057,21 @@ }, { "name": "symfony/expression-language", - "version": "v6.3.0", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "6d560c4c80e7e328708efd923f93ad67e6a0c1c0" + "reference": "6c8b12f1e5ee5d91b812fb8628fca86e2fe5d152" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/6d560c4c80e7e328708efd923f93ad67e6a0c1c0", - "reference": "6d560c4c80e7e328708efd923f93ad67e6a0c1c0", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/6c8b12f1e5ee5d91b812fb8628fca86e2fe5d152", + "reference": "6c8b12f1e5ee5d91b812fb8628fca86e2fe5d152", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/cache": "^5.4|^6.0", + "symfony/cache": "^5.4|^6.0|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3" }, @@ -6094,7 +6101,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.3.0" + "source": "https://github.com/symfony/expression-language/tree/v6.4.0" }, "funding": [ { @@ -6110,20 +6117,20 @@ "type": "tidelift" } ], - "time": "2023-04-28T16:05:33+00:00" + "time": "2023-07-27T06:52:43+00:00" }, { "name": "symfony/filesystem", - "version": "v6.3.1", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", "shasum": "" }, "require": { @@ -6157,7 +6164,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.3.1" + "source": "https://github.com/symfony/filesystem/tree/v6.4.0" }, "funding": [ { @@ -6173,27 +6180,27 @@ "type": "tidelift" } ], - "time": "2023-06-01T08:30:39+00:00" + "time": "2023-07-26T17:27:13+00:00" }, { "name": "symfony/finder", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", - "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { - "symfony/filesystem": "^6.0" + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -6221,7 +6228,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.5" + "source": "https://github.com/symfony/finder/tree/v6.4.0" }, "funding": [ { @@ -6237,20 +6244,20 @@ "type": "tidelift" } ], - "time": "2023-09-26T12:56:25+00:00" + "time": "2023-10-31T17:30:12+00:00" }, { "name": "symfony/flex", - "version": "v2.4.1", + "version": "v2.4.2", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "ae6dea68771c5fca9d172e0c0910bdd06199f6f4" + "reference": "67ee785f1aedada76461de7a7ec10cd7f8ff8d36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/ae6dea68771c5fca9d172e0c0910bdd06199f6f4", - "reference": "ae6dea68771c5fca9d172e0c0910bdd06199f6f4", + "url": "https://api.github.com/repos/symfony/flex/zipball/67ee785f1aedada76461de7a7ec10cd7f8ff8d36", + "reference": "67ee785f1aedada76461de7a7ec10cd7f8ff8d36", "shasum": "" }, "require": { @@ -6286,7 +6293,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.4.1" + "source": "https://github.com/symfony/flex/tree/v2.4.2" }, "funding": [ { @@ -6302,31 +6309,31 @@ "type": "tidelift" } ], - "time": "2023-10-30T18:35:17+00:00" + "time": "2023-12-05T14:09:35+00:00" }, { "name": "symfony/form", - "version": "v6.3.10", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "5afc7334b9d60dd0799612faf3d103b25bc60ae4" + "reference": "10649ab710b58a04bcf1886f005ccab58d9cf0a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/5afc7334b9d60dd0799612faf3d103b25bc60ae4", - "reference": "5afc7334b9d60dd0799612faf3d103b25bc60ae4", + "url": "https://api.github.com/repos/symfony/form/zipball/10649ab710b58a04bcf1886f005ccab58d9cf0a4", + "reference": "10649ab710b58a04bcf1886f005ccab58d9cf0a4", "shasum": "" }, "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/options-resolver": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/options-resolver": "^5.4|^6.0|^7.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/property-access": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -6342,20 +6349,20 @@ }, "require-dev": { "doctrine/collections": "^1.0|^2.0", - "symfony/config": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/html-sanitizer": "^6.1", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", - "symfony/security-core": "^6.2", - "symfony/security-csrf": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.2|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -6383,7 +6390,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.3.10" + "source": "https://github.com/symfony/form/tree/v6.4.1" }, "funding": [ { @@ -6399,38 +6406,38 @@ "type": "tidelift" } ], - "time": "2023-11-30T11:08:22+00:00" + "time": "2023-11-30T11:08:34+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.3.9", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "f83d20092e98c3ae8b5874b8f0787546c5c61cda" + "reference": "ac22d760bf9ff4440a1b6c7caef34d38b44290aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/f83d20092e98c3ae8b5874b8f0787546c5c61cda", - "reference": "f83d20092e98c3ae8b5874b8f0787546c5c61cda", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ac22d760bf9ff4440a1b6c7caef34d38b44290aa", + "reference": "ac22d760bf9ff4440a1b6c7caef34d38b44290aa", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", "php": ">=8.1", - "symfony/cache": "^5.4|^6.0", - "symfony/config": "^6.1", - "symfony/dependency-injection": "^6.3.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", "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.3", - "symfony/http-kernel": "^6.3", + "symfony/error-handler": "^6.1|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^5.4|^6.0" + "symfony/routing": "^6.4|^7.0" }, "conflict": { "doctrine/annotations": "<1.13.1", @@ -6438,67 +6445,71 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/asset": "<5.4", + "symfony/asset-mapper": "<6.4", "symfony/clock": "<6.3", "symfony/console": "<5.4", - "symfony/dom-crawler": "<6.3", + "symfony/dom-crawler": "<6.4", "symfony/dotenv": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<6.3", "symfony/lock": "<5.4", "symfony/mailer": "<5.4", "symfony/messenger": "<6.3", - "symfony/mime": "<6.2", + "symfony/mime": "<6.4", "symfony/property-access": "<5.4", "symfony/property-info": "<5.4", + "symfony/scheduler": "<6.4", "symfony/security-core": "<5.4", "symfony/security-csrf": "<5.4", - "symfony/serializer": "<6.3", + "symfony/serializer": "<6.4", "symfony/stopwatch": "<5.4", - "symfony/translation": "<6.2.8", + "symfony/translation": "<6.4", "symfony/twig-bridge": "<5.4", "symfony/twig-bundle": "<5.4", - "symfony/validator": "<6.3", - "symfony/web-profiler-bundle": "<5.4", - "symfony/workflow": "<5.4" + "symfony/validator": "<6.4", + "symfony/web-profiler-bundle": "<6.4", + "symfony/workflow": "<6.4" }, "require-dev": { "doctrine/annotations": "^1.13.1|^2", "doctrine/persistence": "^1.3|^2|^3", + "dragonmantank/cron-expression": "^3.1", "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": "^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": "^6.3", - "symfony/lock": "^5.4|^6.0", - "symfony/mailer": "^5.4|^6.0", - "symfony/messenger": "^6.3", - "symfony/mime": "^6.2", - "symfony/notifier": "^5.4|^6.0", + "seld/jsonlint": "^1.10", + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/console": "^5.4.9|^6.0.9|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/dotenv": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-client": "^6.3|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/mailer": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.3|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/notifier": "^5.4|^6.0|^7.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.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": "^6.3", - "symfony/web-link": "^5.4|^6.0", - "symfony/workflow": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/scheduler": "^6.4|^7.0", + "symfony/security-bundle": "^5.4|^6.0|^7.0", + "symfony/semaphore": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", "twig/twig": "^2.10|^3.0" }, "type": "symfony-bundle", @@ -6527,7 +6538,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.3.9" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.1" }, "funding": [ { @@ -6543,20 +6554,20 @@ "type": "tidelift" } ], - "time": "2023-11-24T10:25:33+00:00" + "time": "2023-12-01T16:35:22+00:00" }, { "name": "symfony/http-client", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "0314e2d49939a9831929d6fc81c01c6df137fd0a" + "reference": "5c584530b77aa10ae216989ffc48b4bedc9c0b29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/0314e2d49939a9831929d6fc81c01c6df137fd0a", - "reference": "0314e2d49939a9831929d6fc81c01c6df137fd0a", + "url": "https://api.github.com/repos/symfony/http-client/zipball/5c584530b77aa10ae216989ffc48b4bedc9c0b29", + "reference": "5c584530b77aa10ae216989ffc48b4bedc9c0b29", "shasum": "" }, "require": { @@ -6585,10 +6596,11 @@ "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -6619,7 +6631,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.3.8" + "source": "https://github.com/symfony/http-client/tree/v6.4.0" }, "funding": [ { @@ -6635,7 +6647,7 @@ "type": "tidelift" } ], - "time": "2023-11-06T18:31:59+00:00" + "time": "2023-11-28T20:55:58+00:00" }, { "name": "symfony/http-client-contracts", @@ -6717,16 +6729,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.3.9", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "49a04fd3a21edc9ce503ab78e9f342805fefe780" + "reference": "44a6d39a9cc11e154547d882d5aac1e014440771" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49a04fd3a21edc9ce503ab78e9f342805fefe780", - "reference": "49a04fd3a21edc9ce503ab78e9f342805fefe780", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/44a6d39a9cc11e154547d882d5aac1e014440771", + "reference": "44a6d39a9cc11e154547d882d5aac1e014440771", "shasum": "" }, "require": { @@ -6741,12 +6753,12 @@ "require-dev": { "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.3", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^5.4|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -6774,7 +6786,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.9" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.0" }, "funding": [ { @@ -6790,29 +6802,29 @@ "type": "tidelift" } ], - "time": "2023-11-20T16:36:29+00:00" + "time": "2023-11-20T16:41:16+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.3.10", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "8d8e7aa60593fd0a2e3c1cea08cc687314841b61" + "reference": "2953274c16a229b3933ef73a6898e18388e12e1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8d8e7aa60593fd0a2e3c1cea08cc687314841b61", - "reference": "8d8e7aa60593fd0a2e3c1cea08cc687314841b61", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2953274c16a229b3933ef73a6898e18388e12e1b", + "reference": "2953274c16a229b3933ef73a6898e18388e12e1b", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.3", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^6.3.4", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -6820,7 +6832,7 @@ "symfony/cache": "<5.4", "symfony/config": "<6.1", "symfony/console": "<5.4", - "symfony/dependency-injection": "<6.3.4", + "symfony/dependency-injection": "<6.4", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", @@ -6830,7 +6842,7 @@ "symfony/translation": "<5.4", "symfony/translation-contracts": "<2.5", "symfony/twig-bridge": "<5.4", - "symfony/validator": "<5.4", + "symfony/validator": "<6.4", "symfony/var-dumper": "<6.3", "twig/twig": "<2.13" }, @@ -6839,26 +6851,26 @@ }, "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.3.4", - "symfony/dom-crawler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", "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/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0", - "symfony/validator": "^6.3", - "symfony/var-exporter": "^6.2", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, "type": "library", @@ -6887,7 +6899,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.3.10" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.1" }, "funding": [ { @@ -6903,29 +6915,29 @@ "type": "tidelift" } ], - "time": "2023-12-01T16:57:27+00:00" + "time": "2023-12-01T17:02:02+00:00" }, { "name": "symfony/intl", - "version": "v6.3.7", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "4cc98c05f2c55150a6aa5b3e20667f7a6d06cca9" + "reference": "41d16f0294b9ca6e5540728580c65cfa3848fbf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/4cc98c05f2c55150a6aa5b3e20667f7a6d06cca9", - "reference": "4cc98c05f2c55150a6aa5b3e20667f7a6d06cca9", + "url": "https://api.github.com/repos/symfony/intl/zipball/41d16f0294b9ca6e5540728580c65cfa3848fbf5", + "reference": "41d16f0294b9ca6e5540728580c65cfa3848fbf5", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { - "symfony/filesystem": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -6969,7 +6981,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.3.7" + "source": "https://github.com/symfony/intl/tree/v6.4.0" }, "funding": [ { @@ -6985,20 +6997,20 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:11:45+00:00" + "time": "2023-10-28T23:12:08+00:00" }, { "name": "symfony/mailer", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06" + "reference": "ca8dcf8892cdc5b4358ecf2528429bb5e706f7ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/d89611a7830d51b5e118bca38e390dea92f9ea06", - "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06", + "url": "https://api.github.com/repos/symfony/mailer/zipball/ca8dcf8892cdc5b4358ecf2528429bb5e706f7ba", + "reference": "ca8dcf8892cdc5b4358ecf2528429bb5e706f7ba", "shasum": "" }, "require": { @@ -7006,8 +7018,8 @@ "php": ">=8.1", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/mime": "^6.2", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -7018,10 +7030,10 @@ "symfony/twig-bridge": "<6.2.1" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/messenger": "^6.2", - "symfony/twig-bridge": "^6.2" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" }, "type": "library", "autoload": { @@ -7049,7 +7061,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.3.5" + "source": "https://github.com/symfony/mailer/tree/v6.4.0" }, "funding": [ { @@ -7065,20 +7077,20 @@ "type": "tidelift" } ], - "time": "2023-09-06T09:47:15+00:00" + "time": "2023-11-12T18:02:22+00:00" }, { "name": "symfony/mime", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" + "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", - "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "url": "https://api.github.com/repos/symfony/mime/zipball/ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", + "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", "shasum": "" }, "require": { @@ -7092,16 +7104,16 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" + "symfony/serializer": "<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "~6.2.13|^6.3.2" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3.2|^7.0" }, "type": "library", "autoload": { @@ -7133,7 +7145,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.5" + "source": "https://github.com/symfony/mime/tree/v6.4.0" }, "funding": [ { @@ -7149,26 +7161,27 @@ "type": "tidelift" } ], - "time": "2023-09-29T06:59:36+00:00" + "time": "2023-10-17T11:49:05+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "2bbfc8bd9d6f966b69eda20c66762580a0410c78" + "reference": "c262c2f54ce7e160a231808817f306f880c32750" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/2bbfc8bd9d6f966b69eda20c66762580a0410c78", - "reference": "2bbfc8bd9d6f966b69eda20c66762580a0410c78", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/c262c2f54ce7e160a231808817f306f880c32750", + "reference": "c262c2f54ce7e160a231808817f306f880c32750", "shasum": "" }, "require": { "monolog/monolog": "^1.25.1|^2|^3", "php": ">=8.1", - "symfony/http-kernel": "^5.4|^6.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -7177,13 +7190,13 @@ "symfony/security-core": "<6.0" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/mailer": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/security-core": "^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/mailer": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "symfony-bridge", "autoload": { @@ -7211,7 +7224,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v6.3.8" + "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.0" }, "funding": [ { @@ -7227,7 +7240,7 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:07:48+00:00" + "time": "2023-10-31T08:18:17+00:00" }, { "name": "symfony/monolog-bundle", @@ -7312,16 +7325,16 @@ }, { "name": "symfony/options-resolver", - "version": "v6.3.0", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" + "reference": "22301f0e7fdeaacc14318928612dee79be99860e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22301f0e7fdeaacc14318928612dee79be99860e", + "reference": "22301f0e7fdeaacc14318928612dee79be99860e", "shasum": "" }, "require": { @@ -7359,7 +7372,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" + "source": "https://github.com/symfony/options-resolver/tree/v6.4.0" }, "funding": [ { @@ -7375,20 +7388,20 @@ "type": "tidelift" } ], - "time": "2023-05-12T14:21:09+00:00" + "time": "2023-08-08T10:16:24+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "82161c4bebf77900372083ec6e484b5f055b0cba" + "reference": "e001f752338a49d644ee0523fd7891aabaccb7e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/82161c4bebf77900372083ec6e484b5f055b0cba", - "reference": "82161c4bebf77900372083ec6e484b5f055b0cba", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/e001f752338a49d644ee0523fd7891aabaccb7e2", + "reference": "e001f752338a49d644ee0523fd7891aabaccb7e2", "shasum": "" }, "require": { @@ -7398,8 +7411,8 @@ "symfony/security-core": "<5.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/security-core": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/security-core": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -7431,7 +7444,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.3.8" + "source": "https://github.com/symfony/password-hasher/tree/v6.4.0" }, "funding": [ { @@ -7447,7 +7460,7 @@ "type": "tidelift" } ], - "time": "2023-11-06T10:58:05+00:00" + "time": "2023-11-06T11:00:25+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -7870,25 +7883,25 @@ }, { "name": "symfony/property-access", - "version": "v6.3.2", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "2dc4f9da444b8f8ff592e95d570caad67924f1d0" + "reference": "75f6990ae8e8040dd587162f3f1863f755957129" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/2dc4f9da444b8f8ff592e95d570caad67924f1d0", - "reference": "2dc4f9da444b8f8ff592e95d570caad67924f1d0", + "url": "https://api.github.com/repos/symfony/property-access/zipball/75f6990ae8e8040dd587162f3f1863f755957129", + "reference": "75f6990ae8e8040dd587162f3f1863f755957129", "shasum": "" }, "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/property-info": "^5.4|^6.0" + "symfony/property-info": "^5.4|^6.0|^7.0" }, "require-dev": { - "symfony/cache": "^5.4|^6.0" + "symfony/cache": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -7927,7 +7940,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.3.2" + "source": "https://github.com/symfony/property-access/tree/v6.4.0" }, "funding": [ { @@ -7943,38 +7956,38 @@ "type": "tidelift" } ], - "time": "2023-07-13T15:26:11+00:00" + "time": "2023-09-25T12:52:38+00:00" }, { "name": "symfony/property-info", - "version": "v6.3.9", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "664ae7ad443d7cc591ff3e15496b954e4cefe729" + "reference": "288be71bae2ebc88676f5d3a03d23f70b278fcc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/664ae7ad443d7cc591ff3e15496b954e4cefe729", - "reference": "664ae7ad443d7cc591ff3e15496b954e4cefe729", + "url": "https://api.github.com/repos/symfony/property-info/zipball/288be71bae2ebc88676f5d3a03d23f70b278fcc1", + "reference": "288be71bae2ebc88676f5d3a03d23f70b278fcc1", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/string": "^5.4|^6.0" + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/serializer": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", "phpdocumentor/reflection-docblock": "^5.2", "phpstan/phpdoc-parser": "^1.0", - "symfony/cache": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8010,7 +8023,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.3.9" + "source": "https://github.com/symfony/property-info/tree/v6.4.0" }, "funding": [ { @@ -8026,29 +8039,30 @@ "type": "tidelift" } ], - "time": "2023-11-24T11:57:32+00:00" + "time": "2023-11-25T16:57:46+00:00" }, { "name": "symfony/rate-limiter", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "9e65b2ec0816a2fd3406f26d036c5a1b6feee101" + "reference": "b598ae785a3b3ee932c1fb638b1df86f0d36f81e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/9e65b2ec0816a2fd3406f26d036c5a1b6feee101", - "reference": "9e65b2ec0816a2fd3406f26d036c5a1b6feee101", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/b598ae785a3b3ee932c1fb638b1df86f0d36f81e", + "reference": "b598ae785a3b3ee932c1fb638b1df86f0d36f81e", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/options-resolver": "^5.4|^6.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/options-resolver": "^5.4|^6.0|^7.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/lock": "^5.4|^6.0" + "symfony/lock": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8080,7 +8094,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v6.3.8" + "source": "https://github.com/symfony/rate-limiter/tree/v6.4.0" }, "funding": [ { @@ -8096,20 +8110,20 @@ "type": "tidelift" } ], - "time": "2023-11-10T07:40:52+00:00" + "time": "2023-11-10T07:41:05+00:00" }, { "name": "symfony/routing", - "version": "v6.3.10", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "cb7404232d49dd11cc971b832fcbd49e7c22b049" + "reference": "0c95c164fdba18b12523b75e64199ca3503e6d40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/cb7404232d49dd11cc971b832fcbd49e7c22b049", - "reference": "cb7404232d49dd11cc971b832fcbd49e7c22b049", + "url": "https://api.github.com/repos/symfony/routing/zipball/0c95c164fdba18b12523b75e64199ca3503e6d40", + "reference": "0c95c164fdba18b12523b75e64199ca3503e6d40", "shasum": "" }, "require": { @@ -8125,11 +8139,11 @@ "require-dev": { "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^6.2", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8163,7 +8177,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.3.10" + "source": "https://github.com/symfony/routing/tree/v6.4.1" }, "funding": [ { @@ -8179,20 +8193,20 @@ "type": "tidelift" } ], - "time": "2023-12-01T14:25:58+00:00" + "time": "2023-12-01T14:54:37+00:00" }, { "name": "symfony/runtime", - "version": "v6.3.2", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "d5c09493647a0c1a16e6c8da308098e840d1164f" + "reference": "86539231fadfdc7f7e9911d6fa7ed84a606e7d34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/d5c09493647a0c1a16e6c8da308098e840d1164f", - "reference": "d5c09493647a0c1a16e6c8da308098e840d1164f", + "url": "https://api.github.com/repos/symfony/runtime/zipball/86539231fadfdc7f7e9911d6fa7ed84a606e7d34", + "reference": "86539231fadfdc7f7e9911d6fa7ed84a606e7d34", "shasum": "" }, "require": { @@ -8204,10 +8218,10 @@ }, "require-dev": { "composer/composer": "^1.0.2|^2.0", - "symfony/console": "^5.4.9|^6.0.9", - "symfony/dotenv": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0" + "symfony/console": "^5.4.9|^6.0.9|^7.0", + "symfony/dotenv": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" }, "type": "composer-plugin", "extra": { @@ -8242,7 +8256,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v6.3.2" + "source": "https://github.com/symfony/runtime/tree/v6.4.0" }, "funding": [ { @@ -8258,67 +8272,68 @@ "type": "tidelift" } ], - "time": "2023-07-16T17:05:46+00:00" + "time": "2023-10-18T09:43:34+00:00" }, { "name": "symfony/security-bundle", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "57889ebb1ac3403d550c787c4fde127261abacb6" + "reference": "4fd31b7cb2a18f62c5a8588b82a44fd240b41a9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/57889ebb1ac3403d550c787c4fde127261abacb6", - "reference": "57889ebb1ac3403d550c787c4fde127261abacb6", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/4fd31b7cb2a18f62c5a8588b82a44fd240b41a9e", + "reference": "4fd31b7cb2a18f62c5a8588b82a44fd240b41a9e", "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/clock": "^6.3|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.2|^7.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^6.2", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.2|^7.0", "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.3.6", + "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.2|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/security-http": "^6.3.6|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/browser-kit": "<5.4", "symfony/console": "<5.4", - "symfony/framework-bundle": "<6.3", + "symfony/framework-bundle": "<6.4", "symfony/http-client": "<5.4", "symfony/ldap": "<5.4", - "symfony/twig-bundle": "<5.4" + "symfony/serializer": "<6.4", + "symfony/twig-bundle": "<5.4", + "symfony/validator": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", - "symfony/asset": "^5.4|^6.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/css-selector": "^5.4|^6.0", - "symfony/dom-crawler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/form": "^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", - "symfony/serializer": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/twig-bridge": "^5.4|^6.0", - "symfony/twig-bundle": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0", + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/ldap": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/twig-bridge": "^5.4|^6.0|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", "twig/twig": "^2.13|^3.0.4", "web-token/jwt-checker": "^3.1", "web-token/jwt-signature-algorithm-ecdsa": "^3.1", @@ -8353,7 +8368,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.3.8" + "source": "https://github.com/symfony/security-bundle/tree/v6.4.0" }, "funding": [ { @@ -8369,27 +8384,27 @@ "type": "tidelift" } ], - "time": "2023-11-09T09:33:10+00:00" + "time": "2023-10-31T14:46:20+00:00" }, { "name": "symfony/security-core", - "version": "v6.3.7", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "7ceb30fed93f5ea40ccde3173d1f7712527c0d62" + "reference": "9e24a7199744d944c03fc1448276dc57f6237a33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/7ceb30fed93f5ea40ccde3173d1f7712527c0d62", - "reference": "7ceb30fed93f5ea40ccde3173d1f7712527c0d62", + "url": "https://api.github.com/repos/symfony/security-core/zipball/9e24a7199744d944c03fc1448276dc57f6237a33", + "reference": "9e24a7199744d944c03fc1448276dc57f6237a33", "shasum": "" }, "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3", - "symfony/password-hasher": "^5.4|^6.0", + "symfony/password-hasher": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -8403,14 +8418,14 @@ "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.1|^2.0", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "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" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/ldap": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8438,7 +8453,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.3.7" + "source": "https://github.com/symfony/security-core/tree/v6.4.0" }, "funding": [ { @@ -8454,31 +8469,31 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:11:45+00:00" + "time": "2023-11-06T17:20:05+00:00" }, { "name": "symfony/security-csrf", - "version": "v6.3.2", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "63d7b098c448cbddb46ea5eda33b68c1ece6eb5b" + "reference": "b28413496ebfce2f98afbb990ad0ce0ba3586638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/63d7b098c448cbddb46ea5eda33b68c1ece6eb5b", - "reference": "63d7b098c448cbddb46ea5eda33b68c1ece6eb5b", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/b28413496ebfce2f98afbb990ad0ce0ba3586638", + "reference": "b28413496ebfce2f98afbb990ad0ce0ba3586638", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/security-core": "^5.4|^6.0" + "symfony/security-core": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/http-foundation": "<5.4" }, "require-dev": { - "symfony/http-foundation": "^5.4|^6.0" + "symfony/http-foundation": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8506,7 +8521,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v6.3.2" + "source": "https://github.com/symfony/security-csrf/tree/v6.4.0" }, "funding": [ { @@ -8522,30 +8537,30 @@ "type": "tidelift" } ], - "time": "2023-07-05T08:41:27+00:00" + "time": "2023-08-25T16:27:31+00:00" }, { "name": "symfony/security-http", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "19f7b5f5d20879a976d6d376e359bc975dfc6002" + "reference": "1b49ad8e9f2c3ceec011d67ac09e774e4107416b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/19f7b5f5d20879a976d6d376e359bc975dfc6002", - "reference": "19f7b5f5d20879a976d6d376e359bc975dfc6002", + "url": "https://api.github.com/repos/symfony/security-http/zipball/1b49ad8e9f2c3ceec011d67ac09e774e4107416b", + "reference": "1b49ad8e9f2c3ceec011d67ac09e774e4107416b", "shasum": "" }, "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^6.3", + "symfony/http-foundation": "^6.2|^7.0", + "symfony/http-kernel": "^6.3|^7.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/security-core": "^6.3", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -8557,14 +8572,14 @@ }, "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/cache": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.3|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.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", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", "web-token/jwt-checker": "^3.1", "web-token/jwt-signature-algorithm-ecdsa": "^3.1" }, @@ -8594,7 +8609,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.3.8" + "source": "https://github.com/symfony/security-http/tree/v6.4.0" }, "funding": [ { @@ -8610,20 +8625,20 @@ "type": "tidelift" } ], - "time": "2023-11-09T21:20:12+00:00" + "time": "2023-11-24T21:18:21+00:00" }, { "name": "symfony/serializer", - "version": "v6.3.10", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "6eee0fd95f5caa1e77cab29552620ebf8e5b1a5f" + "reference": "7ead272e62c9567df619ef3c49809bf934ddbc1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/6eee0fd95f5caa1e77cab29552620ebf8e5b1a5f", - "reference": "6eee0fd95f5caa1e77cab29552620ebf8e5b1a5f", + "url": "https://api.github.com/repos/symfony/serializer/zipball/7ead272e62c9567df619ef3c49809bf934ddbc1f", + "reference": "7ead272e62c9567df619ef3c49809bf934ddbc1f", "shasum": "" }, "require": { @@ -8639,28 +8654,32 @@ "symfony/property-access": "<5.4", "symfony/property-info": "<5.4.24|>=6,<6.2.11", "symfony/uid": "<5.4", + "symfony/validator": "<6.4", "symfony/yaml": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12|^2", "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", - "symfony/form": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4.24|^6.2.11", - "symfony/uid": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0", - "symfony/var-exporter": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "seld/jsonlint": "^1.10", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4.24|^6.2.11|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8688,7 +8707,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.3.10" + "source": "https://github.com/symfony/serializer/tree/v6.4.1" }, "funding": [ { @@ -8704,7 +8723,7 @@ "type": "tidelift" } ], - "time": "2023-12-01T14:25:58+00:00" + "time": "2023-12-01T14:54:37+00:00" }, { "name": "symfony/service-contracts", @@ -8790,7 +8809,7 @@ }, { "name": "symfony/stopwatch", - "version": "v6.3.0", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -8832,7 +8851,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.0" }, "funding": [ { @@ -8852,16 +8871,16 @@ }, { "name": "symfony/string", - "version": "v6.3.9", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "56427887aeaf540e9bbd121ad6c43f14ad3ce136" + "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/56427887aeaf540e9bbd121ad6c43f14ad3ce136", - "reference": "56427887aeaf540e9bbd121ad6c43f14ad3ce136", + "url": "https://api.github.com/repos/symfony/string/zipball/b45fcf399ea9c3af543a92edf7172ba21174d809", + "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809", "shasum": "" }, "require": { @@ -8875,11 +8894,11 @@ "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/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8918,7 +8937,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.9" + "source": "https://github.com/symfony/string/tree/v6.4.0" }, "funding": [ { @@ -8934,20 +8953,20 @@ "type": "tidelift" } ], - "time": "2023-11-28T20:40:29+00:00" + "time": "2023-11-28T20:41:49+00:00" }, { "name": "symfony/translation", - "version": "v6.3.7", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499" + "reference": "b1035dbc2a344b21f8fa8ac451c7ecec4ea45f37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/30212e7c87dcb79c83f6362b00bde0e0b1213499", - "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499", + "url": "https://api.github.com/repos/symfony/translation/zipball/b1035dbc2a344b21f8fa8ac451c7ecec4ea45f37", + "reference": "b1035dbc2a344b21f8fa8ac451c7ecec4ea45f37", "shasum": "" }, "require": { @@ -8972,17 +8991,17 @@ "require-dev": { "nikic/php-parser": "^4.13", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0" + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -9013,7 +9032,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.3.7" + "source": "https://github.com/symfony/translation/tree/v6.4.0" }, "funding": [ { @@ -9029,7 +9048,7 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:11:45+00:00" + "time": "2023-11-29T08:14:36+00:00" }, { "name": "symfony/translation-contracts", @@ -9111,20 +9130,21 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "c51407623959a626784ff302419026f56dc4e1ba" + "reference": "142bc3ad4a61d7eedf7cc21d8ef2bd8a8e7417bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/c51407623959a626784ff302419026f56dc4e1ba", - "reference": "c51407623959a626784ff302419026f56dc4e1ba", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/142bc3ad4a61d7eedf7cc21d8ef2bd8a8e7417bf", + "reference": "142bc3ad4a61d7eedf7cc21d8ef2bd8a8e7417bf", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3", "twig/twig": "^2.13|^3.0.4" }, @@ -9134,41 +9154,41 @@ "symfony/console": "<5.4", "symfony/form": "<6.3", "symfony/http-foundation": "<5.4", - "symfony/http-kernel": "<6.2", + "symfony/http-kernel": "<6.4", "symfony/mime": "<6.2", + "symfony/serializer": "<6.4", "symfony/translation": "<5.4", "symfony/workflow": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "egulias/email-validator": "^2.1.10|^3|^4", "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.3", - "symfony/html-sanitizer": "^6.1", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^6.2", - "symfony/intl": "^5.4|^6.0", - "symfony/mime": "^6.2", + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/asset-mapper": "^6.3|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/routing": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^5.4|^6.0", - "symfony/security-csrf": "^5.4|^6.0", - "symfony/security-http": "^5.4|^6.0", - "symfony/serializer": "^6.2", - "symfony/stopwatch": "^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", + "symfony/security-core": "^5.4|^6.0|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/security-http": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^6.1|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0", + "symfony/workflow": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", "twig/cssinliner-extra": "^2.12|^3", "twig/inky-extra": "^2.12|^3", "twig/markdown-extra": "^2.12|^3" @@ -9199,7 +9219,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.3.8" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.0" }, "funding": [ { @@ -9215,30 +9235,30 @@ "type": "tidelift" } ], - "time": "2023-11-09T21:20:12+00:00" + "time": "2023-11-25T08:25:13+00:00" }, { "name": "symfony/twig-bundle", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "82429320fe931dd50825ec08140c54b3a315bf79" + "reference": "35d84393e598dfb774e6a2bf49e5229a8a6dbe4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/82429320fe931dd50825ec08140c54b3a315bf79", - "reference": "82429320fe931dd50825ec08140c54b3a315bf79", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/35d84393e598dfb774e6a2bf49e5229a8a6dbe4c", + "reference": "35d84393e598dfb774e6a2bf49e5229a8a6dbe4c", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "php": ">=8.1", - "symfony/config": "^6.1", - "symfony/dependency-injection": "^6.1", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.1|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/http-kernel": "^6.2", - "symfony/twig-bridge": "^6.3", + "symfony/twig-bridge": "^6.4", "twig/twig": "^2.13|^3.0.4" }, "conflict": { @@ -9246,17 +9266,16 @@ "symfony/translation": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", - "symfony/asset": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/form": "^5.4|^6.0", - "symfony/framework-bundle": "^5.4|^6.0", - "symfony/routing": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/web-link": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "symfony-bundle", "autoload": { @@ -9284,7 +9303,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.3.8" + "source": "https://github.com/symfony/twig-bundle/tree/v6.4.0" }, "funding": [ { @@ -9300,20 +9319,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:07:48+00:00" + "time": "2023-11-07T14:57:07+00:00" }, { "name": "symfony/validator", - "version": "v6.3.9", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "c118889931856af47b0732b609f3ac2ddccd1da6" + "reference": "33e1f3bb76ef70e3170e12f878aefb9c69b0fc4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/c118889931856af47b0732b609f3ac2ddccd1da6", - "reference": "c118889931856af47b0732b609f3ac2ddccd1da6", + "url": "https://api.github.com/repos/symfony/validator/zipball/33e1f3bb76ef70e3170e12f878aefb9c69b0fc4c", + "reference": "33e1f3bb76ef70e3170e12f878aefb9c69b0fc4c", "shasum": "" }, "require": { @@ -9338,21 +9357,21 @@ "require-dev": { "doctrine/annotations": "^1.13|^2", "egulias/email-validator": "^2.1.10|^3|^4", - "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/expression-language": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -9380,7 +9399,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.3.9" + "source": "https://github.com/symfony/validator/tree/v6.4.0" }, "funding": [ { @@ -9396,20 +9415,20 @@ "type": "tidelift" } ], - "time": "2023-11-29T07:44:47+00:00" + "time": "2023-11-29T07:47:42+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a" + "reference": "c40f7d17e91d8b407582ed51a2bbf83c52c367f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/81acabba9046550e89634876ca64bfcd3c06aa0a", - "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c40f7d17e91d8b407582ed51a2bbf83c52c367f6", + "reference": "c40f7d17e91d8b407582ed51a2bbf83c52c367f6", "shasum": "" }, "require": { @@ -9422,10 +9441,11 @@ }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", "twig/twig": "^2.13|^3.0.4" }, "bin": [ @@ -9464,7 +9484,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.8" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.0" }, "funding": [ { @@ -9480,27 +9500,28 @@ "type": "tidelift" } ], - "time": "2023-11-08T10:42:36+00:00" + "time": "2023-11-09T08:28:32+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.3.10", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "7bfcf232a9c7e4acad00e96774e340eb86d10bf0" + "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7bfcf232a9c7e4acad00e96774e340eb86d10bf0", - "reference": "7bfcf232a9c7e4acad00e96774e340eb86d10bf0", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2d08ca6b9cc704dce525615d1e6d1788734f36d9", + "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/var-dumper": "^5.4|^6.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -9538,7 +9559,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.3.10" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.1" }, "funding": [ { @@ -9554,7 +9575,7 @@ "type": "tidelift" } ], - "time": "2023-11-29T16:00:50+00:00" + "time": "2023-11-30T10:32:10+00:00" }, { "name": "symfony/webpack-encore-bundle", @@ -9629,16 +9650,16 @@ }, { "name": "symfony/yaml", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92" + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/3493af8a8dad7fa91c77fa473ba23ecd95334a92", - "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", "shasum": "" }, "require": { @@ -9650,7 +9671,7 @@ "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -9681,7 +9702,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.3.8" + "source": "https://github.com/symfony/yaml/tree/v6.4.0" }, "funding": [ { @@ -9697,27 +9718,27 @@ "type": "tidelift" } ], - "time": "2023-11-06T10:58:05+00:00" + "time": "2023-11-06T11:00:25+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.6", + "version": "v2.2.7", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", - "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "php": "^5.5 || ^7.0 || ^8.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" @@ -9748,9 +9769,9 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" }, - "time": "2023-01-03T09:29:04+00:00" + "time": "2023-12-08T13:03:43+00:00" }, { "name": "twig/cssinliner-extra", @@ -10319,20 +10340,19 @@ }, { "name": "zircote/swagger-php", - "version": "4.7.16", + "version": "4.8.1", "source": { "type": "git", "url": "https://github.com/zircote/swagger-php.git", - "reference": "21366a8c43819457d458e772a4e86d0df9233b5e" + "reference": "2a2ae434965f5c497713e05d1398fc9476dfdeb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zircote/swagger-php/zipball/21366a8c43819457d458e772a4e86d0df9233b5e", - "reference": "21366a8c43819457d458e772a4e86d0df9233b5e", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/2a2ae434965f5c497713e05d1398fc9476dfdeb0", + "reference": "2a2ae434965f5c497713e05d1398fc9476dfdeb0", "shasum": "" }, "require": { - "doctrine/annotations": "^1.7 || ^2.0", "ext-json": "*", "php": ">=7.2", "psr/log": "^1.1 || ^2.0 || ^3.0", @@ -10342,11 +10362,15 @@ }, "require-dev": { "composer/package-versions-deprecated": "^1.11", + "doctrine/annotations": "^1.7 || ^2.0", "friendsofphp/php-cs-fixer": "^2.17 || ^3.0", "phpstan/phpstan": "^1.6", "phpunit/phpunit": ">=8", "vimeo/psalm": "^4.23" }, + "suggest": { + "doctrine/annotations": "^1.7 || ^2.0" + }, "bin": [ "bin/openapi" ], @@ -10391,9 +10415,9 @@ ], "support": { "issues": "https://github.com/zircote/swagger-php/issues", - "source": "https://github.com/zircote/swagger-php/tree/4.7.16" + "source": "https://github.com/zircote/swagger-php/tree/4.8.1" }, - "time": "2023-11-30T21:47:39+00:00" + "time": "2023-12-11T08:35:08+00:00" } ], "packages-dev": [ @@ -10842,16 +10866,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.40.0", + "version": "v3.41.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "27d2b3265b5d550ec411b4319967ae7cfddfb2e0" + "reference": "8b6ae8dcbaf23f09680643ab832a4a3a260265f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/27d2b3265b5d550ec411b4319967ae7cfddfb2e0", - "reference": "27d2b3265b5d550ec411b4319967ae7cfddfb2e0", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/8b6ae8dcbaf23f09680643ab832a4a3a260265f6", + "reference": "8b6ae8dcbaf23f09680643ab832a4a3a260265f6", "shasum": "" }, "require": { @@ -10881,8 +10905,6 @@ "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", - "phpspec/prophecy": "^1.17", - "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.6", "symfony/phpunit-bridge": "^6.3.8 || ^7.0", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" @@ -10923,7 +10945,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.40.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.41.1" }, "funding": [ { @@ -10931,7 +10953,7 @@ "type": "github" } ], - "time": "2023-11-26T09:25:53+00:00" + "time": "2023-12-10T19:59:27+00:00" }, { "name": "masterminds/html5", @@ -11002,16 +11024,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -11052,9 +11074,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "phar-io/manifest", @@ -11169,16 +11191,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.47", + "version": "1.10.50", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39" + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", - "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/06a98513ac72c03e8366b5a0cb00750b487032e4", + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4", "shasum": "" }, "require": { @@ -11227,7 +11249,7 @@ "type": "tidelift" } ], - "time": "2023-12-01T15:19:17+00:00" + "time": "2023-12-13T10:59:42+00:00" }, { "name": "phpstan/phpstan-doctrine", @@ -12859,27 +12881,27 @@ }, { "name": "symfony/browser-kit", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "e270297dbee59168274c2b535ab1bccd593e6ffe" + "reference": "a3bb210e001580ec75e1d02b27fae3452e6bf502" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/e270297dbee59168274c2b535ab1bccd593e6ffe", - "reference": "e270297dbee59168274c2b535ab1bccd593e6ffe", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/a3bb210e001580ec75e1d02b27fae3452e6bf502", + "reference": "a3bb210e001580ec75e1d02b27fae3452e6bf502", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/dom-crawler": "^5.4|^6.0" + "symfony/dom-crawler": "^5.4|^6.0|^7.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0" + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -12907,7 +12929,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.3.8" + "source": "https://github.com/symfony/browser-kit/tree/v6.4.0" }, "funding": [ { @@ -12923,37 +12945,37 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:07:48+00:00" + "time": "2023-10-31T08:18:17+00:00" }, { "name": "symfony/debug-bundle", - "version": "v6.3.2", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "3f04a578e1a9f1d7da84a87b690c03123e5d8c31" + "reference": "1e07027423d1d37125b60a50997ada26a9d9d202" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/3f04a578e1a9f1d7da84a87b690c03123e5d8c31", - "reference": "3f04a578e1a9f1d7da84a87b690c03123e5d8c31", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/1e07027423d1d37125b60a50997ada26a9d9d202", + "reference": "1e07027423d1d37125b60a50997ada26a9d9d202", "shasum": "" }, "require": { "ext-xml": "*", "php": ">=8.1", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/twig-bridge": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/twig-bridge": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/config": "<5.4", "symfony/dependency-injection": "<5.4" }, "require-dev": { - "symfony/config": "^5.4|^6.0", - "symfony/web-profiler-bundle": "^5.4|^6.0" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0" }, "type": "symfony-bundle", "autoload": { @@ -12981,7 +13003,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.3.2" + "source": "https://github.com/symfony/debug-bundle/tree/v6.4.0" }, "funding": [ { @@ -12997,20 +13019,20 @@ "type": "tidelift" } ], - "time": "2023-07-13T14:29:38+00:00" + "time": "2023-11-01T12:07:38+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.3.9", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "b7065c123ae977a008568a3d016a17a110df7a8e" + "reference": "14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b7065c123ae977a008568a3d016a17a110df7a8e", - "reference": "b7065c123ae977a008568a3d016a17a110df7a8e", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33", + "reference": "14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33", "shasum": "" }, "require": { @@ -13020,7 +13042,7 @@ "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0" + "symfony/css-selector": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -13048,7 +13070,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.3.9" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.0" }, "funding": [ { @@ -13064,7 +13086,7 @@ "type": "tidelift" } ], - "time": "2023-11-20T16:36:29+00:00" + "time": "2023-11-20T16:41:16+00:00" }, { "name": "symfony/phpunit-bridge", @@ -13149,16 +13171,16 @@ }, { "name": "symfony/process", - "version": "v6.3.4", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" + "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", - "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", + "url": "https://api.github.com/repos/symfony/process/zipball/191703b1566d97a5425dc969e4350d32b8ef17aa", + "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa", "shasum": "" }, "require": { @@ -13190,7 +13212,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.3.4" + "source": "https://github.com/symfony/process/tree/v6.4.0" }, "funding": [ { @@ -13206,41 +13228,42 @@ "type": "tidelift" } ], - "time": "2023-08-07T10:39:22+00:00" + "time": "2023-11-17T21:06:49+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "4167c20cbdbb1152007fa731718c8c0362f28617" + "reference": "14752d3fb77c3c69b6cee7c03c06e2d6494a196b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/4167c20cbdbb1152007fa731718c8c0362f28617", - "reference": "4167c20cbdbb1152007fa731718c8c0362f28617", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/14752d3fb77c3c69b6cee7c03c06e2d6494a196b", + "reference": "14752d3fb77c3c69b6cee7c03c06e2d6494a196b", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/config": "^5.4|^6.0", - "symfony/framework-bundle": "^5.4|^6.0,<6.4", - "symfony/http-kernel": "^6.3", - "symfony/routing": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", "symfony/twig-bundle": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, "conflict": { "symfony/form": "<5.4", "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4" + "symfony/messenger": "<5.4", + "symfony/twig-bundle": ">=7.0" }, "require-dev": { - "symfony/browser-kit": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/css-selector": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "symfony-bundle", "autoload": { @@ -13271,7 +13294,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.3.8" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.0" }, "funding": [ { @@ -13287,7 +13310,7 @@ "type": "tidelift" } ], - "time": "2023-10-31T14:41:59+00:00" + "time": "2023-11-07T14:57:07+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index 30a2df2e..cad3a437 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -1,4 +1,11 @@ framework: + # Deprecations for 7.0 + handle_all_throwables: true + # cannot be disabled, because of https://github.com/nelmio/NelmioApiDocBundle/pull/2164 + annotations: + enabled: true + # --------------------------- + exceptions: App\Validator\ValidationFailedException: log_level: debug diff --git a/phpstan.neon b/phpstan.neon index 3962b3e5..705ed50b 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -636,16 +636,6 @@ parameters: count: 1 path: src/Command/TranslationCommand.php - - - message: "#^Cannot access property \\$original on SimpleXMLElement\\|null\\.$#" - count: 1 - path: src/Command/TranslationCommand.php - - - - message: "#^Cannot access property \\$target\\-language on SimpleXMLElement\\|null\\.$#" - count: 1 - path: src/Command/TranslationCommand.php - - message: "#^Cannot call method asXML\\(\\) on SimpleXMLElement\\|false\\.$#" count: 5 @@ -816,11 +806,6 @@ parameters: count: 1 path: src/Configuration/SystemConfiguration.php - - - message: "#^Method App\\\\Configuration\\\\SystemConfiguration\\:\\:getThemeColorChoices\\(\\) should return string\\|null but returns float\\|int\\\\|int\\<1, max\\>\\|string\\|true\\.$#" - count: 1 - path: src/Configuration/SystemConfiguration.php - - message: "#^Method App\\\\Configuration\\\\SystemConfiguration\\:\\:getUserDefaultCurrency\\(\\) should return string but returns bool\\|float\\|int\\|string\\|null\\.$#" count: 1 @@ -1141,11 +1126,6 @@ parameters: count: 3 path: src/Controller/Reporting/ProjectDateRangeController.php - - - message: "#^Parameter \\#1 \\$begin of method App\\\\Form\\\\Model\\\\DateRange\\:\\:setBegin\\(\\) expects DateTime, DateTime\\|null given\\.$#" - count: 1 - path: src/Controller/Reporting/ProjectDateRangeController.php - - message: "#^Parameter \\#2 \\$begin of method App\\\\Project\\\\ProjectStatisticService\\:\\:getBudgetStatisticModelForProjectsByDateRange\\(\\) expects DateTime, DateTime\\|null given\\.$#" count: 1 @@ -3471,16 +3451,6 @@ parameters: count: 1 path: src/Form/Type/ColorChoiceType.php - - - message: "#^Method App\\\\Form\\\\Type\\\\ColorChoiceType\\:\\:convertStringToColorArray\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Type/ColorChoiceType.php - - - - message: "#^Parameter \\#1 \\$config of method App\\\\Form\\\\Type\\\\ColorChoiceType\\:\\:convertStringToColorArray\\(\\) expects string, string\\|null given\\.$#" - count: 1 - path: src/Form/Type/ColorChoiceType.php - - message: "#^Class App\\\\Form\\\\Type\\\\ColorPickerType implements generic interface Symfony\\\\Component\\\\Form\\\\DataTransformerInterface but does not specify its types\\: T, R$#" count: 1 @@ -4231,29 +4201,14 @@ parameters: count: 1 path: src/Plugin/PluginMetadata.php - - - message: "#^Cannot access offset 'amount' on mixed\\.$#" - count: 1 - path: src/Project/ProjectStatisticService.php - - - - message: "#^Cannot access offset 'billable' on mixed\\.$#" - count: 3 - path: src/Project/ProjectStatisticService.php - - message: "#^Cannot access offset 'duration' on mixed\\.$#" - count: 9 - path: src/Project/ProjectStatisticService.php - - - - message: "#^Cannot access offset 'exported' on mixed\\.$#" count: 3 path: src/Project/ProjectStatisticService.php - message: "#^Cannot access offset 'id' on mixed\\.$#" - count: 8 + count: 4 path: src/Project/ProjectStatisticService.php - @@ -4261,11 +4216,6 @@ parameters: count: 1 path: src/Project/ProjectStatisticService.php - - - message: "#^Cannot access offset 'rate' on mixed\\.$#" - count: 6 - path: src/Project/ProjectStatisticService.php - - message: "#^Cannot call method getEnd\\(\\) on App\\\\Entity\\\\Project\\|null\\.$#" count: 2 @@ -4331,11 +4281,6 @@ parameters: count: 1 path: src/Project/ProjectStatisticService.php - - - message: "#^Parameter \\#1 \\$durationTotal of method App\\\\Reporting\\\\ProjectView\\\\ProjectViewModel\\:\\:setDurationTotal\\(\\) expects int, mixed given\\.$#" - count: 1 - path: src/Project/ProjectStatisticService.php - - message: "#^Parameter \\#1 \\$durationWeek of method App\\\\Reporting\\\\ProjectView\\\\ProjectViewModel\\:\\:setDurationWeek\\(\\) expects int, mixed given\\.$#" count: 1 @@ -4351,11 +4296,6 @@ parameters: count: 1 path: src/Project/ProjectStatisticService.php - - - message: "#^Parameter \\#1 \\$rateTotal of method App\\\\Reporting\\\\ProjectView\\\\ProjectViewModel\\:\\:setRateTotal\\(\\) expects float, mixed given\\.$#" - count: 1 - path: src/Project/ProjectStatisticService.php - - message: "#^Parameter \\#1 \\$recordDuration of method App\\\\Model\\\\TimesheetCountedStatistic\\:\\:setDurationBillable\\(\\) expects int, float\\|int given\\.$#" count: 1 @@ -4371,11 +4311,6 @@ parameters: count: 1 path: src/Project/ProjectStatisticService.php - - - message: "#^Parameter \\#1 \\$timesheetCounter of method App\\\\Reporting\\\\ProjectView\\\\ProjectViewModel\\:\\:setTimesheetCounter\\(\\) expects int, mixed given\\.$#" - count: 1 - path: src/Project/ProjectStatisticService.php - - message: "#^Parameter \\#1 \\$totalDuration of method App\\\\Model\\\\Statistic\\\\Timesheet\\:\\:setTotalDuration\\(\\) expects int, float\\|int given\\.$#" count: 2 @@ -4396,11 +4331,6 @@ parameters: count: 1 path: src/Reporting/CustomerMonthlyProjects/CustomerMonthlyProjectsRepository.php - - - message: "#^Property App\\\\Reporting\\\\ProjectDateRange\\\\ProjectDateRangeQuery\\:\\:\\$month \\(DateTime\\) does not accept DateTime\\|null\\.$#" - count: 1 - path: src/Reporting/ProjectDateRange/ProjectDateRangeQuery.php - - message: "#^Cannot access offset 'project' on mixed\\.$#" count: 1 @@ -4421,11 +4351,6 @@ parameters: count: 1 path: src/Reporting/ProjectDetails/ProjectDetailsModel.php - - - message: "#^Method App\\\\Reporting\\\\ProjectView\\\\ProjectViewModel\\:\\:getBudgetStatisticModel\\(\\) should return App\\\\Model\\\\BudgetStatisticModelInterface but returns App\\\\Model\\\\BudgetStatisticModelInterface\\|null\\.$#" - count: 1 - path: src/Reporting/ProjectView/ProjectViewModel.php - - message: "#^Cannot call method getSearchFields\\(\\) on App\\\\Utils\\\\SearchTerm\\|null\\.$#" count: 1 @@ -5136,11 +5061,6 @@ parameters: count: 2 path: src/Saml/SamlProvider.php - - - message: "#^Parameter \\#1 \\$identifier of method Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserProviderInterface\\:\\:loadUserByIdentifier\\(\\) expects string, string\\|null given\\.$#" - count: 1 - path: src/Saml/SamlProvider.php - - message: "#^Parameter \\#1 \\$key of function array_key_exists expects int\\|string, mixed given\\.$#" count: 1 diff --git a/src/API/Authentication/SessionAuthenticator.php b/src/API/Authentication/SessionAuthenticator.php index 0d6eb548..f365a51f 100644 --- a/src/API/Authentication/SessionAuthenticator.php +++ b/src/API/Authentication/SessionAuthenticator.php @@ -38,7 +38,7 @@ final class SessionAuthenticator extends AbstractAuthenticator return $token; } - public function supports(Request $request): ?bool + public function supports(Request $request): bool { if (str_contains($request->getRequestUri(), '/api/')) { // API docs can only be access, when the user is logged in @@ -62,7 +62,7 @@ final class SessionAuthenticator extends AbstractAuthenticator return $this->authenticator->onAuthenticationSuccess($request, $token, $firewallName); } - public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response + public function onAuthenticationFailure(Request $request, AuthenticationException $exception): Response { return $this->authenticator->onAuthenticationFailure($request, $exception); } diff --git a/src/API/Authentication/TokenAuthenticator.php b/src/API/Authentication/TokenAuthenticator.php index f685cb91..d7852106 100644 --- a/src/API/Authentication/TokenAuthenticator.php +++ b/src/API/Authentication/TokenAuthenticator.php @@ -33,7 +33,7 @@ final class TokenAuthenticator extends AbstractAuthenticator { } - public function supports(Request $request): ?bool + public function supports(Request $request): bool { if (str_contains($request->getRequestUri(), '/api/')) { return !str_contains($request->getRequestUri(), '/api/doc'); @@ -95,7 +95,7 @@ final class TokenAuthenticator extends AbstractAuthenticator return null; } - public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response + public function onAuthenticationFailure(Request $request, AuthenticationException $exception): Response { $data = [ 'message' => $exception instanceof CustomUserMessageAuthenticationException ? $exception->getMessage() : 'Invalid credentials' diff --git a/src/Calendar/RecentActivitiesSource.php b/src/Calendar/RecentActivitiesSource.php index 859c0a99..544822cc 100644 --- a/src/Calendar/RecentActivitiesSource.php +++ b/src/Calendar/RecentActivitiesSource.php @@ -62,7 +62,7 @@ final class RecentActivitiesSource implements DragAndDropSource return $this->entries; } - public function getBlockInclude(): ?string + public function getBlockInclude(): string { return 'calendar/drag-drop.html.twig'; } diff --git a/src/Calendar/TimesheetEntry.php b/src/Calendar/TimesheetEntry.php index 88eb6a0a..d4059091 100644 --- a/src/Calendar/TimesheetEntry.php +++ b/src/Calendar/TimesheetEntry.php @@ -44,12 +44,14 @@ final class TimesheetEntry implements DragAndDropEntry public function getTitle(): string { - if ($this->timesheet->getActivity() !== null && $this->timesheet->getActivity()->getName() !== null) { - return $this->timesheet->getActivity()->getName(); + $activity = $this->timesheet->getActivity(); + if ($activity !== null && $activity->getName() !== null) { + return $activity->getName(); } - if (null !== $this->timesheet->getProject() && $this->timesheet->getProject()->getName() !== null) { - return $this->timesheet->getProject()->getName(); + $project = $this->timesheet->getProject(); + if ($project !== null && $project->getName() !== null) { + return $project->getName(); } return $this->timesheet->getDescription() ?? ''; @@ -60,7 +62,7 @@ final class TimesheetEntry implements DragAndDropEntry return $this->color; } - public function getBlockName(): ?string + public function getBlockName(): string { return 'dd_timesheet'; } diff --git a/src/Configuration/SystemConfiguration.php b/src/Configuration/SystemConfiguration.php index efdccd07..21fd4b82 100644 --- a/src/Configuration/SystemConfiguration.php +++ b/src/Configuration/SystemConfiguration.php @@ -482,10 +482,10 @@ final class SystemConfiguration return (bool) $this->find('theme.avatar_url'); } - public function getThemeColorChoices(): ?string + public function getThemeColorChoices(): string { $config = $this->find('theme.color_choices'); - if (!empty($config)) { + if (\is_string($config) && $config !== '') { return $config; } diff --git a/src/Constants.php b/src/Constants.php index bec892a7..c291fc87 100644 --- a/src/Constants.php +++ b/src/Constants.php @@ -17,11 +17,11 @@ class Constants /** * The current release version */ - public const VERSION = '2.5.0'; + public const VERSION = '2.6.0'; /** * The current release: major * 10000 + minor * 100 + patch */ - public const VERSION_ID = 20500; + public const VERSION_ID = 20600; /** * The software name */ diff --git a/src/Controller/ActivityController.php b/src/Controller/ActivityController.php index ccf0fdca..25372b81 100644 --- a/src/Controller/ActivityController.php +++ b/src/Controller/ActivityController.php @@ -31,6 +31,8 @@ use App\Form\Type\ActivityType; use App\Repository\ActivityRateRepository; use App\Repository\ActivityRepository; use App\Repository\Query\ActivityQuery; +use App\Repository\Query\TeamQuery; +use App\Repository\Query\TimesheetQuery; use App\Repository\TeamRepository; use App\Utils\DataTable; use App\Utils\PageSetup; @@ -135,6 +137,22 @@ final class ActivityController extends AbstractController $defaultTeam = null; $now = $this->getDateTimeFactory()->createDateTime(); + $exportUrl = null; + $invoiceUrl = null; + $params = ['customers[]' => '', 'projects[]' => '', 'activities[]' => $activity->getId(), 'daterange' => '', 'exported' => TimesheetQuery::STATE_NOT_EXPORTED, 'billable' => true]; + if ($activity->getProject() !== null) { + $params['projects[]'] = $activity->getProject()->getId(); + if ($activity->getProject()->getCustomer() !== null) { + $params['customers[]'] = $activity->getProject()->getCustomer()->getId(); + } + } + if ($this->isGranted('create_export')) { + $exportUrl = $this->generateUrl('export', array_merge($params, ['preview' => true])); + } + if ($this->isGranted('view_invoice')) { + $invoiceUrl = $this->generateUrl('invoice', $params); + } + if ($this->isGranted('edit', $activity)) { if ($this->isGranted('create_team')) { $defaultTeam = $teamRepository->findOneBy(['name' => $activity->getName()]); @@ -147,7 +165,9 @@ final class ActivityController extends AbstractController } if ($this->isGranted('permissions', $activity) || $this->isGranted('details', $activity) || $this->isGranted('view_team')) { - $teams = $activity->getTeams(); + $query = new TeamQuery(); + $query->addActivity($activity); + $teams = $teamRepository->getTeamsForQuery($query); } // additional boxes by plugins @@ -168,7 +188,9 @@ final class ActivityController extends AbstractController 'team' => $defaultTeam, 'teams' => $teams, 'now' => $now, - 'boxes' => $boxes + 'boxes' => $boxes, + 'export_url' => $exportUrl, + 'invoice_url' => $invoiceUrl, ]); } diff --git a/src/Controller/Auth/SamlController.php b/src/Controller/Auth/SamlController.php index 9d43c801..6a7be289 100644 --- a/src/Controller/Auth/SamlController.php +++ b/src/Controller/Auth/SamlController.php @@ -12,10 +12,10 @@ namespace App\Controller\Auth; use App\Configuration\SamlConfigurationInterface; use App\Saml\SamlAuthFactory; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\Security\Http\SecurityRequestAttributes; #[Route(path: '/saml')] final class SamlController extends AbstractController @@ -32,7 +32,7 @@ final class SamlController extends AbstractController } $session = $request->getSession(); - $authErrorKey = Security::AUTHENTICATION_ERROR; + $authErrorKey = SecurityRequestAttributes::AUTHENTICATION_ERROR; $error = null; diff --git a/src/Controller/CustomerController.php b/src/Controller/CustomerController.php index 41f03040..89537dd3 100644 --- a/src/Controller/CustomerController.php +++ b/src/Controller/CustomerController.php @@ -33,6 +33,8 @@ use App\Repository\CustomerRepository; use App\Repository\ProjectRepository; use App\Repository\Query\CustomerQuery; use App\Repository\Query\ProjectQuery; +use App\Repository\Query\TeamQuery; +use App\Repository\Query\TimesheetQuery; use App\Repository\TeamRepository; use App\Utils\DataTable; use App\Utils\PageSetup; @@ -307,6 +309,15 @@ final class CustomerController extends AbstractController $rates = []; $now = $this->getDateTimeFactory()->createDateTime(); + $exportUrl = null; + $invoiceUrl = null; + if ($this->isGranted('create_export')) { + $exportUrl = $this->generateUrl('export', ['customers[]' => $customer->getId(), 'projects[]' => '', 'daterange' => '', 'exported' => TimesheetQuery::STATE_NOT_EXPORTED, 'preview' => true, 'billable' => true]); + } + if ($this->isGranted('view_invoice')) { + $invoiceUrl = $this->generateUrl('invoice', ['customers[]' => $customer->getId(), 'projects[]' => '', 'daterange' => '', 'exported' => TimesheetQuery::STATE_NOT_EXPORTED, 'billable' => true]); + } + if ($this->isGranted('edit', $customer)) { if ($this->isGranted('create_team')) { $defaultTeam = $teamRepository->findOneBy(['name' => $customer->getName()]); @@ -328,7 +339,9 @@ final class CustomerController extends AbstractController } if ($this->isGranted('permissions', $customer) || $this->isGranted('details', $customer) || $this->isGranted('view_team')) { - $teams = $customer->getTeams(); + $query = new TeamQuery(); + $query->addCustomer($customer); + $teams = $teamRepository->getTeamsForQuery($query); } // additional boxes by plugins @@ -353,7 +366,9 @@ final class CustomerController extends AbstractController 'customer_now' => new \DateTime('now', $timezone), 'rates' => $rates, 'now' => $now, - 'boxes' => $boxes + 'boxes' => $boxes, + 'export_url' => $exportUrl, + 'invoice_url' => $invoiceUrl, ]); } diff --git a/src/Controller/ProfileController.php b/src/Controller/ProfileController.php index c80a0366..42d86dfc 100644 --- a/src/Controller/ProfileController.php +++ b/src/Controller/ProfileController.php @@ -248,7 +248,7 @@ final class ProfileController extends AbstractController public function preferencesAction(User $profile, Request $request, EventDispatcherInterface $dispatcher, UserRepository $userRepository): Response { // we need to prepare the user preferences, which is done via an EventSubscriber - $event = new PrepareUserEvent($profile); + $event = new PrepareUserEvent($profile, false); $dispatcher->dispatch($event); $form = $this->createPreferencesForm($profile); diff --git a/src/Controller/ProjectController.php b/src/Controller/ProjectController.php index a8546679..c27a81ad 100644 --- a/src/Controller/ProjectController.php +++ b/src/Controller/ProjectController.php @@ -36,6 +36,8 @@ use App\Repository\ProjectRateRepository; use App\Repository\ProjectRepository; use App\Repository\Query\ActivityQuery; use App\Repository\Query\ProjectQuery; +use App\Repository\Query\TeamQuery; +use App\Repository\Query\TimesheetQuery; use App\Repository\TeamRepository; use App\Utils\Context; use App\Utils\DataTable; @@ -334,6 +336,15 @@ final class ProjectController extends AbstractController $rates = []; $now = $this->getDateTimeFactory()->createDateTime(); + $exportUrl = null; + $invoiceUrl = null; + if ($this->isGranted('create_export') && $project->getCustomer() !== null) { + $exportUrl = $this->generateUrl('export', ['customers[]' => $project->getCustomer()->getId(), 'projects[]' => $project->getId(), 'daterange' => '', 'exported' => TimesheetQuery::STATE_NOT_EXPORTED, 'preview' => true, 'billable' => true]); + } + if ($this->isGranted('view_invoice') && $project->getCustomer() !== null) { + $invoiceUrl = $this->generateUrl('invoice', ['customers[]' => $project->getCustomer()->getId(), 'projects[]' => $project->getId(), 'daterange' => '', 'exported' => TimesheetQuery::STATE_NOT_EXPORTED, 'billable' => true]); + } + if ($this->isGranted('edit', $project)) { if ($this->isGranted('create_team')) { $defaultTeam = $teamRepository->findOneBy(['name' => $project->getName()]); @@ -351,7 +362,9 @@ final class ProjectController extends AbstractController } if ($this->isGranted('permissions', $project) || $this->isGranted('details', $project) || $this->isGranted('view_team')) { - $teams = $project->getTeams(); + $query = new TeamQuery(); + $query->addProject($project); + $teams = $teamRepository->getTeamsForQuery($query); } // additional boxes by plugins @@ -375,7 +388,9 @@ final class ProjectController extends AbstractController 'teams' => $teams, 'rates' => $rates, 'now' => $now, - 'boxes' => $boxes + 'boxes' => $boxes, + 'export_url' => $exportUrl, + 'invoice_url' => $invoiceUrl, ]); } diff --git a/src/Controller/Reporting/ProjectDateRangeController.php b/src/Controller/Reporting/ProjectDateRangeController.php index d020246e..d39d8d48 100644 --- a/src/Controller/Reporting/ProjectDateRangeController.php +++ b/src/Controller/Reporting/ProjectDateRangeController.php @@ -30,14 +30,15 @@ final class ProjectDateRangeController extends AbstractController $dateFactory = $this->getDateTimeFactory(); $user = $this->getUser(); - $query = new ProjectDaterangeQuery($dateFactory->getStartOfMonth(), $user); + $defaultStart = $dateFactory->getStartOfMonth(); + $query = new ProjectDaterangeQuery($defaultStart, $user); $form = $this->createFormForGetRequest(ProjectDateRangeForm::class, $query, [ 'timezone' => $user->getTimezone() ]); $form->submit($request->query->all(), false); $dateRange = new DateRange(true); - $dateRange->setBegin($query->getMonth()); + $dateRange->setBegin($query->getMonth() ?? $defaultStart); $dateRange->setEnd($dateFactory->getEndOfMonth($dateRange->getBegin())); $projects = $service->findProjectsForDateRange($query, $dateRange); diff --git a/src/Controller/Security/PasswordResetController.php b/src/Controller/Security/PasswordResetController.php index ca073c52..00a5feb6 100644 --- a/src/Controller/Security/PasswordResetController.php +++ b/src/Controller/Security/PasswordResetController.php @@ -64,7 +64,7 @@ final class PasswordResetController extends AbstractController $username = $request->request->get('username'); $user = $this->userService->findUserByUsernameOrEmail($username); - if (null !== $user && !$user->isPasswordRequestNonExpired($this->configuration->getPasswordResetRetryLifetime())) { + if (!$user->isPasswordRequestNonExpired($this->configuration->getPasswordResetRetryLifetime())) { if (!$user->isInternalUser()) { throw $this->createAccessDeniedException( sprintf('The user "%s" tried to reset the password, but it is registered as "%s" auth-type.', $user->getUserIdentifier(), $user->getAuth()) diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 003e2ccd..816220e2 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -11,6 +11,7 @@ namespace App\Controller; use App\Configuration\SystemConfiguration; use App\Entity\User; +use App\Event\PrepareUserEvent; use App\Event\UserPreferenceDisplayEvent; use App\Export\Spreadsheet\UserExporter; use App\Export\Spreadsheet\Writer\BinaryFileResponseWriter; @@ -112,7 +113,7 @@ final class UserController extends AbstractController #[Route(path: '/create', name: 'admin_user_create', methods: ['GET', 'POST'])] #[IsGranted('create_user')] - public function createAction(Request $request, SystemConfiguration $config, UserRepository $userRepository): Response + public function createAction(Request $request, SystemConfiguration $config, UserRepository $userRepository, EventDispatcherInterface $dispatcher): Response { $user = $this->createNewDefaultUser($config); $editForm = $this->getCreateUserForm($user); @@ -126,6 +127,14 @@ final class UserController extends AbstractController $userRepository->saveUser($user); $this->flashSuccess('action.update.success'); + try { + $event = new PrepareUserEvent($user, false); + $dispatcher->dispatch($event); + $userRepository->saveUser($user); + } catch (\Exception $ex) { + // it should be no problem, if creating default user preferences fails + } + return $this->redirectToRouteAfterCreate('user_profile_edit', ['username' => $user->getUserIdentifier()]); } diff --git a/src/Controller/WizardController.php b/src/Controller/WizardController.php index d93277c5..6cfe7203 100644 --- a/src/Controller/WizardController.php +++ b/src/Controller/WizardController.php @@ -76,9 +76,9 @@ final class WizardController extends AbstractController $userService->updateUser($user); if ($data['reload'] === '1') { - return $this->redirectToRoute('wizard', ['wizard' => 'profile', '_locale' => $data['language']]); + return $this->redirectToRoute('wizard', ['wizard' => 'profile', '_locale' => $user->getLanguage()]); } else { - return $this->redirectToRoute('wizard', ['wizard' => $next, '_locale' => $data['language']]); + return $this->redirectToRoute('wizard', ['wizard' => $next, '_locale' => $user->getLanguage()]); } } diff --git a/src/Entity/MetaTableTypeTrait.php b/src/Entity/MetaTableTypeTrait.php index 8a60e38f..66a0bb16 100644 --- a/src/Entity/MetaTableTypeTrait.php +++ b/src/Entity/MetaTableTypeTrait.php @@ -36,15 +36,12 @@ trait MetaTableTypeTrait private ?string $name = null; /** * Value of the meta (custom) field - * - * ATTENTION: - * This field can be used to temporary hold data in another format (e.g. array) during form transformation, */ #[ORM\Column(name: 'value', type: 'text', length: 65535, nullable: true)] #[Assert\Length(max: 65535)] #[Serializer\Expose] #[Serializer\Groups(['Default'])] - private mixed $value = null; + private ?string $value = null; #[ORM\Column(name: 'visible', type: 'boolean', nullable: false, options: ['default' => false])] #[Assert\NotNull] private bool $visible = false; @@ -61,6 +58,14 @@ trait MetaTableTypeTrait */ private array $options = []; private int $order = 0; + /** + * Used for data conversion during form transformation. + * + * ATTENTION: This field can be used to temporary hold data in another format (e.g. array) during form transformation. + * TODO unclear when "array" should happen. the above statement is old and maybe we can remove the "mixed” type + */ + private mixed $data = null; + private bool $updated = false; public function getName(): ?string { @@ -80,41 +85,47 @@ trait MetaTableTypeTrait public function getValue(): mixed { - if ($this->value === null) { + $value = $this->updated ? $this->data : $this->value; + + if ($value === null) { return null; } return match ($this->type) { - YesNoType::class, CheckboxType::class => (\is_string($this->value) || \is_int($this->value)) ? (bool) $this->value : $this->value, - IntegerType::class => (\is_string($this->value) || \is_int($this->value)) ? (int) $this->value : $this->value, - NumberType::class => (\is_string($this->value) || \is_float($this->value)) ? (float) $this->value : $this->value, - default => $this->value, + YesNoType::class, CheckboxType::class => (\is_string($value) || \is_int($value)) ? (bool) $value : $value, + IntegerType::class => (\is_string($value) || \is_int($value)) ? (int) $value : $value, + NumberType::class => (\is_string($value) || \is_float($value)) ? (float) $value : $value, + default => $value }; } /** - * Value will not be serialized before its stored, so it should be a primitive type. - * - * @param mixed $value - * @return MetaTableTypeInterface + * Value will not be serialized before its stored, so it should be a primitive/scalar type. */ public function setValue(mixed $value): MetaTableTypeInterface { + $this->data = $value; + $this->updated = true; + // unchecked checkboxes / false bool would save an empty string in the database // those cannot be searched in the database if (null !== $value) { switch ($this->type) { case YesNoType::class: case CheckboxType::class: - if (\is_string($value) || \is_bool($value)) { - $value = (int) $value; - } else { + if (!\is_int($value) && !\is_bool($value) && !\is_string($value)) { throw new \InvalidArgumentException('Failed converting meta-field bool value'); + } else { + $value = (string) $value; } } } - $this->value = $value; + if ($value === null) { + $this->value = $value; + } elseif (\is_scalar($value)) { + $this->value = (string) $value; + } return $this; } diff --git a/src/Entity/User.php b/src/Entity/User.php index dc9394bc..c3f92ac3 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -1023,6 +1023,10 @@ class User implements UserInterface, EquatableInterface, ThemeUserInterface, Pas return false; } + if ($this->enabled !== $user->isEnabled()) { + return false; + } + return true; } diff --git a/src/Event/PrepareUserEvent.php b/src/Event/PrepareUserEvent.php index 86f4eee1..89f5f324 100644 --- a/src/Event/PrepareUserEvent.php +++ b/src/Event/PrepareUserEvent.php @@ -13,14 +13,24 @@ use App\Entity\User; use Symfony\Contracts\EventDispatcher\Event; /** - * This event should be used, if a user profile is loaded and want to fill the dynamic user preferences + * To be used when a user profile is loaded and should be filled with dynamic user preferences. + * + * @internal */ final class PrepareUserEvent extends Event { - public function __construct(private User $user) + public function __construct(private User $user, private bool $booting = true) { } + /** + * Whether this event is dispatched for the currently logged in user during kernel boot. + */ + public function isBooting(): bool + { + return $this->booting; + } + public function getUser(): User { return $this->user; diff --git a/src/Event/UserPreferenceEvent.php b/src/Event/UserPreferenceEvent.php index c1eea139..9c70b5c1 100644 --- a/src/Event/UserPreferenceEvent.php +++ b/src/Event/UserPreferenceEvent.php @@ -14,18 +14,26 @@ use App\Entity\UserPreference; use Symfony\Contracts\EventDispatcher\Event; /** - * This event should be used, if further user preferences should be added dynamically. + * Add further user-preference definitions dynamically. + * This is used on every page load, do not query the database when this is dispatched. */ final class UserPreferenceEvent extends Event { /** - * @param User $user - * @param UserPreference[] $preferences + * @param array $preferences */ - public function __construct(private User $user, private array $preferences) + public function __construct(private readonly User $user, private array $preferences, private readonly bool $booting = true) { } + /** + * Whether this event is dispatched for the currently logged in user during kernel boot. + */ + public function isBooting(): bool + { + return $this->booting; + } + /** * Do not set the preferences directly to the user object, but ONLY via addPreference() * diff --git a/src/EventSubscriber/UserPreferenceSubscriber.php b/src/EventSubscriber/UserPreferenceSubscriber.php index 16504724..d0d83d99 100644 --- a/src/EventSubscriber/UserPreferenceSubscriber.php +++ b/src/EventSubscriber/UserPreferenceSubscriber.php @@ -137,7 +137,7 @@ final class UserPreferenceSubscriber implements EventSubscriberInterface { $user = $event->getUser(); - $event = new UserPreferenceEvent($user, $this->getDefaultPreferences($user)); + $event = new UserPreferenceEvent($user, $this->getDefaultPreferences($user), $event->isBooting()); $this->eventDispatcher->dispatch($event); foreach ($event->getPreferences() as $preference) { diff --git a/src/Form/TimesheetEditForm.php b/src/Form/TimesheetEditForm.php index 97c0e355..6ee0e3db 100644 --- a/src/Form/TimesheetEditForm.php +++ b/src/Form/TimesheetEditForm.php @@ -10,7 +10,9 @@ namespace App\Form; use App\Configuration\SystemConfiguration; +use App\Entity\Customer; use App\Entity\Timesheet; +use App\Form\Type\CustomerType; use App\Form\Type\DatePickerType; use App\Form\Type\DescriptionType; use App\Form\Type\DurationType; @@ -23,6 +25,7 @@ use App\Form\Type\TimesheetBillableType; use App\Form\Type\UserType; use App\Form\Type\YesNoType; use App\Repository\CustomerRepository; +use App\Repository\Query\CustomerFormTypeQuery; use App\Timesheet\Calculator\BillableCalculator; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\CallbackTransformer; @@ -49,7 +52,6 @@ class TimesheetEditForm extends AbstractType $project = null; $customer = null; $currency = false; - $customerCount = $this->customers->countCustomer(true); $timezone = $options['timezone']; $isNew = true; @@ -100,15 +102,33 @@ class TimesheetEditForm extends AbstractType $this->addDuration($builder, $options, (!$options['allow_begin_datetime'] || !$options['allow_end_datetime']), $isNew); } + // ----------------------------------------------------- + $query = new CustomerFormTypeQuery($customer); + $query->setUser($options['user']); // @phpstan-ignore-line + $qb = $this->customers->getQueryBuilderForFormType($query); + /** @var array $customers */ + $customers = $qb->getQuery()->getResult(); + $customerCount = \count($customers); + if ($this->showCustomer($options, $isNew, $customerCount)) { - $this->addCustomer($builder, $customer); + $builder->add('customer', CustomerType::class, [ + 'choices' => $customers, + 'data' => $customer, + 'required' => false, + 'placeholder' => '', + 'mapped' => false, + 'project_enabled' => true, + ]); } - $allowCreate = (bool) $this->systemConfiguration->find('activity.allow_inline_create'); - + // TODO pre-select if only one exists $this->addProject($builder, $isNew, $project, $customer); + + // TODO make creation possible + //$allowCreate = (bool) $this->systemConfiguration->find('activity.allow_inline_create'); $this->addActivity($builder, $activity, $project, [ - 'allow_create' => $allowCreate && $options['create_activity'], + 'allow_create' => false, + // 'allow_create' => $allowCreate && $options['create_activity'], ]); $descriptionOptions = ['required' => false]; @@ -394,7 +414,7 @@ class TimesheetEditForm extends AbstractType public function configureOptions(OptionsResolver $resolver): void { $maxMinutes = $this->systemConfiguration->getTimesheetLongRunningDuration(); - $maxHours = 8; + $maxHours = 10; if ($maxMinutes > 0) { $maxHours = (int) ($maxMinutes / 60); } diff --git a/src/Form/Type/CalendarTitlePatternType.php b/src/Form/Type/CalendarTitlePatternType.php index 71047dac..51b62e36 100644 --- a/src/Form/Type/CalendarTitlePatternType.php +++ b/src/Form/Type/CalendarTitlePatternType.php @@ -29,6 +29,8 @@ final class CalendarTitlePatternType extends AbstractType public const PATTERN_PROJECT_DESCRIPTION = self::PATTERN_PROJECT . self::SPACER . self::PATTERN_DESCRIPTION; public const PATTERN_CUSTOMER_DESCRIPTION = self::PATTERN_CUSTOMER . self::SPACER . self::PATTERN_DESCRIPTION; public const PATTERN_PROJECT_CUSTOMER = self::PATTERN_PROJECT . self::SPACER . self::PATTERN_CUSTOMER; + public const PATTERN_CUSTOMER_PROJECT = self::PATTERN_CUSTOMER . self::SPACER . self::PATTERN_PROJECT; + public const PATTERN_PROJECT_ACTIVITY = self::PATTERN_PROJECT . self::SPACER . self::PATTERN_ACTIVITY; public function __construct(private TranslatorInterface $translator) { @@ -54,6 +56,8 @@ final class CalendarTitlePatternType extends AbstractType $project . self::SPACER . $description => CalendarTitlePatternType::PATTERN_PROJECT_DESCRIPTION, $customer . self::SPACER . $description => CalendarTitlePatternType::PATTERN_CUSTOMER_DESCRIPTION, $project . self::SPACER . $customer => CalendarTitlePatternType::PATTERN_PROJECT_CUSTOMER, + $customer . self::SPACER . $project => CalendarTitlePatternType::PATTERN_CUSTOMER_PROJECT, + $project . self::SPACER . $activity => CalendarTitlePatternType::PATTERN_PROJECT_ACTIVITY, ] ]); } diff --git a/src/Form/Type/ColorChoiceType.php b/src/Form/Type/ColorChoiceType.php index 2cea7b53..1d1f41a9 100644 --- a/src/Form/Type/ColorChoiceType.php +++ b/src/Form/Type/ColorChoiceType.php @@ -69,6 +69,10 @@ final class ColorChoiceType extends AbstractType implements DataTransformerInter ]); } + /** + * @param string $config + * @return array + */ private function convertStringToColorArray(string $config): array { $config = explode(',', $config); diff --git a/src/Ldap/LdapUserProvider.php b/src/Ldap/LdapUserProvider.php index 786f6b9d..d6e7f099 100644 --- a/src/Ldap/LdapUserProvider.php +++ b/src/Ldap/LdapUserProvider.php @@ -16,6 +16,9 @@ use Symfony\Component\Security\Core\Exception\UserNotFoundException; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\UserProviderInterface; +/** + * @template-implements UserProviderInterface + */ final class LdapUserProvider implements UserProviderInterface { public function __construct(private LdapManager $ldapManager, private ?LoggerInterface $logger = null) diff --git a/src/Project/ProjectStatisticService.php b/src/Project/ProjectStatisticService.php index 09f06eb0..e2f7631e 100644 --- a/src/Project/ProjectStatisticService.php +++ b/src/Project/ProjectStatisticService.php @@ -727,13 +727,11 @@ class ProjectStatisticService $endMonth = (clone $startOfWeek)->modify('last day of this month'); $projectViews = []; - foreach ($projects as $project) { - $projectViews[$project->getId()] = new ProjectViewModel($project); - } $budgetStats = $this->getBudgetStatisticModelForProjects($projects, $today); foreach ($budgetStats as $model) { - $projectViews[$model->getProject()->getId()]->setBudgetStatisticModel($model); + $project = $model->getProject(); + $projectViews[$project->getId()] = new ProjectViewModel($model); } $projectIds = array_keys($projectViews); @@ -741,7 +739,6 @@ class ProjectStatisticService $tplQb = $this->timesheetRepository->createQueryBuilder('t'); $tplQb ->select('IDENTITY(t.project) AS id') - ->addSelect('COUNT(t.id) as amount') ->addSelect('COALESCE(SUM(t.duration), 0) AS duration') ->addSelect('COALESCE(SUM(t.rate), 0) AS rate') ->andWhere($tplQb->expr()->in('t.project', ':project')) @@ -749,14 +746,11 @@ class ProjectStatisticService ->setParameter('project', array_values($projectIds)) ; + // find the most recent timesheet for each project $qb = clone $tplQb; $qb->addSelect('MAX(t.date) as lastRecord'); - $result = $qb->getQuery()->getScalarResult(); foreach ($result as $row) { - $projectViews[$row['id']]->setDurationTotal($row['duration']); - $projectViews[$row['id']]->setRateTotal($row['rate']); - $projectViews[$row['id']]->setTimesheetCounter($row['amount']); if ($row['lastRecord'] !== null) { // might be the wrong timezone $projectViews[$row['id']]->setLastRecord($factory->createDateTime($row['lastRecord'])); @@ -801,34 +795,6 @@ class ProjectStatisticService $projectViews[$row['id']]->setDurationMonth($row['duration']); } - $qb = clone $tplQb; - $qb - ->addSelect('t.exported') - ->addSelect('t.billable') - ->addGroupBy('t.exported') - ->addGroupBy('t.billable') - ; - $result = $qb->getQuery()->getScalarResult(); - foreach ($result as $row) { - /** @var ProjectViewModel $view */ - $view = $projectViews[$row['id']]; - if ($row['billable'] === 1 && $row['exported'] === 1) { - $view->setBillableDuration($view->getBillableDuration() + $row['duration']); - $view->setBillableRate($view->getBillableRate() + $row['rate']); - } elseif ($row['billable'] === 1 && $row['exported'] === 0) { - $view->setBillableDuration($view->getBillableDuration() + $row['duration']); - $view->setBillableRate($view->getBillableRate() + $row['rate']); - $view->setNotExportedDuration($view->getNotExportedDuration() + $row['duration']); - $view->setNotExportedRate($view->getNotExportedRate() + $row['rate']); - $view->setNotBilledDuration($view->getNotBilledDuration() + $row['duration']); - $view->setNotBilledRate($view->getNotBilledRate() + $row['rate']); - } elseif ($row['billable'] === 0 && $row['exported'] === 0) { - $view->setNotExportedDuration($view->getNotExportedDuration() + $row['duration']); - $view->setNotExportedRate($view->getNotExportedRate() + $row['rate']); - } - // the last possible case $row['billable'] === 0 && $row['exported'] === 1 is extremely unlikely and not used - } - return array_values($projectViews); } } diff --git a/src/Reporting/ProjectDateRange/ProjectDateRangeForm.php b/src/Reporting/ProjectDateRange/ProjectDateRangeForm.php index 71b0aba4..36dad705 100644 --- a/src/Reporting/ProjectDateRange/ProjectDateRangeForm.php +++ b/src/Reporting/ProjectDateRange/ProjectDateRangeForm.php @@ -30,6 +30,7 @@ final class ProjectDateRangeForm extends AbstractType ]); $builder->add('month', MonthPickerType::class, [ + 'required' => true, 'label' => false, 'view_timezone' => $options['timezone'], 'model_timezone' => $options['timezone'], diff --git a/src/Reporting/ProjectDateRange/ProjectDateRangeQuery.php b/src/Reporting/ProjectDateRange/ProjectDateRangeQuery.php index 41494dbc..7211e1d9 100644 --- a/src/Reporting/ProjectDateRange/ProjectDateRangeQuery.php +++ b/src/Reporting/ProjectDateRange/ProjectDateRangeQuery.php @@ -14,16 +14,14 @@ use App\Entity\User; final class ProjectDateRangeQuery { - private \DateTime $month; - private ?User $user; + private ?\DateTime $month; private ?Customer $customer = null; private bool $includeNoWork = false; private ?string $budgetType = null; - public function __construct(\DateTime $month, User $user) + public function __construct(\DateTime $month, private User $user) { $this->month = clone $month; - $this->user = $user; } public function isBudgetIndependent(): bool @@ -46,7 +44,7 @@ final class ProjectDateRangeQuery $this->includeNoWork = $includeNoWork; } - public function getUser(): ?User + public function getUser(): User { return $this->user; } diff --git a/src/Reporting/ProjectInactive/ProjectInactiveQuery.php b/src/Reporting/ProjectInactive/ProjectInactiveQuery.php index 23608548..fb3605f8 100644 --- a/src/Reporting/ProjectInactive/ProjectInactiveQuery.php +++ b/src/Reporting/ProjectInactive/ProjectInactiveQuery.php @@ -15,15 +15,13 @@ use DateTime; final class ProjectInactiveQuery { private DateTime $lastChange; - private User $user; - public function __construct(DateTime $lastChange, User $user) + public function __construct(DateTime $lastChange, private User $user) { $this->lastChange = clone $lastChange; - $this->user = $user; } - public function getUser(): ?User + public function getUser(): User { return $this->user; } diff --git a/src/Reporting/ProjectView/ProjectViewModel.php b/src/Reporting/ProjectView/ProjectViewModel.php index 5ec65c1a..aa0b05c6 100644 --- a/src/Reporting/ProjectView/ProjectViewModel.php +++ b/src/Reporting/ProjectView/ProjectViewModel.php @@ -11,42 +11,24 @@ namespace App\Reporting\ProjectView; use App\Entity\Project; use App\Model\BudgetStatisticModelInterface; +use App\Model\ProjectBudgetStatisticModel; +use App\Model\Statistic\BudgetStatistic; use DateTime; final class ProjectViewModel { - private int $timesheetCounter = 0; private int $durationDay = 0; private int $durationWeek = 0; private int $durationMonth = 0; - private int $durationTotal = 0; - private float $rateTotal = 0.00; - private int $notExportedDuration = 0; - private float $notExportedRate = 0.00; - private int $notBilledDuration = 0; - private float $notBilledRate = 0.00; - private int $billableDuration = 0; - private float $billableRate = 0.00; private ?DateTime $lastRecord = null; - private ?BudgetStatisticModelInterface $budgetStatisticModel = null; - public function __construct(private Project $project) + public function __construct(private ProjectBudgetStatisticModel $budgetStatisticModel) { } public function getProject(): Project { - return $this->project; - } - - public function getTimesheetCounter(): int - { - return $this->timesheetCounter; - } - - public function setTimesheetCounter(int $timesheetCounter): void - { - $this->timesheetCounter = $timesheetCounter; + return $this->budgetStatisticModel->getProject(); } public function getDurationDay(): int @@ -79,84 +61,47 @@ final class ProjectViewModel $this->durationMonth = $durationMonth; } - public function getDurationTotal(): int + private function getTotals(): BudgetStatistic { - return $this->durationTotal; + if ($this->budgetStatisticModel->getStatisticTotal() === null) { + throw new \InvalidArgumentException('Totals must not be null'); + } + + return $this->budgetStatisticModel->getStatisticTotal(); } - public function setDurationTotal(int $durationTotal): void + public function getDurationTotal(): int { - $this->durationTotal = $durationTotal; + return $this->getTotals()->getDuration(); } public function getNotExportedDuration(): int { - return $this->notExportedDuration; - } + $totals = $this->getTotals(); - public function setNotExportedDuration(int $notExportedDuration): void - { - $this->notExportedDuration = $notExportedDuration; + return $totals->getDurationBillable() - $totals->getDurationBillableExported(); } public function getNotExportedRate(): float { - return $this->notExportedRate; - } + $totals = $this->getTotals(); - public function setNotExportedRate(float $notExportedRate): void - { - $this->notExportedRate = $notExportedRate; - } - - public function getNotBilledDuration(): int - { - return $this->notBilledDuration; - } - - public function setNotBilledDuration(int $notBilledDuration): void - { - $this->notBilledDuration = $notBilledDuration; - } - - public function getNotBilledRate(): float - { - return $this->notBilledRate; - } - - public function setNotBilledRate(float $notBilledRate): void - { - $this->notBilledRate = $notBilledRate; + return $totals->getRateBillable() - $totals->getRateBillableExported(); } public function getBillableDuration(): int { - return $this->billableDuration; - } - - public function setBillableDuration(int $billableDuration): void - { - $this->billableDuration = $billableDuration; + return $this->getTotals()->getDurationBillable(); } public function getBillableRate(): float { - return $this->billableRate; - } - - public function setBillableRate(float $billableRate): void - { - $this->billableRate = $billableRate; + return $this->getTotals()->getRateBillable(); } public function getRateTotal(): float { - return $this->rateTotal; - } - - public function setRateTotal(float $rateTotal): void - { - $this->rateTotal = $rateTotal; + return $this->getTotals()->getRate(); } public function getLastRecord(): ?DateTime @@ -173,9 +118,4 @@ final class ProjectViewModel { return $this->budgetStatisticModel; } - - public function setBudgetStatisticModel(BudgetStatisticModelInterface $budgetStatisticModel): void - { - $this->budgetStatisticModel = $budgetStatisticModel; - } } diff --git a/src/Reporting/ProjectView/ProjectViewQuery.php b/src/Reporting/ProjectView/ProjectViewQuery.php index 7fae6817..537c3c43 100644 --- a/src/Reporting/ProjectView/ProjectViewQuery.php +++ b/src/Reporting/ProjectView/ProjectViewQuery.php @@ -23,7 +23,7 @@ final class ProjectViewQuery { } - public function getUser(): ?User + public function getUser(): User { return $this->user; } diff --git a/src/Repository/Query/BaseQuery.php b/src/Repository/Query/BaseQuery.php index 4a019049..4cf71930 100644 --- a/src/Repository/Query/BaseQuery.php +++ b/src/Repository/Query/BaseQuery.php @@ -142,8 +142,12 @@ class BaseQuery return $this->orderBy; } - public function setOrderBy(string $orderBy): self + public function setOrderBy(?string $orderBy): self { + if ($orderBy === null) { + $orderBy = (string) $this->defaults['orderBy']; // @phpstan-ignore-line + } + $this->orderBy = $orderBy; return $this; @@ -154,8 +158,12 @@ class BaseQuery return $this->order; } - public function setOrder(string $order): self + public function setOrder(?string $order): self { + if ($order === null) { + $order = (string) $this->defaults['order']; // @phpstan-ignore-line + } + if (\in_array($order, [self::ORDER_ASC, self::ORDER_DESC])) { $this->order = $order; } diff --git a/src/Repository/Query/TeamQuery.php b/src/Repository/Query/TeamQuery.php index ef485962..2b5cce72 100644 --- a/src/Repository/Query/TeamQuery.php +++ b/src/Repository/Query/TeamQuery.php @@ -9,6 +9,9 @@ namespace App\Repository\Query; +use App\Entity\Activity; +use App\Entity\Customer; +use App\Entity\Project; use App\Entity\User; class TeamQuery extends BaseQuery @@ -19,12 +22,27 @@ class TeamQuery extends BaseQuery * @var User[] */ private array $users = []; + /** + * @var array + */ + private array $customers = []; + /** + * @var array + */ + private array $projects = []; + /** + * @var array + */ + private array $activities = []; public function __construct() { $this->setDefaults([ 'orderBy' => 'name', 'users' => [], + 'customers' => [], + 'projects' => [], + 'activities' => [], ]); } @@ -33,20 +51,16 @@ class TeamQuery extends BaseQuery return !empty($this->users); } - public function addUser(User $user): self + public function addUser(User $user): void { $this->users[$user->getId()] = $user; - - return $this; } - public function removeUser(User $user): self + public function removeUser(User $user): void { if (isset($this->users[$user->getId()])) { unset($this->users[$user->getId()]); } - - return $this; } /** @@ -56,4 +70,82 @@ class TeamQuery extends BaseQuery { return array_values($this->users); } + + public function hasCustomers(): bool + { + return \count($this->customers) > 0; + } + + /** + * @return Customer[] + */ + public function getCustomers(): array + { + return $this->customers; + } + + /** + * @param array $customers + */ + public function setCustomers(array $customers): void + { + $this->customers = $customers; + } + + public function addCustomer(Customer $customer): void + { + $this->customers[] = $customer; + } + + public function hasProjects(): bool + { + return \count($this->projects) > 0; + } + + /** + * @return Project[] + */ + public function getProjects(): array + { + return $this->projects; + } + + /** + * @param array $projects + */ + public function setProjects(array $projects): void + { + $this->projects = $projects; + } + + public function addProject(Project $project): void + { + $this->projects[] = $project; + } + + public function hasActivities(): bool + { + return \count($this->activities) > 0; + } + + /** + * @return Activity[] + */ + public function getActivities(): array + { + return $this->activities; + } + + /** + * @param array $activities + */ + public function setActivities(array $activities): void + { + $this->activities = $activities; + } + + public function addActivity(Activity $activity): void + { + $this->activities[] = $activity; + } } diff --git a/src/Repository/TeamRepository.php b/src/Repository/TeamRepository.php index 671cfaf2..eb552653 100644 --- a/src/Repository/TeamRepository.php +++ b/src/Repository/TeamRepository.php @@ -148,12 +148,9 @@ class TeamRepository extends EntityRepository private function getQueryBuilderForQuery(TeamQuery $query): QueryBuilder { - $qb = $this->getEntityManager()->createQueryBuilder(); + $qb = $this->createQueryBuilder('t'); - $qb - ->select('t') - ->from(Team::class, 't') - ; + $qb->select('t'); $orderBy = $query->getOrderBy(); switch ($orderBy) { @@ -162,6 +159,30 @@ class TeamRepository extends EntityRepository break; } + if ($query->hasCustomers()) { + $qb->leftJoin('t.customers', 'qCustomers'); + $qb->orWhere( + $qb->expr()->in('qCustomers', ':customers') + ); + $qb->setParameter('customers', $query->getCustomers()); + } + + if ($query->hasProjects()) { + $qb->leftJoin('t.projects', 'qProjects'); + $qb->orWhere( + $qb->expr()->in('qProjects', ':projects') + ); + $qb->setParameter('projects', $query->getProjects()); + } + + if ($query->hasActivities()) { + $qb->leftJoin('t.activities', 'qActivities'); + $qb->orWhere( + $qb->expr()->in('qActivities', ':activities') + ); + $qb->setParameter('activities', $query->getActivities()); + } + if ($query->hasUsers()) { $qb->leftJoin('t.members', 'qMembers'); $qb->orWhere( diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index bf92b36a..27e81f69 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -35,6 +35,7 @@ use Symfony\Component\Security\Core\User\UserProviderInterface; /** * @extends \Doctrine\ORM\EntityRepository * @template-implements PasswordUpgraderInterface + * @template-implements UserProviderInterface */ class UserRepository extends EntityRepository implements UserLoaderInterface, UserProviderInterface, PasswordUpgraderInterface { diff --git a/src/Saml/SamlProvider.php b/src/Saml/SamlProvider.php index 36e0a8d4..230c3d83 100644 --- a/src/Saml/SamlProvider.php +++ b/src/Saml/SamlProvider.php @@ -18,6 +18,9 @@ use Symfony\Component\Security\Core\User\UserProviderInterface; final class SamlProvider { + /** + * @param UserProviderInterface $userProvider + */ public function __construct( private UserRepository $repository, private UserProviderInterface $userProvider, @@ -30,8 +33,10 @@ final class SamlProvider $user = null; try { - /** @var User $user */ - $user = $this->userProvider->loadUserByIdentifier($token->getUserIdentifier()); + if ($token->getUserIdentifier() !== null) { + /** @var User $user */ + $user = $this->userProvider->loadUserByIdentifier($token->getUserIdentifier()); + } } catch (UserNotFoundException $e) { } diff --git a/src/Security/KimaiUserProvider.php b/src/Security/KimaiUserProvider.php index a1126caf..3f292c5f 100644 --- a/src/Security/KimaiUserProvider.php +++ b/src/Security/KimaiUserProvider.php @@ -20,13 +20,14 @@ use Symfony\Component\Security\Core\User\UserProviderInterface; /** * @template-implements PasswordUpgraderInterface + * @template-implements UserProviderInterface */ final class KimaiUserProvider implements UserProviderInterface, PasswordUpgraderInterface { private ?ChainUserProvider $provider = null; /** - * @param iterable|UserProviderInterface[] $providers + * @param iterable> $providers */ public function __construct(private iterable $providers, private SystemConfiguration $configuration) { @@ -60,12 +61,12 @@ final class KimaiUserProvider implements UserProviderInterface, PasswordUpgrader public function loadUserByIdentifier(string $identifier): UserInterface { - return $this->getInternalProvider()->loadUserByIdentifier($identifier); + return $this->getInternalProvider()->loadUserByIdentifier($identifier); // @phpstan-ignore-line } public function refreshUser(UserInterface $user): UserInterface { - return $this->getInternalProvider()->refreshUser($user); + return $this->getInternalProvider()->refreshUser($user); // @phpstan-ignore-line } public function supportsClass(string $class): bool diff --git a/src/Twig/Runtime/ThemeExtension.php b/src/Twig/Runtime/ThemeExtension.php index a5064df8..fb64360f 100644 --- a/src/Twig/Runtime/ThemeExtension.php +++ b/src/Twig/Runtime/ThemeExtension.php @@ -16,7 +16,6 @@ use App\Event\PageActionsEvent; use App\Event\ThemeEvent; use App\Event\ThemeJavascriptTranslationsEvent; use App\Utils\Color; -use App\Utils\FormFormatConverter; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\Translation\TranslatorInterface; @@ -110,11 +109,8 @@ final class ThemeExtension implements RuntimeExtensionInterface return (new Color())->getRandom($identifier); } - public function getTimePresets(string $timezone, string $format): array + public function getTimePresets(string $timezone): array { - $converter = new FormFormatConverter(); - $format = $converter->convert($format); - $intervalMinutes = $this->configuration->getTimesheetIncrementMinutes(); if ($intervalMinutes < 5) { @@ -123,17 +119,15 @@ final class ThemeExtension implements RuntimeExtensionInterface $maxMinutes = 24 * 60 - $intervalMinutes; - $date = new \DateTime('now', new \DateTimeZone($timezone)); - $date->setTime(0, 0, 0); + $date = new \DateTimeImmutable('now', new \DateTimeZone($timezone)); + $date = $date->setTime(0, 0, 0); - $presets = [ - $date->format($format) - ]; + $presets = [$date]; for ($minutes = $intervalMinutes; $minutes <= $maxMinutes; $minutes += $intervalMinutes) { - $date->modify('+' . $intervalMinutes . ' minutes'); + $date = $date->modify('+' . $intervalMinutes . ' minutes'); - $presets[] = $date->format($format); + $presets[] = $date; } return $presets; diff --git a/src/User/UserService.php b/src/User/UserService.php index 12d33393..af39d57e 100644 --- a/src/User/UserService.php +++ b/src/User/UserService.php @@ -127,7 +127,7 @@ class UserService return $user; } - public function findUserByUsernameOrEmail(string $usernameOrEmail): ?User + public function findUserByUsernameOrEmail(string $usernameOrEmail): User { return $this->repository->loadUserByIdentifier($usernameOrEmail); } diff --git a/src/Utils/SearchTerm.php b/src/Utils/SearchTerm.php index 6ffac6db..3348f95c 100644 --- a/src/Utils/SearchTerm.php +++ b/src/Utils/SearchTerm.php @@ -57,14 +57,14 @@ final class SearchTerm return $this->fields; } - public function getSearchTerm(): ?string + public function getSearchTerm(): string { return $this->term; } public function hasSearchTerm(): bool { - return !empty($this->term); + return $this->term !== ''; } public function getOriginalSearch(): string diff --git a/src/Validator/Constraints/Customer.php b/src/Validator/Constraints/Customer.php index 2c52a86f..2a532234 100644 --- a/src/Validator/Constraints/Customer.php +++ b/src/Validator/Constraints/Customer.php @@ -22,7 +22,7 @@ final class Customer extends Constraint public string $message = 'This customer has invalid settings.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/DateTimeFormat.php b/src/Validator/Constraints/DateTimeFormat.php index e2a470a0..92549b4b 100644 --- a/src/Validator/Constraints/DateTimeFormat.php +++ b/src/Validator/Constraints/DateTimeFormat.php @@ -22,7 +22,7 @@ final class DateTimeFormat extends Constraint public ?string $separator = null; public ?string $message = 'This datetime format is invalid.'; - public function getTargets(): string|array + public function getTargets(): string { return self::PROPERTY_CONSTRAINT; } diff --git a/src/Validator/Constraints/Project.php b/src/Validator/Constraints/Project.php index 0e851900..c5e52c78 100644 --- a/src/Validator/Constraints/Project.php +++ b/src/Validator/Constraints/Project.php @@ -22,7 +22,7 @@ final class Project extends Constraint public string $message = 'This project has invalid settings.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/Team.php b/src/Validator/Constraints/Team.php index 441a0008..1ad7f868 100644 --- a/src/Validator/Constraints/Team.php +++ b/src/Validator/Constraints/Team.php @@ -22,7 +22,7 @@ final class Team extends Constraint public string $message = 'The team has invalid settings.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimeFormat.php b/src/Validator/Constraints/TimeFormat.php index 4a81983a..6c3dff1a 100644 --- a/src/Validator/Constraints/TimeFormat.php +++ b/src/Validator/Constraints/TimeFormat.php @@ -21,7 +21,7 @@ final class TimeFormat extends Constraint public string $message = 'This time format is invalid.'; - public function getTargets(): string|array + public function getTargets(): string { return self::PROPERTY_CONSTRAINT; } diff --git a/src/Validator/Constraints/Timesheet.php b/src/Validator/Constraints/Timesheet.php index 9559abf6..000ba5a2 100644 --- a/src/Validator/Constraints/Timesheet.php +++ b/src/Validator/Constraints/Timesheet.php @@ -16,7 +16,7 @@ final class Timesheet extends Constraint { public string $message = 'This timesheet has invalid settings.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetBasic.php b/src/Validator/Constraints/TimesheetBasic.php index 8821e093..84c3f7d5 100644 --- a/src/Validator/Constraints/TimesheetBasic.php +++ b/src/Validator/Constraints/TimesheetBasic.php @@ -33,7 +33,7 @@ final class TimesheetBasic extends TimesheetConstraint public string $message = 'This timesheet has invalid settings.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetDeactivated.php b/src/Validator/Constraints/TimesheetDeactivated.php index d650a395..2aa4352e 100644 --- a/src/Validator/Constraints/TimesheetDeactivated.php +++ b/src/Validator/Constraints/TimesheetDeactivated.php @@ -24,7 +24,7 @@ final class TimesheetDeactivated extends TimesheetConstraint public string $message = 'This timesheet has invalid settings.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetExported.php b/src/Validator/Constraints/TimesheetExported.php index df37d914..fa169791 100644 --- a/src/Validator/Constraints/TimesheetExported.php +++ b/src/Validator/Constraints/TimesheetExported.php @@ -24,7 +24,7 @@ final class TimesheetExported extends TimesheetConstraint */ public null|\DateTime|string $now; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetFutureTimes.php b/src/Validator/Constraints/TimesheetFutureTimes.php index 0aa54c53..610c01ea 100644 --- a/src/Validator/Constraints/TimesheetFutureTimes.php +++ b/src/Validator/Constraints/TimesheetFutureTimes.php @@ -22,7 +22,7 @@ final class TimesheetFutureTimes extends TimesheetConstraint public string $message = 'The date cannot be in the future.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetLockdown.php b/src/Validator/Constraints/TimesheetLockdown.php index 1ba70425..40c8c646 100644 --- a/src/Validator/Constraints/TimesheetLockdown.php +++ b/src/Validator/Constraints/TimesheetLockdown.php @@ -23,7 +23,7 @@ final class TimesheetLockdown extends TimesheetConstraint */ public \DateTime|string|null $now; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetLongRunning.php b/src/Validator/Constraints/TimesheetLongRunning.php index 537eb882..41cbf9d8 100644 --- a/src/Validator/Constraints/TimesheetLongRunning.php +++ b/src/Validator/Constraints/TimesheetLongRunning.php @@ -22,7 +22,7 @@ final class TimesheetLongRunning extends TimesheetConstraint public string $message = 'Maximum duration of {{ value }} hours exceeded.'; public string $maximumMessage = 'Maximum duration exceeded.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetMultiUpdate.php b/src/Validator/Constraints/TimesheetMultiUpdate.php index 8b3c0c8e..5b250b19 100644 --- a/src/Validator/Constraints/TimesheetMultiUpdate.php +++ b/src/Validator/Constraints/TimesheetMultiUpdate.php @@ -34,7 +34,7 @@ final class TimesheetMultiUpdate extends Constraint public string $message = 'This form has invalid settings.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetMultiUser.php b/src/Validator/Constraints/TimesheetMultiUser.php index f9c8c969..cb0e7db8 100644 --- a/src/Validator/Constraints/TimesheetMultiUser.php +++ b/src/Validator/Constraints/TimesheetMultiUser.php @@ -22,7 +22,7 @@ final class TimesheetMultiUser extends Constraint public string $message = 'This form has invalid settings.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetOverlapping.php b/src/Validator/Constraints/TimesheetOverlapping.php index 35ff6eba..fbdb6d46 100644 --- a/src/Validator/Constraints/TimesheetOverlapping.php +++ b/src/Validator/Constraints/TimesheetOverlapping.php @@ -19,7 +19,7 @@ final class TimesheetOverlapping extends TimesheetConstraint public string $message = 'You already have an entry for this time.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetRestart.php b/src/Validator/Constraints/TimesheetRestart.php index 751c66d0..4992a729 100644 --- a/src/Validator/Constraints/TimesheetRestart.php +++ b/src/Validator/Constraints/TimesheetRestart.php @@ -19,7 +19,7 @@ final class TimesheetRestart extends TimesheetConstraint public string $message = 'You are not allowed to start this timesheet record.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/TimesheetZeroDuration.php b/src/Validator/Constraints/TimesheetZeroDuration.php index 16bde215..55110c5d 100644 --- a/src/Validator/Constraints/TimesheetZeroDuration.php +++ b/src/Validator/Constraints/TimesheetZeroDuration.php @@ -19,7 +19,7 @@ final class TimesheetZeroDuration extends TimesheetConstraint public string $message = 'Duration cannot be zero.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/src/Validator/Constraints/User.php b/src/Validator/Constraints/User.php index 0bcfcc8c..622480b8 100644 --- a/src/Validator/Constraints/User.php +++ b/src/Validator/Constraints/User.php @@ -28,7 +28,7 @@ final class User extends Constraint public string $message = 'The user has invalid settings.'; - public function getTargets(): string|array + public function getTargets(): string { return self::CLASS_CONSTRAINT; } diff --git a/templates/contract/status.html.twig b/templates/contract/status.html.twig index 57ec9f49..3c592fda 100644 --- a/templates/contract/status.html.twig +++ b/templates/contract/status.html.twig @@ -88,7 +88,7 @@ {% endif %} {% if year is defined %} - {% embed '@theme/embeds/collapsible.html.twig' with {open: not box_configuration.collapsed, id: 'working_time_detail_box', border: false, item: {options: {bodyExtraClass: 'border-top'}, bodyClasses: 'p-0 table-responsive'}} %} + {% embed '@theme/embeds/collapsible.html.twig' with {id: 'working_time_detail_box', border: false, item: {options: {bodyExtraClass: 'border-top', open: not box_configuration.collapsed}, bodyClasses: 'p-0 table-responsive'}} %} {% set yearShould = 0 %} {% set yearIs = 0 %} {% set approved = 0 %} @@ -228,7 +228,7 @@ {% if withWorkHourConfiguration %} {% set expectedWeekTimes = user.workHoursMonday + user.workHoursTuesday + user.workHoursWednesday + user.workHoursThursday + user.workHoursFriday + user.workHoursSaturday + user.workHoursSunday %} - {% embed '@theme/embeds/collapsible.html.twig' with {open: not box_configuration.collapsed, id: 'work_contract_should_preview', border: false, item: {options: {bodyExtraClass: 'border-top'}}} %} + {% embed '@theme/embeds/collapsible.html.twig' with {id: 'work_contract_should_preview', border: false, item: {options: {bodyExtraClass: 'border-top'}}} %} {% from "macros/status.html.twig" import status_duration %} {% block title %} {{ 'work_times_should'|trans }} diff --git a/templates/embeds/budgets.html.twig b/templates/embeds/budgets.html.twig index d2be77fd..6c86b0ea 100644 --- a/templates/embeds/budgets.html.twig +++ b/templates/embeds/budgets.html.twig @@ -15,14 +15,14 @@ - - + + + + + {% if entity.timeBudget > 0 %}
{{ 'timeBudget'|trans }} + {% if entity.timeBudget > 0 %} {{ entity.timeBudget|duration }} {% else %} - {% endif %} + {% if entity.timeBudget > 0 %} 100% {% else %} @@ -48,6 +48,18 @@ {{ stats.durationBillable|duration }} {{ percentReached|number_format(2) }}%
{{ 'not_exported'|trans }} + {% set not_exported = (stats.statisticTotal.durationBillable - stats.statisticTotal.durationBillableExported) %} + {% if export_url is defined and export_url is not null %} + {{ not_exported|duration }} + {% else %} + {{ not_exported|duration }} + {% endif %} + -
@@ -87,14 +99,14 @@ - - + + + + + {% set percentReached = 0 %} {% if stats.rateBillable > 0 %} {% set percentReached = (stats.internalRate / (stats.rateBillable / 100)) %} diff --git a/templates/form/blocks.html.twig b/templates/form/blocks.html.twig index fd1aa0f6..b5366cc2 100644 --- a/templates/form/blocks.html.twig +++ b/templates/form/blocks.html.twig @@ -147,7 +147,7 @@ {{ icon('calendar') }} {{ block('form_widget_simple') }} - {% set time_presets = form_time_presets(app.user.timezone, format) %} + {% set time_presets = form_time_presets(app.user.timezone) %} {% if time_presets|length > 0 and form.vars.disabled is same as (false) %}
{{ 'budget'|trans }} + {% if entity.budget > 0 %} {{ entity.budget|money(currency) }} {% else %} - {% endif %} + {% if entity.budget > 0 %} 100% {% else %} @@ -120,6 +132,18 @@ {{ stats.rateBillable|money(currency) }} {{ percentReached|number_format(2) }}%
{{ 'not_invoiced'|trans }} + {% set not_exported = (stats.statisticTotal.rateBillable - stats.statisticTotal.rateBillableExported) %} + {% if invoice_url is defined and invoice_url is not null %} + {{ not_exported|money(currency) }} + {% else %} + {{ not_exported|money(currency) }} + {% endif %} + -