diff --git a/.ddev/config.yaml b/.ddev/config.yaml index 8a1afba88..163165550 100644 --- a/.ddev/config.yaml +++ b/.ddev/config.yaml @@ -11,7 +11,7 @@ additional_fqdns: - meals.test database: type: mariadb - version: "10.11" + version: "10.2" performance_mode: none hooks: post-start: diff --git a/.php-cs-fixer.dist b/.php-cs-fixer.dist index 797e29d30..fd06c38f1 100644 --- a/.php-cs-fixer.dist +++ b/.php-cs-fixer.dist @@ -23,7 +23,8 @@ return $config ], ], 'single_line_throw' => false, - 'global_namespace_import' => true + 'global_namespace_import' => true, + 'trailing_comma_in_multiline' => false ]) ->setUsingCache(false) ->setFinder($finder); diff --git a/Changelog.md b/Changelog.md index 6738e2db3..07f2bf7bf 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,75 @@ # Changelog +## Version v3.1.5 (2024-08-21) + +### Fixes + +- fixed formatting (53e33911) +- fixed a bug that prevented booked Guest meals to be displayed in the participant list (ad609b22) + +## Version v3.1.4 (2024-08-15) + +### Security Fixes + +- security fix for vue-template-compiler (e275564e) + +### Fixes + +- fixed a bug that occured when trying to join a combi meal when no more meals for the day could be booked (aabf1138) +- fixed a bug that prevented setting the servingsize correctly and added updating combimeals after setting serving size (73d61478) +- fixed missing shadows by removing global css (ab236a00) +- fixed several security issues (f03f27c2) +- fixed typing issue (1af59607) +- fixed broken cypress tests (2c0be0af) +- fix for flaky test (5faf6f2c) +- fixed missing shadow on GuestDay (5d754d82) +- fixed broken button coloring (ce3bf666) +- fixed missing background on participation counter (0e94f66e) +- fixed cypress tests (d9f40df9) +- fixed formatting (716fb012) +- fixed remaining typing problems (bf649ef8) +- fixed several typing issues (430cf7e2) +- fixed several typing issues (dee97908) +- fixed some typing problems (7af806e1) +- fixed ddev setup process (7246021a) +- fixed make commands / npm commands (16e980ce) +- fixed some typing problems (37781bd4) + +### Chores and tidying + +- updated axios because of a vulnerability that allowed server-side request forgery in axios (61a20844) +- Updated Readme (6bfe1e12) +- updated folder to Recources (2cbb1cf2) + +### Other + +- changed that users with a balance of 0 can be shown in the costs tab (e47a49d8) +- added checks for updating menus and setting serving size of dishes, also added verbose errormessages for failed checks (3735fd53) +- removed tcpdf, because it is no longer used to create pdfs and has a vulnerability (d7e48eea) +- potential fix for docker build warning (fc5ea854) +- another fix for broken cypress test (a2fdcc9d) +- removed commented code (a6ef925f) +- added verification in guest component and added flashmessage to inform users when they exceed the max number of meals per day (3e527539) +- added required optional parameter (b100d966) +- adjusted formatting (1caecf7a) +- added check for max meals in backend (ed2584d0) +- removed console.logs (77c58f21) +- added Guest label to displayed lists of participants (d69ce782) +- implemented lazy loading of views to reduce initial bundle size (133d23a9) +- changed node variable to vite env variable (6787e570) +- reverted cypress version as a potential fix (d8ea4a5c) +- changed yarn to npm in cypress build (7de083a8) +- adjusted github actions pipeline to use vitest and vue-tsc (0d5c7f90) +- migrated jest tests to vitest (f0482cc4) +- started jest to vitest migration (ab1aab41) +- finalised vite setup (884adab0) +- added dev config (5ea42daf) +- added vite config (7b96720e) +- added symfony-vite-bundle (09437f5a) +- adjusted imports to be compatiuble with vite, added missing packages and added some null checks (80483e4c) +- copied files from webpack package (72dc98cb) +- initialized basic vite config (afcbf06a) + ## Version v3.1.3 (2024-08-05) ### Fixes diff --git a/Dockerfile b/Dockerfile index 3bc4a0397..5fca73a32 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,10 @@ # generate frontend assets -FROM node:20 as frontend +FROM node:20 AS frontend RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y -o Dpkg::Options::="--force-confold" --no-install-recommends --no-install-suggests \ build-essential \ nodejs -WORKDIR var/www/html/src/Resources +WORKDIR /var/www/html/src/Resources COPY src/Resources/package.json src/Resources/package-lock.json ./ RUN npm install COPY src/Resources/ . diff --git a/README.md b/README.md index 743073eef..4169bad1b 100755 --- a/README.md +++ b/README.md @@ -252,6 +252,7 @@ In the Vite Dev mode browsers will typically send out a Warning("Source-Map-Fehl * 201: There are parameters missing to create a dish * 202: One or more titles haven't been sent * 203: There was an error while counting the number of times dishes were taken + * 204: The servingSize cannot be adjusted, because there are booked combi-meals *CategoryController 3xx* * 301: The choosen titles for the category either are missing or do already exist *ParticipantController 4xx* diff --git a/composer.json b/composer.json index 74675b17f..a53946933 100755 --- a/composer.json +++ b/composer.json @@ -30,7 +30,6 @@ "psr/container": "^1.0", "psr/link": "^1.0", "psr/log": "^1|^2", - "qipsius/tcpdf-bundle": "^2.0", "stof/doctrine-extensions-bundle": "^1.6", "symfony/asset": "^6.4", "symfony/config": "^6.4", diff --git a/composer.lock b/composer.lock index 357190942..661bd92dd 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": "f72cd6ae1207bf9b0272314bd3b1486a", + "content-hash": "4c287424a7c9d4e730cf21f58eb02a3f", "packages": [ { "name": "behat/transliterator", @@ -236,16 +236,16 @@ }, { "name": "doctrine/common", - "version": "3.4.4", + "version": "3.4.5", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a" + "reference": "6c8fef961f67b8bc802ce3e32e3ebd1022907286" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a", - "reference": "0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a", + "url": "https://api.github.com/repos/doctrine/common/zipball/6c8fef961f67b8bc802ce3e32e3ebd1022907286", + "reference": "6c8fef961f67b8bc802ce3e32e3ebd1022907286", "shasum": "" }, "require": { @@ -307,7 +307,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.4.4" + "source": "https://github.com/doctrine/common/tree/3.4.5" }, "funding": [ { @@ -323,20 +323,20 @@ "type": "tidelift" } ], - "time": "2024-04-16T13:35:33+00:00" + "time": "2024-10-08T15:53:43+00:00" }, { "name": "doctrine/dbal", - "version": "3.8.5", + "version": "3.9.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "0e3536ba088a749985c8801105b6b3ac6c1280b6" + "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/0e3536ba088a749985c8801105b6b3ac6c1280b6", - "reference": "0e3536ba088a749985c8801105b6b3ac6c1280b6", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/61446f07fcb522414d6cfd8b1c3e5f9e18c579ba", + "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba", "shasum": "" }, "require": { @@ -352,12 +352,12 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.11.1", + "phpstan/phpstan": "1.12.6", "phpstan/phpstan-strict-rules": "^1.6", - "phpunit/phpunit": "9.6.19", + "phpunit/phpunit": "9.6.20", "psalm/plugin-phpunit": "0.18.4", "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.9.2", + "squizlabs/php_codesniffer": "3.10.2", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/console": "^4.4|^5.4|^6.0|^7.0", "vimeo/psalm": "4.30.0" @@ -420,7 +420,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.5" + "source": "https://github.com/doctrine/dbal/tree/3.9.3" }, "funding": [ { @@ -436,7 +436,7 @@ "type": "tidelift" } ], - "time": "2024-06-08T17:49:56+00:00" + "time": "2024-10-10T17:56:43+00:00" }, { "name": "doctrine/deprecations", @@ -487,16 +487,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.12.0", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "5418e811a14724068e95e0ba43353b903ada530f" + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5418e811a14724068e95e0ba43353b903ada530f", - "reference": "5418e811a14724068e95e0ba43353b903ada530f", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca59d84b8e63143ce1aed90cdb333ba329d71563", + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563", "shasum": "" }, "require": { @@ -587,7 +587,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.12.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.0" }, "funding": [ { @@ -603,7 +603,7 @@ "type": "tidelift" } ], - "time": "2024-03-19T07:20:37+00:00" + "time": "2024-09-01T09:46:40+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -1028,21 +1028,21 @@ }, { "name": "doctrine/migrations", - "version": "3.7.4", + "version": "3.8.2", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "954e0a314c2f0eb9fb418210445111747de254a6" + "reference": "5007eb1168691225ac305fe16856755c20860842" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/954e0a314c2f0eb9fb418210445111747de254a6", - "reference": "954e0a314c2f0eb9fb418210445111747de254a6", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/5007eb1168691225ac305fe16856755c20860842", + "reference": "5007eb1168691225ac305fe16856755c20860842", "shasum": "" }, "require": { "composer-runtime-api": "^2", - "doctrine/dbal": "^3.5.1 || ^4", + "doctrine/dbal": "^3.6 || ^4", "doctrine/deprecations": "^0.5.3 || ^1", "doctrine/event-manager": "^1.2 || ^2.0", "php": "^8.1", @@ -1060,6 +1060,7 @@ "doctrine/persistence": "^2 || ^3", "doctrine/sql-formatter": "^1.0", "ext-pdo_sqlite": "*", + "fig/log-test": "^1", "phpstan/phpstan": "^1.10", "phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-phpunit": "^1.3", @@ -1080,7 +1081,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + "Doctrine\\Migrations\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1110,7 +1111,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.7.4" + "source": "https://github.com/doctrine/migrations/tree/3.8.2" }, "funding": [ { @@ -1126,20 +1127,20 @@ "type": "tidelift" } ], - "time": "2024-03-06T13:41:11+00:00" + "time": "2024-10-10T21:35:27+00:00" }, { "name": "doctrine/orm", - "version": "2.19.5", + "version": "2.20.0", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "94986af28452da42a46a4489d1c958a2e5d710e5" + "reference": "8ed6c2234aba019f9737a6bcc9516438e62da27c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/94986af28452da42a46a4489d1c958a2e5d710e5", - "reference": "94986af28452da42a46a4489d1c958a2e5d710e5", + "url": "https://api.github.com/repos/doctrine/orm/zipball/8ed6c2234aba019f9737a6bcc9516438e62da27c", + "reference": "8ed6c2234aba019f9737a6bcc9516438e62da27c", "shasum": "" }, "require": { @@ -1168,14 +1169,16 @@ "doctrine/annotations": "^1.13 || ^2", "doctrine/coding-standard": "^9.0.2 || ^12.0", "phpbench/phpbench": "^0.16.10 || ^1.0", - "phpstan/phpstan": "~1.4.10 || 1.10.59", + "phpstan/extension-installer": "~1.1.0 || ^1.4", + "phpstan/phpstan": "~1.4.10 || 1.12.6", + "phpstan/phpstan-deprecation-rules": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", "psr/log": "^1 || ^2 || ^3", "squizlabs/php_codesniffer": "3.7.2", "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "vimeo/psalm": "4.30.0 || 5.22.2" + "vimeo/psalm": "4.30.0 || 5.24.0" }, "suggest": { "ext-dom": "Provides support for XSD validation for XML mapping files", @@ -1225,22 +1228,22 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.19.5" + "source": "https://github.com/doctrine/orm/tree/2.20.0" }, - "time": "2024-04-30T06:49:54+00:00" + "time": "2024-10-11T11:47:24+00:00" }, { "name": "doctrine/persistence", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "477da35bd0255e032826f440b94b3e37f2d56f42" + "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/477da35bd0255e032826f440b94b3e37f2d56f42", - "reference": "477da35bd0255e032826f440b94b3e37f2d56f42", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/0ea965320cec355dba75031c1b23d4c78362e3ff", + "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff", "shasum": "" }, "require": { @@ -1252,15 +1255,13 @@ "doctrine/common": "<2.10" }, "require-dev": { - "composer/package-versions-deprecated": "^1.11", - "doctrine/coding-standard": "^11", + "doctrine/coding-standard": "^12", "doctrine/common": "^3.0", - "phpstan/phpstan": "1.9.4", + "phpstan/phpstan": "1.12.7", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "vimeo/psalm": "4.30.0 || 5.3.0" + "phpunit/phpunit": "^8.5.38 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" }, "type": "library", "autoload": { @@ -1309,7 +1310,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.3.2" + "source": "https://github.com/doctrine/persistence/tree/3.4.0" }, "funding": [ { @@ -1325,20 +1326,20 @@ "type": "tidelift" } ], - "time": "2024-03-12T14:54:36+00:00" + "time": "2024-10-30T19:48:12+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.4.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "d1ac84aef745c69ea034929eb6d65a6908b675cc" + "reference": "b784cbde727cf806721451dde40eff4fec3bbe86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d1ac84aef745c69ea034929eb6d65a6908b675cc", - "reference": "d1ac84aef745c69ea034929eb6d65a6908b675cc", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/b784cbde727cf806721451dde40eff4fec3bbe86", + "reference": "b784cbde727cf806721451dde40eff4fec3bbe86", "shasum": "" }, "require": { @@ -1346,6 +1347,7 @@ }, "require-dev": { "doctrine/coding-standard": "^12", + "ergebnis/phpunit-slow-test-detector": "^2.14", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^10.5", "vimeo/psalm": "^5.24" @@ -1378,9 +1380,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.4.0" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.1" }, - "time": "2024-05-08T08:12:09+00:00" + "time": "2024-10-21T18:21:57+00:00" }, { "name": "egulias/email-validator", @@ -1533,16 +1535,16 @@ }, { "name": "gedmo/doctrine-extensions", - "version": "v3.15.0", + "version": "v3.17.1", "source": { "type": "git", "url": "https://github.com/doctrine-extensions/DoctrineExtensions.git", - "reference": "2a89103f4984d8970f3855284c8c04e6e6a63c0f" + "reference": "eabb45018c5a4362b46c5beae3881261da89f900" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/2a89103f4984d8970f3855284c8c04e6e6a63c0f", - "reference": "2a89103f4984d8970f3855284c8c04e6e6a63c0f", + "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/eabb45018c5a4362b46c5beae3881261da89f900", + "reference": "eabb45018c5a4362b46c5beae3881261da89f900", "shasum": "" }, "require": { @@ -1559,26 +1561,28 @@ }, "conflict": { "doctrine/annotations": "<1.13 || >=3.0", - "doctrine/dbal": "<3.2 || >=4.0", + "doctrine/dbal": "<3.7 || >=5.0", "doctrine/mongodb-odm": "<2.3 || >=3.0", - "doctrine/orm": "<2.14.0 || 2.16.0 || 2.16.1 || >=3.0" + "doctrine/orm": "<2.14.0 || 2.16.0 || 2.16.1 || >=4.0" }, "require-dev": { "doctrine/annotations": "^1.13 || ^2.0", "doctrine/cache": "^1.11 || ^2.0", - "doctrine/dbal": "^3.2", + "doctrine/dbal": "^3.7 || ^4.0", "doctrine/doctrine-bundle": "^2.3", "doctrine/mongodb-odm": "^2.3", - "doctrine/orm": "^2.14.0", + "doctrine/orm": "^2.14.0 || ^3.0", "friendsofphp/php-cs-fixer": "^3.14.0", "nesbot/carbon": "^2.71 || ^3.0", - "phpstan/phpstan": "^1.10.2", - "phpstan/phpstan-doctrine": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-doctrine": "^1.4", + "phpstan/phpstan-phpunit": "^1.4", "phpunit/phpunit": "^9.6", - "rector/rector": "^0.19", + "rector/rector": "^1.1", "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/doctrine-bridge": "^5.4 || ^6.0 || ^7.0", "symfony/phpunit-bridge": "^6.0 || ^7.0", + "symfony/uid": "^5.4 || ^6.0 || ^7.0", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { @@ -1588,7 +1592,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.13-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -1636,7 +1640,7 @@ "support": { "email": "gediminas.morkevicius@gmail.com", "issues": "https://github.com/doctrine-extensions/DoctrineExtensions/issues", - "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.15.0", + "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.17.1", "wiki": "https://github.com/Atlantic18/DoctrineExtensions/tree/main/doc" }, "funding": [ @@ -1657,7 +1661,7 @@ "type": "github" } ], - "time": "2024-02-12T15:17:22+00:00" + "time": "2024-10-07T22:30:27+00:00" }, { "name": "hwi/oauth-bundle", @@ -1829,27 +1833,27 @@ }, { "name": "laminas/laminas-code", - "version": "4.14.0", + "version": "4.15.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "562e02b7d85cb9142b5116cc76c4c7c162a11a1c" + "reference": "877ad42fe9c164785182fca8afa3f416a056884d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/562e02b7d85cb9142b5116cc76c4c7c162a11a1c", - "reference": "562e02b7d85cb9142b5116cc76c4c7c162a11a1c", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/877ad42fe9c164785182fca8afa3f416a056884d", + "reference": "877ad42fe9c164785182fca8afa3f416a056884d", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "doctrine/annotations": "^2.0.1", "ext-phar": "*", - "laminas/laminas-coding-standard": "^2.5.0", - "laminas/laminas-stdlib": "^3.17.0", - "phpunit/phpunit": "^10.3.3", + "laminas/laminas-coding-standard": "^3.0.0", + "laminas/laminas-stdlib": "^3.18.0", + "phpunit/phpunit": "^10.5.37", "psalm/plugin-phpunit": "^0.19.0", "vimeo/psalm": "^5.15.0" }, @@ -1888,42 +1892,42 @@ "type": "community_bridge" } ], - "time": "2024-06-17T08:50:25+00:00" + "time": "2024-10-25T10:15:16+00:00" }, { "name": "lcobucci/jwt", - "version": "5.3.0", + "version": "5.4.2", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83" + "reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", - "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/ea1ce71cbf9741e445a5914e2f67cdbb484ff712", + "reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712", "shasum": "" }, "require": { "ext-openssl": "*", "ext-sodium": "*", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", "psr/clock": "^1.0" }, "require-dev": { - "infection/infection": "^0.27.0", - "lcobucci/clock": "^3.0", + "infection/infection": "^0.29", + "lcobucci/clock": "^3.2", "lcobucci/coding-standard": "^11.0", - "phpbench/phpbench": "^1.2.9", + "phpbench/phpbench": "^1.2", "phpstan/extension-installer": "^1.2", "phpstan/phpstan": "^1.10.7", "phpstan/phpstan-deprecation-rules": "^1.1.3", "phpstan/phpstan-phpunit": "^1.3.10", "phpstan/phpstan-strict-rules": "^1.5.0", - "phpunit/phpunit": "^10.2.6" + "phpunit/phpunit": "^11.1" }, "suggest": { - "lcobucci/clock": ">= 3.0" + "lcobucci/clock": ">= 3.2" }, "type": "library", "autoload": { @@ -1949,7 +1953,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/5.3.0" + "source": "https://github.com/lcobucci/jwt/tree/5.4.2" }, "funding": [ { @@ -1961,20 +1965,20 @@ "type": "patreon" } ], - "time": "2024-04-11T23:07:54+00:00" + "time": "2024-11-07T12:54:35+00:00" }, { "name": "monolog/monolog", - "version": "3.6.0", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/32e515fdc02cdafbe4593e30a9350d486b125b67", + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67", "shasum": "" }, "require": { @@ -1994,12 +1998,14 @@ "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.5.17", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", "predis/predis": "^1.1 || ^2", - "ruflin/elastica": "^7", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -2050,7 +2056,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + "source": "https://github.com/Seldaek/monolog/tree/3.8.0" }, "funding": [ { @@ -2062,7 +2068,7 @@ "type": "tidelift" } ], - "time": "2024-04-12T21:02:21+00:00" + "time": "2024-11-12T13:57:08+00:00" }, { "name": "paypal/paypal-checkout-sdk", @@ -2114,7 +2120,7 @@ "support": { "source": "https://github.com/paypal/Checkout-PHP-SDK/tree/1.0.2" }, - "abandoned": true, + "abandoned": "paypal/paypal-server-sdk", "time": "2021-09-21T20:57:38+00:00" }, { @@ -2162,16 +2168,16 @@ }, { "name": "pentatrion/vite-bundle", - "version": "v6.4.7", + "version": "v6.5.3", "source": { "type": "git", "url": "https://github.com/lhapaipai/vite-bundle.git", - "reference": "e802802e9cb463661b2a81c05723627270c451f7" + "reference": "9316e75d82b6c6b912b4ed45c38fc5a735aafcf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lhapaipai/vite-bundle/zipball/e802802e9cb463661b2a81c05723627270c451f7", - "reference": "e802802e9cb463661b2a81c05723627270c451f7", + "url": "https://api.github.com/repos/lhapaipai/vite-bundle/zipball/9316e75d82b6c6b912b4ed45c38fc5a735aafcf9", + "reference": "9316e75d82b6c6b912b4ed45c38fc5a735aafcf9", "shasum": "" }, "require": { @@ -2217,9 +2223,9 @@ ], "support": { "issues": "https://github.com/lhapaipai/vite-bundle/issues", - "source": "https://github.com/lhapaipai/vite-bundle/tree/v6.4.7" + "source": "https://github.com/lhapaipai/vite-bundle/tree/v6.5.3" }, - "time": "2024-05-09T14:30:47+00:00" + "time": "2024-08-16T08:18:36+00:00" }, { "name": "psr/cache", @@ -2519,65 +2525,18 @@ }, "time": "2021-07-14T16:41:46+00:00" }, - { - "name": "qipsius/tcpdf-bundle", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/Qipsius/QipsiusTCPDFBundle.git", - "reference": "961f0bfd55442336b8a12d599eca078b26a4b853" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Qipsius/QipsiusTCPDFBundle/zipball/961f0bfd55442336b8a12d599eca078b26a4b853", - "reference": "961f0bfd55442336b8a12d599eca078b26a4b853", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/framework-bundle": ">=3.4", - "tecnickcom/tcpdf": "*" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Qipsius\\TCPDFBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rich Sage", - "email": "rich.sage@gmail.com" - } - ], - "description": "A bundle to easily integrate TCPDF into Symfony", - "homepage": "https://github.com/qipsius/QipsiusTCPDFBundle", - "keywords": [ - "TCPDF", - "pdf" - ], - "support": { - "issues": "https://github.com/Qipsius/QipsiusTCPDFBundle/issues", - "source": "https://github.com/Qipsius/QipsiusTCPDFBundle/tree/2.0.3" - }, - "time": "2023-08-07T08:33:50+00:00" - }, { "name": "stof/doctrine-extensions-bundle", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/stof/StofDoctrineExtensionsBundle.git", - "reference": "9f7023e4c8a1c00a5627d41c1027a3f89e477630" + "reference": "473ae65598fa4160654c350e139e20ee75d9a91a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stof/StofDoctrineExtensionsBundle/zipball/9f7023e4c8a1c00a5627d41c1027a3f89e477630", - "reference": "9f7023e4c8a1c00a5627d41c1027a3f89e477630", + "url": "https://api.github.com/repos/stof/StofDoctrineExtensionsBundle/zipball/473ae65598fa4160654c350e139e20ee75d9a91a", + "reference": "473ae65598fa4160654c350e139e20ee75d9a91a", "shasum": "" }, "require": { @@ -2642,22 +2601,22 @@ ], "support": { "issues": "https://github.com/stof/StofDoctrineExtensionsBundle/issues", - "source": "https://github.com/stof/StofDoctrineExtensionsBundle/tree/v1.11.0" + "source": "https://github.com/stof/StofDoctrineExtensionsBundle/tree/v1.12.0" }, - "time": "2024-02-13T14:43:20+00:00" + "time": "2024-06-10T12:27:27+00:00" }, { "name": "symfony/asset", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "c668aa320e26b7379540368832b9d1dd43d32603" + "reference": "2466c17d61d14539cddf77e57ebb9cc971185302" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/c668aa320e26b7379540368832b9d1dd43d32603", - "reference": "c668aa320e26b7379540368832b9d1dd43d32603", + "url": "https://api.github.com/repos/symfony/asset/zipball/2466c17d61d14539cddf77e57ebb9cc971185302", + "reference": "2466c17d61d14539cddf77e57ebb9cc971185302", "shasum": "" }, "require": { @@ -2697,7 +2656,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.4.8" + "source": "https://github.com/symfony/asset/tree/v6.4.13" }, "funding": [ { @@ -2713,20 +2672,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/cache", - "version": "v7.1.1", + "version": "v7.1.7", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "760294dc7158372699dccd077965c16c328f8719" + "reference": "23b61c9592ee72233c31625f0ae805dd1571e928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/760294dc7158372699dccd077965c16c328f8719", - "reference": "760294dc7158372699dccd077965c16c328f8719", + "url": "https://api.github.com/repos/symfony/cache/zipball/23b61c9592ee72233c31625f0ae805dd1571e928", + "reference": "23b61c9592ee72233c31625f0ae805dd1571e928", "shasum": "" }, "require": { @@ -2794,7 +2753,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.1.1" + "source": "https://github.com/symfony/cache/tree/v7.1.7" }, "funding": [ { @@ -2810,20 +2769,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-11-05T15:34:55+00:00" }, { "name": "symfony/clock", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" + "reference": "97bebc53548684c17ed696bc8af016880f0f098d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", - "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", + "url": "https://api.github.com/repos/symfony/clock/zipball/97bebc53548684c17ed696bc8af016880f0f098d", + "reference": "97bebc53548684c17ed696bc8af016880f0f098d", "shasum": "" }, "require": { @@ -2868,7 +2827,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.1.1" + "source": "https://github.com/symfony/clock/tree/v7.1.6" }, "funding": [ { @@ -2884,20 +2843,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/config", - "version": "v6.4.8", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "12e7e52515ce37191b193cf3365903c4f3951e35" + "reference": "4e55e7e4ffddd343671ea972216d4509f46c22ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/12e7e52515ce37191b193cf3365903c4f3951e35", - "reference": "12e7e52515ce37191b193cf3365903c4f3951e35", + "url": "https://api.github.com/repos/symfony/config/zipball/4e55e7e4ffddd343671ea972216d4509f46c22ef", + "reference": "4e55e7e4ffddd343671ea972216d4509f46c22ef", "shasum": "" }, "require": { @@ -2943,7 +2902,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.4.8" + "source": "https://github.com/symfony/config/tree/v6.4.14" }, "funding": [ { @@ -2959,20 +2918,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-04T11:33:53+00:00" }, { "name": "symfony/console", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "be5854cee0e8c7b110f00d695d11debdfa1a2a91" + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/be5854cee0e8c7b110f00d695d11debdfa1a2a91", - "reference": "be5854cee0e8c7b110f00d695d11debdfa1a2a91", + "url": "https://api.github.com/repos/symfony/console/zipball/f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", "shasum": "" }, "require": { @@ -3037,7 +2996,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.8" + "source": "https://github.com/symfony/console/tree/v6.4.15" }, "funding": [ { @@ -3053,7 +3012,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-06T14:19:14+00:00" }, { "name": "symfony/contracts", @@ -3152,16 +3111,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "d3b618176e8c3a9e5772151c51eba0c52a0c771c" + "reference": "70ab1f65a4516ef741e519ea938e6aa465e6aa36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d3b618176e8c3a9e5772151c51eba0c52a0c771c", - "reference": "d3b618176e8c3a9e5772151c51eba0c52a0c771c", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/70ab1f65a4516ef741e519ea938e6aa465e6aa36", + "reference": "70ab1f65a4516ef741e519ea938e6aa465e6aa36", "shasum": "" }, "require": { @@ -3213,7 +3172,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.4.8" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.15" }, "funding": [ { @@ -3229,20 +3188,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-09T06:56:25+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "2c36eca96f111ada35b648a4d6e8aa61f354e4d4" + "reference": "3fcfb37b738def92757b6ac5365a3147b2e2dd36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/2c36eca96f111ada35b648a4d6e8aa61f354e4d4", - "reference": "2c36eca96f111ada35b648a4d6e8aa61f354e4d4", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/3fcfb37b738def92757b6ac5365a3147b2e2dd36", + "reference": "3fcfb37b738def92757b6ac5365a3147b2e2dd36", "shasum": "" }, "require": { @@ -3321,7 +3280,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.1" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.6" }, "funding": [ { @@ -3337,20 +3296,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-10-18T09:42:06+00:00" }, { "name": "symfony/dotenv", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "55aefa0029adff89ecffdb560820e945c7983f06" + "reference": "436ae2dd89360fea8c7d5ff3f48ecf523c80bfb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/55aefa0029adff89ecffdb560820e945c7983f06", - "reference": "55aefa0029adff89ecffdb560820e945c7983f06", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/436ae2dd89360fea8c7d5ff3f48ecf523c80bfb4", + "reference": "436ae2dd89360fea8c7d5ff3f48ecf523c80bfb4", "shasum": "" }, "require": { @@ -3395,7 +3354,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.8" + "source": "https://github.com/symfony/dotenv/tree/v6.4.13" }, "funding": [ { @@ -3411,20 +3370,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-28T07:43:51+00:00" }, { "name": "symfony/error-handler", - "version": "v7.1.1", + "version": "v7.1.7", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd" + "reference": "010e44661f4c6babaf8c4862fe68c24a53903342" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", - "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/010e44661f4c6babaf8c4862fe68c24a53903342", + "reference": "010e44661f4c6babaf8c4862fe68c24a53903342", "shasum": "" }, "require": { @@ -3470,7 +3429,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/v7.1.1" + "source": "https://github.com/symfony/error-handler/tree/v7.1.7" }, "funding": [ { @@ -3486,20 +3445,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-11-05T15:34:55+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", - "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", "shasum": "" }, "require": { @@ -3550,7 +3509,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.4.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.13" }, "funding": [ { @@ -3566,20 +3525,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/expression-language", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "0b63cb437741a42104d3ccc9bf60bbd8e1acbd2a" + "reference": "3524904fb026356a5230cd197f9a4e6a61e0e7df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/0b63cb437741a42104d3ccc9bf60bbd8e1acbd2a", - "reference": "0b63cb437741a42104d3ccc9bf60bbd8e1acbd2a", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/3524904fb026356a5230cd197f9a4e6a61e0e7df", + "reference": "3524904fb026356a5230cd197f9a4e6a61e0e7df", "shasum": "" }, "require": { @@ -3614,7 +3573,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.4.8" + "source": "https://github.com/symfony/expression-language/tree/v6.4.13" }, "funding": [ { @@ -3630,20 +3589,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-09T08:40:40+00:00" }, { "name": "symfony/filesystem", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "802e87002f919296c9f606457d9fa327a0b3d6b2" + "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/802e87002f919296c9f606457d9fa327a0b3d6b2", - "reference": "802e87002f919296c9f606457d9fa327a0b3d6b2", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c835867b3c62bb05c7fe3d637c871c7ae52024d4", + "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4", "shasum": "" }, "require": { @@ -3680,7 +3639,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.1.1" + "source": "https://github.com/symfony/filesystem/tree/v7.1.6" }, "funding": [ { @@ -3696,20 +3655,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/finder", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6" + "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/fbb0ba67688b780efbc886c1a0a0948dcf7205d6", - "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6", + "url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8", + "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8", "shasum": "" }, "require": { @@ -3744,7 +3703,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.1" + "source": "https://github.com/symfony/finder/tree/v7.1.6" }, "funding": [ { @@ -3760,26 +3719,29 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-10-01T08:31:23+00:00" }, { "name": "symfony/flex", - "version": "v1.21.6", + "version": "v1.21.8", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "06b58a5e5b4c6528fb12e0fac5fea0db3f1e7ae8" + "reference": "bda5f869ac51c8e985a6fe9f964c4cb78228a369" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/06b58a5e5b4c6528fb12e0fac5fea0db3f1e7ae8", - "reference": "06b58a5e5b4c6528fb12e0fac5fea0db3f1e7ae8", + "url": "https://api.github.com/repos/symfony/flex/zipball/bda5f869ac51c8e985a6fe9f964c4cb78228a369", + "reference": "bda5f869ac51c8e985a6fe9f964c4cb78228a369", "shasum": "" }, "require": { "composer-plugin-api": "^1.0|^2.0", "php": ">=7.1" }, + "conflict": { + "composer/semver": "<1.7.2" + }, "require-dev": { "composer/composer": "^1.0.2|^2.0", "symfony/dotenv": "^4.4|^5.0|^6.0", @@ -3809,7 +3771,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.21.6" + "source": "https://github.com/symfony/flex/tree/v1.21.8" }, "funding": [ { @@ -3825,20 +3787,20 @@ "type": "tidelift" } ], - "time": "2024-03-02T08:16:37+00:00" + "time": "2024-10-07T08:51:39+00:00" }, { "name": "symfony/form", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "196ebc738e59bec2bbf1f49c24cc221b47f77f5d" + "reference": "0fe17f90af23908ddc11dc23507db98e66572046" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/196ebc738e59bec2bbf1f49c24cc221b47f77f5d", - "reference": "196ebc738e59bec2bbf1f49c24cc221b47f77f5d", + "url": "https://api.github.com/repos/symfony/form/zipball/0fe17f90af23908ddc11dc23507db98e66572046", + "reference": "0fe17f90af23908ddc11dc23507db98e66572046", "shasum": "" }, "require": { @@ -3906,7 +3868,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.4.8" + "source": "https://github.com/symfony/form/tree/v6.4.13" }, "funding": [ { @@ -3922,20 +3884,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-09T08:40:40+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "7c7739f87f1a8be1c2f5e7d28addfe763a917acb" + "reference": "e8b0bd921f9bd35ea4d1508067c3f3f6e2036418" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/7c7739f87f1a8be1c2f5e7d28addfe763a917acb", - "reference": "7c7739f87f1a8be1c2f5e7d28addfe763a917acb", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/e8b0bd921f9bd35ea4d1508067c3f3f6e2036418", + "reference": "e8b0bd921f9bd35ea4d1508067c3f3f6e2036418", "shasum": "" }, "require": { @@ -3944,7 +3906,7 @@ "php": ">=8.1", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4.12|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.1|^7.0", "symfony/event-dispatcher": "^5.4|^6.0|^7.0", @@ -3974,6 +3936,7 @@ "symfony/mime": "<6.4", "symfony/property-access": "<5.4", "symfony/property-info": "<5.4", + "symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6", "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", "symfony/security-core": "<5.4", "symfony/security-csrf": "<5.4", @@ -4054,7 +4017,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.4.8" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.13" }, "funding": [ { @@ -4070,20 +4033,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "61faba993e620fc22d4f0ab3b6bcf8fbb0d44b05" + "reference": "cb4073c905cd12b8496d24ac428a9228c1750670" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/61faba993e620fc22d4f0ab3b6bcf8fbb0d44b05", - "reference": "61faba993e620fc22d4f0ab3b6bcf8fbb0d44b05", + "url": "https://api.github.com/repos/symfony/http-client/zipball/cb4073c905cd12b8496d24ac428a9228c1750670", + "reference": "cb4073c905cd12b8496d24ac428a9228c1750670", "shasum": "" }, "require": { @@ -4147,7 +4110,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.8" + "source": "https://github.com/symfony/http-client/tree/v6.4.15" }, "funding": [ { @@ -4163,20 +4126,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-13T13:40:18+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "27de8cc95e11db7a50b027e71caaab9024545947" + "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/27de8cc95e11db7a50b027e71caaab9024545947", - "reference": "27de8cc95e11db7a50b027e71caaab9024545947", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6", + "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6", "shasum": "" }, "require": { @@ -4186,12 +4149,12 @@ "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.3" + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.3|^7.0", + "symfony/cache": "^6.4.12|^7.1.5", "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", @@ -4224,7 +4187,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.4.8" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.15" }, "funding": [ { @@ -4240,20 +4203,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-08T16:09:24+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "6c519aa3f32adcfd1d1f18d923f6b227d9acf3c1" + "reference": "b002a5b3947653c5aee3adac2a024ea615fd3ff5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6c519aa3f32adcfd1d1f18d923f6b227d9acf3c1", - "reference": "6c519aa3f32adcfd1d1f18d923f6b227d9acf3c1", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b002a5b3947653c5aee3adac2a024ea615fd3ff5", + "reference": "b002a5b3947653c5aee3adac2a024ea615fd3ff5", "shasum": "" }, "require": { @@ -4338,7 +4301,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.4.8" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.15" }, "funding": [ { @@ -4354,20 +4317,20 @@ "type": "tidelift" } ], - "time": "2024-06-02T16:06:25+00:00" + "time": "2024-11-13T13:57:37+00:00" }, { "name": "symfony/intl", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "50265cdcf5a44bec3fcf487b5d0015aece91d1eb" + "reference": "b1d5e8d82615b60f229216edfee0b59e2ef66da6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/50265cdcf5a44bec3fcf487b5d0015aece91d1eb", - "reference": "50265cdcf5a44bec3fcf487b5d0015aece91d1eb", + "url": "https://api.github.com/repos/symfony/intl/zipball/b1d5e8d82615b60f229216edfee0b59e2ef66da6", + "reference": "b1d5e8d82615b60f229216edfee0b59e2ef66da6", "shasum": "" }, "require": { @@ -4421,7 +4384,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.4.8" + "source": "https://github.com/symfony/intl/tree/v6.4.15" }, "funding": [ { @@ -4437,20 +4400,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-08T15:28:48+00:00" }, { "name": "symfony/mailer", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "54fec5a552238d071502facd85c34af83a20dc38" + "reference": "f732e1fafdf0f4a2d865e91f1018aaca174aeed9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/54fec5a552238d071502facd85c34af83a20dc38", - "reference": "54fec5a552238d071502facd85c34af83a20dc38", + "url": "https://api.github.com/repos/symfony/mailer/zipball/f732e1fafdf0f4a2d865e91f1018aaca174aeed9", + "reference": "f732e1fafdf0f4a2d865e91f1018aaca174aeed9", "shasum": "" }, "require": { @@ -4497,7 +4460,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v5.4.40" + "source": "https://github.com/symfony/mailer/tree/v5.4.45" }, "funding": [ { @@ -4513,7 +4476,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/mercure", @@ -4684,16 +4647,16 @@ }, { "name": "symfony/mime", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "618597ab8b78ac86d1c75a9d0b35540cda074f33" + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/618597ab8b78ac86d1c75a9d0b35540cda074f33", - "reference": "618597ab8b78ac86d1c75a9d0b35540cda074f33", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", "shasum": "" }, "require": { @@ -4707,7 +4670,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.3.2" + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -4717,7 +4680,7 @@ "symfony/process": "^5.4|^6.4|^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" + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -4749,7 +4712,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.8" + "source": "https://github.com/symfony/mime/tree/v6.4.13" }, "funding": [ { @@ -4765,20 +4728,20 @@ "type": "tidelift" } ], - "time": "2024-06-01T07:50:16+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "727be11ae17bb1c5a7f600753b9a1bf0cc0ec3b8" + "reference": "e1da878cf5f701df5f5c1799bdbf827acee5a76e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/727be11ae17bb1c5a7f600753b9a1bf0cc0ec3b8", - "reference": "727be11ae17bb1c5a7f600753b9a1bf0cc0ec3b8", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/e1da878cf5f701df5f5c1799bdbf827acee5a76e", + "reference": "e1da878cf5f701df5f5c1799bdbf827acee5a76e", "shasum": "" }, "require": { @@ -4827,7 +4790,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v7.1.1" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.1.6" }, "funding": [ { @@ -4843,7 +4806,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-10-14T08:49:35+00:00" }, { "name": "symfony/monolog-bundle", @@ -4928,16 +4891,16 @@ }, { "name": "symfony/options-resolver", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55" + "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55", - "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/85e95eeede2d41cd146146e98c9c81d9214cae85", + "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85", "shasum": "" }, "require": { @@ -4975,7 +4938,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.1.1" + "source": "https://github.com/symfony/options-resolver/tree/v7.1.6" }, "funding": [ { @@ -4991,20 +4954,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/password-hasher", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "4ad96eb7cf9e2f8f133ada95f2b8021769061662" + "reference": "2e618d1af51805e5a1fbda326d00b77c6c1037d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/4ad96eb7cf9e2f8f133ada95f2b8021769061662", - "reference": "4ad96eb7cf9e2f8f133ada95f2b8021769061662", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/2e618d1af51805e5a1fbda326d00b77c6c1037d5", + "reference": "2e618d1af51805e5a1fbda326d00b77c6c1037d5", "shasum": "" }, "require": { @@ -5047,7 +5010,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.1.1" + "source": "https://github.com/symfony/password-hasher/tree/v7.1.6" }, "funding": [ { @@ -5063,24 +5026,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -5126,7 +5089,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -5142,24 +5105,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -5204,7 +5167,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -5220,24 +5183,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance and support of other locales than \"en\"" @@ -5288,7 +5251,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0" }, "funding": [ { @@ -5304,26 +5267,25 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:12:16+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -5372,7 +5334,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -5388,24 +5350,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -5453,7 +5415,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -5469,24 +5431,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -5533,7 +5495,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -5549,40 +5511,32 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, - "type": "library", + "type": "metapackage", "extra": { "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -5606,7 +5560,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.0" }, "funding": [ { @@ -5622,24 +5576,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -5682,7 +5636,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" }, "funding": [ { @@ -5698,24 +5652,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -5762,7 +5716,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -5778,24 +5732,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -5838,7 +5792,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { @@ -5854,25 +5808,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.2" }, "type": "library", "extra": { @@ -5915,7 +5868,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -5931,20 +5884,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/property-access", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "e4d9b00983612f9c0013ca37c61affdba2dd975a" + "reference": "8cc779d88d12e440adaa26387bcfc25744064afe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/e4d9b00983612f9c0013ca37c61affdba2dd975a", - "reference": "e4d9b00983612f9c0013ca37c61affdba2dd975a", + "url": "https://api.github.com/repos/symfony/property-access/zipball/8cc779d88d12e440adaa26387bcfc25744064afe", + "reference": "8cc779d88d12e440adaa26387bcfc25744064afe", "shasum": "" }, "require": { @@ -5992,7 +5945,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.4.8" + "source": "https://github.com/symfony/property-access/tree/v6.4.13" }, "funding": [ { @@ -6008,20 +5961,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/property-info", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "7f544bc6ceb1a6a2283c7af8e8621262c43b7ede" + "reference": "9d7b576bb643c72bf3b60eb8e89c98725d00afd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/7f544bc6ceb1a6a2283c7af8e8621262c43b7ede", - "reference": "7f544bc6ceb1a6a2283c7af8e8621262c43b7ede", + "url": "https://api.github.com/repos/symfony/property-info/zipball/9d7b576bb643c72bf3b60eb8e89c98725d00afd0", + "reference": "9d7b576bb643c72bf3b60eb8e89c98725d00afd0", "shasum": "" }, "require": { @@ -6036,7 +5989,7 @@ }, "require-dev": { "phpdocumentor/reflection-docblock": "^5.2", - "phpstan/phpdoc-parser": "^1.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/serializer": "^6.4|^7.0" @@ -6075,7 +6028,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.8" + "source": "https://github.com/symfony/property-info/tree/v6.4.15" }, "funding": [ { @@ -6091,20 +6044,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-07T16:39:46+00:00" }, { "name": "symfony/proxy-manager-bridge", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/proxy-manager-bridge.git", - "reference": "b8119e0b248ef0711c25cd09acc729102122621c" + "reference": "8932b572e147e80fb498045c580eb14215197529" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/b8119e0b248ef0711c25cd09acc729102122621c", - "reference": "b8119e0b248ef0711c25cd09acc729102122621c", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/8932b572e147e80fb498045c580eb14215197529", + "reference": "8932b572e147e80fb498045c580eb14215197529", "shasum": "" }, "require": { @@ -6142,7 +6095,7 @@ "description": "Provides integration for ProxyManager with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.8" + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.13" }, "funding": [ { @@ -6158,20 +6111,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/routing", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58" + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58", - "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58", + "url": "https://api.github.com/repos/symfony/routing/zipball/640a74250d13f9c30d5ca045b6aaaabcc8215278", + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278", "shasum": "" }, "require": { @@ -6225,7 +6178,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.8" + "source": "https://github.com/symfony/routing/tree/v6.4.13" }, "funding": [ { @@ -6241,20 +6194,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/runtime", - "version": "v6.4.8", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "b4bfa2fd4cad1fee62f80b3dfe4eb674cc3302a0" + "reference": "4facd4174f45cd37c65860403412b67c7381136a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/b4bfa2fd4cad1fee62f80b3dfe4eb674cc3302a0", - "reference": "b4bfa2fd4cad1fee62f80b3dfe4eb674cc3302a0", + "url": "https://api.github.com/repos/symfony/runtime/zipball/4facd4174f45cd37c65860403412b67c7381136a", + "reference": "4facd4174f45cd37c65860403412b67c7381136a", "shasum": "" }, "require": { @@ -6304,7 +6257,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v6.4.8" + "source": "https://github.com/symfony/runtime/tree/v6.4.14" }, "funding": [ { @@ -6320,20 +6273,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-05T16:39:55+00:00" }, { "name": "symfony/security-bundle", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "dc4fb2acee6d28bf490ba300a36389182de74d25" + "reference": "7df1d3d431be03fbeb1b162eebca424005b48cdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/dc4fb2acee6d28bf490ba300a36389182de74d25", - "reference": "dc4fb2acee6d28bf490ba300a36389182de74d25", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/7df1d3d431be03fbeb1b162eebca424005b48cdd", + "reference": "7df1d3d431be03fbeb1b162eebca424005b48cdd", "shasum": "" }, "require": { @@ -6342,7 +6295,7 @@ "php": ">=8.2", "symfony/clock": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4.11|^7.1.4", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -6382,7 +6335,7 @@ "symfony/validator": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", "twig/twig": "^3.0.4", - "web-token/jwt-library": "^3.3.2" + "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "symfony-bundle", "autoload": { @@ -6410,7 +6363,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/v7.1.1" + "source": "https://github.com/symfony/security-bundle/tree/v7.1.6" }, "funding": [ { @@ -6426,20 +6379,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/security-core", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "536399671a46b0e615d69583f067e30ad25ad038" + "reference": "6f3ffbfa1ece94f3a6d97e6e96e9994e9d1bbce2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/536399671a46b0e615d69583f067e30ad25ad038", - "reference": "536399671a46b0e615d69583f067e30ad25ad038", + "url": "https://api.github.com/repos/symfony/security-core/zipball/6f3ffbfa1ece94f3a6d97e6e96e9994e9d1bbce2", + "reference": "6f3ffbfa1ece94f3a6d97e6e96e9994e9d1bbce2", "shasum": "" }, "require": { @@ -6496,7 +6449,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.1.1" + "source": "https://github.com/symfony/security-core/tree/v7.1.6" }, "funding": [ { @@ -6512,20 +6465,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/security-csrf", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "f46ab02b76311087873257071559edcaf6d7ab99" + "reference": "c34421b7d34efbaef5d611ab2e646a0ec464ffe3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/f46ab02b76311087873257071559edcaf6d7ab99", - "reference": "f46ab02b76311087873257071559edcaf6d7ab99", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/c34421b7d34efbaef5d611ab2e646a0ec464ffe3", + "reference": "c34421b7d34efbaef5d611ab2e646a0ec464ffe3", "shasum": "" }, "require": { @@ -6564,7 +6517,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v6.4.8" + "source": "https://github.com/symfony/security-csrf/tree/v6.4.13" }, "funding": [ { @@ -6580,20 +6533,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/security-http", - "version": "v7.1.1", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "8fa539ad9fe3c45452b8cca8381c2414cef78559" + "reference": "e11ea7f98fba4921a6c847a0c6a77d1befa9698f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/8fa539ad9fe3c45452b8cca8381c2414cef78559", - "reference": "8fa539ad9fe3c45452b8cca8381c2414cef78559", + "url": "https://api.github.com/repos/symfony/security-http/zipball/e11ea7f98fba4921a6c847a0c6a77d1befa9698f", + "reference": "e11ea7f98fba4921a6c847a0c6a77d1befa9698f", "shasum": "" }, "require": { @@ -6624,7 +6577,7 @@ "symfony/routing": "^6.4|^7.0", "symfony/security-csrf": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", - "web-token/jwt-library": "^3.3.2" + "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "library", "autoload": { @@ -6652,7 +6605,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.1.1" + "source": "https://github.com/symfony/security-http/tree/v7.1.8" }, "funding": [ { @@ -6668,20 +6621,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-11-13T13:40:27+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "63e069eb616049632cde9674c46957819454b8aa" + "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/63e069eb616049632cde9674c46957819454b8aa", - "reference": "63e069eb616049632cde9674c46957819454b8aa", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2cae0a6f8d04937d02f6d19806251e2104d54f92", + "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92", "shasum": "" }, "require": { @@ -6714,7 +6667,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.8" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.13" }, "funding": [ { @@ -6730,20 +6683,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/string", - "version": "v7.1.1", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "60bc311c74e0af215101235aa6f471bcbc032df2" + "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/60bc311c74e0af215101235aa6f471bcbc032df2", - "reference": "60bc311c74e0af215101235aa6f471bcbc032df2", + "url": "https://api.github.com/repos/symfony/string/zipball/591ebd41565f356fcd8b090fe64dbb5878f50281", + "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281", "shasum": "" }, "require": { @@ -6801,7 +6754,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.1" + "source": "https://github.com/symfony/string/tree/v7.1.8" }, "funding": [ { @@ -6817,20 +6770,20 @@ "type": "tidelift" } ], - "time": "2024-06-04T06:40:14+00:00" + "time": "2024-11-13T13:31:21+00:00" }, { "name": "symfony/translation", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a" + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/a002933b13989fc4bd0b58e04bf7eec5210e438a", - "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a", + "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", "shasum": "" }, "require": { @@ -6896,7 +6849,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.8" + "source": "https://github.com/symfony/translation/tree/v6.4.13" }, "funding": [ { @@ -6912,20 +6865,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-27T18:14:25+00:00" }, { "name": "symfony/twig-bridge", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "57de1b7d7499053a2c5beb9344751e8bfd332649" + "reference": "ec3511eef0576f378b2758da9e1c157086babd59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/57de1b7d7499053a2c5beb9344751e8bfd332649", - "reference": "57de1b7d7499053a2c5beb9344751e8bfd332649", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/ec3511eef0576f378b2758da9e1c157086babd59", + "reference": "ec3511eef0576f378b2758da9e1c157086babd59", "shasum": "" }, "require": { @@ -7005,7 +6958,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.8" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.13" }, "funding": [ { @@ -7021,20 +6974,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/twig-bundle", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "ef17bc8fc2cb2376b235cd1b98f0275a78c5ba65" + "reference": "c3beeb5336aba1ea03c37e526968c2fde3ef25c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/ef17bc8fc2cb2376b235cd1b98f0275a78c5ba65", - "reference": "ef17bc8fc2cb2376b235cd1b98f0275a78c5ba65", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/c3beeb5336aba1ea03c37e526968c2fde3ef25c4", + "reference": "c3beeb5336aba1ea03c37e526968c2fde3ef25c4", "shasum": "" }, "require": { @@ -7089,7 +7042,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.4.8" + "source": "https://github.com/symfony/twig-bundle/tree/v6.4.13" }, "funding": [ { @@ -7105,20 +7058,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/validator", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "dab2781371d54c86f6b25623ab16abb2dde2870c" + "reference": "7541055cdaf54ff95f0735bf703d313374e8b20b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/dab2781371d54c86f6b25623ab16abb2dde2870c", - "reference": "dab2781371d54c86f6b25623ab16abb2dde2870c", + "url": "https://api.github.com/repos/symfony/validator/zipball/7541055cdaf54ff95f0735bf703d313374e8b20b", + "reference": "7541055cdaf54ff95f0735bf703d313374e8b20b", "shasum": "" }, "require": { @@ -7186,7 +7139,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.8" + "source": "https://github.com/symfony/validator/tree/v6.4.15" }, "funding": [ { @@ -7202,20 +7155,20 @@ "type": "tidelift" } ], - "time": "2024-06-02T15:48:50+00:00" + "time": "2024-11-08T15:28:48+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "ad23ca4312395f0a8a8633c831ef4c4ee542ed25" + "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ad23ca4312395f0a8a8633c831ef4c4ee542ed25", - "reference": "ad23ca4312395f0a8a8633c831ef4c4ee542ed25", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80", + "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80", "shasum": "" }, "require": { @@ -7271,7 +7224,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.8" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.15" }, "funding": [ { @@ -7287,20 +7240,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-08T15:28:48+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "792ca836f99b340f2e9ca9497c7953948c49a504" + "reference": "0f605f72a363f8743001038a176eeb2a11223b51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/792ca836f99b340f2e9ca9497c7953948c49a504", - "reference": "792ca836f99b340f2e9ca9497c7953948c49a504", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f605f72a363f8743001038a176eeb2a11223b51", + "reference": "0f605f72a363f8743001038a176eeb2a11223b51", "shasum": "" }, "require": { @@ -7348,7 +7301,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.8" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.13" }, "funding": [ { @@ -7364,20 +7317,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/web-link", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/web-link.git", - "reference": "63f90aa0054bfd9a091d2f5cf465958f1030638f" + "reference": "383aa7566f25e3a1ab323732c2cc6a1748120d3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-link/zipball/63f90aa0054bfd9a091d2f5cf465958f1030638f", - "reference": "63f90aa0054bfd9a091d2f5cf465958f1030638f", + "url": "https://api.github.com/repos/symfony/web-link/zipball/383aa7566f25e3a1ab323732c2cc6a1748120d3a", + "reference": "383aa7566f25e3a1ab323732c2cc6a1748120d3a", "shasum": "" }, "require": { @@ -7431,7 +7384,7 @@ "push" ], "support": { - "source": "https://github.com/symfony/web-link/tree/v7.1.1" + "source": "https://github.com/symfony/web-link/tree/v7.1.6" }, "funding": [ { @@ -7447,20 +7400,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9" + "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e99b4e94d124b29ee4cf3140e1b537d2dad8cec9", + "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9", "shasum": "" }, "require": { @@ -7503,7 +7456,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.8" + "source": "https://github.com/symfony/yaml/tree/v6.4.13" }, "funding": [ { @@ -7519,100 +7472,28 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" - }, - { - "name": "tecnickcom/tcpdf", - "version": "6.7.5", - "source": { - "type": "git", - "url": "https://github.com/tecnickcom/TCPDF.git", - "reference": "951eabf0338ec2522bd0d5d9c79b08a3a3d36b36" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/951eabf0338ec2522bd0d5d9c79b08a3a3d36b36", - "reference": "951eabf0338ec2522bd0d5d9c79b08a3a3d36b36", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "config", - "include", - "tcpdf.php", - "tcpdf_parser.php", - "tcpdf_import.php", - "tcpdf_barcodes_1d.php", - "tcpdf_barcodes_2d.php", - "include/tcpdf_colors.php", - "include/tcpdf_filters.php", - "include/tcpdf_font_data.php", - "include/tcpdf_fonts.php", - "include/tcpdf_images.php", - "include/tcpdf_static.php", - "include/barcodes/datamatrix.php", - "include/barcodes/pdf417.php", - "include/barcodes/qrcode.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Nicola Asuni", - "email": "info@tecnick.com", - "role": "lead" - } - ], - "description": "TCPDF is a PHP class for generating PDF documents and barcodes.", - "homepage": "http://www.tcpdf.org/", - "keywords": [ - "PDFD32000-2008", - "TCPDF", - "barcodes", - "datamatrix", - "pdf", - "pdf417", - "qrcode" - ], - "support": { - "issues": "https://github.com/tecnickcom/TCPDF/issues", - "source": "https://github.com/tecnickcom/TCPDF/tree/6.7.5" - }, - "funding": [ - { - "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_donations¤cy_code=GBP&business=paypal@tecnick.com&item_name=donation%20for%20tcpdf%20project", - "type": "custom" - } - ], - "time": "2024-04-20T17:25:10+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "twig/twig", - "version": "v3.10.3", + "version": "v3.15.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "67f29781ffafa520b0bbfbd8384674b42db04572" + "reference": "2d5b3964cc21d0188633d7ddce732dc8e874db02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/67f29781ffafa520b0bbfbd8384674b42db04572", - "reference": "67f29781ffafa520b0bbfbd8384674b42db04572", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/2d5b3964cc21d0188633d7ddce732dc8e874db02", + "reference": "2d5b3964cc21d0188633d7ddce732dc8e874db02", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.22" + "symfony/polyfill-php81": "^1.29" }, "require-dev": { "psr/container": "^1.0|^2.0", @@ -7658,7 +7539,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.10.3" + "source": "https://github.com/twigphp/Twig/tree/v3.15.0" }, "funding": [ { @@ -7670,7 +7551,7 @@ "type": "tidelift" } ], - "time": "2024-05-16T10:04:27+00:00" + "time": "2024-11-17T15:59:19+00:00" } ], "packages-dev": [ @@ -7900,30 +7781,38 @@ }, { "name": "composer/pcre", - "version": "3.1.4", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "04229f163664973f68f38f6f73d917799168ef24" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", - "reference": "04229f163664973f68f38f6f73d917799168ef24", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { @@ -7951,7 +7840,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.4" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -7967,28 +7856,28 @@ "type": "tidelift" } ], - "time": "2024-05-27T13:40:54+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { "name": "composer/semver", - "version": "3.4.0", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -8032,7 +7921,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.0" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -8048,7 +7937,7 @@ "type": "tidelift" } ], - "time": "2023-08-31T09:50:34+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/xdebug-handler", @@ -8222,22 +8111,23 @@ }, { "name": "doctrine/data-fixtures", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f" + "reference": "d2ff5046b263868baf6e9b06cf4918f60096c0d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", - "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/d2ff5046b263868baf6e9b06cf4918f60096c0d0", + "reference": "d2ff5046b263868baf6e9b06cf4918f60096c0d0", "shasum": "" }, "require": { "doctrine/deprecations": "^0.5.3 || ^1.0", - "doctrine/persistence": "^2.0|^3.0", - "php": "^7.4 || ^8.0" + "doctrine/persistence": "^2.0 || ^3.0", + "php": "^7.4 || ^8.0", + "symfony/polyfill-php80": "^1" }, "conflict": { "doctrine/dbal": "<3.5 || >=5", @@ -8251,11 +8141,12 @@ "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.14 || ^3", "ext-sqlite3": "*", + "fig/log-test": "^1", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.6.13 || ^10.4.2", + "psr/log": "^1.1 || ^2 || ^3", "symfony/cache": "^5.4 || ^6.3 || ^7", - "symfony/var-exporter": "^5.4 || ^6.3 || ^7", - "vimeo/psalm": "^5.9" + "symfony/var-exporter": "^5.4 || ^6.3 || ^7" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -8286,7 +8177,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/1.7.0" + "source": "https://github.com/doctrine/data-fixtures/tree/1.8.0" }, "funding": [ { @@ -8302,20 +8193,20 @@ "type": "tidelift" } ], - "time": "2023-11-24T11:18:31+00:00" + "time": "2024-11-04T22:36:12+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.6.1", + "version": "3.6.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "d13a08ebf244f74c8adb8ff15aa55d01c404e534" + "reference": "f44a224e27573b79140197a44e68484c45fb24da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/d13a08ebf244f74c8adb8ff15aa55d01c404e534", - "reference": "d13a08ebf244f74c8adb8ff15aa55d01c404e534", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/f44a224e27573b79140197a44e68484c45fb24da", + "reference": "f44a224e27573b79140197a44e68484c45fb24da", "shasum": "" }, "require": { @@ -8373,7 +8264,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.6.1" + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.6.2" }, "funding": [ { @@ -8389,7 +8280,7 @@ "type": "tidelift" } ], - "time": "2024-05-07T07:16:35+00:00" + "time": "2024-11-13T07:41:29+00:00" }, { "name": "evenement/evenement", @@ -8485,16 +8376,16 @@ }, { "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", + "version": "v1.5.3", "source": { "type": "git", "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", "shasum": "" }, "require": { @@ -8535,22 +8426,22 @@ ], "support": { "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" }, - "time": "2022-03-02T22:36:06+00:00" + "time": "2024-04-30T00:40:11+00:00" }, { "name": "fidry/cpu-core-counter", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" + "reference": "8520451a140d3f46ac33042715115e290cf5785f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", "shasum": "" }, "require": { @@ -8590,7 +8481,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" }, "funding": [ { @@ -8598,20 +8489,20 @@ "type": "github" } ], - "time": "2024-02-07T09:43:46+00:00" + "time": "2024-08-06T10:04:20+00:00" }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.59.3", + "version": "v3.64.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29" + "reference": "58dd9c931c785a79739310aef5178928305ffa67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/30ba9ecc2b0e5205e578fe29973c15653d9bfd29", - "reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/58dd9c931c785a79739310aef5178928305ffa67", + "reference": "58dd9c931c785a79739310aef5178928305ffa67", "shasum": "" }, "require": { @@ -8693,7 +8584,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.59.3" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.64.0" }, "funding": [ { @@ -8701,7 +8592,7 @@ "type": "github" } ], - "time": "2024-06-16T14:17:03+00:00" + "time": "2024-08-30T23:09:38+00:00" }, { "name": "masterminds/html5", @@ -8772,16 +8663,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.12.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { @@ -8820,7 +8711,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { @@ -8828,20 +8719,20 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:39:25+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { "name": "netresearch/jsonmapper", - "version": "v4.4.1", + "version": "v4.5.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0" + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/132c75c7dd83e45353ebb9c6c9f591952995bbf0", - "reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", "shasum": "" }, "require": { @@ -8877,22 +8768,22 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.4.1" + "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" }, - "time": "2024-01-31T06:18:54+00:00" + "time": "2024-09-08T10:13:13+00:00" }, { "name": "nikic/php-parser", - "version": "v4.19.1", + "version": "v4.19.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", "shasum": "" }, "require": { @@ -8901,7 +8792,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -8933,9 +8824,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4" }, - "time": "2024-03-17T08:10:35+00:00" + "time": "2024-09-29T15:01:53+00:00" }, { "name": "pdepend/pdepend", @@ -9173,16 +9064,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.4.1", + "version": "5.6.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", - "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/f3558a4c23426d12bffeaab463f8a8d8b681193c", + "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c", "shasum": "" }, "require": { @@ -9191,17 +9082,17 @@ "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.5", + "mockery/mockery": "~1.3.5 || ~1.6.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan": "^1.8", "phpstan/phpstan-mockery": "^1.1", "phpstan/phpstan-webmozart-assert": "^1.2", "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^5.13" + "psalm/phar": "^5.26" }, "type": "library", "extra": { @@ -9231,29 +9122,29 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.0" }, - "time": "2024-05-21T05:55:05+00:00" + "time": "2024-11-12T11:25:25+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.8.2", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "153ae662783729388a584b4361f2545e4d841e3c" + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", - "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", "php": "^7.3 || ^8.0", "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" + "phpstan/phpdoc-parser": "^1.18|^2.0" }, "require-dev": { "ext-tokenizer": "*", @@ -9289,9 +9180,9 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" }, - "time": "2024-02-23T11:10:43+00:00" + "time": "2024-11-09T15:12:26+00:00" }, { "name": "phploc/phploc", @@ -9560,30 +9451,30 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.29.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" + "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299", + "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^5.3.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", "symfony/process": "^5.2" }, "type": "library", @@ -9601,41 +9492,41 @@ "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.29.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0" }, - "time": "2024-05-31T08:52:43+00:00" + "time": "2024-10-13T11:29:49+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.31", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.6" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -9644,7 +9535,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -9673,7 +9564,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -9681,7 +9572,7 @@ "type": "github" } ], - "time": "2024-03-02T06:37:42+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", @@ -9926,45 +9817,45 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.19", + "version": "9.6.21", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8" + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8", - "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", + "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.28", - "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", "sebastian/version": "^3.0.2" }, "suggest": { @@ -10009,7 +9900,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21" }, "funding": [ { @@ -10025,27 +9916,27 @@ "type": "tidelift" } ], - "time": "2024-04-05T04:35:58+00:00" + "time": "2024-09-19T10:50:18+00:00" }, { "name": "psalm/plugin-symfony", - "version": "v5.2.2", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/psalm/psalm-plugin-symfony.git", - "reference": "58e109257764e8e7eab10a43a4212bbd70435f67" + "reference": "fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/psalm/psalm-plugin-symfony/zipball/58e109257764e8e7eab10a43a4212bbd70435f67", - "reference": "58e109257764e8e7eab10a43a4212bbd70435f67", + "url": "https://api.github.com/repos/psalm/psalm-plugin-symfony/zipball/fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196", + "reference": "fb801a9b3d12ace9fb619febfaa3ae0bc1dbb196", "shasum": "" }, "require": { "ext-simplexml": "*", "php": "^8.1", "symfony/framework-bundle": "^5.0 || ^6.0 || ^7.0", - "vimeo/psalm": "^5.24" + "vimeo/psalm": "^5.16" }, "require-dev": { "doctrine/annotations": "^1.8|^2", @@ -10088,9 +9979,9 @@ "description": "Psalm Plugin for Symfony", "support": { "issues": "https://github.com/psalm/psalm-plugin-symfony/issues", - "source": "https://github.com/psalm/psalm-plugin-symfony/tree/v5.2.2" + "source": "https://github.com/psalm/psalm-plugin-symfony/tree/v5.2.5" }, - "time": "2024-06-06T15:34:33+00:00" + "time": "2024-07-03T11:57:02+00:00" }, { "name": "react/cache", @@ -10466,31 +10357,31 @@ }, { "name": "react/socket", - "version": "v1.15.0", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038" + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038", - "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", - "react/dns": "^1.11", + "react/dns": "^1.13", "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.6 || ^1.2.1", - "react/stream": "^1.2" + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" }, "require-dev": { "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4 || ^3 || ^2", + "react/async": "^4.3 || ^3.3 || ^2", "react/promise-stream": "^1.4", - "react/promise-timer": "^1.10" + "react/promise-timer": "^1.11" }, "type": "library", "autoload": { @@ -10534,7 +10425,7 @@ ], "support": { "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.15.0" + "source": "https://github.com/reactphp/socket/tree/v1.16.0" }, "funding": [ { @@ -10542,7 +10433,7 @@ "type": "open_collective" } ], - "time": "2023-12-15T11:02:10+00:00" + "time": "2024-07-26T10:38:09+00:00" }, { "name": "react/stream", @@ -11778,16 +11669,16 @@ }, { "name": "symfony/browser-kit", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8" + "reference": "65d4b3fd9556e4b5b41287bef93c671f8f9f86ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/62ab90b92066ef6cce5e79365625b4b1432464c8", - "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/65d4b3fd9556e4b5b41287bef93c671f8f9f86ab", + "reference": "65d4b3fd9556e4b5b41287bef93c671f8f9f86ab", "shasum": "" }, "require": { @@ -11826,7 +11717,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.4.8" + "source": "https://github.com/symfony/browser-kit/tree/v6.4.13" }, "funding": [ { @@ -11842,20 +11733,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08" + "reference": "cb23e97813c5837a041b73a6d63a9ddff0778f5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/4b61b02fe15db48e3687ce1c45ea385d1780fe08", - "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/cb23e97813c5837a041b73a6d63a9ddff0778f5e", + "reference": "cb23e97813c5837a041b73a6d63a9ddff0778f5e", "shasum": "" }, "require": { @@ -11891,7 +11782,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.8" + "source": "https://github.com/symfony/css-selector/tree/v6.4.13" }, "funding": [ { @@ -11907,20 +11798,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/debug-bundle", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "689f1bcb0bd3b945e3c671cbd06274b127c64dc9" + "reference": "7bcfaff39e094cc09455201916d016d9b2ae08ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/689f1bcb0bd3b945e3c671cbd06274b127c64dc9", - "reference": "689f1bcb0bd3b945e3c671cbd06274b127c64dc9", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/7bcfaff39e094cc09455201916d016d9b2ae08ff", + "reference": "7bcfaff39e094cc09455201916d016d9b2ae08ff", "shasum": "" }, "require": { @@ -11965,7 +11856,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.4.8" + "source": "https://github.com/symfony/debug-bundle/tree/v6.4.13" }, "funding": [ { @@ -11981,20 +11872,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/dom-crawler", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "01ce8174447f1f1dd33a5854b01beef79061d9fa" + "reference": "794ddd5481ba15d8a04132c95e211cd5656e09fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/01ce8174447f1f1dd33a5854b01beef79061d9fa", - "reference": "01ce8174447f1f1dd33a5854b01beef79061d9fa", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/794ddd5481ba15d8a04132c95e211cd5656e09fb", + "reference": "794ddd5481ba15d8a04132c95e211cd5656e09fb", "shasum": "" }, "require": { @@ -12032,7 +11923,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.1.1" + "source": "https://github.com/symfony/dom-crawler/tree/v7.1.6" }, "funding": [ { @@ -12048,20 +11939,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/process", - "version": "v7.1.1", + "version": "v7.1.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "febf90124323a093c7ee06fdb30e765ca3c20028" + "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/febf90124323a093c7ee06fdb30e765ca3c20028", - "reference": "febf90124323a093c7ee06fdb30e765ca3c20028", + "url": "https://api.github.com/repos/symfony/process/zipball/42783370fda6e538771f7c7a36e9fa2ee3a84892", + "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892", "shasum": "" }, "require": { @@ -12093,7 +11984,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.1.1" + "source": "https://github.com/symfony/process/tree/v7.1.8" }, "funding": [ { @@ -12109,20 +12000,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-11-06T14:23:19+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.8", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "bcc806d1360991de3bf78ac5ca0202db85de9bfc" + "reference": "bfbade623f1cc7f1e243ce5488af33861a8f5be7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/bcc806d1360991de3bf78ac5ca0202db85de9bfc", - "reference": "bcc806d1360991de3bf78ac5ca0202db85de9bfc", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/bfbade623f1cc7f1e243ce5488af33861a8f5be7", + "reference": "bfbade623f1cc7f1e243ce5488af33861a8f5be7", "shasum": "" }, "require": { @@ -12175,7 +12066,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.8" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.14" }, "funding": [ { @@ -12191,7 +12082,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-04T11:33:53+00:00" }, { "name": "theseer/tokenizer", @@ -12245,16 +12136,16 @@ }, { "name": "vimeo/psalm", - "version": "5.24.0", + "version": "5.26.1", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "462c80e31c34e58cc4f750c656be3927e80e550e" + "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/462c80e31c34e58cc4f750c656be3927e80e550e", - "reference": "462c80e31c34e58cc4f750c656be3927e80e550e", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", + "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", "shasum": "" }, "require": { @@ -12275,7 +12166,7 @@ "felixfbecker/language-server-protocol": "^1.5.2", "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.16", + "nikic/php-parser": "^4.17", "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", "sebastian/diff": "^4.0 || ^5.0 || ^6.0", "spatie/array-to-xml": "^2.17.0 || ^3.0", @@ -12351,7 +12242,7 @@ "issues": "https://github.com/vimeo/psalm/issues", "source": "https://github.com/vimeo/psalm" }, - "time": "2024-05-01T19:32:08+00:00" + "time": "2024-09-08T18:53:08+00:00" }, { "name": "webmozart/assert", @@ -12492,7 +12383,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -12502,6 +12393,6 @@ "ext-json": "*", "ext-pdo": "*" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/config/bundles.php b/config/bundles.php index c347fd05a..2b4fa9838 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -12,7 +12,6 @@ App\Mealz\MealBundle\MealzMealBundle::class => ['all' => true], App\Mealz\UserBundle\MealzUserBundle::class => ['all' => true], App\Mealz\AccountingBundle\MealzAccountingBundle::class => ['all' => true], - Qipsius\TCPDFBundle\QipsiusTCPDFBundle::class => ['all' => true], Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true, 'staging' => true], diff --git a/config/services.yaml b/config/services.yaml index 2ef918e4e..844713aa5 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -110,7 +110,7 @@ services: App\Mealz\MealBundle\Repository\DishRepositoryInterface: '@App\Mealz\MealBundle\Repository\DishRepository' App\Mealz\MealBundle\Repository\DishVariationRepositoryInterface: '@App\Mealz\MealBundle\Repository\DishVariationRepository' App\Mealz\MealBundle\Repository\EventRepositoryInterface: '@App\Mealz\MealBundle\Repository\EventRepository' - App\Mealz\MealBundle\Repository\EventParticipationRepositoryInterface: '@App\Mealz\MealBundle\Repository\EventParticipationRepository' + App\Mealz\MealBundle\Repository\EventPartRepoInterface: '@App\Mealz\MealBundle\Repository\EventPartRepo' App\Mealz\MealBundle\Repository\CategoryRepositoryInterface: '@App\Mealz\MealBundle\Repository\CategoryRepository' App\Mealz\MealBundle\Repository\GuestInvitationRepositoryInterface: '@App\Mealz\MealBundle\Repository\GuestInvitationRepository' App\Mealz\MealBundle\Repository\MealRepositoryInterface: '@App\Mealz\MealBundle\Repository\MealRepository' @@ -152,7 +152,7 @@ services: arguments: $entityClass: App\Mealz\MealBundle\Entity\Event - App\Mealz\MealBundle\Repository\EventParticipationRepository: + App\Mealz\MealBundle\Repository\EventPartRepo: arguments: $entityClass: App\Mealz\MealBundle\Entity\EventParticipation @@ -224,8 +224,6 @@ services: <<: *mm_service_args $webhookURL: '%app.notifier.mattermost.weekly_menu.webhook_url%' - Qipsius\TCPDFBundle\Controller\TCPDFController: '@qipsius.tcpdf' - App\Mealz\MealBundle\Service\CombinedMealService: arguments: $combinedPrice: '%mealz.meal.combined.price%' @@ -285,6 +283,11 @@ services: $logoutUrl: '%app.idp.endpoint.logout%' $baseUri: '%app.base_url%' + mealz.oauthuserprovider: '@App\Mealz\UserBundle\Provider\OAuthUserProvider' + App\Mealz\UserBundle\Provider\OAuthUserProvider: + arguments: + $authClientID: '%app.idp.client_id%' + App\Mealz\UserBundle\Repository\ProfileRepository: arguments: $entityClass: App\Mealz\UserBundle\Entity\Profile diff --git a/migrations/Version20240722142949.php b/migrations/Version20240722142949.php new file mode 100644 index 000000000..b5c478bae --- /dev/null +++ b/migrations/Version20240722142949.php @@ -0,0 +1,33 @@ +addSql('ALTER TABLE day DROP event_id'); + $this->addSql('ALTER TABLE event_participation DROP INDEX UNIQ_8F0C52E3E5A02990'); + $this->addSql('CREATE UNIQUE INDEX unique_day_event ON event_participation (day, event)'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE day ADD event_id INT DEFAULT NULL'); + $this->addSql('DROP INDEX unique_day_event ON event_participation'); + } +} diff --git a/migrations/Version20240802130923.txt b/migrations/Version20240802130923.txt new file mode 100644 index 000000000..e10e504ed --- /dev/null +++ b/migrations/Version20240802130923.txt @@ -0,0 +1,77 @@ +addSql('ALTER TABLE day ADD CONSTRAINT FK_E5A02990C86F3B2F FOREIGN KEY (week_id) REFERENCES week (id)'); + $this->addSql('ALTER TABLE dish CHANGE one_serving_size one_serving_size TINYINT(1) NOT NULL'); + $this->addSql('ALTER TABLE dish ADD CONSTRAINT FK_957D8CB812469DE2 FOREIGN KEY (category_id) REFERENCES Category (id) ON DELETE SET NULL'); + $this->addSql('ALTER TABLE dish ADD CONSTRAINT FK_957D8CB8727ACA70 FOREIGN KEY (parent_id) REFERENCES dish (id) ON DELETE CASCADE'); + $this->addSql('DROP INDEX unique_day_event ON event_participation'); + $this->addSql('ALTER TABLE event_participation ADD CONSTRAINT FK_8F0C52E3E5A02990 FOREIGN KEY (day) REFERENCES day (id)'); + $this->addSql('ALTER TABLE event_participation ADD CONSTRAINT FK_8F0C52E33BAE0AA7 FOREIGN KEY (event) REFERENCES event (id)'); + $this->addSql('CREATE INDEX IDX_8F0C52E3E5A02990 ON event_participation (day)'); + $this->addSql('ALTER TABLE guest_invitation ADD CONSTRAINT FK_CC0531331FB8D185 FOREIGN KEY (host_id) REFERENCES profile (id) ON DELETE NO ACTION'); + $this->addSql('ALTER TABLE guest_invitation ADD CONSTRAINT FK_CC05313366C8FC2F FOREIGN KEY (meal_day_id) REFERENCES day (id) ON DELETE NO ACTION'); + $this->addSql('ALTER TABLE login ADD CONSTRAINT FK_AA08CB10CCFA12B8 FOREIGN KEY (profile_id) REFERENCES profile (id)'); + $this->addSql('ALTER TABLE meal ADD CONSTRAINT FK_9EF68E9C148EB0CB FOREIGN KEY (dish_id) REFERENCES dish (id)'); + $this->addSql('ALTER TABLE meal ADD CONSTRAINT FK_9EF68E9CE5A02990 FOREIGN KEY (day) REFERENCES day (id)'); + $this->addSql('ALTER TABLE participant CHANGE profile_id profile_id VARCHAR(255) NOT NULL, CHANGE confirmed confirmed TINYINT(1) DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE participant ADD CONSTRAINT FK_D79F6B113BAE0AA7 FOREIGN KEY (event) REFERENCES event_participation (id)'); + $this->addSql('ALTER TABLE participant ADD CONSTRAINT FK_D79F6B11639666D6 FOREIGN KEY (meal_id) REFERENCES meal (id)'); + $this->addSql('ALTER TABLE participant ADD CONSTRAINT FK_D79F6B11CCFA12B8 FOREIGN KEY (profile_id) REFERENCES profile (id)'); + $this->addSql('CREATE INDEX IDX_D79F6B113BAE0AA7 ON participant (event)'); + $this->addSql('ALTER TABLE participant_dish ADD CONSTRAINT FK_41C99E869D1C3019 FOREIGN KEY (participant_id) REFERENCES participant (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE participant_dish ADD CONSTRAINT FK_41C99E86148EB0CB FOREIGN KEY (dish_id) REFERENCES dish (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE profile_role ADD CONSTRAINT FK_E1A105FECCFA12B8 FOREIGN KEY (profile_id) REFERENCES profile (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE profile_role ADD CONSTRAINT FK_E1A105FED60322AC FOREIGN KEY (role_id) REFERENCES role (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE transaction ADD CONSTRAINT FK_723705D18157AA0F FOREIGN KEY (profile) REFERENCES profile (id)'); + $this->addSql('ALTER TABLE session CHANGE sess_data sess_data LONGBLOB NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE meal DROP FOREIGN KEY FK_9EF68E9C148EB0CB'); + $this->addSql('ALTER TABLE meal DROP FOREIGN KEY FK_9EF68E9CE5A02990'); + $this->addSql('ALTER TABLE login DROP FOREIGN KEY FK_AA08CB10CCFA12B8'); + $this->addSql('ALTER TABLE participant_dish DROP FOREIGN KEY FK_41C99E869D1C3019'); + $this->addSql('ALTER TABLE participant_dish DROP FOREIGN KEY FK_41C99E86148EB0CB'); + $this->addSql('ALTER TABLE session CHANGE sess_data sess_data BLOB NOT NULL'); + $this->addSql('ALTER TABLE profile_role DROP FOREIGN KEY FK_E1A105FECCFA12B8'); + $this->addSql('ALTER TABLE profile_role DROP FOREIGN KEY FK_E1A105FED60322AC'); + $this->addSql('ALTER TABLE guest_invitation DROP FOREIGN KEY FK_CC0531331FB8D185'); + $this->addSql('ALTER TABLE guest_invitation DROP FOREIGN KEY FK_CC05313366C8FC2F'); + $this->addSql('ALTER TABLE participant DROP FOREIGN KEY FK_D79F6B113BAE0AA7'); + $this->addSql('ALTER TABLE participant DROP FOREIGN KEY FK_D79F6B11639666D6'); + $this->addSql('ALTER TABLE participant DROP FOREIGN KEY FK_D79F6B11CCFA12B8'); + $this->addSql('DROP INDEX IDX_D79F6B113BAE0AA7 ON participant'); + $this->addSql('ALTER TABLE participant CHANGE profile_id profile_id VARCHAR(255) DEFAULT NULL, CHANGE confirmed confirmed TINYINT(1) NOT NULL'); + $this->addSql('ALTER TABLE day DROP FOREIGN KEY FK_E5A02990C86F3B2F'); + $this->addSql('ALTER TABLE transaction DROP FOREIGN KEY FK_723705D18157AA0F'); + $this->addSql('ALTER TABLE event_participation DROP FOREIGN KEY FK_8F0C52E3E5A02990'); + $this->addSql('ALTER TABLE event_participation DROP FOREIGN KEY FK_8F0C52E33BAE0AA7'); + $this->addSql('DROP INDEX IDX_8F0C52E3E5A02990 ON event_participation'); + $this->addSql('CREATE UNIQUE INDEX unique_day_event ON event_participation (day, event)'); + $this->addSql('ALTER TABLE dish DROP FOREIGN KEY FK_957D8CB812469DE2'); + $this->addSql('ALTER TABLE dish DROP FOREIGN KEY FK_957D8CB8727ACA70'); + $this->addSql('ALTER TABLE dish CHANGE one_serving_size one_serving_size TINYINT(1) DEFAULT 0 NOT NULL'); + } +} diff --git a/migrations/Version20240904104901.php b/migrations/Version20240904104901.php new file mode 100644 index 000000000..27c063cbc --- /dev/null +++ b/migrations/Version20240904104901.php @@ -0,0 +1,81 @@ +addSql('ALTER TABLE day ADD CONSTRAINT FK_E5A02990C86F3B2F FOREIGN KEY (week_id) REFERENCES week (id)'); + $this->addSql('ALTER TABLE dish ADD CONSTRAINT FK_957D8CB812469DE2 FOREIGN KEY (category_id) REFERENCES Category (id) ON DELETE SET NULL'); + $this->addSql('ALTER TABLE dish ADD CONSTRAINT FK_957D8CB8727ACA70 FOREIGN KEY (parent_id) REFERENCES dish (id) ON DELETE CASCADE'); + $this->addSql('DROP INDEX unique_day_event ON event_participation'); + $this->addSql('ALTER TABLE event_participation ADD CONSTRAINT FK_8F0C52E3E5A02990 FOREIGN KEY (day) REFERENCES day (id)'); + $this->addSql('ALTER TABLE event_participation ADD CONSTRAINT FK_8F0C52E33BAE0AA7 FOREIGN KEY (event) REFERENCES event (id)'); + $this->addSql('CREATE INDEX IDX_8F0C52E3E5A02990 ON event_participation (day)'); + $this->addSql('ALTER TABLE guest_invitation ADD eventParticipation INT NOT NULL'); + $this->addSql('ALTER TABLE guest_invitation ADD CONSTRAINT FK_CC0531331FB8D185 FOREIGN KEY (host_id) REFERENCES profile (id) ON DELETE NO ACTION'); + $this->addSql('ALTER TABLE guest_invitation ADD CONSTRAINT FK_CC05313366C8FC2F FOREIGN KEY (meal_day_id) REFERENCES day (id) ON DELETE NO ACTION'); + $this->addSql('ALTER TABLE guest_invitation ADD CONSTRAINT FK_CC053133AF63C1E0 FOREIGN KEY (eventParticipation) REFERENCES event_participation (id) ON DELETE NO ACTION'); + $this->addSql('CREATE INDEX IDX_CC053133AF63C1E0 ON guest_invitation (eventParticipation)'); + $this->addSql('ALTER TABLE login ADD CONSTRAINT FK_AA08CB10CCFA12B8 FOREIGN KEY (profile_id) REFERENCES profile (id)'); + $this->addSql('ALTER TABLE meal ADD CONSTRAINT FK_9EF68E9C148EB0CB FOREIGN KEY (dish_id) REFERENCES dish (id)'); + $this->addSql('ALTER TABLE meal ADD CONSTRAINT FK_9EF68E9CE5A02990 FOREIGN KEY (day) REFERENCES day (id)'); + $this->addSql('ALTER TABLE participant CHANGE profile_id profile_id VARCHAR(255) NOT NULL, CHANGE confirmed confirmed TINYINT(1) DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE participant ADD CONSTRAINT FK_D79F6B113BAE0AA7 FOREIGN KEY (event) REFERENCES event_participation (id)'); + $this->addSql('ALTER TABLE participant ADD CONSTRAINT FK_D79F6B11639666D6 FOREIGN KEY (meal_id) REFERENCES meal (id)'); + $this->addSql('ALTER TABLE participant ADD CONSTRAINT FK_D79F6B11CCFA12B8 FOREIGN KEY (profile_id) REFERENCES profile (id)'); + $this->addSql('CREATE INDEX IDX_D79F6B113BAE0AA7 ON participant (event)'); + $this->addSql('ALTER TABLE participant_dish ADD CONSTRAINT FK_41C99E869D1C3019 FOREIGN KEY (participant_id) REFERENCES participant (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE participant_dish ADD CONSTRAINT FK_41C99E86148EB0CB FOREIGN KEY (dish_id) REFERENCES dish (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE profile_role ADD CONSTRAINT FK_E1A105FECCFA12B8 FOREIGN KEY (profile_id) REFERENCES profile (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE profile_role ADD CONSTRAINT FK_E1A105FED60322AC FOREIGN KEY (role_id) REFERENCES role (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE transaction ADD CONSTRAINT FK_723705D18157AA0F FOREIGN KEY (profile) REFERENCES profile (id)'); + $this->addSql('ALTER TABLE session CHANGE sess_data sess_data LONGBLOB NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE meal DROP FOREIGN KEY FK_9EF68E9C148EB0CB'); + $this->addSql('ALTER TABLE meal DROP FOREIGN KEY FK_9EF68E9CE5A02990'); + $this->addSql('ALTER TABLE login DROP FOREIGN KEY FK_AA08CB10CCFA12B8'); + $this->addSql('ALTER TABLE participant_dish DROP FOREIGN KEY FK_41C99E869D1C3019'); + $this->addSql('ALTER TABLE participant_dish DROP FOREIGN KEY FK_41C99E86148EB0CB'); + $this->addSql('ALTER TABLE session CHANGE sess_data sess_data BLOB NOT NULL'); + $this->addSql('ALTER TABLE profile_role DROP FOREIGN KEY FK_E1A105FECCFA12B8'); + $this->addSql('ALTER TABLE profile_role DROP FOREIGN KEY FK_E1A105FED60322AC'); + $this->addSql('ALTER TABLE guest_invitation DROP FOREIGN KEY FK_CC0531331FB8D185'); + $this->addSql('ALTER TABLE guest_invitation DROP FOREIGN KEY FK_CC05313366C8FC2F'); + $this->addSql('ALTER TABLE guest_invitation DROP FOREIGN KEY FK_CC053133AF63C1E0'); + $this->addSql('DROP INDEX IDX_CC053133AF63C1E0 ON guest_invitation'); + $this->addSql('ALTER TABLE guest_invitation DROP eventParticipation'); + $this->addSql('ALTER TABLE participant DROP FOREIGN KEY FK_D79F6B113BAE0AA7'); + $this->addSql('ALTER TABLE participant DROP FOREIGN KEY FK_D79F6B11639666D6'); + $this->addSql('ALTER TABLE participant DROP FOREIGN KEY FK_D79F6B11CCFA12B8'); + $this->addSql('DROP INDEX IDX_D79F6B113BAE0AA7 ON participant'); + $this->addSql('ALTER TABLE participant CHANGE profile_id profile_id VARCHAR(255) DEFAULT NULL, CHANGE confirmed confirmed TINYINT(1) NOT NULL'); + $this->addSql('ALTER TABLE day DROP FOREIGN KEY FK_E5A02990C86F3B2F'); + $this->addSql('ALTER TABLE transaction DROP FOREIGN KEY FK_723705D18157AA0F'); + $this->addSql('ALTER TABLE event_participation DROP FOREIGN KEY FK_8F0C52E3E5A02990'); + $this->addSql('ALTER TABLE event_participation DROP FOREIGN KEY FK_8F0C52E33BAE0AA7'); + $this->addSql('DROP INDEX IDX_8F0C52E3E5A02990 ON event_participation'); + $this->addSql('CREATE UNIQUE INDEX unique_day_event ON event_participation (day, event)'); + $this->addSql('ALTER TABLE dish DROP FOREIGN KEY FK_957D8CB812469DE2'); + $this->addSql('ALTER TABLE dish DROP FOREIGN KEY FK_957D8CB8727ACA70'); + } +} diff --git a/migrations/Version20240904132158.php b/migrations/Version20240904132158.php new file mode 100644 index 000000000..6ed0d53c9 --- /dev/null +++ b/migrations/Version20240904132158.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE guest_invitation CHANGE eventParticipation eventParticipation INT DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE session RENAME INDEX sess_lifetime_idx TO session_sess_lifetime_idx'); + } +} diff --git a/migrations/Version20240905081818.php b/migrations/Version20240905081818.php new file mode 100644 index 000000000..8d7d2b057 --- /dev/null +++ b/migrations/Version20240905081818.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE guest_invitation CHANGE eventParticipation eventParticipation INT DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE guest_invitation CHANGE eventParticipation eventParticipation INT NOT NULL'); + } +} diff --git a/src/Mealz/AccountingBundle/Controller/AccountingBookController.php b/src/Mealz/AccountingBundle/Controller/AccountingBookController.php index 4cbc93aee..fa95c36ff 100644 --- a/src/Mealz/AccountingBundle/Controller/AccountingBookController.php +++ b/src/Mealz/AccountingBundle/Controller/AccountingBookController.php @@ -8,12 +8,9 @@ use App\Mealz\MealBundle\Controller\BaseController; use DateTime; use Exception; -use Qipsius\TCPDFBundle\Controller\TCPDFController; -use ReflectionException; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Http\Attribute\IsGranted; -use Symfony\Contracts\Translation\TranslatorInterface; #[IsGranted('ROLE_KITCHEN_STAFF')] class AccountingBookController extends BaseController @@ -97,61 +94,4 @@ public function listAllTransactions(?string $dateRange, TransactionRepositoryInt return new JsonResponse($response, Response::HTTP_OK); } - - /** - * Export transaction table as PDF for finance staff. - * - * @throws ReflectionException - * @throws Exception - */ - public function exportPDF( - ?string $dateRange, - TCPDFController $pdfGen, - TransactionRepositoryInterface $transactionRepo, - TranslatorInterface $translator - ): Response { - // Get date range set with date range picker by user - $dateRange = str_replace('-', '/', $dateRange); - $dateRangeArray = explode('&', $dateRange); - $minDate = new DateTime($dateRangeArray[0]); - $maxDate = new DateTime($dateRangeArray[1]); - - $heading = $minDate->format('d.m.') . ' - ' . $maxDate->format('d.m.Y'); - $transactions = $transactionRepo->findAllTransactionsInDateRange($minDate, $maxDate); - - // Create PDF file - $pdf = $pdfGen->create(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); - $pdf->setHeaderData('', 0, '', '', [0, 0, 0], [255, 255, 255]); - $pdf->setPrintHeader(false); - $pdf->setPrintFooter(false); - $pdf->AddPage(); - - $filename = $translator->trans('payment.transaction_history.finances.pdf') . '-' . $minDate->format('d.m.Y') . '-' . $maxDate->format('d.m.Y'); - $pdf->SetTitle($filename); - - $cssFile = file_get_contents(__DIR__ . '/../Resources/css/transaction-export.css'); - - $includeCSS = ''; - - $html = $this->renderView('MealzAccountingBundle:Accounting/Finance:print_finances.html.twig', [ - 'headingFirst' => null, - 'heading' => $heading, - 'transactionsFirst' => null, - 'transactions' => $transactions, - 'minDate' => $minDate->format('m/d/Y'), - 'maxDate' => $maxDate->format('m/d/Y'), - ]); - - $pdf->writeHTML($includeCSS . $html); - - $content = $pdf->Output($filename . '.pdf', 'S'); - $now = gmdate('D, d M Y H:i:s') . ' GMT'; - - return new Response($content, Response::HTTP_OK, [ - 'Content-Type' => 'application/pdf', - 'Expires' => $now, - 'Last-Modified' => $now, - 'Content-Disposition' => 'inline; filename="' . basename($filename) . '"', - ]); - } } diff --git a/src/Mealz/AccountingBundle/Controller/CostSheetController.php b/src/Mealz/AccountingBundle/Controller/CostSheetController.php index ec7ceba9e..ec33e98cc 100644 --- a/src/Mealz/AccountingBundle/Controller/CostSheetController.php +++ b/src/Mealz/AccountingBundle/Controller/CostSheetController.php @@ -73,11 +73,6 @@ public function list( fn ($cost) => (float) $cost, $userCosts ); - - // if total amount is zero, remove user from rendered items - if (0.001 > (float) $userCosts['total'] && -0.001 < (float) $userCosts['total']) { - unset($users[$username]); - } } $users = $this->costSheetService->mergeDoubleUserTransactions($users); diff --git a/src/Mealz/AccountingBundle/Resources/config/routing.yml b/src/Mealz/AccountingBundle/Resources/config/routing.yml index 90a93fc6d..c8b70aff5 100644 --- a/src/Mealz/AccountingBundle/Resources/config/routing.yml +++ b/src/Mealz/AccountingBundle/Resources/config/routing.yml @@ -16,10 +16,6 @@ mealz_accounting_accounting_book_finance: path: /api/accounting/book/finance/list/{dateRange} defaults: { _controller: App\Mealz\AccountingBundle\Controller\AccountingBookController::listAllTransactions, dateRange: null } -mealz_accounting_accounting_book_finance_export: - path: /api/accounting/book/finance/export/{dateRange} - defaults: { _controller: App\Mealz\AccountingBundle\Controller\AccountingBookController::exportPDF, dateRange: null } - mealz_accounting_api_costs: path: /api/costs defaults: { _controller: App\Mealz\AccountingBundle\Controller\CostSheetController::list } diff --git a/src/Mealz/AccountingBundle/Resources/css/transaction-export.css b/src/Mealz/AccountingBundle/Resources/css/transaction-export.css deleted file mode 100644 index d64ec9f26..000000000 --- a/src/Mealz/AccountingBundle/Resources/css/transaction-export.css +++ /dev/null @@ -1,17 +0,0 @@ -td { - border: 1px solid #f2f5f7; -} - -table { - padding: 2px 3px; -} - -.amount, -.daily-closing { - text-align: right; -} - -.date, -.name { - text-align: left; -} diff --git a/src/Mealz/MealBundle/Controller/ApiController.php b/src/Mealz/MealBundle/Controller/ApiController.php index 78e0db763..04d4a5b97 100644 --- a/src/Mealz/MealBundle/Controller/ApiController.php +++ b/src/Mealz/MealBundle/Controller/ApiController.php @@ -10,6 +10,7 @@ use App\Mealz\MealBundle\Entity\Slot; use App\Mealz\MealBundle\Service\ApiService; use App\Mealz\MealBundle\Service\DishService; +use App\Mealz\MealBundle\Service\EventParticipationService; use App\Mealz\MealBundle\Service\GuestParticipationService; use App\Mealz\MealBundle\Service\OfferService; use App\Mealz\MealBundle\Service\ParticipationCountService; @@ -30,6 +31,7 @@ class ApiController extends BaseController private ApiService $apiSrv; private OfferService $offerSrv; private GuestParticipationService $guestPartiSrv; + private EventParticipationService $eventService; public function __construct( DishService $dishSrv, @@ -38,7 +40,8 @@ public function __construct( ParticipationService $participationSrv, ApiService $apiSrv, OfferService $offerSrv, - GuestParticipationService $guestPartiSrv + GuestParticipationService $guestPartiSrv, + EventParticipationService $eventService ) { $this->dishSrv = $dishSrv; $this->slotSrv = $slotSrv; @@ -47,6 +50,7 @@ public function __construct( $this->apiSrv = $apiSrv; $this->offerSrv = $offerSrv; $this->guestPartiSrv = $guestPartiSrv; + $this->eventService = $eventService; } public function getEnvironmentVars(): JsonResponse @@ -101,9 +105,8 @@ public function getDashboardData(ParticipationCountService $partCountSrv): JsonR 'slots' => [], 'meals' => [], 'isEnabled' => $day->isEnabled(), - 'event' => $this->apiSrv->getEventParticipationData($day, $profile), + 'events' => $this->apiSrv->getEventParticipationsData($day, $profile), ]; - $this->addSlots($response[$week->getId()]['days'][$day->getId()]['slots'], $slots, $day, $activeParticipations); /** @var Meal $meal */ foreach ($day->getMeals() as $meal) { @@ -164,6 +167,12 @@ public function list(): JsonResponse return new JsonResponse(null, Response::HTTP_BAD_REQUEST); } + if (false === $day->isEnabled() || false === $day->getWeek()->isEnabled()) { + $list['day'] = $day->getDateTime(); + + return new JsonResponse($list, Response::HTTP_OK); + } + $list['data'] = $this->participationSrv->getParticipationListBySlots($day); $meals = $this->participationSrv->getMealsForTheDay($day); @@ -173,9 +182,7 @@ public function list(): JsonResponse foreach ($meals as $meal) { $list['meals'] = $list['meals'] + $this->getDishData($meal); } - - $list['event'] = $this->apiSrv->getEventParticipationInfo($day); - + $list['events'] = $this->eventService->getEventParticipationData($day); $list['day'] = $day->getDateTime(); return new JsonResponse($list, Response::HTTP_OK); @@ -312,7 +319,11 @@ private function convertMealForDashboard(Meal $meal, float $participationCount, ]; } - private function addMealWithVariations(Meal $meal, float $participationCount, ?Profile $profile, array &$meals + private function addMealWithVariations( + Meal $meal, + float $participationCount, + ?Profile $profile, + array &$meals ): void { $parent = $meal->getDish()->getParent(); $parentExistsInArray = array_key_exists($parent->getId(), $meals); diff --git a/src/Mealz/MealBundle/Controller/CategoryController.php b/src/Mealz/MealBundle/Controller/CategoryController.php index 26bb5b729..008135489 100644 --- a/src/Mealz/MealBundle/Controller/CategoryController.php +++ b/src/Mealz/MealBundle/Controller/CategoryController.php @@ -54,7 +54,7 @@ public function update(Request $request, Category $category): JsonResponse return new JsonResponse($category, Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('category update error', $this->getTrace($e)); + $this->logger->info('category update error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } @@ -69,7 +69,7 @@ public function delete(Category $category): JsonResponse $this->em->remove($category); $this->em->flush(); } catch (Exception $e) { - $this->logger->error('category delete error', $this->getTrace($e)); + $this->logger->info('category delete error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } diff --git a/src/Mealz/MealBundle/Controller/DishController.php b/src/Mealz/MealBundle/Controller/DishController.php index d9b739d2a..180aa1e15 100644 --- a/src/Mealz/MealBundle/Controller/DishController.php +++ b/src/Mealz/MealBundle/Controller/DishController.php @@ -29,7 +29,7 @@ public function __construct( private readonly DishRepositoryInterface $dishRepository, private readonly DishService $dishService, private readonly EntityManagerInterface $em, - private readonly LoggerInterface $logger + private readonly LoggerInterface $logger, ) { } @@ -98,7 +98,7 @@ public function new(Request $request): JsonResponse return new JsonResponse(null, Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('dish create error', $this->getTrace($e)); + $this->logger->info('dish create error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } @@ -121,7 +121,7 @@ public function delete(Dish $dish): JsonResponse return new JsonResponse(null, Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('dish delete error', $this->getTrace($e)); + $this->logger->info('dish delete error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } @@ -134,15 +134,20 @@ public function update(Dish $dish, Request $request): JsonResponse { try { $parameters = json_decode($request->getContent(), true); + $oneServingSize = $dish->hasOneServingSize(); $this->dishService->updateHelper($dish, $parameters); $this->em->persist($dish); $this->em->flush(); + if (true === isset($parameters['oneServingSize']) && $oneServingSize !== $parameters['oneServingSize']) { + $this->dishService->updateCombisForDish($dish); + } + return new JsonResponse($dish, Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('dish update error', $this->getTrace($e)); + $this->logger->info('dish update error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } diff --git a/src/Mealz/MealBundle/Controller/DishVariationController.php b/src/Mealz/MealBundle/Controller/DishVariationController.php index 298d779cf..d657459cb 100644 --- a/src/Mealz/MealBundle/Controller/DishVariationController.php +++ b/src/Mealz/MealBundle/Controller/DishVariationController.php @@ -57,7 +57,7 @@ public function new(Request $request, Dish $dish): JsonResponse return new JsonResponse(null, Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('dish variation create error', $this->getTrace($e)); + $this->logger->info('dish variation create error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } @@ -85,7 +85,7 @@ public function update(Request $request, DishVariation $dishVariation): JsonResp return new JsonResponse($dishVariation, Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('dish variation update error', $this->getTrace($e)); + $this->logger->info('dish variation update error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } @@ -108,7 +108,7 @@ public function delete(DishVariation $dishVariation): JsonResponse return new JsonResponse(null, Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('dish variation delete error', $this->getTrace($e)); + $this->logger->info('dish variation delete error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } diff --git a/src/Mealz/MealBundle/Controller/EventController.php b/src/Mealz/MealBundle/Controller/EventController.php index bf51c26ee..b5dcfe67c 100644 --- a/src/Mealz/MealBundle/Controller/EventController.php +++ b/src/Mealz/MealBundle/Controller/EventController.php @@ -35,6 +35,8 @@ public function __construct( public function getEventList(): JsonResponse { $events = $this->eventRepository->findBy(['deleted' => 0]); + $this->logger->info('Anzahl Events:' . count($events)); + $this->logger->info('Events:' . print_r($events, true)); return new JsonResponse($events, Response::HTTP_OK); } @@ -73,7 +75,7 @@ public function update(Request $request, Event $event): JsonResponse return new JsonResponse($event, Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('event update error', $this->getTrace($e)); + $this->logger->info('event update error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage(), 500]); } @@ -90,13 +92,13 @@ public function delete(Event $event): JsonResponse return new JsonResponse(null, Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('event delete error', $this->getTrace($e)); + $this->logger->info('event delete error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage(), 500]); } } - public function join(DateTime $date): JsonResponse + public function join(DateTime $date, int $eventId): JsonResponse { $profile = $this->getProfile(); if (null === $profile) { @@ -109,18 +111,17 @@ public function join(DateTime $date): JsonResponse if (new DateTime() > $day->getDateTime()->modify($eventLockModifier)) { return new JsonResponse(['message' => '804: User could not join the event'], Response::HTTP_INTERNAL_SERVER_ERROR); } - - $eventParticipation = $this->eventPartSrv->join($profile, $day); + $eventParticipation = $this->eventPartSrv->join($profile, $day, $eventId); if (null === $eventParticipation) { return new JsonResponse(['message' => '802: User could not join the event'], Response::HTTP_INTERNAL_SERVER_ERROR); } $this->eventDispatcher->dispatch(new EventParticipationUpdateEvent($eventParticipation)); - return new JsonResponse($this->eventPartSrv->getEventParticipationData($day, $profile), Response::HTTP_OK); + return new JsonResponse($this->eventPartSrv->getEventParticipationData($day, $eventId, $profile), Response::HTTP_OK); } - public function leave(DateTime $date): JsonResponse + public function leave(DateTime $date, int $eventId): JsonResponse { $profile = $this->getProfile(); if (null === $profile) { @@ -129,17 +130,17 @@ public function leave(DateTime $date): JsonResponse $day = $this->dayRepository->getDayByDate($date); - $eventParticipation = $this->eventPartSrv->leave($profile, $day); + $eventParticipation = $this->eventPartSrv->leave($profile, $day, $eventId); if (null === $eventParticipation) { return new JsonResponse(['message' => '802: User could not leave the event'], Response::HTTP_INTERNAL_SERVER_ERROR); } $this->eventDispatcher->dispatch(new EventParticipationUpdateEvent($eventParticipation)); - return new JsonResponse($this->eventPartSrv->getEventParticipationData($day, $profile), Response::HTTP_OK); + return new JsonResponse($this->eventPartSrv->getEventParticipationData($day, $eventId, $profile), Response::HTTP_OK); } - public function getEventParticipants(DateTime $date): JsonResponse + public function getEventParticipants(DateTime $date, int $eventId): JsonResponse { $day = $this->dayRepository->getDayByDate($date); @@ -147,6 +148,6 @@ public function getEventParticipants(DateTime $date): JsonResponse return new JsonResponse(['message' => 'Could not find day'], Response::HTTP_NOT_FOUND); } - return new JsonResponse($this->eventPartSrv->getParticipants($day), Response::HTTP_OK); + return new JsonResponse($this->eventPartSrv->getParticipants($day, $eventId), Response::HTTP_OK); } } diff --git a/src/Mealz/MealBundle/Controller/MealAdminController.php b/src/Mealz/MealBundle/Controller/MealAdminController.php index a3cae6020..0fa053115 100644 --- a/src/Mealz/MealBundle/Controller/MealAdminController.php +++ b/src/Mealz/MealBundle/Controller/MealAdminController.php @@ -4,6 +4,7 @@ use App\Mealz\MealBundle\Entity\Day; use App\Mealz\MealBundle\Entity\Dish; +use App\Mealz\MealBundle\Entity\EventParticipation; use App\Mealz\MealBundle\Entity\Meal; use App\Mealz\MealBundle\Entity\Week; use App\Mealz\MealBundle\Event\WeekUpdateEvent; @@ -144,7 +145,6 @@ public function edit(Request $request, Week $week): JsonResponse $days = $data['days']; $week->setEnabled($data['enabled']); - try { foreach ($days as $day) { $this->handleDay($day); @@ -190,7 +190,6 @@ public function getLockDateTimeForWeek(Week $week): JsonResponse private function handleDay(array $day): void { - // check if day exists $dayEntity = $this->dayRepository->find($day['id']); if (null === $dayEntity) { throw new Exception('105: day not found'); @@ -199,9 +198,18 @@ private function handleDay(array $day): void if (null !== $day['enabled']) { $dayEntity->setEnabled($day['enabled']); } - $this->setLockParticipationForDay($dayEntity, $day); - $this->mealAdminHelper->handleEventParticipation($dayEntity, $day['event']); + if (array_key_exists('events', $day)) { + $eventCollection = $day['events']; + foreach ($dayEntity->getEvents() as $event) { + $this->em->remove($event); + } + $dayEntity->removeEvents(); + $this->em->flush(); + foreach ($eventCollection as $event) { + $this->handleEventArr($event, $dayEntity); + } + } $mealCollection = $day['meals']; /* @@ -217,7 +225,7 @@ private function handleDay(array $day): void // parentMeal is an array of either one meal without variations or 1-2 variations foreach ($mealCollection as $mealArr) { - $this->handleMealArray($mealArr, $dayEntity); + $this->mealAdminHelper->handleMealArray($mealArr, $dayEntity); } } @@ -232,9 +240,16 @@ private function handleNewDay($dayData, Day $day): void $day->setEnabled($dayData['enabled']); } + $eventCollection = $dayData['events']; $this->setLockParticipationForDay($day, $dayData); - $this->mealAdminHelper->handleEventParticipation($day, $dayData['event']); - + foreach ($day->getEvents() as $event) { + $this->em->remove($event); + } + $day->removeEvents(); + $this->em->flush(); + foreach ($eventCollection as $eventArr) { + $this->handleEventArr($eventArr, $day); + } $mealCollection = $dayData['meals']; // max 2 main meals allowed if (2 < count($mealCollection)) { @@ -243,7 +258,7 @@ private function handleNewDay($dayData, Day $day): void // parentMeal is an array of either one meal without variations or 1-2 variations foreach ($mealCollection as $mealArr) { - $this->handleMealArray($mealArr, $day); + $this->mealAdminHelper->handleMealArray($mealArr, $day); } } @@ -260,63 +275,23 @@ private function setLockParticipationForDay(Day $dayEntity, array $day): void } } - private function handleMealArray(array $mealArr, Day $dayEntity): void + private function handleEventArr(array $eventArr, Day $day): void { - foreach ($mealArr as $meal) { - if (false === isset($meal['dishSlug'])) { - continue; - } - $dishEntity = $this->dishRepository->findOneBy(['slug' => $meal['dishSlug']]); - if (null === $dishEntity) { - throw new Exception('107: dish not found for slug: ' . $meal['dishSlug']); - } - // if mealId is null create meal - if (false === isset($meal['mealId'])) { - $this->createMeal($dishEntity, $dayEntity, $meal); - } else { - $this->modifyMeal($meal, $dishEntity, $dayEntity); - } - } + $this->addEvent($eventArr, $day); } - private function createMeal(Dish $dishEntity, Day $dayEntity, array $meal): void + private function addEvent(array $event, Day $dayEntity) { - $mealEntity = new Meal($dishEntity, $dayEntity); - $mealEntity->setPrice($dishEntity->getPrice()); - $this->mealAdminHelper->setParticipationLimit($mealEntity, $meal); - $dayEntity->addMeal($mealEntity); - } - - /** - * @throws Exception - */ - private function modifyMeal(array $meal, Dish $dishEntity, Day $dayEntity): void - { - $mealEntity = $this->mealRepository->find($meal['mealId']); - if (null === $mealEntity) { - // this happens because meals without participations are deleted, even though they - // could be modified later on (this shouldn't happen but might) - $mealEntity = new Meal($dishEntity, $dayEntity); - $mealEntity->setPrice($dishEntity->getPrice()); - $dayEntity->addMeal($mealEntity); - - return; - } - - $this->mealAdminHelper->setParticipationLimit($mealEntity, $meal); - // check if the requested dish is the same as before - if ($mealEntity->getDish()->getId() === $dishEntity->getId()) { - return; - } - - // check if meal already exists and can be modified (aka has no participations) - if (!$mealEntity->hasParticipations()) { - $mealEntity->setDish($dishEntity); - $mealEntity->setPrice($dishEntity->getPrice()); - - return; + if (!isset($event['eventId'])) { + } else { + $eventEntity = $this->mealAdminHelper->findEvent($event['eventId']); + $eventExistsAlready = $this->mealAdminHelper->checkIfEventExistsForDay($event['eventId'], $dayEntity); + if (!$eventExistsAlready) { + $eventParticipation = new EventParticipation($dayEntity, $eventEntity); + $dayEntity->addEvent($eventParticipation); + } else { + throw new Exception('Meal exists for day already'); + } } - - throw new Exception('108: meal has participations for id: ' . $meal['mealId']); } } diff --git a/src/Mealz/MealBundle/Controller/MealGuestController.php b/src/Mealz/MealBundle/Controller/MealGuestController.php index b3e706cad..6dedfd2c9 100644 --- a/src/Mealz/MealBundle/Controller/MealGuestController.php +++ b/src/Mealz/MealBundle/Controller/MealGuestController.php @@ -5,6 +5,7 @@ namespace App\Mealz\MealBundle\Controller; use App\Mealz\MealBundle\Entity\Day; +use App\Mealz\MealBundle\Entity\EventParticipation; use App\Mealz\MealBundle\Entity\GuestInvitation; use App\Mealz\MealBundle\Entity\Participant; use App\Mealz\MealBundle\Event\EventParticipationUpdateEvent; @@ -46,7 +47,7 @@ public function joinAsGuest(Request $request): JsonResponse $participants = $this->guestPartSrv->join($profile, $meals, $slot, $dishSlugs); $this->triggerJoinEvents($participants); } catch (Exception $e) { - $this->logger->error('guest join error', $this->getTrace($e)); + $this->logger->info('guest join error', $this->getTrace($e)); return new JsonResponse($e->getMessage(), Response::HTTP_BAD_REQUEST); } @@ -61,7 +62,7 @@ public function joinAsGuest(Request $request): JsonResponse public function newGuestInvitation( #[MapEntity(id: 'dayId')] Day $mealDay, - GuestInvitationRepositoryInterface $guestInvitationRepo + GuestInvitationRepositoryInterface $guestInvitationRepo, ): JsonResponse { $userProfile = $this->getProfile(); if (null === $userProfile) { @@ -76,14 +77,16 @@ public function newGuestInvitation( #[IsGranted('ROLE_USER')] public function newGuestEventInvitation( Day $dayId, - GuestInvitationRepositoryInterface $guestInvitationRepo + GuestInvitationRepositoryInterface $guestInvitationRepo, + #[MapEntity(id: 'eventId')] + EventParticipation $eventParticipation, ): JsonResponse { $userProfile = $this->getProfile(); if (null === $userProfile) { return new JsonResponse(null, Response::HTTP_FORBIDDEN); } - $eventInvitation = $guestInvitationRepo->findOrCreateInvitation($userProfile, $dayId); + $eventInvitation = $guestInvitationRepo->findOrCreateEventInvitation($userProfile, $dayId, $eventParticipation); return new JsonResponse(['url' => $this->generateInvitationUrl($eventInvitation, false)], Response::HTTP_OK); } @@ -97,11 +100,12 @@ public function getEventInvitationData( if (null === $invitation) { return new JsonResponse(['message' => '901: Could not find invitation for the given hash', 403]); } - + // es kommt hier nur die EventId an + // $this->logger->info('Event '. print_r($eventParticipation)); $guestData = [ 'date' => $invitation->getDay()->getDateTime(), 'lockDate' => $invitation->getDay()->getLockParticipationDateTime(), - 'event' => $invitation->getDay()->getEvent()->getEvent()->getTitle(), + 'event' => $invitation->getEventParticipation() ? $invitation->getEventParticipation()->getEvent()->getTitle() : null, ]; return new JsonResponse($guestData, Response::HTTP_OK); @@ -110,7 +114,7 @@ public function getEventInvitationData( public function joinEventAsGuest( string $invitationId, Request $request, - GuestInvitationRepositoryInterface $guestInvitationRepo + GuestInvitationRepositoryInterface $guestInvitationRepo, ): JsonResponse { $parameters = json_decode($request->getContent(), true); @@ -131,7 +135,8 @@ public function joinEventAsGuest( $parameters['firstName'], $parameters['lastName'], $parameters['company'], - $invitation->getDay() + $invitation->getDay(), + $invitation->getEventParticipation(), ); $this->eventDispatcher->dispatch(new EventParticipationUpdateEvent($eventParticipation)); diff --git a/src/Mealz/MealBundle/Controller/ParticipantController.php b/src/Mealz/MealBundle/Controller/ParticipantController.php index c6a1c148e..3ead37588 100644 --- a/src/Mealz/MealBundle/Controller/ParticipantController.php +++ b/src/Mealz/MealBundle/Controller/ParticipantController.php @@ -70,7 +70,7 @@ public function joinMeal(Request $request): JsonResponse try { $result = $this->participationSrv->join($profile, $meal, $slot, $parameters['dishSlugs']); } catch (Exception $e) { - $this->logger->error('join meal error', $this->getTrace($e)); + $this->logger->info('join meal error', $this->getTrace($e)); return new JsonResponse(['message' => '402: ' . $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } @@ -151,7 +151,7 @@ public function updateCombinedMeal( } catch (ParticipationException $pex) { return new JsonResponse(['message' => $pex->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY); } catch (Exception $e) { - $this->logger->error('update combined meal error', $this->getTrace($e)); + $this->logger->info('update combined meal error', $this->getTrace($e)); return new JsonResponse(['message' => 'unexpected error'], Response::HTTP_INTERNAL_SERVER_ERROR); } @@ -289,7 +289,7 @@ public function add(Profile $profile, Meal $meal, Request $request): JsonRespons 'booked' => $participationData, ], Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('error adding participant to meal', $this->getTrace($e)); + $this->logger->info('error adding participant to meal', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } @@ -321,7 +321,7 @@ public function remove(EntityManagerInterface $entityManager, Profile $profile, 'booked' => $participationData, ], Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('error removing participant from meal', $this->getTrace($e)); + $this->logger->info('error removing participant from meal', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } diff --git a/src/Mealz/MealBundle/Controller/SlotController.php b/src/Mealz/MealBundle/Controller/SlotController.php index ed4857bb6..8c7a97502 100644 --- a/src/Mealz/MealBundle/Controller/SlotController.php +++ b/src/Mealz/MealBundle/Controller/SlotController.php @@ -65,7 +65,7 @@ public function update(Request $request, Slot $slot): JsonResponse return new JsonResponse($slot, Response::HTTP_OK); } catch (Exception $e) { - $this->logger->error('slot update error', $this->getTrace($e)); + $this->logger->info('slot update error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_METHOD_NOT_ALLOWED); } @@ -79,7 +79,7 @@ public function delete(Slot $slot): JsonResponse $this->em->persist($slot); $this->em->flush(); } catch (Exception $e) { - $this->logger->error('slot delete error', $this->getTrace($e)); + $this->logger->info('slot delete error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_METHOD_NOT_ALLOWED); } @@ -111,7 +111,7 @@ public function new(Request $request): JsonResponse $this->em->persist($slot); $this->em->flush(); } catch (Exception $e) { - $this->logger->error('slot create error', $this->getTrace($e)); + $this->logger->info('slot create error', $this->getTrace($e)); return new JsonResponse(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } diff --git a/src/Mealz/MealBundle/DataFixtures/ORM/LoadEvents.php b/src/Mealz/MealBundle/DataFixtures/ORM/LoadEvents.php index 87de9634c..9082dab27 100644 --- a/src/Mealz/MealBundle/DataFixtures/ORM/LoadEvents.php +++ b/src/Mealz/MealBundle/DataFixtures/ORM/LoadEvents.php @@ -29,6 +29,11 @@ public function load(ObjectManager $manager): void 'public' => true, 'slug' => 'alumni-afterwork', ], + [ + 'title' => 'Lunch Roulette', + 'public' => true, + 'slug' => 'lunch-roulette', + ], ]; foreach ($eventItems as $item) { diff --git a/src/Mealz/MealBundle/Entity/Day.php b/src/Mealz/MealBundle/Entity/Day.php index af3ed5ecb..dbb3116dc 100644 --- a/src/Mealz/MealBundle/Entity/Day.php +++ b/src/Mealz/MealBundle/Entity/Day.php @@ -32,9 +32,11 @@ class Day extends AbstractMessage implements JsonSerializable #[ORM\OneToMany(mappedBy: 'day', targetEntity: Meal::class, cascade: ['all'])] private Collection $meals; - #[ORM\OneToOne(mappedBy: 'day', targetEntity: EventParticipation::class, cascade: ['all'])] - #[ORM\JoinColumn(name: 'event_id', referencedColumnName: 'id', nullable: true)] - private ?EventParticipation $event = null; + /** + * @var Collection + */ + #[ORM\OneToMany(mappedBy: 'day', targetEntity: EventParticipation::class, cascade: ['all'])] + private Collection $events; #[ORM\Column(name: 'lockParticipationDateTime', type: 'datetime', nullable: true)] private DateTime $lockParticipationOn; @@ -45,6 +47,7 @@ public function __construct() $this->week = $this->getDefaultWeek($this->dateTime); $this->lockParticipationOn = $this->dateTime; $this->meals = new MealCollection(); + $this->events = new EventCollection(); } public function getId(): ?int @@ -77,14 +80,47 @@ public function setWeek(Week $week): void $this->week = $week; } - public function getEvent(): ?EventParticipation + public function getEvents(): ?EventCollection + { + if (false === ($this->events instanceof Collection)) { + $this->events = new EventCollection(); + } + + return new EventCollection($this->events->toArray()); + } + + public function getEvent(int $id): ?EventParticipation + { + foreach ($this->getEvents() as $event) { + if ($event->getId() === $id) { + return $event; + } + } + + return null; + } + + public function addEvent(EventParticipation $event) + { + $event->setDay($this); + $this->events->add($event); + } + + public function removeEvent(EventParticipation $event) { - return $this->event; + if ($this->events->contains($event)) { + $this->events->removeElement($event); + } } - public function setEvent(?EventParticipation $event): void + public function removeEvents() { - $this->event = $event; + $this->events->clear(); + } + + public function setEvents(EventCollection $events): void + { + $this->events = $events; } public function getMeals(): MealCollection @@ -145,11 +181,12 @@ private function getDefaultWeek(DateTime $date): Week /** * @return (DateTime|array[][]|bool|int|null)[] * - * @psalm-return array{dateTime: DateTime, lockParticipationDateTime: DateTime, week: int|null, meals: array<''|int, non-empty-list>, event: int|null, enabled: bool} + * @psalm-return array{dateTime: DateTime, dayId: int|null, enabled: bool, events: array>, lockParticipationDateTime: DateTime, meals: array<''|int, non-empty-list>, week: int|null} */ public function jsonSerialize(): array { $meals = []; + $events = []; foreach ($this->getMeals() as $meal) { $parent = $meal->getDish()->getParent(); @@ -159,14 +196,23 @@ public function jsonSerialize(): array $meals[$meal->getDish()->getId()][] = $meal->jsonSerialize(); } } + foreach ($this->getEvents() as $event) { + if (null !== $event && $event instanceof EventParticipation) { + $eventId = $event->getId(); + if (isset($eventId)) { + $events[$eventId] = $event->jsonSerialize(); + } + } + } return [ 'dateTime' => $this->getDateTime(), 'lockParticipationDateTime' => $this->getLockParticipationDateTime(), 'week' => $this->getWeek()->getId(), 'meals' => $meals, - 'event' => $this->event?->getEvent()->getId(), + 'events' => $events, 'enabled' => $this->isEnabled(), + 'dayId' => $this->getId(), ]; } } diff --git a/src/Mealz/MealBundle/Entity/EventCollection.php b/src/Mealz/MealBundle/Entity/EventCollection.php new file mode 100644 index 000000000..ff49c4c15 --- /dev/null +++ b/src/Mealz/MealBundle/Entity/EventCollection.php @@ -0,0 +1,28 @@ + + */ +class EventCollection extends ArrayCollection +{ + /** + * @param EventParticipation[] $elements + */ + public function __construct(array $elements = []) + { + foreach ($elements as $item) { + if (false === ($item instanceof EventParticipation)) { + throw new RuntimeException('invalid argument; expected "EventParticipation", got "' . gettype($item) . '"'); + } + } + + parent::__construct($elements); + } +} diff --git a/src/Mealz/MealBundle/Entity/EventParticipation.php b/src/Mealz/MealBundle/Entity/EventParticipation.php index 9b75eab53..670a1b60a 100644 --- a/src/Mealz/MealBundle/Entity/EventParticipation.php +++ b/src/Mealz/MealBundle/Entity/EventParticipation.php @@ -21,22 +21,22 @@ class EventParticipation #[ORM\GeneratedValue(strategy: 'AUTO')] private ?int $id = null; - #[ORM\OneToOne(inversedBy: 'event', targetEntity: Day::class)] + #[ORM\ManyToOne(targetEntity: Day::class, inversedBy: 'events')] #[ORM\JoinColumn(name: 'day', referencedColumnName: 'id')] private Day $day; - #[ORM\ManyToOne(targetEntity: Event::class)] + #[ORM\ManyToOne(targetEntity: Event::class, cascade: ['persist'])] #[ORM\JoinColumn(name: 'event', referencedColumnName: 'id')] - private Event $event; + public Event $event; - #[ORM\OneToMany(mappedBy: 'event', targetEntity: Participant::class)] + #[ORM\OneToMany(mappedBy: 'event', targetEntity: Participant::class, cascade: ['persist', 'remove'])] public ?Collection $participants = null; public function __construct(Day $day, Event $event, ?Collection $participants = null) { $this->day = $day; $this->event = $event; - $this->participants = $participants; + $this->participants = $participants ?? new ArrayCollection(); } public function getId(): ?int @@ -79,6 +79,11 @@ public function getParticipant(Profile $profile): ?Participant return null; } + public function setParticipant(Participant $participant): void + { + $this->participants->add($participant); + } + public function getParticipants(): ArrayCollection { if (null === $this->participants) { @@ -87,4 +92,14 @@ public function getParticipants(): ArrayCollection return new ArrayCollection($this->participants->toArray()); } + + public function jsonSerialize(): array + { + return [ + 'id' => $this->getId(), + 'event' => $this->getEvent(), + 'day' => $this->getDay()->getId(), + 'participants' => $this->getParticipants(), + ]; + } } diff --git a/src/Mealz/MealBundle/Entity/GuestInvitation.php b/src/Mealz/MealBundle/Entity/GuestInvitation.php index 7debb3b61..47b432ff3 100644 --- a/src/Mealz/MealBundle/Entity/GuestInvitation.php +++ b/src/Mealz/MealBundle/Entity/GuestInvitation.php @@ -26,13 +26,20 @@ class GuestInvitation #[ORM\JoinColumn(name: 'meal_day_id', referencedColumnName: 'id', nullable: false, onDelete: 'NO ACTION')] private Day $day; + #[ORM\ManyToOne(targetEntity: EventParticipation::class)] + #[ORM\JoinColumn(name: 'eventParticipation', referencedColumnName: 'id', nullable: true, onDelete: 'NO ACTION')] + private ?EventParticipation $eventParticipation = null; + /** * Initializes class instance. */ - public function __construct(Profile $host, Day $day) + public function __construct(Profile $host, Day $day, ?EventParticipation $eventParticipation) { $this->host = $host; $this->day = $day; + if ($eventParticipation) { + $this->eventParticipation = $eventParticipation; + } } public function setId(string $id): static @@ -42,6 +49,11 @@ public function setId(string $id): static return $this; } + public function getEventParticipation(): ?EventParticipation + { + return $this->eventParticipation; + } + /** * @return string */ @@ -73,7 +85,11 @@ public function getDay(): Day #[ORM\PrePersist] public function beforeCreate(): void { - $this->id = md5($this->host->getUsername() . $this->day->getId()); + if ($this->eventParticipation) { + $this->id = md5($this->host->getUsername() . $this->day->getId() . $this->eventParticipation->getId()); + } else { + $this->id = md5($this->host->getUsername() . $this->day->getId()); + } $this->createdOn = new DateTime(); } } diff --git a/src/Mealz/MealBundle/Entity/Week.php b/src/Mealz/MealBundle/Entity/Week.php index 17c75b32f..b6fe316ec 100644 --- a/src/Mealz/MealBundle/Entity/Week.php +++ b/src/Mealz/MealBundle/Entity/Week.php @@ -117,4 +117,9 @@ public function jsonSerialize(): array 'enabled' => $this->isEnabled(), ]; } + + public function __toString() + { + return (string) $this->getCalendarWeek(); + } } diff --git a/src/Mealz/MealBundle/Event/EventParticipationUpdateEvent.php b/src/Mealz/MealBundle/Event/EventParticipationUpdateEvent.php index 9ca60ed40..9d7e169f9 100644 --- a/src/Mealz/MealBundle/Event/EventParticipationUpdateEvent.php +++ b/src/Mealz/MealBundle/Event/EventParticipationUpdateEvent.php @@ -10,7 +10,7 @@ /** * Event that is triggert when a event participation is updated. */ -class EventParticipationUpdateEvent extends Event +class EventParticipationUpdateEvent extends EventParticipation { private EventParticipation $eventParticpation; diff --git a/src/Mealz/MealBundle/Helper/MealAdminHelper.php b/src/Mealz/MealBundle/Helper/MealAdminHelper.php index b068fe572..4c86fed16 100644 --- a/src/Mealz/MealBundle/Helper/MealAdminHelper.php +++ b/src/Mealz/MealBundle/Helper/MealAdminHelper.php @@ -5,17 +5,25 @@ namespace App\Mealz\MealBundle\Helper; use App\Mealz\MealBundle\Entity\Day; +use App\Mealz\MealBundle\Entity\Dish; +use App\Mealz\MealBundle\Entity\Event; use App\Mealz\MealBundle\Entity\Meal; +use App\Mealz\MealBundle\Repository\DishRepository; +use App\Mealz\MealBundle\Repository\EventPartRepo; +use App\Mealz\MealBundle\Repository\EventRepository; +use App\Mealz\MealBundle\Repository\MealRepository; use App\Mealz\MealBundle\Service\EventParticipationService; +use Exception; class MealAdminHelper { - private EventParticipationService $eventService; - public function __construct( - EventParticipationService $eventService + private readonly EventParticipationService $eventService, + private readonly EventRepository $eventRepository, + private readonly EventPartRepo $eventPartRepo, + private readonly DishRepository $dishRepository, + private readonly MealRepository $mealRepository ) { - $this->eventService = $eventService; } public function setParticipationLimit(Meal $mealEntity, array $meal): void @@ -31,8 +39,77 @@ public function setParticipationLimit(Meal $mealEntity, array $meal): void } } - public function handleEventParticipation(Day $day, ?int $eventId = null): void + public function findEvent(int $eventId): ?Event + { + return $this->eventRepository->find($eventId); + } + + public function checkIfEventExistsForDay(int $eventId, Day $day): bool + { + if ($this->eventPartRepo->findByEventIdAndDay($day, $eventId)) { + return true; + } + + return false; + } + + public function handleMealArray(array $mealArr, Day $dayEntity): void + { + foreach ($mealArr as $meal) { + if (false === isset($meal['dishSlug'])) { + continue; + } + $dishEntity = $this->dishRepository->findOneBy(['slug' => $meal['dishSlug']]); + if (null === $dishEntity) { + throw new Exception('107: dish not found for slug: ' . $meal['dishSlug']); + } + // if mealId is null create meal + if (false === isset($meal['mealId'])) { + $this->createMeal($dishEntity, $dayEntity, $meal); + } else { + $this->modifyMeal($meal, $dishEntity, $dayEntity); + } + } + } + + private function createMeal(Dish $dishEntity, Day $dayEntity, array $meal): void + { + $mealEntity = new Meal($dishEntity, $dayEntity); + $mealEntity->setPrice($dishEntity->getPrice()); + $this->setParticipationLimit($mealEntity, $meal); + $dayEntity->addMeal($mealEntity); + } + + /** + * @throws Exception + */ + private function modifyMeal(array $meal, Dish $dishEntity, Day $dayEntity): void { - $this->eventService->handleEventParticipation($day, $eventId); + $mealEntity = $this->mealRepository->find($meal['mealId']); + if (null === $mealEntity) { + // this happens because meals without participations are deleted, even though they + // could be modified later on (this shouldn't happen but might) + $mealEntity = new Meal($dishEntity, $dayEntity); + $mealEntity->setPrice($dishEntity->getPrice()); + $dayEntity->addMeal($mealEntity); + + return; + } + + $this->setParticipationLimit($mealEntity, $meal); + // check if the requested dish is the same as before + if ($mealEntity->getDish()->getId() === $dishEntity->getId()) { + return; + } + + // check if meal already exists and can be modified (aka has no participations) + if (!$mealEntity->hasParticipations()) { + $mealEntity->setDish($dishEntity); + $mealEntity->setPrice($dishEntity->getPrice()); + + return; + } + + throw new Exception('108: meal has participations for id: ' . $meal['mealId']); } } diff --git a/src/Mealz/MealBundle/Message/WeeklyMenuMessage.php b/src/Mealz/MealBundle/Message/WeeklyMenuMessage.php index 199898421..12315ae4f 100644 --- a/src/Mealz/MealBundle/Message/WeeklyMenuMessage.php +++ b/src/Mealz/MealBundle/Message/WeeklyMenuMessage.php @@ -5,6 +5,7 @@ namespace App\Mealz\MealBundle\Message; use App\Mealz\MealBundle\Entity\Day; +use App\Mealz\MealBundle\Entity\EventParticipation; use App\Mealz\MealBundle\Entity\Meal; use App\Mealz\MealBundle\Entity\Week; use App\Mealz\MealBundle\Service\Notification\MessageInterface; @@ -44,7 +45,7 @@ public function getContent(): string ], 'messages' ); - $tableHeader = "\n|Day|Meals|\n|:-----|:-----|\n"; + $tableHeader = "\n|Day|Meals|Events|\n|:-----|:-----|\n"; $body = $this->getDishesByWeek($this->week); $footer = $this->translator->trans('week.notification.footer.default', [], 'messages'); } @@ -73,12 +74,35 @@ private function getDishesByDay(Day $day): string { $body = $day->getDateTime()->format('l') . ' | '; - if (!$day->isEnabled() || (0 === count($day->getMeals()))) { - return $body . $this->translator->trans('week.notification.content.no_meals', [], 'messages') . ' | '; + $dishes = []; + $events = []; + + $dishes = $this->handleDishes($day); + /** @var EventParticipation $event */ + foreach ($day->getEvents() as $event) { + $events[$event->getEvent()->getTitle()] = $event->getEvent()->getTitle(); } - $dishes = []; + if (!$day->isEnabled() || (0 === count($day->getMeals()))) { + $body = $body . $this->translator->trans('week.notification.content.no_meals', [], 'messages') . ' | '; + if (0 === count($day->getEvents())) { + return $body . $this->translator->trans('week.notification.content.no_events', [], 'messages') . ' | '; + } else { + return $body . $this->eventsToString($events); + } + } elseif (!$day->isEnabled() || (0 === count($day->getEvents()))) { + $body = $body . $this->toString($dishes); + + return $body . $this->translator->trans('week.notification.content.no_events', [], 'messages') . ' | '; + } else { + $body = $body . $this->toString($dishes); + + return $body . $this->eventsToString($events); + } + } + private function handleDishes(Day $day) + { /** @var Meal $meal */ foreach ($day->getMeals() as $meal) { if ($meal->isCombinedMeal()) { @@ -95,7 +119,7 @@ private function getDishesByDay(Day $day): string } } - return $body . $this->toString($dishes); + return $dishes; } /** @@ -115,4 +139,17 @@ private function toString(array $dishes): string return implode(', ', $result) . ' |'; } + + /** + * @param array $events + */ + private function eventsToString(array $events): string + { + $result = []; + foreach ($events as $eventTitle) { + $result[$eventTitle] = '**' . $eventTitle . '**'; + } + + return implode(', ', $result) . ' |'; + } } diff --git a/src/Mealz/MealBundle/Repository/DishRepository.php b/src/Mealz/MealBundle/Repository/DishRepository.php index b4166c39f..3a00a4030 100644 --- a/src/Mealz/MealBundle/Repository/DishRepository.php +++ b/src/Mealz/MealBundle/Repository/DishRepository.php @@ -80,6 +80,40 @@ public function hasDishAssociatedMeals(Dish $dish): bool return 0 < $query->getQuery()->getSingleScalarResult(); } + /** + * @throws NoResultException + * @throws NonUniqueResultException + */ + public function hasDishAssociatedCombiMealsInFuture(Dish $dish): bool + { + $today = new DateTime('today'); + $formattedDate = $today->format('Y-m-d') . ' 12:00:00.000000'; + if (true === $dish->hasVariations()) { + $variations = $dish->getVariations(); + foreach ($variations as $variation) { + if (true === $this->hasDishAssociatedCombiMealsInFuture($variation)) { + return true; + } + } + } + + $mealRepo = $this->getEntityManager()->getRepository(Meal::class); + $query = $mealRepo->createQueryBuilder('m2') + ->select('COUNT(m2)') + ->join('m2.day', 'd') + ->join('m2.dish', 'g') + ->join(Meal::class, 'm', 'WITH', 'm.day = d.id') + ->join('m2.participants', 'p') + ->where('g.slug = :slug') + ->andWhere('m.dish = :dish_id') + ->andWhere('m.dateTime >= :now') + ->setParameter('slug', 'combined-dish') + ->setParameter('dish_id', $dish->getId(), Types::INTEGER) + ->setParameter('now', $formattedDate); + + return 0 < $query->getQuery()->getSingleScalarResult(); + } + /** * Counts the number of Dish was taken in the last X Weeks. * diff --git a/src/Mealz/MealBundle/Repository/DishRepositoryInterface.php b/src/Mealz/MealBundle/Repository/DishRepositoryInterface.php index 1647ac4dc..fe040949f 100644 --- a/src/Mealz/MealBundle/Repository/DishRepositoryInterface.php +++ b/src/Mealz/MealBundle/Repository/DishRepositoryInterface.php @@ -17,6 +17,8 @@ public function getSortedDishesQueryBuilder(array $options = []): QueryBuilder; public function hasDishAssociatedMeals(Dish $dish): bool; + public function hasDishAssociatedCombiMealsInFuture(Dish $dish): bool; + /** * Counts the number of Dish was taken in the last X Weeks. */ diff --git a/src/Mealz/MealBundle/Repository/EventParticipationRepository.php b/src/Mealz/MealBundle/Repository/EventPartRepo.php similarity index 62% rename from src/Mealz/MealBundle/Repository/EventParticipationRepository.php rename to src/Mealz/MealBundle/Repository/EventPartRepo.php index 56b9d99a6..d259b9c2d 100644 --- a/src/Mealz/MealBundle/Repository/EventParticipationRepository.php +++ b/src/Mealz/MealBundle/Repository/EventPartRepo.php @@ -11,7 +11,7 @@ /** * @extends BaseRepository */ -class EventParticipationRepository extends BaseRepository implements EventParticipationRepositoryInterface +class EventPartRepo extends BaseRepository implements EventPartRepoInterface { public function add($eventParticipation): void { @@ -34,4 +34,19 @@ public function findByEventAndDay(Day $day, Event $event): ?EventParticipation return count($result) ? $result[0] : null; } + + public function findByEventIdAndDay(Day $day, int $eventId): ?EventParticipation + { + $queryBuilder = $this->createQueryBuilder('m'); + + // WHERE + $queryBuilder->andWhere('m.day = :day'); + $queryBuilder->andWhere('m.event = :event'); + $queryBuilder->setParameter('day', $day->getId()); + $queryBuilder->setParameter('event', $eventId); + + $result = $queryBuilder->getQuery()->getResult(); + + return count($result) ? $result[0] : null; + } } diff --git a/src/Mealz/MealBundle/Repository/EventParticipationRepositoryInterface.php b/src/Mealz/MealBundle/Repository/EventPartRepoInterface.php similarity index 86% rename from src/Mealz/MealBundle/Repository/EventParticipationRepositoryInterface.php rename to src/Mealz/MealBundle/Repository/EventPartRepoInterface.php index 1b512fa3a..1bd05a021 100644 --- a/src/Mealz/MealBundle/Repository/EventParticipationRepositoryInterface.php +++ b/src/Mealz/MealBundle/Repository/EventPartRepoInterface.php @@ -12,7 +12,7 @@ /** * @template-extends ObjectRepository */ -interface EventParticipationRepositoryInterface extends ObjectRepository +interface EventPartRepoInterface extends ObjectRepository { public function add($eventParticipation): void; diff --git a/src/Mealz/MealBundle/Repository/GuestInvitationRepository.php b/src/Mealz/MealBundle/Repository/GuestInvitationRepository.php index fc276e00b..f0a5968ed 100644 --- a/src/Mealz/MealBundle/Repository/GuestInvitationRepository.php +++ b/src/Mealz/MealBundle/Repository/GuestInvitationRepository.php @@ -5,6 +5,7 @@ namespace App\Mealz\MealBundle\Repository; use App\Mealz\MealBundle\Entity\Day; +use App\Mealz\MealBundle\Entity\EventParticipation; use App\Mealz\MealBundle\Entity\GuestInvitation; use App\Mealz\UserBundle\Entity\Profile; use Doctrine\ORM\Exception\ORMException; @@ -15,6 +16,28 @@ */ class GuestInvitationRepository extends BaseRepository implements GuestInvitationRepositoryInterface { + /** + * Gets the event guest invitation from a particular user on a particular day. + * + * @throws ORMException + * @throws OptimisticLockException + */ + public function findOrCreateEventInvitation(Profile $host, Day $day, ?EventParticipation $eventParticipation): GuestInvitation + { + $entityManager = $this->getEntityManager(); + if ($eventParticipation) { + $invitation = $this->findOneBy(['host' => $host->getUsername(), 'day' => $day->getId(), 'eventParticipation' => $eventParticipation]); + } + + if (($invitation instanceof GuestInvitation) === false) { + $invitation = new GuestInvitation($host, $day, $eventParticipation); + $entityManager->persist($invitation); + $entityManager->flush(); + } + + return $invitation; + } + /** * Gets the guest invitation from a particular user on a particular day. * @@ -23,12 +46,11 @@ class GuestInvitationRepository extends BaseRepository implements GuestInvitatio */ public function findOrCreateInvitation(Profile $host, Day $day): GuestInvitation { + $entityManager = $this->getEntityManager(); $invitation = $this->findOneBy(['host' => $host->getUsername(), 'day' => $day->getId()]); if (($invitation instanceof GuestInvitation) === false) { - $invitation = new GuestInvitation($host, $day); - - $entityManager = $this->getEntityManager(); + $invitation = new GuestInvitation($host, $day, null); $entityManager->persist($invitation); $entityManager->flush(); } diff --git a/src/Mealz/MealBundle/Repository/GuestInvitationRepositoryInterface.php b/src/Mealz/MealBundle/Repository/GuestInvitationRepositoryInterface.php index 6ebd4ff48..94596e6f0 100644 --- a/src/Mealz/MealBundle/Repository/GuestInvitationRepositoryInterface.php +++ b/src/Mealz/MealBundle/Repository/GuestInvitationRepositoryInterface.php @@ -5,6 +5,7 @@ namespace App\Mealz\MealBundle\Repository; use App\Mealz\MealBundle\Entity\Day; +use App\Mealz\MealBundle\Entity\EventParticipation; use App\Mealz\MealBundle\Entity\GuestInvitation; use App\Mealz\UserBundle\Entity\Profile; use Doctrine\Persistence\ObjectRepository; @@ -14,6 +15,11 @@ */ interface GuestInvitationRepositoryInterface extends ObjectRepository { + /** + * Gets the guest invitation from a particular user on a particular day. + */ + public function findOrCreateEventInvitation(Profile $host, Day $day, ?EventParticipation $eventParticipation): GuestInvitation; + /** * Gets the guest invitation from a particular user on a particular day. */ diff --git a/src/Mealz/MealBundle/Repository/MealRepository.php b/src/Mealz/MealBundle/Repository/MealRepository.php index 56965520f..4d1b70d12 100644 --- a/src/Mealz/MealBundle/Repository/MealRepository.php +++ b/src/Mealz/MealBundle/Repository/MealRepository.php @@ -4,6 +4,7 @@ namespace App\Mealz\MealBundle\Repository; +use App\Mealz\MealBundle\Entity\Dish; use App\Mealz\MealBundle\Entity\Meal; use DateTime; use Doctrine\DBAL\Types\Types; @@ -155,4 +156,22 @@ public function getLockedMeals(): array return $queryBuilder->getQuery()->getResult(); } + + /** + * Returns all CombiMeals that are in the future and contain a specific dish. + * + * @return Meal[] + */ + public function getFutureMealsForDish(Dish $dish): array + { + $queryBuilder = $this->createQueryBuilder('m') + ->select('m') + ->join('m.day', 'd') + ->andWhere('m.dish = :dish_id') + ->andWhere('m.dateTime >= :now') + ->setParameter('dish_id', $dish->getId(), Types::INTEGER) + ->setParameter('now', new DateTime('now'), Types::DATETIME_MUTABLE); + + return $queryBuilder->getQuery()->getResult(); + } } diff --git a/src/Mealz/MealBundle/Repository/MealRepositoryInterface.php b/src/Mealz/MealBundle/Repository/MealRepositoryInterface.php index 2684341b1..943bc96ca 100644 --- a/src/Mealz/MealBundle/Repository/MealRepositoryInterface.php +++ b/src/Mealz/MealBundle/Repository/MealRepositoryInterface.php @@ -4,6 +4,7 @@ namespace App\Mealz\MealBundle\Repository; +use App\Mealz\MealBundle\Entity\Dish; use App\Mealz\MealBundle\Entity\Meal; use DateTime; use Doctrine\Common\Collections\Selectable; @@ -60,4 +61,11 @@ public function getOutdatedMeals(): array; * @return Meal[] */ public function getLockedMeals(): array; + + /** + * Returns all Meals that are in the future and contain a specific dish. + * + * @return Meal[] + */ + public function getFutureMealsForDish(Dish $dish): array; } diff --git a/src/Mealz/MealBundle/Repository/ParticipantRepository.php b/src/Mealz/MealBundle/Repository/ParticipantRepository.php index 8ffa4435b..3bf3d4c66 100644 --- a/src/Mealz/MealBundle/Repository/ParticipantRepository.php +++ b/src/Mealz/MealBundle/Repository/ParticipantRepository.php @@ -535,4 +535,19 @@ public function getParticipationsOfSlot(Slot $slot): array return $participations; } + + public function getParticipationCountByProfile(Profile $profile, DateTime $date): int + { + $queryBuilder = $this->createQueryBuilder('p') + ->select('p.id') + ->join('p.meal', 'm', 'ON') + ->where('p.profile = :profile') + ->andWhere('m.dateTime = :day') + ->setParameter('profile', $profile->getUsername()) + ->setParameter('day', $date->format('Y-m-d H:i:s.u')); + + $participations = $queryBuilder->getQuery()->execute(); + + return count($participations); + } } diff --git a/src/Mealz/MealBundle/Repository/ParticipantRepositoryInterface.php b/src/Mealz/MealBundle/Repository/ParticipantRepositoryInterface.php index 57e15193a..8f2aeef86 100644 --- a/src/Mealz/MealBundle/Repository/ParticipantRepositoryInterface.php +++ b/src/Mealz/MealBundle/Repository/ParticipantRepositoryInterface.php @@ -95,4 +95,9 @@ public function removeFutureMealsByProfile(Profile $profile): void; * Returns an array of all the participations for a given slot starting from the current week. */ public function getParticipationsOfSlot(Slot $slot): array; + + /** + * Returns the number of participations a profile has on a date. + */ + public function getParticipationCountByProfile(Profile $profile, DateTime $date): int; } diff --git a/src/Mealz/MealBundle/Resources/config/routing.yml b/src/Mealz/MealBundle/Resources/config/routing.yml index 4457050cf..9e65d18d6 100644 --- a/src/Mealz/MealBundle/Resources/config/routing.yml +++ b/src/Mealz/MealBundle/Resources/config/routing.yml @@ -216,17 +216,17 @@ MealzMealBundle_api_events_delete: methods: [ DELETE ] MealzMealBundle_api_events_join: - path: /api/events/participation/{date} + path: /api/events/participation/{date}/{eventId} defaults: { _controller: App\Mealz\MealBundle\Controller\EventController::join } methods: [ POST ] MealzMealBundle_api_events_leave: - path: /api/events/participation/{date} + path: /api/events/participation/{date}/{eventId} defaults: { _controller: App\Mealz\MealBundle\Controller\EventController::leave } methods: [ DELETE ] MealzMealBundle_Meal_api_guest_event_invitation: - path: /event/invitation/{dayId} + path: /event/invitation/{dayId}/{eventId} defaults: { _controller: App\Mealz\MealBundle\Controller\MealGuestController::newGuestEventInvitation } requirements: dayId: '[1-9][0-9]*' @@ -357,7 +357,7 @@ MealzMealBundle_api_participations: methods: [ GET ] MealzMealBundle_api_event_participations: - path: /api/participations/event/{date} + path: /api/events/participation/{date}/{eventId} defaults: { _controller: App\Mealz\MealBundle\Controller\EventController::getEventParticipants } methods: [ GET ] diff --git a/src/Mealz/MealBundle/Resources/translations/messages.en.yml b/src/Mealz/MealBundle/Resources/translations/messages.en.yml index 063442082..8535a36f6 100644 --- a/src/Mealz/MealBundle/Resources/translations/messages.en.yml +++ b/src/Mealz/MealBundle/Resources/translations/messages.en.yml @@ -9,6 +9,7 @@ week: default: Log into your account at https://meals.aoe.com/ to get it! content: no_meals: No offers for this day + no_events: No events on this day entity: added: '%entityName% has been added.' diff --git a/src/Mealz/MealBundle/Service/ApiService.php b/src/Mealz/MealBundle/Service/ApiService.php index f80e2c8ee..fd6ecc4a9 100644 --- a/src/Mealz/MealBundle/Service/ApiService.php +++ b/src/Mealz/MealBundle/Service/ApiService.php @@ -124,7 +124,17 @@ public function isParamValid($parameters, $key, $type): bool public function getEventParticipationData(Day $day, ?Profile $profile = null): ?array { - return $this->eventPartSrv->getEventParticipationData($day, $profile); + return $this->eventPartSrv->getEventParticipationData($day, null, $profile); + } + + public function getEventParticipationsData(Day $day, ?Profile $profile = null): ?array + { + $participations = []; + foreach ($day->getEvents() as $eventParticipation) { + $participations[] = $this->eventPartSrv->getEventParticipationData($day, $eventParticipation->getId(), $profile); + } + + return $participations; } /** @@ -132,15 +142,15 @@ public function getEventParticipationData(Day $day, ?Profile $profile = null): ? * * @psalm-return array{name: string, participants: array}|null */ - public function getEventParticipationInfo(Day $day): ?array + public function getEventParticipationInfo(Day $day, int $eventId): ?array { - if (null === $day->getEvent()) { + if (null === $day->getEvents()) { return null; } return [ - 'name' => $day->getEvent()->getEvent()->getTitle(), - 'participants' => $this->getEventParticipants($day), + 'name' => $day->getEvent($eventId)->getEvent()->getTitle(), + 'participants' => $this->getEventParticipants($day, $eventId), ]; } @@ -166,8 +176,17 @@ public function hasCombiReachedLimit(Day $day): bool return $hasReachedLimit; } - private function getEventParticipants(Day $day): array + public function isMealOpen(Meal $meal): bool + { + return false === $meal->isLocked() + && true === $meal->isOpen() + && false === $meal->hasReachedParticipationLimit() + && (false === $meal->isCombinedMeal() + || false === $this->hasCombiReachedLimit($meal->getDay())); + } + + private function getEventParticipants(Day $day, int $eventId): array { - return $this->eventPartSrv->getParticipants($day); + return $this->eventPartSrv->getParticipants($day, $eventId); } } diff --git a/src/Mealz/MealBundle/Service/DayService.php b/src/Mealz/MealBundle/Service/DayService.php index 1af3b355a..9d9be4fbf 100644 --- a/src/Mealz/MealBundle/Service/DayService.php +++ b/src/Mealz/MealBundle/Service/DayService.php @@ -7,18 +7,22 @@ use App\Mealz\MealBundle\Entity\Day; use App\Mealz\MealBundle\Entity\Meal; use App\Mealz\MealBundle\Repository\MealRepositoryInterface; +use App\Mealz\MealBundle\Repository\ParticipantRepositoryInterface; use Doctrine\ORM\EntityManagerInterface; class DayService { private MealRepositoryInterface $mealRepository; + private ParticipantRepositoryInterface $participantRepo; private EntityManagerInterface $em; public function __construct( MealRepositoryInterface $mealRepository, + ParticipantRepositoryInterface $participantRepo, EntityManagerInterface $entityManager ) { $this->mealRepository = $mealRepository; + $this->participantRepo = $participantRepo; $this->em = $entityManager; } @@ -60,6 +64,25 @@ public function removeUnusedMeals(Day $day, array $mealCollection): void } } + public function checkMealsUpdatable(Day $day, array $mealCollection): bool + { + $flattenedMeals = array_merge(...array_values($mealCollection)); + $mealIdsOfCol = array_map( + fn ($meal) => $meal['mealId'], + $flattenedMeals + ); + $mealsToUpdate = $day->getMeals()->filter(fn ($meal) => false === in_array($meal->getId(), $mealIdsOfCol)); + + /** @var Meal $meal */ + foreach ($mealsToUpdate as $meal) { + if (true === $meal->hasParticipations()) { + return false; + } + } + + return true; + } + private function removeUnusedMealHelper(Meal $mealEntity, array $mealCollection, Day $day): void { $canRemove = true; diff --git a/src/Mealz/MealBundle/Service/DishService.php b/src/Mealz/MealBundle/Service/DishService.php index dbf28edf2..1ea6d3030 100644 --- a/src/Mealz/MealBundle/Service/DishService.php +++ b/src/Mealz/MealBundle/Service/DishService.php @@ -8,9 +8,12 @@ use App\Mealz\MealBundle\Entity\DishVariation; use App\Mealz\MealBundle\Entity\Meal; use App\Mealz\MealBundle\Enum\Diet; +use App\Mealz\MealBundle\Event\WeekUpdateEvent; use App\Mealz\MealBundle\Repository\CategoryRepository; use App\Mealz\MealBundle\Repository\DishRepository; +use App\Mealz\MealBundle\Repository\MealRepositoryInterface; use Exception; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; class DishService { @@ -26,19 +29,25 @@ class DishService private ApiService $apiService; private CategoryRepository $categoryRepository; private DishRepository $dishRepository; + private EventDispatcherInterface $eventDispatcher; + private MealRepositoryInterface $mealRepo; public function __construct( int $newFlagThreshold, string $dishConsCountPeriod, ApiService $apiService, CategoryRepository $categoryRepository, - DishRepository $dishRepository + DishRepository $dishRepository, + EventDispatcherInterface $eventDispatcher, + MealRepositoryInterface $mealRepo, ) { $this->newFlagThreshold = $newFlagThreshold; $this->dishConsCountPeriod = $dishConsCountPeriod; $this->apiService = $apiService; $this->categoryRepository = $categoryRepository; $this->dishRepository = $dishRepository; + $this->eventDispatcher = $eventDispatcher; + $this->mealRepo = $mealRepo; } /** @@ -58,8 +67,8 @@ public function isNew(Dish $dish): bool */ public function updateHelper(Dish $dish, array $parameters): void { - $this->setTitleIfValid($dish, $parameters); $this->setServingSizeIfValid($dish, $parameters); + $this->setTitleIfValid($dish, $parameters); $this->setDescriptionIfValid($dish, $parameters); $this->setCategoryIfValid($dish, $parameters); $this->setDietIfValid($dish, $parameters); @@ -92,6 +101,28 @@ public function getUniqueDishesFromMeals(array $meals): array return $uniqueMeals; } + public function updateCombisForDish(Dish $dish): void + { + $meals = $this->mealRepo->getFutureMealsForDish($dish); + + if (true === $dish->hasVariations()) { + foreach ($dish->getVariations() as $variation) { + $res = $this->mealRepo->getFutureMealsForDish($variation); + $meals = array_merge($meals, $res); + } + } + + $weeksToUpdate = array_map( + fn ($meal) => $meal->getDay()->getWeek(), + array_unique($meals) + ); + $uniqueWeeks = array_unique($weeksToUpdate); + + foreach ($uniqueWeeks as $week) { + $this->eventDispatcher->dispatch(new WeekUpdateEvent($week, false)); + } + } + private function setDietIfValid(Dish $dish, array $parameters): void { if (true === $this->apiService->isParamValid($parameters, 'diet', 'string')) { @@ -119,6 +150,10 @@ private function setDescriptionIfValid(Dish $dish, array $parameters): void private function setServingSizeIfValid(Dish $dish, array $parameters): void { if (true === $this->apiService->isParamValid($parameters, 'oneServingSize', 'boolean')) { + if (true === $parameters['oneServingSize'] && true === $this->hasBookedCombiMealsInFuture($dish)) { + throw new Exception('204: The servingSize cannot be adjusted, because there are booked combi-meals'); + } + $dish->setOneServingSize($parameters['oneServingSize']); if (true === $dish->hasVariations()) { /** @var Dish $variation */ @@ -138,4 +173,9 @@ private function setTitleIfValid(Dish $dish, array $parameters): void $dish->setTitleEn($parameters['titleEn']); } } + + private function hasBookedCombiMealsInFuture(Dish $dish): bool + { + return $this->dishRepository->hasDishAssociatedCombiMealsInFuture($dish); + } } diff --git a/src/Mealz/MealBundle/Service/EventParticipationService.php b/src/Mealz/MealBundle/Service/EventParticipationService.php index 7e1cc3451..64893403e 100644 --- a/src/Mealz/MealBundle/Service/EventParticipationService.php +++ b/src/Mealz/MealBundle/Service/EventParticipationService.php @@ -3,10 +3,9 @@ namespace App\Mealz\MealBundle\Service; use App\Mealz\MealBundle\Entity\Day; -use App\Mealz\MealBundle\Entity\Event; use App\Mealz\MealBundle\Entity\EventParticipation; use App\Mealz\MealBundle\Entity\Participant; -use App\Mealz\MealBundle\Repository\EventParticipationRepositoryInterface; +use App\Mealz\MealBundle\Repository\EventPartRepoInterface; use App\Mealz\MealBundle\Repository\EventRepositoryInterface; use App\Mealz\UserBundle\Entity\Profile; use Doctrine\ORM\EntityManagerInterface; @@ -16,7 +15,7 @@ class EventParticipationService { private Doorman $doorman; private EntityManagerInterface $em; - private EventParticipationRepositoryInterface $eventPartRepo; + private EventPartRepoInterface $eventPartRepo; private EventRepositoryInterface $eventRepo; private GuestParticipationService $guestPartSrv; @@ -24,7 +23,7 @@ public function __construct( Doorman $doorman, EntityManagerInterface $em, EventRepositoryInterface $eventRepo, - EventParticipationRepositoryInterface $eventPartRepo, + EventPartRepoInterface $eventPartRepo, GuestParticipationService $guestPartSrv ) { $this->doorman = $doorman; @@ -39,45 +38,48 @@ public function __construct( * if an eventId is passed in as a parameter. If no eventId is present * the eventparticipation will get removed from the day. */ - public function handleEventParticipation(Day $day, ?int $eventId = null): void + public function handleEventParticipation(Day $day, EventParticipation $event): void { - if (null === $eventId) { - $this->removeEventFromDay($day); + if (null === $event->getId()) { + $this->removeEventFromDay($day, $event); } else { - $event = $this->eventRepo->find($eventId); $this->addEventToDay($day, $event); } } /** - * @return (bool|int|null)[]|null + * @return (Day|bool|int|null)[]|null * - * @psalm-return array{eventId: int, participationId: int|null, participations: int, isPublic: bool, isParticipating?: bool}|null + * @psalm-return array{day: \App\Mealz\MealBundle\Entity\Day, eventId: int, isParticipating?: bool, isPublic: bool, participationId: int|null, participations: int<0, max>} | array{\App\Mealz\MealBundle\Entity\EventParticipation} */ - public function getEventParticipationData(Day $day, ?Profile $profile = null): ?array + public function getEventParticipationData(Day $day, ?int $eventId = null, ?Profile $profile = null): ?array { - $eventParticipation = $day->getEvent(); - if (null === $eventParticipation) { - return null; - } - - $participationData = [ - 'eventId' => $eventParticipation->getEvent()->getId(), - 'participationId' => $eventParticipation->getId(), - 'participations' => count($eventParticipation->getParticipants()), - 'isPublic' => $eventParticipation->getEvent()->isPublic(), - ]; - - if (null !== $profile) { - $participationData['isParticipating'] = null !== $eventParticipation->getParticipant($profile); + if (null === $eventId) { + return $day->getEvents()->toArray(); + } else { + $eventParticipation = $day->getEvent($eventId); + if (null === $eventParticipation) { + return null; + } + $participationData = [ + 'eventId' => $eventParticipation->getEvent()->getId(), + 'participationId' => $eventParticipation->getId(), + 'participations' => count($eventParticipation->getParticipants()), + 'isPublic' => $eventParticipation->getEvent()->isPublic(), + 'day' => $eventParticipation->getDay(), + ]; + + if (null !== $profile) { + $participationData['isParticipating'] = null !== $eventParticipation->getParticipant($profile); + } + + return $participationData; } - - return $participationData; } - public function join(Profile $profile, Day $day): ?EventParticipation + public function join(Profile $profile, Day $day, int $eventId): ?EventParticipation { - $eventParticipation = $day->getEvent(); + $eventParticipation = $day->getEvent($eventId); if (null !== $eventParticipation && true === $this->doorman->isUserAllowedToJoinEvent($eventParticipation)) { $participation = $this->createEventParticipation($profile, $eventParticipation); $this->em->persist($participation); @@ -96,7 +98,8 @@ public function joinAsGuest( string $firstName, string $lastName, string $company, - Day $eventDay + Day $eventDay, + EventParticipation $eventParticipation, ): EventParticipation { $guestProfile = $this->guestPartSrv->getCreateGuestProfile( $firstName, @@ -109,7 +112,6 @@ public function joinAsGuest( try { $this->em->persist($guestProfile); - $eventParticipation = $eventDay->getEvent(); $participation = $this->createEventParticipation($guestProfile, $eventParticipation); $this->em->persist($participation); @@ -124,9 +126,9 @@ public function joinAsGuest( } } - public function leave(Profile $profile, Day $day): ?EventParticipation + public function leave(Profile $profile, Day $day, int $eventId): ?EventParticipation { - $eventParticipation = $day->getEvent(); + $eventParticipation = $day->getEvent($eventId); $participation = $eventParticipation->getParticipant($profile); if (null !== $participation) { @@ -144,42 +146,45 @@ public function leave(Profile $profile, Day $day): ?EventParticipation * * @psalm-return array */ - public function getParticipants(Day $day): array + public function getParticipants(Day $day, int $eventId): array { - $eventParticipation = $day->getEvent(); + $eventParticipation = $day->getEvent($eventId); if (null === $eventParticipation) { return []; } return array_map( fn (Participant $participant) => $this->getParticipantName($participant), - $day->getEvent()->getParticipants()->toArray() + $day->getEvent($eventId)->getParticipants()->toArray() ); } - private function addEventToDay(Day $day, ?Event $event): void + /** + * adds new event to the eventCollection. + */ + private function addEventToDay(Day $day, ?EventParticipation $event): void { // new eventparticipation - if (null !== $event && null === $day->getEvent()) { - $eventParticipation = new EventParticipation($day, $event); - $day->setEvent($eventParticipation); - } elseif (null !== $event && $day->getEvent()->getEvent()->getId() !== $event->getId()) { - // edit eventparticipation - $day->getEvent()->setEvent($event); + if (null !== $event) { + $eventParticipation = new EventParticipation($day, $event->getEvent()); + $day->addEvent($eventParticipation); } } - private function removeEventFromDay(Day $day): void + private function removeEventFromDay(Day $day, EventParticipation $event): void { - if (null !== $day->getEvent()) { - $this->em->remove($day->getEvent()); - $day->setEvent(null); - } + $day->removeEvent($event); } - private function createEventParticipation(Profile $profile, EventParticipation $eventParticiation): Participant + private function createEventParticipation(Profile $profile, EventParticipation $eventParticipation): Participant { - return new Participant($profile, null, $eventParticiation); + $participant = new Participant($profile, null, $eventParticipation); + $eventParticipation->setParticipant($participant); + $this->em->persist($participant); + $this->em->persist($eventParticipation); + $this->em->flush(); + + return $participant; } private function getParticipantName(Participant $participant): string diff --git a/src/Mealz/MealBundle/Service/ParticipationService.php b/src/Mealz/MealBundle/Service/ParticipationService.php index f6b0c8291..0eceaf2af 100644 --- a/src/Mealz/MealBundle/Service/ParticipationService.php +++ b/src/Mealz/MealBundle/Service/ParticipationService.php @@ -50,6 +50,10 @@ public function __construct( */ public function join(Profile $profile, Meal $meal, ?Slot $slot = null, array $dishSlugs = []): ?array { + if (2 <= $this->participantRepo->getParticipationCountByProfile($profile, $meal->getDateTime())) { + return null; + } + // user is attempting to take over an already booked meal by some participant if (true === $this->mealIsOffered($meal) && true === $this->allowedToAccept($meal)) { return $this->reassignOfferedMeal($meal, $profile, $dishSlugs); diff --git a/src/Mealz/MealBundle/Tests/Controller/AbstractControllerTestCase.php b/src/Mealz/MealBundle/Tests/Controller/AbstractControllerTestCase.php index 35fedf7be..a93a93c8b 100644 --- a/src/Mealz/MealBundle/Tests/Controller/AbstractControllerTestCase.php +++ b/src/Mealz/MealBundle/Tests/Controller/AbstractControllerTestCase.php @@ -147,7 +147,7 @@ protected function createParticipant(Profile $profile, Meal $meal): Participant protected function createEventParticipation(Day $day, Event $event): EventParticipation { $eventParticipation = new EventParticipation($day, $event); - $day->setEvent($eventParticipation); + $day->addEvent($eventParticipation); $this->persistAndFlushAll([$eventParticipation, $day]); return $eventParticipation; diff --git a/src/Mealz/MealBundle/Tests/Controller/EventControllerTest.php b/src/Mealz/MealBundle/Tests/Controller/EventControllerTest.php index 8b3313777..02eed4372 100644 --- a/src/Mealz/MealBundle/Tests/Controller/EventControllerTest.php +++ b/src/Mealz/MealBundle/Tests/Controller/EventControllerTest.php @@ -9,7 +9,7 @@ use App\Mealz\MealBundle\Entity\Event; use App\Mealz\MealBundle\Entity\Participant; use App\Mealz\MealBundle\Repository\DayRepository; -use App\Mealz\MealBundle\Repository\EventParticipationRepositoryInterface; +use App\Mealz\MealBundle\Repository\EventPartRepoInterface; use App\Mealz\MealBundle\Repository\ParticipantRepositoryInterface; use App\Mealz\UserBundle\DataFixtures\ORM\LoadRoles; use App\Mealz\UserBundle\DataFixtures\ORM\LoadUsers; @@ -141,15 +141,15 @@ public function testJoin(): void $this->assertNotNull($day); $eventParticipation = $this->createEventParticipation($day, $newEvent); - - $url = '/api/events/participation/' . $day->getDateTime()->format('Y-m-d') . '%20' . $day->getDateTime()->format('H:i:s'); + $eventParticipationId = $eventParticipation->getId(); + $url = '/api/events/participation/' . $day->getDateTime()->format('Y-m-d') . '%20' . $day->getDateTime()->format('H:i:s') . '/' . $eventParticipationId; $this->client->request('POST', $url); $this->assertEquals(Response::HTTP_OK, $this->client->getResponse()->getStatusCode()); $content = json_decode($this->client->getResponse()->getContent()); $this->assertNotNull($content); - $eventPartRepo = self::getContainer()->get(EventParticipationRepositoryInterface::class); + $eventPartRepo = self::getContainer()->get(EventPartRepoInterface::class); $eventPart = $eventPartRepo->findOneBy(['id' => $content->participationId]); $this->assertNotNull($eventPart); @@ -175,18 +175,19 @@ public function testLeave(): void $day = $dayRepo->matching($criteria)->get(0); $eventParticipation = $this->createEventParticipation($day, $newEvent); + $eventParticipationId = $eventParticipation->getId(); - $url = '/api/events/participation/' . $day->getDateTime()->format('Y-m-d') . '%20' . $day->getDateTime()->format('H:i:s'); + $url = '/api/events/participation/' . $day->getDateTime()->format('Y-m-d') . '%20' . $day->getDateTime()->format('H:i:s') . '/' . $eventParticipationId; $this->client->request('POST', $url); - $url = '/api/events/participation/' . $day->getDateTime()->format('Y-m-d') . '%20' . $day->getDateTime()->format('H:i:s'); + $url = '/api/events/participation/' . $day->getDateTime()->format('Y-m-d') . '%20' . $day->getDateTime()->format('H:i:s') . '/' . $eventParticipationId; $this->client->request('DELETE', $url); $this->assertEquals(Response::HTTP_OK, $this->client->getResponse()->getStatusCode()); $content = json_decode($this->client->getResponse()->getContent()); $this->assertNotNull($content); - $eventPartRepo = self::getContainer()->get(EventParticipationRepositoryInterface::class); + $eventPartRepo = self::getContainer()->get(EventPartRepoInterface::class); $eventPart = $eventPartRepo->findOneBy(['id' => $content->participationId]); $this->assertNotNull($eventPart); @@ -214,18 +215,20 @@ public function testGetEventParticipants(): void $this->assertNotNull($day); $eventParticipation = $this->createEventParticipation($day, $newEvent); + $eventParticipationId = $eventParticipation->getId(); $date = $day->getDateTime()->format('Y-m-d') . '%20' . $day->getDateTime()->format('H:i:s'); // Verify no participants in new event - $this->client->request('GET', '/api/participations/event/' . $date); + $url = '/api/events/participation/' . $date . '/' . $eventParticipationId; + $this->client->request('GET', $url); $participants = json_decode($this->client->getResponse()->getContent()); $this->assertEquals(0, count($participants)); - $this->client->request('POST', '/api/events/participation/' . $date); + $this->client->request('POST', '/api/events/participation/' . $date . '/' . $eventParticipationId); $this->assertEquals(Response::HTTP_OK, $this->client->getResponse()->getStatusCode()); - $this->client->request('GET', '/api/participations/event/' . $date); + $this->client->request('GET', '/api/events/participation/' . $date . '/' . $eventParticipationId); $participants = json_decode($this->client->getResponse()->getContent()); $this->assertEquals(1, count($participants)); diff --git a/src/Mealz/MealBundle/Tests/Controller/MealAdminControllerTest.php b/src/Mealz/MealBundle/Tests/Controller/MealAdminControllerTest.php index 33e65cc04..f9084b714 100644 --- a/src/Mealz/MealBundle/Tests/Controller/MealAdminControllerTest.php +++ b/src/Mealz/MealBundle/Tests/Controller/MealAdminControllerTest.php @@ -154,7 +154,7 @@ public function testEdit(): void "-1": [] }, "id": ' . $createdWeek->getDays()[0]->getId() . ', - "event": null, + "events": {}, "enabled": true, "date": { "date": "' . $date->format('Y-m-d') . ' 12:00:00.000000", @@ -175,7 +175,7 @@ public function testEdit(): void "-1": [] }, "id": ' . $createdWeek->getDays()[1]->getId() . ', - "event": null, + "events": {}, "enabled": true, "date": { "date": "' . $createdWeek->getDays()[1]->getDateTime()->format('Y-m-d') . ' 12:00:00.000000", @@ -225,7 +225,7 @@ private function createFutureEmptyWeek(DateTime $date): void "-1": [] }, "id": -1, - "event": null, + "events": {}, "enabled": true, "date": { "date": "' . $localDate->format('Y-m-d') . ' 12:00:00.000000", @@ -242,7 +242,7 @@ private function createFutureEmptyWeek(DateTime $date): void "-1": [] }, "id": -2, - "event": null, + "events": {}, "enabled": true, "date": { "date": "' . $localDate->modify('+1 day')->format('Y-m-d') . ' 12:00:00.000000", @@ -260,7 +260,7 @@ private function createFutureEmptyWeek(DateTime $date): void "-1": [] }, "id": -3, - "event": null, + "events": {}, "enabled": true, "date": { "date": "' . $localDate->modify('+1 day')->format('Y-m-d') . ' 12:00:00.000000", @@ -278,7 +278,7 @@ private function createFutureEmptyWeek(DateTime $date): void "-1": [] }, "id": -4, - "event": null, + "events": {}, "enabled": true, "date": { "date": "' . $localDate->modify('+1 day')->format('Y-m-d') . ' 12:00:00.000000", @@ -296,7 +296,14 @@ private function createFutureEmptyWeek(DateTime $date): void "-1": [] }, "id": -5, - "event": ' . $testEvent->getId() . ', + "events": { + "3": { + "eventId": ' . $testEvent->getId() . ', + "eventSlug": "' . $testEvent->getSlug() . '", + "eventTitle": "' . $testEvent->getTitle() . '", + "isPublic": ' . ($testEvent->isPublic() ? 'true' : 'false') . ' + } + }, "enabled": true, "date": { "date": "' . $localDate->modify('+1 day')->format('Y-m-d') . ' 12:00:00.000000", @@ -316,5 +323,6 @@ private function createFutureEmptyWeek(DateTime $date): void // Request $this->client->request('POST', $routeStr, [], [], [], $weekJson); + // https://meals.test/api/weeks/2024W40 } } diff --git a/src/Mealz/MealBundle/Tests/Controller/MealGuestControllerTest.php b/src/Mealz/MealBundle/Tests/Controller/MealGuestControllerTest.php index 5dbaaec99..2bef981e3 100644 --- a/src/Mealz/MealBundle/Tests/Controller/MealGuestControllerTest.php +++ b/src/Mealz/MealBundle/Tests/Controller/MealGuestControllerTest.php @@ -42,9 +42,10 @@ public function testnewGuestEventInvitation(): void { $guestInvitationRepo = self::getContainer()->get(GuestInvitationRepository::class); $eventParticipation = $this->createFutureEvent(); - $url = '/event/invitation/' . $eventParticipation->getDay()->getId(); + $url = '/event/invitation/' . $eventParticipation->getDay()->getId() . '/' . $eventParticipation->getId(); $this->client->request('GET', $url); + $response = $this->client->getResponse(); $this->assertEquals(Response::HTTP_OK, $this->client->getResponse()->getStatusCode()); $guestLink = json_decode($this->client->getResponse()->getContent())->url; @@ -55,7 +56,7 @@ public function testnewGuestEventInvitation(): void $this->assertNotNull($invitation); $this->assertEquals( $eventParticipation->getEvent()->getTitle(), - $invitation->getDay()->getEvent()->getEvent()->getTitle() + $invitation->getEventParticipation()->getEvent()->getTitle() ); } @@ -65,9 +66,11 @@ public function testGetEventInvitationData(): void $eventParticipation = $this->createFutureEvent(); $profile = $this->createProfile('Max', 'Mustermann' . time()); $this->persistAndFlushAll([$profile]); - $eventInvitation = $guestInvitationRepo->findOrCreateInvitation($profile, $eventParticipation->getDay()); + $eventInvitation = $guestInvitationRepo->findOrCreateEventInvitation($profile, $eventParticipation->getDay(), $eventParticipation); $this->client->request('GET', '/api/event/invitation/' . $eventInvitation->getId()); + $response = $this->client->getResponse(); + $this->assertEquals(Response::HTTP_OK, $this->client->getResponse()->getStatusCode()); $content = json_decode($this->client->getResponse()->getContent()); @@ -80,7 +83,7 @@ public function testGetEventInvitationData(): void json_encode($content->lockDate) ); $this->assertEquals( - $eventParticipation->getDay()->getEvent()->getEvent()->getTitle(), + $eventParticipation->getEvent()->getTitle(), $content->event ); } @@ -91,7 +94,7 @@ public function testJoinEventAsGuest(): void $eventParticipation = $this->createFutureEvent(); $profile = $this->createProfile('Max', 'Mustermann' . time()); $this->persistAndFlushAll([$profile]); - $eventInvitation = $guestInvitationRepo->findOrCreateInvitation($profile, $eventParticipation->getDay()); + $eventInvitation = $guestInvitationRepo->findOrCreateEventInvitation($profile, $eventParticipation->getDay(), $eventParticipation); // with company $this->client->request( diff --git a/src/Mealz/UserBundle/DataFixtures/ORM/LoadUsers.php b/src/Mealz/UserBundle/DataFixtures/ORM/LoadUsers.php index 7548caac2..42065c920 100644 --- a/src/Mealz/UserBundle/DataFixtures/ORM/LoadUsers.php +++ b/src/Mealz/UserBundle/DataFixtures/ORM/LoadUsers.php @@ -44,6 +44,7 @@ public function load(ObjectManager $manager): void 'firstName' => 'Alice', 'lastName' => 'Meals', 'roles' => ['ROLE_USER'], + 'email' => 'alice.meals@aoe.com', ], [ 'username' => 'bob.meals', @@ -51,6 +52,7 @@ public function load(ObjectManager $manager): void 'firstName' => 'Bob', 'lastName' => 'Meals', 'roles' => ['ROLE_USER'], + 'email' => 'bob.meals@aoe.com', ], [ 'username' => 'finance.meals', @@ -58,6 +60,7 @@ public function load(ObjectManager $manager): void 'firstName' => 'Finance', 'lastName' => 'Meals', 'roles' => ['ROLE_FINANCE'], + 'email' => 'finance.meals@aoe.com', ], [ 'username' => 'jane.meals', @@ -65,6 +68,7 @@ public function load(ObjectManager $manager): void 'firstName' => 'Jane', 'lastName' => 'Meals', 'roles' => ['ROLE_USER'], + 'email' => 'jane.meals@aoe.com', ], [ 'username' => 'john.meals', @@ -72,6 +76,7 @@ public function load(ObjectManager $manager): void 'firstName' => 'John', 'lastName' => 'Meals', 'roles' => ['ROLE_USER'], + 'email' => 'john.meals@aoe.com', ], [ 'username' => 'kochomi.meals', @@ -79,6 +84,7 @@ public function load(ObjectManager $manager): void 'firstName' => 'Kochomi', 'lastName' => 'Meals', 'roles' => ['ROLE_KITCHEN_STAFF'], + 'email' => 'kochomi.meals@aoe.com', ], [ 'username' => 'admin.meals', @@ -86,11 +92,12 @@ public function load(ObjectManager $manager): void 'firstName' => 'Admin', 'lastName' => 'Meals', 'roles' => ['ROLE_ADMIN'], + 'email' => 'admin.meals@aoe.com', ], ]; foreach ($users as $user) { - $this->addUser($user['username'], $user['password'], $user['firstName'], $user['lastName'], $user['roles']); + $this->addUser($user['username'], $user['password'], $user['firstName'], $user['lastName'], $user['email'], $user['roles']); } for ($i = 0; $i < 15; ++$i) { @@ -114,8 +121,9 @@ protected function addUser( string $password, string $firstName, string $lastName, + string $email, array $roles, - bool $isRandUser = false + bool $isRandUser = false, ): void { $login = new Login(); $login->setUsername($username); @@ -132,6 +140,7 @@ protected function addUser( $profile->setUsername($username); $profile->setName($lastName); $profile->setFirstName($firstName); + $profile->setEmail($email); // set roles /** @var Role[] $roleObjs */ @@ -171,13 +180,15 @@ protected function createRandUser(): void $randLastName = $lastNames[array_rand($lastNames)]; $randPass = (string) rand(); $username = strtolower($randFirstName) . '.' . strtolower($randLastName) . '.' . rand(); + $email = $username . '@aoe.com'; $this->addUser( $username, $randPass, $randFirstName, $randLastName, + $email, ['ROLE_USER'], - true + true, ); } } diff --git a/src/Mealz/UserBundle/Entity/Login.php b/src/Mealz/UserBundle/Entity/Login.php index be0107b49..f570e9c51 100644 --- a/src/Mealz/UserBundle/Entity/Login.php +++ b/src/Mealz/UserBundle/Entity/Login.php @@ -19,7 +19,7 @@ class Login implements SymfonyUserInterface, MealzUserInterface, PasswordAuthent { #[ORM\Id, ORM\GeneratedValue(strategy: 'NONE'), ORM\Column(name: 'id', type: 'string', length: 255, nullable: false)] private string $username = ''; - + private string $email = ''; #[ORM\Column(type: 'string', length: 128)] protected string $password = ''; @@ -37,6 +37,16 @@ public function setUsername(string $username): void $this->username = $username; } + public function setEmail(string $username): void + { + $this->email = $username . '@aoe.com'; + } + + public function getEmail(): string + { + return $this->email; + } + public function getPassword(): string { return $this->password; diff --git a/src/Mealz/UserBundle/Provider/OAuthUserProvider.php b/src/Mealz/UserBundle/Provider/OAuthUserProvider.php index 245a8f3f8..4c40662fc 100644 --- a/src/Mealz/UserBundle/Provider/OAuthUserProvider.php +++ b/src/Mealz/UserBundle/Provider/OAuthUserProvider.php @@ -38,13 +38,11 @@ class OAuthUserProvider implements UserProviderInterface, OAuthAwareUserProvider 'aoe_employee' => self::ROLE_USER, ]; - private EntityManagerInterface $entityManager; - private RoleRepositoryInterface $roleRepo; - - public function __construct(EntityManagerInterface $entityManager, RoleRepositoryInterface $roleRepo) - { - $this->entityManager = $entityManager; - $this->roleRepo = $roleRepo; + public function __construct( + private readonly EntityManagerInterface $entityManager, + private readonly RoleRepositoryInterface $roleRepo, + private readonly string $authClientID + ) { } public function loadUserByIdentifier(string $identifier): UserInterface @@ -69,8 +67,10 @@ public function loadUserByOAuthUserResponse(UserResponseInterface $response): Us $lastName = $response->getLastName() ?? ''; $email = $response->getEmail(); - $idpUserRoles = $response->getData()['roles'] ?? []; - $role = $this->toMealsRole($idpUserRoles); + $data = $response->getData(); + $globalUserRoles = $data['roles'] ?? []; + $appUserRoles = $data['resource_access'][$this->authClientID]['roles'] ?? []; + $role = $this->toMealsRole(array_merge($globalUserRoles, $appUserRoles)); $roles = (null === $role) ? [] : [$role]; try { diff --git a/src/Mealz/UserBundle/Resources/config/services.yml b/src/Mealz/UserBundle/Resources/config/services.yml index ba9771369..628df8b8c 100644 --- a/src/Mealz/UserBundle/Resources/config/services.yml +++ b/src/Mealz/UserBundle/Resources/config/services.yml @@ -1,4 +1,2 @@ services: - mealz.oauthuserprovider: - alias: App\Mealz\UserBundle\Provider\OAuthUserProvider - + # Deprecated, do not define any services here. Use services.yaml in root level config directory instead. diff --git a/src/Mealz/UserBundle/Tests/Service/OAuthProviderTest.php b/src/Mealz/UserBundle/Tests/Service/OAuthProviderTest.php index 7d8e76c68..be4f1b7c2 100644 --- a/src/Mealz/UserBundle/Tests/Service/OAuthProviderTest.php +++ b/src/Mealz/UserBundle/Tests/Service/OAuthProviderTest.php @@ -20,6 +20,8 @@ class OAuthProviderTest extends AbstractControllerTestCase { use ProphecyTrait; + private const string AUTH_CLIENT_ID = 'meals-app'; + private OAuthUserProvider $sut; protected function setUp(): void @@ -34,7 +36,8 @@ protected function setUp(): void $this->sut = new OAuthUserProvider( $em, - self::getContainer()->get(RoleRepositoryInterface::class) + self::getContainer()->get(RoleRepositoryInterface::class), + self::AUTH_CLIENT_ID ); } @@ -136,7 +139,11 @@ private function getMockedUserResponse( 'family_name' => $lastName, 'given_name' => $firstName, 'email' => $email, - 'roles' => $roles, + 'resource_access' => [ + self::AUTH_CLIENT_ID => [ + 'roles' => $roles, + ], + ], ]; $responseProphet = $this->prophesize(UserResponseInterface::class); $responseProphet->getData()->shouldBeCalledOnce()->willReturn($userData); diff --git a/src/Resources/package-lock.json b/src/Resources/package-lock.json index 5a6797031..b8194c118 100644 --- a/src/Resources/package-lock.json +++ b/src/Resources/package-lock.json @@ -2148,9 +2148,9 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", diff --git a/src/Resources/src/api/deleteLeaveEvent.ts b/src/Resources/src/api/deleteLeaveEvent.ts index 085ac26e7..96d524f59 100644 --- a/src/Resources/src/api/deleteLeaveEvent.ts +++ b/src/Resources/src/api/deleteLeaveEvent.ts @@ -2,10 +2,10 @@ import useApi from './api'; import { type IMessage } from '@/interfaces/IMessage'; import { type EventParticipationResponse } from './postJoinEvent'; -export async function deleteLeaveEvent(date: string) { +export async function deleteLeaveEvent(date: string, eventId: number) { const { response, request, error } = useApi( 'DELETE', - `api/events/participation/${date}` + `api/events/participation/${date}/${eventId}` ); await request(); diff --git a/src/Resources/src/api/getDashboardData.ts b/src/Resources/src/api/getDashboardData.ts index 7e9f063a5..d2b2c472b 100644 --- a/src/Resources/src/api/getDashboardData.ts +++ b/src/Resources/src/api/getDashboardData.ts @@ -45,6 +45,14 @@ export type EventParticipation = { participations: number; isParticipating: boolean; isPublic: boolean; + day: Day; +}; + +export type Event = { + id: number; + title: string; + slug: string; + public: boolean; }; export type Day = { @@ -55,7 +63,8 @@ export type Day = { slots: Dictionary; slotsEnabled: boolean; isEnabled: boolean; - event: EventParticipation | null; + events: Dictionary; + dayId: number; }; export type Week = { @@ -71,7 +80,6 @@ export type Dashboard = { export async function useDashboardData() { const { response: dashboardData, request } = useApi('GET', 'api/dashboard'); - const loaded = ref(false); if (loaded.value === false) { diff --git a/src/Resources/src/api/getEventGuestLink.ts b/src/Resources/src/api/getEventGuestLink.ts index c49f1dee7..3b01e5a01 100644 --- a/src/Resources/src/api/getEventGuestLink.ts +++ b/src/Resources/src/api/getEventGuestLink.ts @@ -1,8 +1,16 @@ import useApi from './api'; +import type { EventParticipation } from './getDashboardData'; import { type Link } from './getGuestLink'; -export default async function getEventGuestLink(dayId: string) { - const { error, response: link, request } = useApi('GET', `/event/invitation/${dayId}`); +export default async function getEventGuestLink(eventParticipation?: EventParticipation) { + const { + error, + response: link, + request + } = useApi( + 'GET', + `/event/invitation/${eventParticipation?.day.dayId}/${eventParticipation?.participationId}` + ); await request(); diff --git a/src/Resources/src/api/getEventParticipants.ts b/src/Resources/src/api/getEventParticipants.ts index 60581ca1d..c04c60257 100644 --- a/src/Resources/src/api/getEventParticipants.ts +++ b/src/Resources/src/api/getEventParticipants.ts @@ -1,10 +1,12 @@ import useApi from './api'; import { type IMessage } from '@/interfaces/IMessage'; -export default async function getEventParticipants(date: string) { - const { error, response, request } = useApi('GET', `api/participations/event/${date}`); +export default async function getEventParticipants(date: string, participationId: number) { + const { error, response, request } = useApi( + 'GET', + `api/events/participation/${date}/${participationId}` + ); await request(); - return { error, response }; } diff --git a/src/Resources/src/api/getEvents.ts b/src/Resources/src/api/getEvents.ts index d67ee2b82..8e2cdec1d 100644 --- a/src/Resources/src/api/getEvents.ts +++ b/src/Resources/src/api/getEvents.ts @@ -9,6 +9,5 @@ export default async function getEvents() { const { error, request, response: events } = useApi('GET', 'api/events'); await request(); - return { error, events }; } diff --git a/src/Resources/src/api/postJoinEvent.ts b/src/Resources/src/api/postJoinEvent.ts index 523bba0e9..e1e1082ac 100644 --- a/src/Resources/src/api/postJoinEvent.ts +++ b/src/Resources/src/api/postJoinEvent.ts @@ -8,13 +8,11 @@ export interface EventParticipationResponse { isParticipating: boolean; } -export default async function postJoinEvent(date: string) { +export default async function postJoinEvent(date: string, eventId: number) { const { error, request, response } = useApi( 'POST', - `api/events/participation/${date}` + `api/events/participation/${date}/${eventId}` ); - await request(); - return { error, response }; } diff --git a/src/Resources/src/api/postJoinEventGuest.ts b/src/Resources/src/api/postJoinEventGuest.ts index 60499ceb6..1f0202c1d 100644 --- a/src/Resources/src/api/postJoinEventGuest.ts +++ b/src/Resources/src/api/postJoinEventGuest.ts @@ -6,9 +6,15 @@ export interface GuestEventData { lastName: string; company: string; } +export interface EventParticipationResponse { + eventId: number; + participationId: number; + participations: number; + isParticipating: boolean; +} export default async function postJoinEventGuest(invitationHash: string, guestData: GuestEventData) { - const { error, request, response } = useApi( + const { error, request, response } = useApi( 'POST', `/api/event/invitation/${invitationHash}`, 'application/json', diff --git a/src/Resources/src/components/costs/CostsTable.vue b/src/Resources/src/components/costs/CostsTable.vue index fdad8d422..e03c8eb21 100644 --- a/src/Resources/src/components/costs/CostsTable.vue +++ b/src/Resources/src/components/costs/CostsTable.vue @@ -68,7 +68,9 @@ const filterRegex = computed(() => { const hiddenUsers = computed(() => Object.entries(CostsState.users).filter((user) => { const value = user[1]; - return value.hidden === false || (value.hidden === true && props.showHidden === true); + return ( + (value.hidden === false && (value.costs.total > 0.01 || value.costs.total < -0.01)) || props.showHidden === true + ); }) ); diff --git a/src/Resources/src/components/dashboard/CombiButtonGroup.vue b/src/Resources/src/components/dashboard/CombiButtonGroup.vue index d1a8dd423..418c3b00e 100644 --- a/src/Resources/src/components/dashboard/CombiButtonGroup.vue +++ b/src/Resources/src/components/dashboard/CombiButtonGroup.vue @@ -64,13 +64,13 @@ interface DishInfo { } const props = defineProps<{ - weekID: number | string; - dayID: number | string; + weekID?: number | string; + dayID?: number | string; mealID: number | string; meal: Meal; }>(); -const meal = props.meal ?? dashboardStore.getMeal(props.weekID, props.dayID, props.mealID); +const meal = props.meal ?? dashboardStore.getMeal(props.weekID ?? -1, props.dayID ?? -1, props.mealID); const emit = defineEmits(['addEntry', 'removeEntry']); const selected = ref(); let dishes: DishInfo[] = []; diff --git a/src/Resources/src/components/dashboard/CombiModal.vue b/src/Resources/src/components/dashboard/CombiModal.vue index af9f1b647..1e191d67e 100644 --- a/src/Resources/src/components/dashboard/CombiModal.vue +++ b/src/Resources/src/components/dashboard/CombiModal.vue @@ -48,7 +48,6 @@ class="mt-2 grid" > meals[mealID].dishSlug !== 'combined-dish'); +const keys = computed(() => Object.keys(meals).filter((mealID) => meals[mealID].dishSlug !== 'combined-dish')); const slugs = ref([]); const bookingDisabled = computed(() => slugs.value.length < 2); diff --git a/src/Resources/src/components/dashboard/Day.vue b/src/Resources/src/components/dashboard/Day.vue index 3047d2c5c..c9269915a 100644 --- a/src/Resources/src/components/dashboard/Day.vue +++ b/src/Resources/src/components/dashboard/Day.vue @@ -7,7 +7,7 @@ :class="[day?.isLocked || !day?.isEnabled || (emptyDay && !isEventDay) ? 'bg-[#80909F]' : 'bg-primary-2']" > (); - const day = dashboardStore.getDay(props.weekID ?? -1, props.dayID ?? -1); const weekday = computed(() => { if (day !== undefined) { @@ -129,8 +128,6 @@ const weekday = computed(() => { } return 'unknown'; }); -const emptyDay = Object.keys(day?.meals ?? {}).length === 0; -const isEventDay = day?.event !== null; const date = computed(() => { if (day === null || day === undefined) { return ''; @@ -138,6 +135,8 @@ const date = computed(() => { // format date (2023-12-23) without time stamp return day.date.date.split(' ')[0]; }); +const emptyDay = Object.keys(day?.meals ?? {}).length === 0; +const isEventDay: boolean = day?.events !== undefined && Object.keys(day?.events).length > 0; const dateString = computed(() => { if (day) { return new Date(Date.parse(day.date.date)).toLocaleDateString(locale.value, { @@ -161,11 +160,3 @@ function openModal() { openParticipantsModal.value = true; } - - diff --git a/src/Resources/src/components/dashboard/EventData.vue b/src/Resources/src/components/dashboard/EventData.vue index 6c7b97179..8a23430dd 100644 --- a/src/Resources/src/components/dashboard/EventData.vue +++ b/src/Resources/src/components/dashboard/EventData.vue @@ -1,6 +1,6 @@ diff --git a/src/Resources/src/components/dashboard/GuestLink.vue b/src/Resources/src/components/dashboard/GuestLink.vue index 398da6315..0acfb0eef 100644 --- a/src/Resources/src/components/dashboard/GuestLink.vue +++ b/src/Resources/src/components/dashboard/GuestLink.vue @@ -15,10 +15,12 @@ import { useI18n } from 'vue-i18n'; import { CheckIcon } from '@heroicons/vue/solid'; import { onMounted, ref } from 'vue'; import { Invitation } from '@/enums/Invitation'; +import type { EventParticipation } from '@/api/getDashboardData'; const props = defineProps<{ dayID: string; invitation: Invitation; + eventParticipation?: EventParticipation; }>(); const { t } = useI18n(); @@ -26,7 +28,9 @@ const url = ref(''); onMounted(async () => { const { link, error } = - props.invitation === Invitation.MEAL ? await useGuestLink(props.dayID) : await getEventGuestLink(props.dayID); + props.invitation === Invitation.MEAL + ? await useGuestLink(props.dayID) + : await getEventGuestLink(props.eventParticipation); if (error.value === false && link.value !== undefined) { copyTextToClipboard(link.value.url); url.value = link.value.url; diff --git a/src/Resources/src/components/dashboard/MealCheckbox.vue b/src/Resources/src/components/dashboard/MealCheckbox.vue index b37b92273..52bebec40 100644 --- a/src/Resources/src/components/dashboard/MealCheckbox.vue +++ b/src/Resources/src/components/dashboard/MealCheckbox.vue @@ -263,5 +263,6 @@ async function closeCombiModal(slugs: string[]) { if (slugs !== undefined) { await joinMeal(slugs); } + removeLock(String(props.dayID)); } diff --git a/src/Resources/src/components/dashboard/ParticipantsListModal.vue b/src/Resources/src/components/dashboard/ParticipantsListModal.vue index 3e3f4e1cb..478aca1df 100644 --- a/src/Resources/src/components/dashboard/ParticipantsListModal.vue +++ b/src/Resources/src/components/dashboard/ParticipantsListModal.vue @@ -6,7 +6,7 @@ >
(), { eventTitle: '' @@ -77,7 +78,7 @@ const isLoading = ref(false); watch(showParticipations, async () => { if (showParticipations.value === true) { isLoading.value = true; - participations.value = ((await getParticipantsForEvent(props.date)) as string[]).sort(); + participations.value = ((await getParticipantsForEvent(props.date, props.participationId)) as string[]).sort(); isLoading.value = false; } }); diff --git a/src/Resources/src/components/guest/GuestCheckbox.vue b/src/Resources/src/components/guest/GuestCheckbox.vue index dd527b9a0..cc6396dc6 100644 --- a/src/Resources/src/components/guest/GuestCheckbox.vue +++ b/src/Resources/src/components/guest/GuestCheckbox.vue @@ -1,14 +1,12 @@