diff --git a/composer.json b/composer.json index e5c7f1c8..99538931 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,7 @@ "azuyalabs/yasumi": "^2.6", "composer/semver": "^3.3", "doctrine/doctrine-bundle": "^2.7", - "doctrine/doctrine-migrations-bundle": "3.3.1", + "doctrine/doctrine-migrations-bundle": "^3.3", "doctrine/orm": "^2.8", "endroid/qr-code": "^4.8", "erusev/parsedown": "^1.6", diff --git a/composer.lock b/composer.lock index 90f574bb..78cbc916 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": "347f163b20c45dcf0014dbf1fb339f4d", + "content-hash": "41bb07bb455c3336e8da2e906c33d08f", "packages": [ { "name": "azuyalabs/yasumi", @@ -182,6 +182,85 @@ }, "time": "2022-03-30T09:27:43+00:00" }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "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.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, { "name": "composer/semver", "version": "3.4.3", @@ -861,22 +940,22 @@ }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.3.1", + "version": "3.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0" + "reference": "e858ce0f5c12b266dce7dce24834448355155da7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", - "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/e858ce0f5c12b266dce7dce24834448355155da7", + "reference": "e858ce0f5c12b266dce7dce24834448355155da7", "shasum": "" }, "require": { "doctrine/doctrine-bundle": "^2.4", "doctrine/migrations": "^3.2", - "php": "^7.2|^8.0", + "php": "^7.2 || ^8.0", "symfony/deprecation-contracts": "^2.1 || ^3", "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" }, @@ -884,27 +963,21 @@ "composer/semver": "^3.0", "doctrine/coding-standard": "^12", "doctrine/orm": "^2.6 || ^3", - "doctrine/persistence": "^2.0 || ^3 ", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "phpstan/phpstan-symfony": "^1.3", - "phpunit/phpunit": "^8.5|^9.5", - "psalm/plugin-phpunit": "^0.18.4", - "psalm/plugin-symfony": "^3 || ^5", + "doctrine/persistence": "^2.0 || ^3", + "phpstan/phpstan": "^1.4 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpstan/phpstan-symfony": "^1.3 || ^2", + "phpunit/phpunit": "^8.5 || ^9.5", "symfony/phpunit-bridge": "^6.3 || ^7", - "symfony/var-exporter": "^5.4 || ^6 || ^7", - "vimeo/psalm": "^4.30 || ^5.15" + "symfony/var-exporter": "^5.4 || ^6 || ^7" }, "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\MigrationsBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\Bundle\\MigrationsBundle\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -933,7 +1006,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.1" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.1" }, "funding": [ { @@ -949,7 +1022,7 @@ "type": "tidelift" } ], - "time": "2024-05-14T20:32:18+00:00" + "time": "2025-01-27T22:48:22+00:00" }, { "name": "doctrine/event-manager", @@ -1385,16 +1458,16 @@ }, { "name": "doctrine/orm", - "version": "2.20.1", + "version": "2.20.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "e3cabade99ebccc6ba078884c1c5f250866a494e" + "reference": "19912de9270fa6abb3d25a1a37784af6b818d534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/e3cabade99ebccc6ba078884c1c5f250866a494e", - "reference": "e3cabade99ebccc6ba078884c1c5f250866a494e", + "url": "https://api.github.com/repos/doctrine/orm/zipball/19912de9270fa6abb3d25a1a37784af6b818d534", + "reference": "19912de9270fa6abb3d25a1a37784af6b818d534", "shasum": "" }, "require": { @@ -1481,9 +1554,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.20.1" + "source": "https://github.com/doctrine/orm/tree/2.20.2" }, - "time": "2024-12-19T06:48:36+00:00" + "time": "2025-02-04T19:17:01+00:00" }, { "name": "doctrine/persistence", @@ -1583,16 +1656,16 @@ }, { "name": "doctrine/sql-formatter", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "b784cbde727cf806721451dde40eff4fec3bbe86" + "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/b784cbde727cf806721451dde40eff4fec3bbe86", - "reference": "b784cbde727cf806721451dde40eff4fec3bbe86", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8", + "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8", "shasum": "" }, "require": { @@ -1602,8 +1675,7 @@ "doctrine/coding-standard": "^12", "ergebnis/phpunit-slow-test-detector": "^2.14", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.24" + "phpunit/phpunit": "^10.5" }, "bin": [ "bin/sql-formatter" @@ -1633,9 +1705,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.1" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2" }, - "time": "2024-10-21T18:21:57+00:00" + "time": "2025-01-24T11:45:48+00:00" }, { "name": "egulias/email-validator", @@ -1937,25 +2009,24 @@ }, { "name": "gedmo/doctrine-extensions", - "version": "v3.17.1", + "version": "v3.18.0", "source": { "type": "git", "url": "https://github.com/doctrine-extensions/DoctrineExtensions.git", - "reference": "eabb45018c5a4362b46c5beae3881261da89f900" + "reference": "964db6c4fb5b0fc8aa25cc31b17471b4963460c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/eabb45018c5a4362b46c5beae3881261da89f900", - "reference": "eabb45018c5a4362b46c5beae3881261da89f900", + "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/964db6c4fb5b0fc8aa25cc31b17471b4963460c6", + "reference": "964db6c4fb5b0fc8aa25cc31b17471b4963460c6", "shasum": "" }, "require": { "behat/transliterator": "^1.2", "doctrine/collections": "^1.2 || ^2.0", - "doctrine/common": "^2.13 || ^3.0", "doctrine/deprecations": "^1.0", "doctrine/event-manager": "^1.2 || ^2.0", - "doctrine/persistence": "^2.2 || ^3.0", + "doctrine/persistence": "^2.2 || ^3.0 || ^4.0", "php": "^7.4 || ^8.0", "psr/cache": "^1 || ^2 || ^3", "psr/clock": "^1", @@ -1963,6 +2034,7 @@ }, "conflict": { "doctrine/annotations": "<1.13 || >=3.0", + "doctrine/common": "<2.13 || >=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 || >=4.0" @@ -1970,17 +2042,18 @@ "require-dev": { "doctrine/annotations": "^1.13 || ^2.0", "doctrine/cache": "^1.11 || ^2.0", + "doctrine/common": "^2.13 || ^3.0", "doctrine/dbal": "^3.7 || ^4.0", "doctrine/doctrine-bundle": "^2.3", "doctrine/mongodb-odm": "^2.3", "doctrine/orm": "^2.14.0 || ^3.0", "friendsofphp/php-cs-fixer": "^3.14.0", "nesbot/carbon": "^2.71 || ^3.0", - "phpstan/phpstan": "^1.11", - "phpstan/phpstan-doctrine": "^1.4", - "phpstan/phpstan-phpunit": "^1.4", + "phpstan/phpstan": "^2.1.1", + "phpstan/phpstan-doctrine": "^2.0.1", + "phpstan/phpstan-phpunit": "^2.0.3", "phpunit/phpunit": "^9.6", - "rector/rector": "^1.1", + "rector/rector": "^2.0.6", "symfony/console": "^5.4 || ^6.0 || ^7.0", "symfony/doctrine-bridge": "^5.4 || ^6.0 || ^7.0", "symfony/phpunit-bridge": "^6.0 || ^7.0", @@ -2042,7 +2115,7 @@ "support": { "email": "gediminas.morkevicius@gmail.com", "issues": "https://github.com/doctrine-extensions/DoctrineExtensions/issues", - "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.17.1", + "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.18.0", "wiki": "https://github.com/Atlantic18/DoctrineExtensions/tree/main/doc" }, "funding": [ @@ -2063,7 +2136,7 @@ "type": "github" } ], - "time": "2024-10-07T22:30:27+00:00" + "time": "2025-02-01T22:28:13+00:00" }, { "name": "jms/metadata", @@ -3053,16 +3126,16 @@ }, { "name": "nelmio/api-doc-bundle", - "version": "v4.34.1", + "version": "v4.36.1", "source": { "type": "git", "url": "https://github.com/nelmio/NelmioApiDocBundle.git", - "reference": "a2497e108281f28f2d79a9ddc2d1795e6c2777e9" + "reference": "cdc855ef8e6a811336c3a6c72fe99fbe13a78e37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/a2497e108281f28f2d79a9ddc2d1795e6c2777e9", - "reference": "a2497e108281f28f2d79a9ddc2d1795e6c2777e9", + "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/cdc855ef8e6a811336c3a6c72fe99fbe13a78e37", + "reference": "cdc855ef8e6a811336c3a6c72fe99fbe13a78e37", "shasum": "" }, "require": { @@ -3163,7 +3236,7 @@ ], "support": { "issues": "https://github.com/nelmio/NelmioApiDocBundle/issues", - "source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.34.1" + "source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.36.1" }, "funding": [ { @@ -3171,7 +3244,7 @@ "type": "github" } ], - "time": "2025-01-17T12:19:57+00:00" + "time": "2025-01-19T17:01:30+00:00" }, { "name": "nelmio/cors-bundle", @@ -3899,19 +3972,20 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "2.3.6", + "version": "2.3.8", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "098b848ee6688cb9a252d9ce97889defc517ee88" + "reference": "7a700683743bf1c4a21837c84b266916f1aa7d25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/098b848ee6688cb9a252d9ce97889defc517ee88", - "reference": "098b848ee6688cb9a252d9ce97889defc517ee88", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/7a700683743bf1c4a21837c84b266916f1aa7d25", + "reference": "7a700683743bf1c4a21837c84b266916f1aa7d25", "shasum": "" }, "require": { + "composer/pcre": "^1 || ^2 || ^3", "ext-ctype": "*", "ext-dom": "*", "ext-fileinfo": "*", @@ -3997,9 +4071,9 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/2.3.6" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/2.3.8" }, - "time": "2025-01-12T03:22:26+00:00" + "time": "2025-02-08T03:01:45+00:00" }, { "name": "phpoffice/phpword", @@ -4830,31 +4904,31 @@ }, { "name": "setasign/fpdi", - "version": "v2.6.2", + "version": "v2.6.3", "source": { "type": "git", "url": "https://github.com/Setasign/FPDI.git", - "reference": "9e013b376939c0d4029f54150d2a16f3c67a5797" + "reference": "67c31f5e50c93c20579ca9e23035d8c540b51941" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDI/zipball/9e013b376939c0d4029f54150d2a16f3c67a5797", - "reference": "9e013b376939c0d4029f54150d2a16f3c67a5797", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/67c31f5e50c93c20579ca9e23035d8c540b51941", + "reference": "67c31f5e50c93c20579ca9e23035d8c540b51941", "shasum": "" }, "require": { "ext-zlib": "*", - "php": "^5.6 || ^7.0 || ^8.0" + "php": "^7.1 || ^8.0" }, "conflict": { "setasign/tfpdf": "<1.31" }, "require-dev": { - "phpunit/phpunit": "~5.7", + "phpunit/phpunit": "^7", "setasign/fpdf": "~1.8.6", "setasign/tfpdf": "~1.33", "squizlabs/php_codesniffer": "^3.5", - "tecnickcom/tcpdf": "~6.2" + "tecnickcom/tcpdf": "^6.2" }, "suggest": { "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." @@ -4890,7 +4964,7 @@ ], "support": { "issues": "https://github.com/Setasign/FPDI/issues", - "source": "https://github.com/Setasign/FPDI/tree/v2.6.2" + "source": "https://github.com/Setasign/FPDI/tree/v2.6.3" }, "funding": [ { @@ -4898,7 +4972,7 @@ "type": "tidelift" } ], - "time": "2024-12-10T13:12:19+00:00" + "time": "2025-02-05T13:22:35+00:00" }, { "name": "spomky-labs/otphp", @@ -5053,16 +5127,16 @@ }, { "name": "symfony/cache", - "version": "v6.4.16", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "70d60e9a3603108563010f8592dff15a6f15dfae" + "reference": "b209751ed25f735ea90ca4c9c969d9413a17dfee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/70d60e9a3603108563010f8592dff15a6f15dfae", - "reference": "70d60e9a3603108563010f8592dff15a6f15dfae", + "url": "https://api.github.com/repos/symfony/cache/zipball/b209751ed25f735ea90ca4c9c969d9413a17dfee", + "reference": "b209751ed25f735ea90ca4c9c969d9413a17dfee", "shasum": "" }, "require": { @@ -5129,7 +5203,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.16" + "source": "https://github.com/symfony/cache/tree/v6.4.18" }, "funding": [ { @@ -5145,7 +5219,7 @@ "type": "tidelift" } ], - "time": "2024-11-20T10:10:54+00:00" + "time": "2025-01-22T14:13:52+00:00" }, { "name": "symfony/cache-contracts", @@ -5681,21 +5755,21 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "2ba7e747a944b69f9f583c35173560afebbff995" + "reference": "fd0094d4648bf6bbdafcd1f0c8aafb6e93d735e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/2ba7e747a944b69f9f583c35173560afebbff995", - "reference": "2ba7e747a944b69f9f583c35173560afebbff995", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/fd0094d4648bf6bbdafcd1f0c8aafb6e93d735e6", + "reference": "fd0094d4648bf6bbdafcd1f0c8aafb6e93d735e6", "shasum": "" }, "require": { "doctrine/event-manager": "^1.2|^2", - "doctrine/persistence": "^3.1", + "doctrine/persistence": "^2.5|^3.1|^4", "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", @@ -5769,7 +5843,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.17" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.18" }, "funding": [ { @@ -5785,7 +5859,7 @@ "type": "tidelift" } ], - "time": "2024-12-18T10:42:42+00:00" + "time": "2025-01-25T08:04:58+00:00" }, { "name": "symfony/dotenv", @@ -5863,16 +5937,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "37ad2380e8c1a8cf62a1200a5c10080b679b446c" + "reference": "e8d3b5b1975e67812a54388b1ba8e9ec28eb770e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/37ad2380e8c1a8cf62a1200a5c10080b679b446c", - "reference": "37ad2380e8c1a8cf62a1200a5c10080b679b446c", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e8d3b5b1975e67812a54388b1ba8e9ec28eb770e", + "reference": "e8d3b5b1975e67812a54388b1ba8e9ec28eb770e", "shasum": "" }, "require": { @@ -5918,7 +5992,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.17" + "source": "https://github.com/symfony/error-handler/tree/v6.4.18" }, "funding": [ { @@ -5934,7 +6008,7 @@ "type": "tidelift" } ], - "time": "2024-12-06T13:30:51+00:00" + "time": "2025-01-06T09:38:16+00:00" }, { "name": "symfony/event-dispatcher", @@ -6453,16 +6527,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "17d8ae2e7aa77154f942e8ac48849ac718b0963f" + "reference": "91df8ee37543ebc01756c9e5eaf94d1878ff1ccd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/17d8ae2e7aa77154f942e8ac48849ac718b0963f", - "reference": "17d8ae2e7aa77154f942e8ac48849ac718b0963f", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/91df8ee37543ebc01756c9e5eaf94d1878ff1ccd", + "reference": "91df8ee37543ebc01756c9e5eaf94d1878ff1ccd", "shasum": "" }, "require": { @@ -6582,7 +6656,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.17" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.18" }, "funding": [ { @@ -6598,20 +6672,20 @@ "type": "tidelift" } ], - "time": "2024-12-19T14:08:41+00:00" + "time": "2025-01-28T18:47:02+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "88898d842eb29d7e1a903724c94e90a6ca9c0509" + "reference": "394b440934056b8d9d6ba250001458e9d7998b7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/88898d842eb29d7e1a903724c94e90a6ca9c0509", - "reference": "88898d842eb29d7e1a903724c94e90a6ca9c0509", + "url": "https://api.github.com/repos/symfony/http-client/zipball/394b440934056b8d9d6ba250001458e9d7998b7f", + "reference": "394b440934056b8d9d6ba250001458e9d7998b7f", "shasum": "" }, "require": { @@ -6675,7 +6749,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.17" + "source": "https://github.com/symfony/http-client/tree/v6.4.18" }, "funding": [ { @@ -6691,7 +6765,7 @@ "type": "tidelift" } ], - "time": "2024-12-18T12:18:31+00:00" + "time": "2025-01-28T15:49:13+00:00" }, { "name": "symfony/http-client-contracts", @@ -6773,16 +6847,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.16", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57" + "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/431771b7a6f662f1575b3cfc8fd7617aa9864d57", - "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0492d6217e5ab48f51fca76f64cf8e78919d0db", + "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db", "shasum": "" }, "require": { @@ -6830,7 +6904,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.16" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.18" }, "funding": [ { @@ -6846,20 +6920,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T18:58:10+00:00" + "time": "2025-01-09T15:48:56+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "c5647393c5ce11833d13e4b70fff4b571d4ac710" + "reference": "fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c5647393c5ce11833d13e4b70fff4b571d4ac710", - "reference": "c5647393c5ce11833d13e4b70fff4b571d4ac710", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7", + "reference": "fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7", "shasum": "" }, "require": { @@ -6944,7 +7018,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.17" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.18" }, "funding": [ { @@ -6960,7 +7034,7 @@ "type": "tidelift" } ], - "time": "2024-12-31T14:49:31+00:00" + "time": "2025-01-29T07:25:58+00:00" }, { "name": "symfony/intl", @@ -7047,16 +7121,16 @@ }, { "name": "symfony/mailer", - "version": "v6.4.13", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663" + "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", - "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", + "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", "shasum": "" }, "require": { @@ -7107,7 +7181,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.13" + "source": "https://github.com/symfony/mailer/tree/v6.4.18" }, "funding": [ { @@ -7123,20 +7197,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2025-01-24T15:27:15+00:00" }, { "name": "symfony/mime", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232" + "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232", - "reference": "ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232", + "url": "https://api.github.com/repos/symfony/mime/zipball/917d77981eb1ea963608d5cda4d9c0cf72eaa68e", + "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e", "shasum": "" }, "require": { @@ -7192,7 +7266,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.17" + "source": "https://github.com/symfony/mime/tree/v6.4.18" }, "funding": [ { @@ -7208,7 +7282,7 @@ "type": "tidelift" } ], - "time": "2024-12-02T11:09:41+00:00" + "time": "2025-01-23T13:10:52+00:00" }, { "name": "symfony/monolog-bridge", @@ -7648,16 +7722,16 @@ }, { "name": "symfony/property-access", - "version": "v6.4.13", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "8cc779d88d12e440adaa26387bcfc25744064afe" + "reference": "80e0378f2f058b60d87dedc3c760caec882e992c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/8cc779d88d12e440adaa26387bcfc25744064afe", - "reference": "8cc779d88d12e440adaa26387bcfc25744064afe", + "url": "https://api.github.com/repos/symfony/property-access/zipball/80e0378f2f058b60d87dedc3c760caec882e992c", + "reference": "80e0378f2f058b60d87dedc3c760caec882e992c", "shasum": "" }, "require": { @@ -7705,7 +7779,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.4.13" + "source": "https://github.com/symfony/property-access/tree/v6.4.18" }, "funding": [ { @@ -7721,20 +7795,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2024-12-16T14:42:05+00:00" }, { "name": "symfony/property-info", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "38b125d78e67668159f75383a293ec0c5d3f2963" + "reference": "94d18e5cc11a37fd92856d38b61d9cdf72536a1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/38b125d78e67668159f75383a293ec0c5d3f2963", - "reference": "38b125d78e67668159f75383a293ec0c5d3f2963", + "url": "https://api.github.com/repos/symfony/property-info/zipball/94d18e5cc11a37fd92856d38b61d9cdf72536a1e", + "reference": "94d18e5cc11a37fd92856d38b61d9cdf72536a1e", "shasum": "" }, "require": { @@ -7745,7 +7819,9 @@ "doctrine/annotations": "<1.12", "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/dependency-injection": "<5.4|>=6.0,<6.4" + "symfony/cache": "<5.4", + "symfony/dependency-injection": "<5.4|>=6.0,<6.4", + "symfony/serializer": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12|^2", @@ -7789,7 +7865,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.17" + "source": "https://github.com/symfony/property-info/tree/v6.4.18" }, "funding": [ { @@ -7805,7 +7881,7 @@ "type": "tidelift" } ], - "time": "2024-12-26T19:01:29+00:00" + "time": "2025-01-21T10:52:27+00:00" }, { "name": "symfony/rate-limiter", @@ -7880,16 +7956,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.16", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220" + "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/91e02e606b4b705c2f4fb42f7e7708b7923a3220", - "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220", + "url": "https://api.github.com/repos/symfony/routing/zipball/e9bfc94953019089acdfb9be51c1b9142c4afa68", + "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68", "shasum": "" }, "require": { @@ -7943,7 +8019,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.16" + "source": "https://github.com/symfony/routing/tree/v6.4.18" }, "funding": [ { @@ -7959,7 +8035,7 @@ "type": "tidelift" } ], - "time": "2024-11-13T15:31:34+00:00" + "time": "2025-01-09T08:51:02+00:00" }, { "name": "symfony/runtime", @@ -8154,16 +8230,16 @@ }, { "name": "symfony/security-core", - "version": "v6.4.16", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "19cdb7de86e556202ab16e0cffd1a97348231bc0" + "reference": "0ae7ae716968e00287ab9b7768405e0dc9cad109" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/19cdb7de86e556202ab16e0cffd1a97348231bc0", - "reference": "19cdb7de86e556202ab16e0cffd1a97348231bc0", + "url": "https://api.github.com/repos/symfony/security-core/zipball/0ae7ae716968e00287ab9b7768405e0dc9cad109", + "reference": "0ae7ae716968e00287ab9b7768405e0dc9cad109", "shasum": "" }, "require": { @@ -8220,7 +8296,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.4.16" + "source": "https://github.com/symfony/security-core/tree/v6.4.18" }, "funding": [ { @@ -8236,7 +8312,7 @@ "type": "tidelift" } ], - "time": "2024-11-27T09:48:51+00:00" + "time": "2025-01-22T20:59:03+00:00" }, { "name": "symfony/security-csrf", @@ -8308,16 +8384,16 @@ }, { "name": "symfony/security-http", - "version": "v6.4.15", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "ded1e078f952e686b058d9eac98e497bea47b308" + "reference": "54f2ccce1f3822eee3fb3a85debd9a67d12762b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/ded1e078f952e686b058d9eac98e497bea47b308", - "reference": "ded1e078f952e686b058d9eac98e497bea47b308", + "url": "https://api.github.com/repos/symfony/security-http/zipball/54f2ccce1f3822eee3fb3a85debd9a67d12762b8", + "reference": "54f2ccce1f3822eee3fb3a85debd9a67d12762b8", "shasum": "" }, "require": { @@ -8376,7 +8452,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.4.15" + "source": "https://github.com/symfony/security-http/tree/v6.4.18" }, "funding": [ { @@ -8392,20 +8468,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:40:18+00:00" + "time": "2025-01-28T14:53:52+00:00" }, { "name": "symfony/serializer", - "version": "v6.4.15", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "9d862d66198f3c2e30404228629ef4c18d5d608e" + "reference": "6ad986f62276da4c8c69754decfaa445a89cb6e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/9d862d66198f3c2e30404228629ef4c18d5d608e", - "reference": "9d862d66198f3c2e30404228629ef4c18d5d608e", + "url": "https://api.github.com/repos/symfony/serializer/zipball/6ad986f62276da4c8c69754decfaa445a89cb6e3", + "reference": "6ad986f62276da4c8c69754decfaa445a89cb6e3", "shasum": "" }, "require": { @@ -8474,7 +8550,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v6.4.15" + "source": "https://github.com/symfony/serializer/tree/v6.4.18" }, "funding": [ { @@ -8490,7 +8566,7 @@ "type": "tidelift" } ], - "time": "2024-10-23T13:25:59+00:00" + "time": "2025-01-28T18:47:02+00:00" }, { "name": "symfony/service-contracts", @@ -9091,16 +9167,16 @@ }, { "name": "symfony/validator", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "a3c19a0e542d427c207e22242043ef35b5b99a2c" + "reference": "ce20367d07b2592202e9c266b16a93fa50145207" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/a3c19a0e542d427c207e22242043ef35b5b99a2c", - "reference": "a3c19a0e542d427c207e22242043ef35b5b99a2c", + "url": "https://api.github.com/repos/symfony/validator/zipball/ce20367d07b2592202e9c266b16a93fa50145207", + "reference": "ce20367d07b2592202e9c266b16a93fa50145207", "shasum": "" }, "require": { @@ -9168,7 +9244,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.17" + "source": "https://github.com/symfony/validator/tree/v6.4.18" }, "funding": [ { @@ -9184,20 +9260,20 @@ "type": "tidelift" } ], - "time": "2024-12-29T12:50:19+00:00" + "time": "2025-01-27T16:05:44+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.15", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80" + "reference": "4ad10cf8b020e77ba665305bb7804389884b4837" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80", - "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/4ad10cf8b020e77ba665305bb7804389884b4837", + "reference": "4ad10cf8b020e77ba665305bb7804389884b4837", "shasum": "" }, "require": { @@ -9253,7 +9329,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.15" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.18" }, "funding": [ { @@ -9269,7 +9345,7 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:28:48+00:00" + "time": "2025-01-17T11:26:11+00:00" }, { "name": "symfony/var-exporter", @@ -9422,16 +9498,16 @@ }, { "name": "symfony/yaml", - "version": "v6.4.13", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9" + "reference": "bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e99b4e94d124b29ee4cf3140e1b537d2dad8cec9", - "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9", + "url": "https://api.github.com/repos/symfony/yaml/zipball/bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5", + "reference": "bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5", "shasum": "" }, "require": { @@ -9474,7 +9550,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.13" + "source": "https://github.com/symfony/yaml/tree/v6.4.18" }, "funding": [ { @@ -9490,7 +9566,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2025-01-07T09:44:41+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9549,7 +9625,7 @@ }, { "name": "twig/cssinliner-extra", - "version": "v3.18.0", + "version": "v3.19.0", "source": { "type": "git", "url": "https://github.com/twigphp/cssinliner-extra.git", @@ -9602,7 +9678,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.18.0" + "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.19.0" }, "funding": [ { @@ -9618,7 +9694,7 @@ }, { "name": "twig/extra-bundle", - "version": "v3.18.0", + "version": "v3.19.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", @@ -9676,7 +9752,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.18.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.19.0" }, "funding": [ { @@ -9692,7 +9768,7 @@ }, { "name": "twig/inky-extra", - "version": "v3.18.0", + "version": "v3.19.0", "source": { "type": "git", "url": "https://github.com/twigphp/inky-extra.git", @@ -9746,7 +9822,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/inky-extra/tree/v3.18.0" + "source": "https://github.com/twigphp/inky-extra/tree/v3.19.0" }, "funding": [ { @@ -9762,16 +9838,16 @@ }, { "name": "twig/intl-extra", - "version": "v3.18.0", + "version": "v3.19.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "4eeab2a3f8d04d1838be7251ab2d183f817aea7b" + "reference": "79a1bea7254783b540d51de10dc5e9f310110794" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/4eeab2a3f8d04d1838be7251ab2d183f817aea7b", - "reference": "4eeab2a3f8d04d1838be7251ab2d183f817aea7b", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/79a1bea7254783b540d51de10dc5e9f310110794", + "reference": "79a1bea7254783b540d51de10dc5e9f310110794", "shasum": "" }, "require": { @@ -9810,7 +9886,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.18.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.19.0" }, "funding": [ { @@ -9822,11 +9898,11 @@ "type": "tidelift" } ], - "time": "2024-11-20T13:19:52+00:00" + "time": "2025-01-24T20:20:33+00:00" }, { "name": "twig/string-extra", - "version": "v3.18.0", + "version": "v3.19.0", "source": { "type": "git", "url": "https://github.com/twigphp/string-extra.git", @@ -9877,7 +9953,7 @@ "unicode" ], "support": { - "source": "https://github.com/twigphp/string-extra/tree/v3.18.0" + "source": "https://github.com/twigphp/string-extra/tree/v3.19.0" }, "funding": [ { @@ -9893,16 +9969,16 @@ }, { "name": "twig/twig", - "version": "v3.18.0", + "version": "v3.19.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50" + "reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50", - "reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/d4f8c2b86374f08efc859323dbcd95c590f7124e", + "reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e", "shasum": "" }, "require": { @@ -9957,7 +10033,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.18.0" + "source": "https://github.com/twigphp/Twig/tree/v3.19.0" }, "funding": [ { @@ -9969,7 +10045,7 @@ "type": "tidelift" } ], - "time": "2024-12-29T10:51:50+00:00" + "time": "2025-01-29T07:06:14+00:00" }, { "name": "webmozart/assert", @@ -10280,85 +10356,6 @@ ], "time": "2022-12-23T10:58:28+00:00" }, - { - "name": "composer/pcre", - "version": "3.3.2", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" - }, - "dist": { - "type": "zip", - "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.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" - }, - "type": "library", - "extra": { - "phpstan": { - "includes": [ - "extension.neon" - ] - }, - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-11-12T16:29:46+00:00" - }, { "name": "composer/xdebug-handler", "version": "3.0.5", @@ -10427,16 +10424,16 @@ }, { "name": "dama/doctrine-test-bundle", - "version": "v8.2.0", + "version": "v8.2.2", "source": { "type": "git", "url": "https://github.com/dmaicher/doctrine-test-bundle.git", - "reference": "1f81a280ea63f049d24e9c8ce00e557b18e0ff2f" + "reference": "eefe54fdf00d910f808efea9cfce9cc261064a0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/1f81a280ea63f049d24e9c8ce00e557b18e0ff2f", - "reference": "1f81a280ea63f049d24e9c8ce00e557b18e0ff2f", + "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/eefe54fdf00d910f808efea9cfce9cc261064a0a", + "reference": "eefe54fdf00d910f808efea9cfce9cc261064a0a", "shasum": "" }, "require": { @@ -10450,9 +10447,9 @@ "require-dev": { "behat/behat": "^3.0", "friendsofphp/php-cs-fixer": "^3.27", - "phpstan/phpstan": "^1.2", + "phpstan/phpstan": "^2.0", "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0 || ^11.0", - "symfony/phpunit-bridge": "^6.3", + "symfony/phpunit-bridge": "^7.2", "symfony/process": "^5.4 || ^6.3 || ^7.0", "symfony/yaml": "^5.4 || ^6.3 || ^7.0" }, @@ -10488,26 +10485,26 @@ ], "support": { "issues": "https://github.com/dmaicher/doctrine-test-bundle/issues", - "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v8.2.0" + "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v8.2.2" }, - "time": "2024-05-28T15:41:06+00:00" + "time": "2025-02-04T14:37:36+00:00" }, { "name": "doctrine/data-fixtures", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "2ae45139f148c9272c49a521d82cc50491355a99" + "reference": "f7f1e12d6bceb58c204b3e77210a103c1c57601e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/2ae45139f148c9272c49a521d82cc50491355a99", - "reference": "2ae45139f148c9272c49a521d82cc50491355a99", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f7f1e12d6bceb58c204b3e77210a103c1c57601e", + "reference": "f7f1e12d6bceb58c204b3e77210a103c1c57601e", "shasum": "" }, "require": { - "doctrine/persistence": "^3.1", + "doctrine/persistence": "^3.1 || ^4.0", "php": "^8.1", "psr/log": "^1.1 || ^2 || ^3" }, @@ -10557,7 +10554,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/2.0.1" + "source": "https://github.com/doctrine/data-fixtures/tree/2.0.2" }, "funding": [ { @@ -10573,7 +10570,7 @@ "type": "tidelift" } ], - "time": "2024-12-10T07:03:23+00:00" + "time": "2025-01-21T13:21:31+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -10835,16 +10832,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.68.1", + "version": "v3.68.5", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "b9db2b2ea3cdba7201067acee46f984ef2397cff" + "reference": "7bedb718b633355272428c60736dc97fb96daf27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/b9db2b2ea3cdba7201067acee46f984ef2397cff", - "reference": "b9db2b2ea3cdba7201067acee46f984ef2397cff", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7bedb718b633355272428c60736dc97fb96daf27", + "reference": "7bedb718b633355272428c60736dc97fb96daf27", "shasum": "" }, "require": { @@ -10926,7 +10923,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.68.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.68.5" }, "funding": [ { @@ -10934,7 +10931,7 @@ "type": "github" } ], - "time": "2025-01-17T09:20:36+00:00" + "time": "2025-01-30T17:00:50+00:00" }, { "name": "masterminds/html5", @@ -11123,16 +11120,16 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.1", + "version": "2.1.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "cd6e973e04b4c2b94c86e8612b5a65f0da0e08e7" + "reference": "64ae44e48214f3deebdaeebf2694297a10a2bea9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/cd6e973e04b4c2b94c86e8612b5a65f0da0e08e7", - "reference": "cd6e973e04b4c2b94c86e8612b5a65f0da0e08e7", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/64ae44e48214f3deebdaeebf2694297a10a2bea9", + "reference": "64ae44e48214f3deebdaeebf2694297a10a2bea9", "shasum": "" }, "require": { @@ -11177,7 +11174,7 @@ "type": "github" } ], - "time": "2025-01-05T16:43:48+00:00" + "time": "2025-02-07T15:05:24+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -11299,16 +11296,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "e32ac656788a5bf3dedda89e6a2cad5643bf1a18" + "reference": "d09e152f403c843998d7a52b5d87040c937525dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/e32ac656788a5bf3dedda89e6a2cad5643bf1a18", - "reference": "e32ac656788a5bf3dedda89e6a2cad5643bf1a18", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d09e152f403c843998d7a52b5d87040c937525dd", + "reference": "d09e152f403c843998d7a52b5d87040c937525dd", "shasum": "" }, "require": { @@ -11344,22 +11341,22 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.3" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.4" }, - "time": "2024-12-19T09:14:43+00:00" + "time": "2025-01-22T13:07:38+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "2.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "ed6fea0ad4ad9c7e25f3ad2e7c4d420cf1e67fe3" + "reference": "8b88b5f818bfa301e0c99154ab622dace071c3ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/ed6fea0ad4ad9c7e25f3ad2e7c4d420cf1e67fe3", - "reference": "ed6fea0ad4ad9c7e25f3ad2e7c4d420cf1e67fe3", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/8b88b5f818bfa301e0c99154ab622dace071c3ba", + "reference": "8b88b5f818bfa301e0c99154ab622dace071c3ba", "shasum": "" }, "require": { @@ -11392,28 +11389,28 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.1" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.3" }, - "time": "2024-12-12T20:21:10+00:00" + "time": "2025-01-21T10:52:14+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "c08cd8e54a08d651bc402d304cfa161c3c3766c4" + "reference": "65f02c7e585f3c7372e42e14d3d87da034031553" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/c08cd8e54a08d651bc402d304cfa161c3c3766c4", - "reference": "c08cd8e54a08d651bc402d304cfa161c3c3766c4", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/65f02c7e585f3c7372e42e14d3d87da034031553", + "reference": "65f02c7e585f3c7372e42e14d3d87da034031553", "shasum": "" }, "require": { "ext-simplexml": "*", "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0" + "phpstan/phpstan": "^2.1.2" }, "conflict": { "symfony/framework-bundle": "<3.0" @@ -11463,9 +11460,9 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.1" + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.2" }, - "time": "2025-01-04T13:58:15+00:00" + "time": "2025-01-21T18:57:07+00:00" }, { "name": "phpunit/php-code-coverage", @@ -11790,16 +11787,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.41", + "version": "10.5.45", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e76586fa3d49714f230221734b44892e384109d7" + "reference": "bd68a781d8e30348bc297449f5234b3458267ae8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e76586fa3d49714f230221734b44892e384109d7", - "reference": "e76586fa3d49714f230221734b44892e384109d7", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bd68a781d8e30348bc297449f5234b3458267ae8", + "reference": "bd68a781d8e30348bc297449f5234b3458267ae8", "shasum": "" }, "require": { @@ -11871,7 +11868,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.41" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.45" }, "funding": [ { @@ -11887,7 +11884,7 @@ "type": "tidelift" } ], - "time": "2025-01-13T09:33:05+00:00" + "time": "2025-02-06T16:08:12+00:00" }, { "name": "react/cache", @@ -13475,16 +13472,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v6.4.16", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "4304e6ad5c894a9c72831ad459f627bfd35d766d" + "reference": "fd07959d3e8992795029bdab3605c2e8e895034e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4304e6ad5c894a9c72831ad459f627bfd35d766d", - "reference": "4304e6ad5c894a9c72831ad459f627bfd35d766d", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/fd07959d3e8992795029bdab3605c2e8e895034e", + "reference": "fd07959d3e8992795029bdab3605c2e8e895034e", "shasum": "" }, "require": { @@ -13522,7 +13519,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.16" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.18" }, "funding": [ { @@ -13538,7 +13535,7 @@ "type": "tidelift" } ], - "time": "2024-11-13T15:06:22+00:00" + "time": "2025-01-09T15:35:00+00:00" }, { "name": "symfony/phpunit-bridge", @@ -13624,16 +13621,16 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "979f8ee1a4f2464c20f3fef0d2111827fef2e97e" + "reference": "979b623f12d1eb4f6f8f24fd321dfe1dee2444a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/979f8ee1a4f2464c20f3fef0d2111827fef2e97e", - "reference": "979f8ee1a4f2464c20f3fef0d2111827fef2e97e", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/979b623f12d1eb4f6f8f24fd321dfe1dee2444a2", + "reference": "979b623f12d1eb4f6f8f24fd321dfe1dee2444a2", "shasum": "" }, "require": { @@ -13686,7 +13683,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.17" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.18" }, "funding": [ { @@ -13702,7 +13699,7 @@ "type": "tidelift" } ], - "time": "2024-12-08T23:00:41+00:00" + "time": "2024-12-23T18:38:04+00:00" }, { "name": "theseer/tokenizer", diff --git a/migrations/Version20190219200020.php b/migrations/Version20190219200020.php index 3a3ec836..7b9cae20 100644 --- a/migrations/Version20190219200020.php +++ b/migrations/Version20190219200020.php @@ -23,9 +23,9 @@ final class Version20190219200020 extends AbstractMigration { public function up(Schema $schema): void { - $this->addSql('DELETE FROM kimai2_user_preferences WHERE name = "theme.fixed_layout"'); - $this->addSql('DELETE FROM kimai2_user_preferences WHERE name = "theme.boxed_layout"'); - $this->addSql('DELETE FROM kimai2_user_preferences WHERE name = "theme.mini_sidebar"'); + $this->addSql("DELETE FROM kimai2_user_preferences WHERE name = 'theme.fixed_layout'"); + $this->addSql("DELETE FROM kimai2_user_preferences WHERE name = 'theme.boxed_layout'"); + $this->addSql("DELETE FROM kimai2_user_preferences WHERE name = 'theme.mini_sidebar'"); } public function down(Schema $schema): void diff --git a/phpstan.neon b/phpstan.neon index 996d18a7..ba853bef 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -2892,16 +2892,6 @@ parameters: count: 1 path: src/Form/Type/MetaFieldsCollectionType.php - - - message: "#^Cannot call method modify\\(\\) on mixed\\.$#" - count: 2 - path: src/Form/Type/MonthPickerType.php - - - - message: "#^Cannot clone non\\-object variable \\$date of type mixed\\.$#" - count: 2 - path: src/Form/Type/MonthPickerType.php - - message: "#^Cannot call method modify\\(\\) on DateTime\\|null\\.$#" count: 1 diff --git a/src/Constants.php b/src/Constants.php index 11c41cd7..eaab08d3 100644 --- a/src/Constants.php +++ b/src/Constants.php @@ -17,11 +17,11 @@ final class Constants /** * The current release version */ - public const VERSION = '2.28.0'; + public const VERSION = '2.29.0'; /** * The current release: major * 10000 + minor * 100 + patch */ - public const VERSION_ID = 22800; + public const VERSION_ID = 22900; /** * The software name */ diff --git a/src/Controller/Reporting/ReportUsersYearController.php b/src/Controller/Reporting/ReportUsersYearController.php index 7da25dde..9736baa8 100644 --- a/src/Controller/Reporting/ReportUsersYearController.php +++ b/src/Controller/Reporting/ReportUsersYearController.php @@ -61,11 +61,9 @@ final class ReportUsersYearController extends AbstractController $dateTimeFactory = $this->getDateTimeFactory(); $defaultDate = $dateTimeFactory->createStartOfYear(); - $isFinancialYear = false; if (null !== ($financialYear = $systemConfiguration->getFinancialYearStart())) { $defaultDate = $this->getDateTimeFactory()->createStartOfFinancialYear($financialYear); - $isFinancialYear = true; } $values = new YearlyUserList(); @@ -74,7 +72,6 @@ final class ReportUsersYearController extends AbstractController $form = $this->createFormForGetRequest(YearlyUserListForm::class, $values, [ 'timezone' => $dateTimeFactory->getTimezone()->getName(), 'start_date' => $values->getDate(), - 'show_range' => $isFinancialYear, ]); $form->submit($request->query->all(), false); diff --git a/src/Controller/SystemConfigurationController.php b/src/Controller/SystemConfigurationController.php index 43ada987..7e19e2a6 100644 --- a/src/Controller/SystemConfigurationController.php +++ b/src/Controller/SystemConfigurationController.php @@ -294,6 +294,8 @@ final class SystemConfigurationController extends AbstractController return [ (new SystemConfigurationModel('timesheet')) + ->setTranslation('time_tracking') + ->setTranslationDomain('messages') ->setConfiguration([ (new Configuration('timesheet.mode')) ->setType(TrackingModeType::class) diff --git a/src/EventSubscriber/Actions/CustomerSubscriber.php b/src/EventSubscriber/Actions/CustomerSubscriber.php index 9d91c4e8..a5e80340 100644 --- a/src/EventSubscriber/Actions/CustomerSubscriber.php +++ b/src/EventSubscriber/Actions/CustomerSubscriber.php @@ -61,11 +61,11 @@ final class CustomerSubscriber extends AbstractActionsSubscriber } if ($this->isGranted('view_project') || $this->isGranted('view_teamlead_project') || $this->isGranted('view_team_project')) { - $event->addActionToSubmenu('filter', 'project', ['title' => 'project.filter', 'url' => $this->path('admin_project', ['customers[]' => $customer->getId()])]); + $event->addActionToSubmenu('filter', 'project', ['title' => 'projects', 'url' => $this->path('admin_project', ['customers[]' => $customer->getId()])]); } if ($this->isGranted('view_activity')) { - $event->addActionToSubmenu('filter', 'activity', ['title' => 'activity.filter', 'url' => $this->path('admin_activity', ['customers[]' => $customer->getId()])]); + $event->addActionToSubmenu('filter', 'activity', ['title' => 'activities', 'url' => $this->path('admin_activity', ['customers[]' => $customer->getId()])]); } if ($this->isGranted('view_other_timesheet')) { diff --git a/src/EventSubscriber/Actions/ProjectSubscriber.php b/src/EventSubscriber/Actions/ProjectSubscriber.php index 709f82c1..9ef3f0a6 100644 --- a/src/EventSubscriber/Actions/ProjectSubscriber.php +++ b/src/EventSubscriber/Actions/ProjectSubscriber.php @@ -51,7 +51,7 @@ final class ProjectSubscriber extends AbstractActionsSubscriber } if ($this->isGranted('view_activity')) { - $event->addActionToSubmenu('filter', 'activity', ['title' => 'activity.filter', 'url' => $this->path('admin_activity', ['customers[]' => $customer->getId(), 'projects[]' => $project->getId()])]); + $event->addActionToSubmenu('filter', 'activity', ['title' => 'activities', 'url' => $this->path('admin_activity', ['customers[]' => $customer->getId(), 'projects[]' => $project->getId()])]); } if ($this->isGranted('view_other_timesheet')) { diff --git a/src/EventSubscriber/Actions/UserSubscriber.php b/src/EventSubscriber/Actions/UserSubscriber.php index b0a86c38..7ab3d569 100644 --- a/src/EventSubscriber/Actions/UserSubscriber.php +++ b/src/EventSubscriber/Actions/UserSubscriber.php @@ -35,7 +35,13 @@ final class UserSubscriber extends AbstractActionsSubscriber { $payload = $event->getPayload(); - if (($user = $payload['user']) === null || !$user instanceof User || $user->getId() === null) { + if (!\array_key_exists('user', $payload)) { + return; + } + + $user = $payload['user']; + + if (!$user instanceof User || $user->getId() === null) { return; } diff --git a/src/Export/Base/CsvRenderer.php b/src/Export/Base/CsvRenderer.php index 83f76779..8a05a6eb 100644 --- a/src/Export/Base/CsvRenderer.php +++ b/src/Export/Base/CsvRenderer.php @@ -19,12 +19,16 @@ use App\Repository\Query\TimesheetQuery; use OpenSpout\Writer\CSV\Options; use OpenSpout\Writer\CSV\Writer; use Symfony\Component\HttpFoundation\Response; +use Symfony\Contracts\Translation\TranslatorInterface; final class CsvRenderer implements RendererInterface, TimesheetExportInterface { use ExportTrait; - public function __construct(private readonly SpreadsheetRenderer $spreadsheetRenderer) + public function __construct( + private readonly SpreadsheetRenderer $spreadsheetRenderer, + private readonly TranslatorInterface $translator + ) { } @@ -63,7 +67,7 @@ final class CsvRenderer implements RendererInterface, TimesheetExportInterface $options = new Options(); $options->SHOULD_ADD_BOM = false; - $spreadsheet = new SpoutSpreadsheet(new Writer($options)); + $spreadsheet = new SpoutSpreadsheet(new Writer($options), $this->translator); $spreadsheet->open($filename); $this->spreadsheetRenderer->registerFormatter('date', new DateStringFormatter()); diff --git a/src/Export/Base/SpreadsheetRenderer.php b/src/Export/Base/SpreadsheetRenderer.php index 16e2f5a7..ee5c02f9 100644 --- a/src/Export/Base/SpreadsheetRenderer.php +++ b/src/Export/Base/SpreadsheetRenderer.php @@ -27,6 +27,7 @@ use App\Export\Package\CellFormatter\RateFormatter; use App\Export\Package\CellFormatter\TextFormatter; use App\Export\Package\CellFormatter\TimeFormatter; use App\Export\Package\Column; +use App\Export\Package\ColumnWidth; use App\Export\Package\SpreadsheetPackage; use App\Repository\Query\ActivityQuery; use App\Repository\Query\CustomerQuery; @@ -34,7 +35,6 @@ use App\Repository\Query\ProjectQuery; use App\Repository\Query\TimesheetQuery; use Psr\EventDispatcher\EventDispatcherInterface; use Symfony\Bundle\SecurityBundle\Security; -use Symfony\Contracts\Translation\TranslatorInterface; /** * @internal means no BC promise whatsoever! @@ -47,7 +47,6 @@ final class SpreadsheetRenderer private array $formatter = []; public function __construct( - protected TranslatorInterface $translator, protected EventDispatcherInterface $dispatcher, protected Security $voter ) { @@ -83,12 +82,7 @@ final class SpreadsheetRenderer public function writeSpreadsheet(SpreadsheetPackage $spreadsheetPackage, array $exportItems, TimesheetQuery $query): void { $columns = $this->getColumns($query); - - $headerRow = []; - foreach ($columns as $column) { - $headerRow[] = $this->translator->trans($column->getHeader()); - } - $spreadsheetPackage->setHeader($headerRow); + $spreadsheetPackage->setColumns($columns); $currentRow = 1; foreach ($exportItems as $exportItem) { @@ -150,26 +144,26 @@ final class SpreadsheetRenderer $columns = []; $columns[] = (new Column('date', $this->getFormatter('date')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getBegin()); - $columns[] = (new Column('begin', $this->getFormatter('time')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getBegin()); - $columns[] = (new Column('end', $this->getFormatter('time')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getEnd()); - $columns[] = (new Column('duration', $this->getFormatter('duration')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getDuration()); + $columns[] = (new Column('begin', $this->getFormatter('time')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getBegin())->withColumnWidth(ColumnWidth::SMALL); + $columns[] = (new Column('end', $this->getFormatter('time')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getEnd())->withColumnWidth(ColumnWidth::SMALL); + $columns[] = (new Column('duration', $this->getFormatter('duration')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getDuration())->withColumnWidth(ColumnWidth::SMALL); if ($showRates) { - $columns[] = (new Column('currency', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getProject()?->getCustomer()?->getCurrency()); + $columns[] = (new Column('currency', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getProject()?->getCustomer()?->getCurrency())->withColumnWidth(ColumnWidth::SMALL); $columns[] = (new Column('rate', new RateFormatter()))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getRate()); $columns[] = (new Column('internalRate', new RateFormatter()))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getInternalRate()); $columns[] = (new Column('hourlyRate', new RateFormatter()))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getHourlyRate()); $columns[] = (new Column('fixedRate', new RateFormatter()))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getFixedRate()); } - $columns[] = (new Column('username', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getUser()?->getDisplayName()); + $columns[] = (new Column('username', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getUser()?->getDisplayName())->withColumnWidth(ColumnWidth::MEDIUM); $columns[] = (new Column('account_number', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getUser()?->getAccountNumber()); - $columns[] = (new Column('customer', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getProject()?->getCustomer()?->getName()); - $columns[] = (new Column('project', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getProject()?->getName()); - $columns[] = (new Column('activity', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getActivity()?->getName()); - $columns[] = (new Column('description', new TextFormatter(true)))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getDescription()); + $columns[] = (new Column('customer', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getProject()?->getCustomer()?->getName())->withColumnWidth(ColumnWidth::MEDIUM); + $columns[] = (new Column('project', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getProject()?->getName())->withColumnWidth(ColumnWidth::MEDIUM); + $columns[] = (new Column('activity', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getActivity()?->getName())->withColumnWidth(ColumnWidth::MEDIUM); + $columns[] = (new Column('description', new TextFormatter(true)))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getDescription())->withColumnWidth(ColumnWidth::LARGE); //$columns[] = (new Column('exported', new BooleanFormatter()))->withExtractor(fn(ExportableItem $exportableItem) => $exportableItem->isExported()); - $columns[] = (new Column('billable', new BooleanFormatter()))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->isBillable()); + $columns[] = (new Column('billable', new BooleanFormatter()))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->isBillable())->withColumnWidth(ColumnWidth::SMALL); $columns[] = (new Column('tags', new ArrayFormatter()))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getTagsAsArray()); $columns[] = (new Column('type', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getType()); $columns[] = (new Column('category', $this->getFormatter('default')))->withExtractor(fn (ExportableItem $exportableItem) => $exportableItem->getCategory()); diff --git a/src/Export/Base/XlsxRenderer.php b/src/Export/Base/XlsxRenderer.php index f4692d2a..c3c3f7f2 100644 --- a/src/Export/Base/XlsxRenderer.php +++ b/src/Export/Base/XlsxRenderer.php @@ -17,12 +17,16 @@ use App\Export\TimesheetExportInterface; use App\Repository\Query\TimesheetQuery; use OpenSpout\Writer\XLSX\Writer; use Symfony\Component\HttpFoundation\Response; +use Symfony\Contracts\Translation\TranslatorInterface; final class XlsxRenderer implements RendererInterface, TimesheetExportInterface { use ExportTrait; - public function __construct(private readonly SpreadsheetRenderer $spreadsheetRenderer) + public function __construct( + private readonly SpreadsheetRenderer $spreadsheetRenderer, + private readonly TranslatorInterface $translator, + ) { } @@ -58,7 +62,7 @@ final class XlsxRenderer implements RendererInterface, TimesheetExportInterface throw new \Exception('Could not open temporary file'); } - $spreadsheet = new SpoutSpreadsheet(new Writer()); + $spreadsheet = new SpoutSpreadsheet(new Writer(), $this->translator); $spreadsheet->open($filename); $this->spreadsheetRenderer->writeSpreadsheet($spreadsheet, $exportItems, $query); diff --git a/src/Export/Package/Column.php b/src/Export/Package/Column.php index d3bb74b9..e6949e63 100644 --- a/src/Export/Package/Column.php +++ b/src/Export/Package/Column.php @@ -16,6 +16,7 @@ class Column { private ?string $header = null; private \Closure|null $extractor = null; + private ColumnWidth $columnWidth = ColumnWidth::DEFAULT; public function __construct(private readonly string $name, private readonly CellFormatterInterface $formatter) { @@ -33,6 +34,18 @@ class Column return $this; } + public function withColumnWidth(ColumnWidth $columnWidth): Column + { + $this->columnWidth = $columnWidth; + + return $this; + } + + public function getColumnWidth(): ColumnWidth + { + return $this->columnWidth; + } + public function withExtractor(\Closure $extractor): Column { $this->extractor = $extractor; diff --git a/src/Export/Package/ColumnWidth.php b/src/Export/Package/ColumnWidth.php new file mode 100644 index 00000000..515b267f --- /dev/null +++ b/src/Export/Package/ColumnWidth.php @@ -0,0 +1,19 @@ +spreadsheet = new Spreadsheet(); $this->worksheet = $this->spreadsheet->getActiveSheet(); @@ -82,9 +83,9 @@ final class PhpOfficeSpreadsheet implements SpreadsheetPackage } /** - * @param array $columns + * @param array $columns */ - public function setHeader(array $columns): void + public function setColumns(array $columns): void { if ($this->worksheet === null) { throw new \Exception('Cannot re-use spreadsheet after calling save()'); @@ -92,8 +93,9 @@ final class PhpOfficeSpreadsheet implements SpreadsheetPackage $counter = 1; foreach ($columns as $column) { + $title = $this->translator->trans($column->getHeader()); $pos = CellAddress::fromColumnAndRow($counter, 1); - $this->worksheet->setCellValue($pos, $column); + $this->worksheet->setCellValue($pos, $title); $style = $this->worksheet->getStyle($pos); $style->getBorders()->getBottom()->setBorderStyle(Border::BORDER_THIN); $style->getFont()->setBold(true); diff --git a/src/Export/Package/SpoutSpreadsheet.php b/src/Export/Package/SpoutSpreadsheet.php index 1c836e2c..089c7826 100644 --- a/src/Export/Package/SpoutSpreadsheet.php +++ b/src/Export/Package/SpoutSpreadsheet.php @@ -17,28 +17,40 @@ use OpenSpout\Common\Entity\Style\BorderPart; use OpenSpout\Common\Entity\Style\Color; use OpenSpout\Common\Entity\Style\Style; use OpenSpout\Writer\AbstractWriterMultiSheets; -use OpenSpout\Writer\CSV\Writer; +use OpenSpout\Writer\AutoFilter; +use OpenSpout\Writer\CSV\Writer as CSVWriter; use OpenSpout\Writer\WriterInterface; use OpenSpout\Writer\XLSX\Entity\SheetView; +use OpenSpout\Writer\XLSX\Writer as XLSXWriter; +use Symfony\Contracts\Translation\TranslatorInterface; class SpoutSpreadsheet implements SpreadsheetPackage { private Style $dateStyle; - public function __construct(private readonly WriterInterface $writer) + public function __construct( + private readonly WriterInterface $writer, + private readonly TranslatorInterface $translator + ) { $this->writer->setCreator(Constants::SOFTWARE); $this->dateStyle = (new Style())->setFormat('yyyy-mm-dd'); } /** - * @param array $columns + * @param array $columns */ - public function setHeader(array $columns): void + public function setColumns(array $columns): void { + $columnCounter = \count($columns); + if ($columnCounter === 0) { + throw new \InvalidArgumentException('At least one column is required'); + } + $tmp = []; foreach ($columns as $column) { - $tmp[] = Cell::fromValue($column); + $title = $this->translator->trans($column->getHeader()); + $tmp[] = Cell::fromValue($title); } $style = new Style(); @@ -48,6 +60,24 @@ class SpoutSpreadsheet implements SpreadsheetPackage $style->setBorder(new Border(new BorderPart(Border::BOTTOM, Color::BLACK, Border::WIDTH_THIN, Border::STYLE_SOLID))); $style->setFontBold(); + if ($this->writer instanceof XLSXWriter) { + $autoFilter = new AutoFilter(0, 1, $columnCounter - 1, 1); + $this->writer->getCurrentSheet()->setAutoFilter($autoFilter); + + $options = $this->writer->getOptions(); + + $i = 1; + foreach ($columns as $column) { + $width = match($column->getColumnWidth()) { + ColumnWidth::SMALL => 10, + ColumnWidth::MEDIUM => 30, + ColumnWidth::LARGE => 50, + default => 15, + }; + $options->setColumnWidth($width, $i++); + } + } + $this->writer->addRow(new Row($tmp, $style)); } @@ -62,7 +92,7 @@ class SpoutSpreadsheet implements SpreadsheetPackage $style->setShouldShrinkToFit(true); if (\array_key_exists('totals', $options) && $options['totals'] === true) { - if ($this->writer instanceof Writer) { + if ($this->writer instanceof CSVWriter) { return; } $style->setBorder(new Border(new BorderPart(Border::TOP, Color::BLACK, Border::WIDTH_THIN, Border::STYLE_SOLID))); diff --git a/src/Export/Package/SpreadsheetPackage.php b/src/Export/Package/SpreadsheetPackage.php index 4736e4c2..3ae7ff6d 100644 --- a/src/Export/Package/SpreadsheetPackage.php +++ b/src/Export/Package/SpreadsheetPackage.php @@ -19,9 +19,9 @@ interface SpreadsheetPackage public function save(): void; /** - * @param array $columns + * @param array $columns */ - public function setHeader(array $columns): void; + public function setColumns(array $columns): void; /** * @param array $columns diff --git a/src/Form/Model/Configuration.php b/src/Form/Model/Configuration.php index 2d62b4f7..e2a90f2d 100644 --- a/src/Form/Model/Configuration.php +++ b/src/Form/Model/Configuration.php @@ -28,7 +28,7 @@ final class Configuration */ private array $constraints = []; - public function __construct(private string $name) + public function __construct(private readonly string $name) { } diff --git a/src/Form/Type/MonthPickerType.php b/src/Form/Type/MonthPickerType.php index d74c9317..fe006c56 100644 --- a/src/Form/Type/MonthPickerType.php +++ b/src/Form/Type/MonthPickerType.php @@ -28,22 +28,41 @@ final class MonthPickerType extends AbstractType 'widget' => 'single_text', 'html5' => false, 'format' => DateType::HTML5_FORMAT, - 'start_date' => new \DateTime(), + 'start_date' => new \DateTimeImmutable(), ]); } public function buildView(FormView $view, FormInterface $form, array $options): void { - /** @var \DateTime|null $date */ + if (!$options['start_date'] instanceof \DateTimeInterface) { + throw new \InvalidArgumentException('Start date needs to be a DateTime object'); + } + + /** @var \DateTimeInterface|null $date */ $date = $form->getData(); if (null === $date) { + /** @var \DateTimeImmutable $date */ $date = $options['start_date']; } + $date = \DateTimeImmutable::createFromInterface($date); + $start = \DateTimeImmutable::createFromInterface($options['start_date']); + $start = $start->setDate((int) $start->format('Y'), (int) $start->format('m'), 1); + + $range = []; + $end = $start->modify('-2 year'); + $end = $end->setDate((int) $end->format('Y'), 1, 1); + $i = 1; + while ($i++ < 36 && $end <= $start) { + $range[] = $start; + $start = $start->modify('- 1 month'); + } + $view->vars['month'] = $date; - $view->vars['previousMonth'] = (clone $date)->modify('-1 month'); - $view->vars['nextMonth'] = (clone $date)->modify('+1 month'); + $view->vars['range'] = $range; + $view->vars['previousMonth'] = $date->modify('-1 month'); + $view->vars['nextMonth'] = $date->modify('+1 month'); } public function getParent(): string diff --git a/src/Form/Type/WeekPickerType.php b/src/Form/Type/WeekPickerType.php index 2e5cf111..4a5076e8 100644 --- a/src/Form/Type/WeekPickerType.php +++ b/src/Form/Type/WeekPickerType.php @@ -34,6 +34,10 @@ final class WeekPickerType extends AbstractType public function buildView(FormView $view, FormInterface $form, array $options): void { + if (!$options['start_date'] instanceof \DateTimeInterface) { + throw new \InvalidArgumentException('Start date needs to be a DateTime object'); + } + /** @var \DateTimeInterface|null $date */ $date = $form->getData(); @@ -42,11 +46,31 @@ final class WeekPickerType extends AbstractType $date = $options['start_date']; } - $date = \DateTime::createFromInterface($date); + $date = \DateTimeImmutable::createFromInterface($date); + $start = \DateTimeImmutable::createFromInterface($options['start_date']); - $view->vars['week'] = $date; - $view->vars['previousWeek'] = (clone $date)->modify('-1 week'); - $view->vars['nextWeek'] = (clone $date)->modify('+1 week'); + $week = $date; + if ($date->format('N') === '7') { + $week = $date->modify('+1 day'); + } + if ($start->format('N') === '7') { + $start = $start->modify('+1 day'); + } + + $range = []; + $end = $start->modify('-1 year'); + $end = $end->setDate((int) $end->format('Y'), 1, 1); + $i = 1; + while ($i++ < 106 && $end <= $start) { + $range[] = $start; + $start = $start->modify('- 1 week'); + } + + $view->vars['range'] = $range; + $view->vars['weekNumber'] = $week->format('W'); + $view->vars['week'] = $week; + $view->vars['previousWeek'] = $week->modify('-1 week'); + $view->vars['nextWeek'] = $week->modify('+1 week'); } public function getParent(): string diff --git a/src/Form/Type/YearPickerType.php b/src/Form/Type/YearPickerType.php index 9a1c57bd..445a5586 100644 --- a/src/Form/Type/YearPickerType.php +++ b/src/Form/Type/YearPickerType.php @@ -29,7 +29,6 @@ final class YearPickerType extends AbstractType 'html5' => false, 'format' => DateType::HTML5_FORMAT, 'start_date' => new \DateTimeImmutable(), - 'show_range' => false, ]); } @@ -43,12 +42,19 @@ final class YearPickerType extends AbstractType $date = $options['start_date']; } - $date = \DateTime::createFromInterface($date); + $date = \DateTimeImmutable::createFromInterface($date); + + $range = []; + $start = new \DateTimeImmutable(); + $start = $start->setDate((int) $start->format('Y'), (int) $date->format('m'), (int) $date->format('d')); + for ($i = 0; $i < 6; $i++) { + $range[] = $start->modify('-' . $i . ' year'); + } $view->vars['year'] = $date; - $view->vars['show_range'] = $options['show_range']; - $view->vars['previousYear'] = (clone $date)->modify('-1 year'); - $view->vars['nextYear'] = (clone $date)->modify('+1 year'); + $view->vars['range'] = $range; + $view->vars['previousYear'] = $date->modify('-1 year'); + $view->vars['nextYear'] = $date->modify('+1 year'); } public function getParent(): string diff --git a/src/Invoice/Hydrator/InvoiceItemDefaultHydrator.php b/src/Invoice/Hydrator/InvoiceItemDefaultHydrator.php index b9cac414..7b47ff68 100644 --- a/src/Invoice/Hydrator/InvoiceItemDefaultHydrator.php +++ b/src/Invoice/Hydrator/InvoiceItemDefaultHydrator.php @@ -66,6 +66,7 @@ final class InvoiceItemDefaultHydrator implements InvoiceItemHydrator 'entry.rate_internal' => $formatter->getFormattedMoney($internalRate, $currency), 'entry.rate_internal_nc' => $formatter->getFormattedMoney($internalRate, $currency, false), 'entry.rate_internal_plain' => $internalRate, + 'entry.rate_fixed' => ($item->isFixedRate() ? $item->getFixedRate() : null), 'entry.total' => $formatter->getFormattedMoney($rate, $currency), 'entry.total_nc' => $formatter->getFormattedMoney($rate, $currency, false), 'entry.total_plain' => $rate, diff --git a/src/Reporting/YearlyUserList/YearlyUserListForm.php b/src/Reporting/YearlyUserList/YearlyUserListForm.php index 7682c3f1..6ef054c3 100644 --- a/src/Reporting/YearlyUserList/YearlyUserListForm.php +++ b/src/Reporting/YearlyUserList/YearlyUserListForm.php @@ -28,7 +28,6 @@ final class YearlyUserListForm extends AbstractType 'model_timezone' => $options['timezone'], 'view_timezone' => $options['timezone'], 'start_date' => $options['start_date'], - 'show_range' => $options['show_range'], ]); $builder->add('team', TeamType::class, [ 'multiple' => false, @@ -51,7 +50,6 @@ final class YearlyUserListForm extends AbstractType 'start_date' => new \DateTime(), 'csrf_protection' => false, 'method' => 'GET', - 'show_range' => false, ]); } } diff --git a/templates/form/blocks.html.twig b/templates/form/blocks.html.twig index cf45c9ed..176e1063 100644 --- a/templates/form/blocks.html.twig +++ b/templates/form/blocks.html.twig @@ -291,7 +291,7 @@ data-form-widget="copy-data" data-target="#{{ form.vars.id }}" data-value="{{ previousYear|report_date }}" data-event="change"> {{ icon('left') }} - {% if show_range %} + {% if range is not defined or range is not iterable or range is empty %} {{ year|date_short }} – {{ nextYear|date_short }} @@ -299,10 +299,9 @@ -