Release 2.22.0 (#5043)
This commit is contained in:
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -1,2 +1,2 @@
|
|||||||
github: [kevinpapst]
|
github: [kevinpapst]
|
||||||
custom: ["https://www.kimai.org/", "https://www.kimai.tw/", "https://www.kimai.co.il/"]
|
custom: ["https://www.kimai.org/", "https://www.kimai.cloud/", "https://www.kevinpapst.de/"]
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ fieldset legend.col-form-label {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* See project assignment to teams */
|
/* See project assignment to teams */
|
||||||
fieldset.form-fieldset legend {
|
fieldset.form-fieldset > legend {
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ table.dataTable {
|
|||||||
}
|
}
|
||||||
th.weekend,
|
th.weekend,
|
||||||
td.weekend {
|
td.weekend {
|
||||||
background-color: var(--tblr-bg-surface-secondary);
|
background-color: var(--tblr-gray-50);
|
||||||
}
|
}
|
||||||
/* order is important, "today” should overwrite "weekend" therefor later in the file */
|
/* order is important, "today” should overwrite "weekend" therefor later in the file */
|
||||||
th.today {
|
th.today {
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
"friendsofsymfony/rest-bundle": "^3.0",
|
"friendsofsymfony/rest-bundle": "^3.0",
|
||||||
"gedmo/doctrine-extensions": "^3.6",
|
"gedmo/doctrine-extensions": "^3.6",
|
||||||
"jms/serializer-bundle": "^5.0",
|
"jms/serializer-bundle": "^5.0",
|
||||||
"kevinpapst/tabler-bundle": "^1.2",
|
"kevinpapst/tabler-bundle": "1.4.2",
|
||||||
"league/csv": "^9.4",
|
"league/csv": "^9.4",
|
||||||
"mpdf/mpdf": "^8.0",
|
"mpdf/mpdf": "^8.0",
|
||||||
"nelmio/api-doc-bundle": "^4.0",
|
"nelmio/api-doc-bundle": "^4.0",
|
||||||
|
|||||||
350
composer.lock
generated
350
composer.lock
generated
@@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "6e2a1e12230f06cb810120b7d1cc64d2",
|
"content-hash": "30e0cd4d74c85f6523a08a515a2b40f5",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "azuyalabs/yasumi",
|
"name": "azuyalabs/yasumi",
|
||||||
@@ -184,24 +184,24 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "composer/semver",
|
"name": "composer/semver",
|
||||||
"version": "3.4.2",
|
"version": "3.4.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/composer/semver.git",
|
"url": "https://github.com/composer/semver.git",
|
||||||
"reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6"
|
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6",
|
"url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
|
||||||
"reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6",
|
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^5.3.2 || ^7.0 || ^8.0"
|
"php": "^5.3.2 || ^7.0 || ^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpstan/phpstan": "^1.4",
|
"phpstan/phpstan": "^1.11",
|
||||||
"symfony/phpunit-bridge": "^4.2 || ^5"
|
"symfony/phpunit-bridge": "^3 || ^7"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
@@ -245,7 +245,7 @@
|
|||||||
"support": {
|
"support": {
|
||||||
"irc": "ircs://irc.libera.chat:6697/composer",
|
"irc": "ircs://irc.libera.chat:6697/composer",
|
||||||
"issues": "https://github.com/composer/semver/issues",
|
"issues": "https://github.com/composer/semver/issues",
|
||||||
"source": "https://github.com/composer/semver/tree/3.4.2"
|
"source": "https://github.com/composer/semver/tree/3.4.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -261,7 +261,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-07-12T11:35:52+00:00"
|
"time": "2024-09-19T14:15:21+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "dasprid/enum",
|
"name": "dasprid/enum",
|
||||||
@@ -585,16 +585,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/dbal",
|
"name": "doctrine/dbal",
|
||||||
"version": "3.9.0",
|
"version": "3.9.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/doctrine/dbal.git",
|
"url": "https://github.com/doctrine/dbal.git",
|
||||||
"reference": "d8f68ea6cc00912e5313237130b8c8decf4d28c6"
|
"reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/doctrine/dbal/zipball/d8f68ea6cc00912e5313237130b8c8decf4d28c6",
|
"url": "https://api.github.com/repos/doctrine/dbal/zipball/d7dc08f98cba352b2bab5d32c5e58f7e745c11a7",
|
||||||
"reference": "d8f68ea6cc00912e5313237130b8c8decf4d28c6",
|
"reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -610,7 +610,7 @@
|
|||||||
"doctrine/coding-standard": "12.0.0",
|
"doctrine/coding-standard": "12.0.0",
|
||||||
"fig/log-test": "^1",
|
"fig/log-test": "^1",
|
||||||
"jetbrains/phpstorm-stubs": "2023.1",
|
"jetbrains/phpstorm-stubs": "2023.1",
|
||||||
"phpstan/phpstan": "1.11.7",
|
"phpstan/phpstan": "1.12.0",
|
||||||
"phpstan/phpstan-strict-rules": "^1.6",
|
"phpstan/phpstan-strict-rules": "^1.6",
|
||||||
"phpunit/phpunit": "9.6.20",
|
"phpunit/phpunit": "9.6.20",
|
||||||
"psalm/plugin-phpunit": "0.18.4",
|
"psalm/plugin-phpunit": "0.18.4",
|
||||||
@@ -678,7 +678,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/doctrine/dbal/issues",
|
"issues": "https://github.com/doctrine/dbal/issues",
|
||||||
"source": "https://github.com/doctrine/dbal/tree/3.9.0"
|
"source": "https://github.com/doctrine/dbal/tree/3.9.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -694,7 +694,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-15T07:34:42+00:00"
|
"time": "2024-09-01T13:49:23+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/deprecations",
|
"name": "doctrine/deprecations",
|
||||||
@@ -745,16 +745,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/doctrine-bundle",
|
"name": "doctrine/doctrine-bundle",
|
||||||
"version": "2.12.0",
|
"version": "2.13.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/doctrine/DoctrineBundle.git",
|
"url": "https://github.com/doctrine/DoctrineBundle.git",
|
||||||
"reference": "5418e811a14724068e95e0ba43353b903ada530f"
|
"reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5418e811a14724068e95e0ba43353b903ada530f",
|
"url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca59d84b8e63143ce1aed90cdb333ba329d71563",
|
||||||
"reference": "5418e811a14724068e95e0ba43353b903ada530f",
|
"reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -845,7 +845,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/doctrine/DoctrineBundle/issues",
|
"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": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -861,7 +861,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-03-19T07:20:37+00:00"
|
"time": "2024-09-01T09:46:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/doctrine-migrations-bundle",
|
"name": "doctrine/doctrine-migrations-bundle",
|
||||||
@@ -3055,16 +3055,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nelmio/api-doc-bundle",
|
"name": "nelmio/api-doc-bundle",
|
||||||
"version": "v4.29.3",
|
"version": "v4.30.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/nelmio/NelmioApiDocBundle.git",
|
"url": "https://github.com/nelmio/NelmioApiDocBundle.git",
|
||||||
"reference": "61a3f8bb95111fade6eace55c071c43da0cc75d9"
|
"reference": "277fa17b912be31b5170e49f0924b1028058c938"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/61a3f8bb95111fade6eace55c071c43da0cc75d9",
|
"url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/277fa17b912be31b5170e49f0924b1028058c938",
|
||||||
"reference": "61a3f8bb95111fade6eace55c071c43da0cc75d9",
|
"reference": "277fa17b912be31b5170e49f0924b1028058c938",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -3165,7 +3165,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/nelmio/NelmioApiDocBundle/issues",
|
"issues": "https://github.com/nelmio/NelmioApiDocBundle/issues",
|
||||||
"source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.29.3"
|
"source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.30.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -3173,7 +3173,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-17T13:03:07+00:00"
|
"time": "2024-09-14T10:54:47+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nelmio/cors-bundle",
|
"name": "nelmio/cors-bundle",
|
||||||
@@ -3698,16 +3698,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpoffice/math",
|
"name": "phpoffice/math",
|
||||||
"version": "0.1.0",
|
"version": "0.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/PHPOffice/Math.git",
|
"url": "https://github.com/PHPOffice/Math.git",
|
||||||
"reference": "f0f8cad98624459c540cdd61d2a174d834471773"
|
"reference": "fc2eb6d1a61b058d5dac77197059db30ee3c8329"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/PHPOffice/Math/zipball/f0f8cad98624459c540cdd61d2a174d834471773",
|
"url": "https://api.github.com/repos/PHPOffice/Math/zipball/fc2eb6d1a61b058d5dac77197059db30ee3c8329",
|
||||||
"reference": "f0f8cad98624459c540cdd61d2a174d834471773",
|
"reference": "fc2eb6d1a61b058d5dac77197059db30ee3c8329",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -3722,8 +3722,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"PhpOffice\\Math\\": "src/Math/",
|
"PhpOffice\\Math\\": "src/Math/"
|
||||||
"Tests\\PhpOffice\\Math\\": "tests/Math/"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
@@ -3745,9 +3744,9 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/PHPOffice/Math/issues",
|
"issues": "https://github.com/PHPOffice/Math/issues",
|
||||||
"source": "https://github.com/PHPOffice/Math/tree/0.1.0"
|
"source": "https://github.com/PHPOffice/Math/tree/0.2.0"
|
||||||
},
|
},
|
||||||
"time": "2023-09-25T12:08:20+00:00"
|
"time": "2024-08-12T07:30:45+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpoffice/phpspreadsheet",
|
"name": "phpoffice/phpspreadsheet",
|
||||||
@@ -3855,16 +3854,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpoffice/phpword",
|
"name": "phpoffice/phpword",
|
||||||
"version": "1.2.0",
|
"version": "1.3.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/PHPOffice/PHPWord.git",
|
"url": "https://github.com/PHPOffice/PHPWord.git",
|
||||||
"reference": "e76b701ef538cb749641514fcbc31a68078550fa"
|
"reference": "8392134ce4b5dba65130ba956231a1602b848b7f"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/PHPOffice/PHPWord/zipball/e76b701ef538cb749641514fcbc31a68078550fa",
|
"url": "https://api.github.com/repos/PHPOffice/PHPWord/zipball/8392134ce4b5dba65130ba956231a1602b848b7f",
|
||||||
"reference": "e76b701ef538cb749641514fcbc31a68078550fa",
|
"reference": "8392134ce4b5dba65130ba956231a1602b848b7f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -3872,7 +3871,7 @@
|
|||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"ext-xml": "*",
|
"ext-xml": "*",
|
||||||
"php": "^7.1|^8.0",
|
"php": "^7.1|^8.0",
|
||||||
"phpoffice/math": "^0.1"
|
"phpoffice/math": "^0.2"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"dompdf/dompdf": "^2.0",
|
"dompdf/dompdf": "^2.0",
|
||||||
@@ -3958,22 +3957,22 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/PHPOffice/PHPWord/issues",
|
"issues": "https://github.com/PHPOffice/PHPWord/issues",
|
||||||
"source": "https://github.com/PHPOffice/PHPWord/tree/1.2.0"
|
"source": "https://github.com/PHPOffice/PHPWord/tree/1.3.0"
|
||||||
},
|
},
|
||||||
"time": "2023-11-30T11:22:23+00:00"
|
"time": "2024-08-30T18:03:42+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpdoc-parser",
|
"name": "phpstan/phpdoc-parser",
|
||||||
"version": "1.30.0",
|
"version": "1.30.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpdoc-parser.git",
|
"url": "https://github.com/phpstan/phpdoc-parser.git",
|
||||||
"reference": "5ceb0e384997db59f38774bf79c2a6134252c08f"
|
"reference": "51b95ec8670af41009e2b2b56873bad96682413e"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/5ceb0e384997db59f38774bf79c2a6134252c08f",
|
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/51b95ec8670af41009e2b2b56873bad96682413e",
|
||||||
"reference": "5ceb0e384997db59f38774bf79c2a6134252c08f",
|
"reference": "51b95ec8670af41009e2b2b56873bad96682413e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -4005,9 +4004,9 @@
|
|||||||
"description": "PHPDoc parser with support for nullable, intersection and generic types",
|
"description": "PHPDoc parser with support for nullable, intersection and generic types",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
|
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
|
||||||
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.30.0"
|
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.30.1"
|
||||||
},
|
},
|
||||||
"time": "2024-08-29T09:54:52+00:00"
|
"time": "2024-09-07T20:13:05+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/cache",
|
"name": "psr/cache",
|
||||||
@@ -4371,16 +4370,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/log",
|
"name": "psr/log",
|
||||||
"version": "3.0.1",
|
"version": "3.0.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/php-fig/log.git",
|
"url": "https://github.com/php-fig/log.git",
|
||||||
"reference": "79dff0b268932c640297f5208d6298f71855c03e"
|
"reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e",
|
"url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
|
||||||
"reference": "79dff0b268932c640297f5208d6298f71855c03e",
|
"reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -4415,9 +4414,9 @@
|
|||||||
"psr-3"
|
"psr-3"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/php-fig/log/tree/3.0.1"
|
"source": "https://github.com/php-fig/log/tree/3.0.2"
|
||||||
},
|
},
|
||||||
"time": "2024-08-21T13:31:24+00:00"
|
"time": "2024-09-11T13:17:53+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/simple-cache",
|
"name": "psr/simple-cache",
|
||||||
@@ -4682,16 +4681,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "setasign/fpdi",
|
"name": "setasign/fpdi",
|
||||||
"version": "v2.6.0",
|
"version": "v2.6.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Setasign/FPDI.git",
|
"url": "https://github.com/Setasign/FPDI.git",
|
||||||
"reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad"
|
"reference": "09a816004fcee9ed3405bd164147e3fdbb79a56f"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/Setasign/FPDI/zipball/a6db878129ec6c7e141316ee71872923e7f1b7ad",
|
"url": "https://api.github.com/repos/Setasign/FPDI/zipball/09a816004fcee9ed3405bd164147e3fdbb79a56f",
|
||||||
"reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad",
|
"reference": "09a816004fcee9ed3405bd164147e3fdbb79a56f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -4742,7 +4741,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/Setasign/FPDI/issues",
|
"issues": "https://github.com/Setasign/FPDI/issues",
|
||||||
"source": "https://github.com/Setasign/FPDI/tree/v2.6.0"
|
"source": "https://github.com/Setasign/FPDI/tree/v2.6.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -4750,7 +4749,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2023-12-11T16:03:32+00:00"
|
"time": "2024-09-02T10:17:15+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "spomky-labs/otphp",
|
"name": "spomky-labs/otphp",
|
||||||
@@ -7359,20 +7358,20 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-grapheme",
|
"name": "symfony/polyfill-intl-grapheme",
|
||||||
"version": "v1.30.0",
|
"version": "v1.31.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
||||||
"reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a"
|
"reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
|
||||||
"reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a",
|
"reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1"
|
"php": ">=7.2"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-intl": "For best performance"
|
"ext-intl": "For best performance"
|
||||||
@@ -7417,7 +7416,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0"
|
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7433,24 +7432,24 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-05-31T15:07:36+00:00"
|
"time": "2024-09-09T11:45:10+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-icu",
|
"name": "symfony/polyfill-intl-icu",
|
||||||
"version": "v1.30.0",
|
"version": "v1.31.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-intl-icu.git",
|
"url": "https://github.com/symfony/polyfill-intl-icu.git",
|
||||||
"reference": "e76343c631b453088e2260ac41dfebe21954de81"
|
"reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e76343c631b453088e2260ac41dfebe21954de81",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78",
|
||||||
"reference": "e76343c631b453088e2260ac41dfebe21954de81",
|
"reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1"
|
"php": ">=7.2"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-intl": "For best performance and support of other locales than \"en\""
|
"ext-intl": "For best performance and support of other locales than \"en\""
|
||||||
@@ -7501,7 +7500,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.30.0"
|
"source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7517,26 +7516,25 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-05-31T15:07:36+00:00"
|
"time": "2024-09-09T11:45:10+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-idn",
|
"name": "symfony/polyfill-intl-idn",
|
||||||
"version": "v1.30.0",
|
"version": "v1.31.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-intl-idn.git",
|
"url": "https://github.com/symfony/polyfill-intl-idn.git",
|
||||||
"reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c"
|
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
|
||||||
"reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c",
|
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1",
|
"php": ">=7.2",
|
||||||
"symfony/polyfill-intl-normalizer": "^1.10",
|
"symfony/polyfill-intl-normalizer": "^1.10"
|
||||||
"symfony/polyfill-php72": "^1.10"
|
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-intl": "For best performance"
|
"ext-intl": "For best performance"
|
||||||
@@ -7585,7 +7583,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0"
|
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7601,24 +7599,24 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-05-31T15:07:36+00:00"
|
"time": "2024-09-09T11:45:10+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-normalizer",
|
"name": "symfony/polyfill-intl-normalizer",
|
||||||
"version": "v1.30.0",
|
"version": "v1.31.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
||||||
"reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb"
|
"reference": "3833d7255cc303546435cb650316bff708a1c75c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
|
||||||
"reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb",
|
"reference": "3833d7255cc303546435cb650316bff708a1c75c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1"
|
"php": ">=7.2"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-intl": "For best performance"
|
"ext-intl": "For best performance"
|
||||||
@@ -7666,7 +7664,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0"
|
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7682,24 +7680,24 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-05-31T15:07:36+00:00"
|
"time": "2024-09-09T11:45:10+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php83",
|
"name": "symfony/polyfill-php83",
|
||||||
"version": "v1.30.0",
|
"version": "v1.31.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-php83.git",
|
"url": "https://github.com/symfony/polyfill-php83.git",
|
||||||
"reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9"
|
"reference": "2fb86d65e2d424369ad2905e83b236a8805ba491"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9",
|
"url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491",
|
||||||
"reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9",
|
"reference": "2fb86d65e2d424369ad2905e83b236a8805ba491",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1"
|
"php": ">=7.2"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
@@ -7742,7 +7740,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0"
|
"source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7758,7 +7756,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-06-19T12:35:24+00:00"
|
"time": "2024-09-09T11:45:10+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/property-access",
|
"name": "symfony/property-access",
|
||||||
@@ -9659,23 +9657,23 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/cssinliner-extra",
|
"name": "twig/cssinliner-extra",
|
||||||
"version": "v3.12.0",
|
"version": "v3.13.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/twigphp/cssinliner-extra.git",
|
"url": "https://github.com/twigphp/cssinliner-extra.git",
|
||||||
"reference": "31fd1f7bc79bf3b7c188316e02d78fdd0fc153e3"
|
"reference": "cef36c444b1cce4c0978d7aebd20427671a918f4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/twigphp/cssinliner-extra/zipball/31fd1f7bc79bf3b7c188316e02d78fdd0fc153e3",
|
"url": "https://api.github.com/repos/twigphp/cssinliner-extra/zipball/cef36c444b1cce4c0978d7aebd20427671a918f4",
|
||||||
"reference": "31fd1f7bc79bf3b7c188316e02d78fdd0fc153e3",
|
"reference": "cef36c444b1cce4c0978d7aebd20427671a918f4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.0.2",
|
"php": ">=8.0.2",
|
||||||
"symfony/deprecation-contracts": "^2.5|^3",
|
"symfony/deprecation-contracts": "^2.5|^3",
|
||||||
"tijsverkoyen/css-to-inline-styles": "^2.0",
|
"tijsverkoyen/css-to-inline-styles": "^2.0",
|
||||||
"twig/twig": "^3.0"
|
"twig/twig": "^3.13|^4.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/phpunit-bridge": "^6.4|^7.0"
|
"symfony/phpunit-bridge": "^6.4|^7.0"
|
||||||
@@ -9712,7 +9710,7 @@
|
|||||||
"twig"
|
"twig"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/twigphp/cssinliner-extra/tree/v3.12.0"
|
"source": "https://github.com/twigphp/cssinliner-extra/tree/v3.13.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9724,27 +9722,27 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-26T15:29:01+00:00"
|
"time": "2024-09-03T13:08:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/extra-bundle",
|
"name": "twig/extra-bundle",
|
||||||
"version": "v3.12.0",
|
"version": "v3.13.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/twigphp/twig-extra-bundle.git",
|
"url": "https://github.com/twigphp/twig-extra-bundle.git",
|
||||||
"reference": "a5427976a23c50b98d034d2f4c215ffaaaf5875f"
|
"reference": "21a9a7aa9f79d4493bb6fed4eb2794339f9551f5"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/a5427976a23c50b98d034d2f4c215ffaaaf5875f",
|
"url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/21a9a7aa9f79d4493bb6fed4eb2794339f9551f5",
|
||||||
"reference": "a5427976a23c50b98d034d2f4c215ffaaaf5875f",
|
"reference": "21a9a7aa9f79d4493bb6fed4eb2794339f9551f5",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.0.2",
|
"php": ">=8.0.2",
|
||||||
"symfony/framework-bundle": "^5.4|^6.4|^7.0",
|
"symfony/framework-bundle": "^5.4|^6.4|^7.0",
|
||||||
"symfony/twig-bundle": "^5.4|^6.4|^7.0",
|
"symfony/twig-bundle": "^5.4|^6.4|^7.0",
|
||||||
"twig/twig": "^3.0"
|
"twig/twig": "^3.0|^4.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"league/commonmark": "^1.0|^2.0",
|
"league/commonmark": "^1.0|^2.0",
|
||||||
@@ -9786,7 +9784,7 @@
|
|||||||
"twig"
|
"twig"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.12.0"
|
"source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.13.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9798,27 +9796,27 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-10T10:32:24+00:00"
|
"time": "2024-09-01T20:39:12+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/inky-extra",
|
"name": "twig/inky-extra",
|
||||||
"version": "v3.12.0",
|
"version": "v3.13.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/twigphp/inky-extra.git",
|
"url": "https://github.com/twigphp/inky-extra.git",
|
||||||
"reference": "cf3abb00b329af9a3732d3bd6168a4e16ae8cd9f"
|
"reference": "60c92c2a435ccd95d7a852229f01098aaf7fbced"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/twigphp/inky-extra/zipball/cf3abb00b329af9a3732d3bd6168a4e16ae8cd9f",
|
"url": "https://api.github.com/repos/twigphp/inky-extra/zipball/60c92c2a435ccd95d7a852229f01098aaf7fbced",
|
||||||
"reference": "cf3abb00b329af9a3732d3bd6168a4e16ae8cd9f",
|
"reference": "60c92c2a435ccd95d7a852229f01098aaf7fbced",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"lorenzo/pinky": "^1.0.5",
|
"lorenzo/pinky": "^1.0.5",
|
||||||
"php": ">=8.0.2",
|
"php": ">=8.0.2",
|
||||||
"symfony/deprecation-contracts": "^2.5|^3",
|
"symfony/deprecation-contracts": "^2.5|^3",
|
||||||
"twig/twig": "^3.0"
|
"twig/twig": "^3.13|^4.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/phpunit-bridge": "^6.4|^7.0"
|
"symfony/phpunit-bridge": "^6.4|^7.0"
|
||||||
@@ -9856,7 +9854,7 @@
|
|||||||
"twig"
|
"twig"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/twigphp/inky-extra/tree/v3.12.0"
|
"source": "https://github.com/twigphp/inky-extra/tree/v3.13.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9868,26 +9866,26 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-10T10:32:24+00:00"
|
"time": "2024-09-03T13:08:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/intl-extra",
|
"name": "twig/intl-extra",
|
||||||
"version": "v3.12.0",
|
"version": "v3.13.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/twigphp/intl-extra.git",
|
"url": "https://github.com/twigphp/intl-extra.git",
|
||||||
"reference": "61e1189333120a475d2b67b93664b8002668fc27"
|
"reference": "1b8d78c5db08bdc61015fd55009d2e84b3aa7e38"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/twigphp/intl-extra/zipball/61e1189333120a475d2b67b93664b8002668fc27",
|
"url": "https://api.github.com/repos/twigphp/intl-extra/zipball/1b8d78c5db08bdc61015fd55009d2e84b3aa7e38",
|
||||||
"reference": "61e1189333120a475d2b67b93664b8002668fc27",
|
"reference": "1b8d78c5db08bdc61015fd55009d2e84b3aa7e38",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.0.2",
|
"php": ">=8.0.2",
|
||||||
"symfony/intl": "^5.4|^6.4|^7.0",
|
"symfony/intl": "^5.4|^6.4|^7.0",
|
||||||
"twig/twig": "^3.10"
|
"twig/twig": "^3.13|^4.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/phpunit-bridge": "^6.4|^7.0"
|
"symfony/phpunit-bridge": "^6.4|^7.0"
|
||||||
@@ -9920,7 +9918,7 @@
|
|||||||
"twig"
|
"twig"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/twigphp/intl-extra/tree/v3.12.0"
|
"source": "https://github.com/twigphp/intl-extra/tree/v3.13.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9932,27 +9930,27 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-10T10:32:24+00:00"
|
"time": "2024-09-03T13:08:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/string-extra",
|
"name": "twig/string-extra",
|
||||||
"version": "v3.12.0",
|
"version": "v3.13.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/twigphp/string-extra.git",
|
"url": "https://github.com/twigphp/string-extra.git",
|
||||||
"reference": "0abea0e39f24db0bd847165533d77c93fcbb5025"
|
"reference": "148e869d87cf4bea9d97896ab49e048e4add3310"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/twigphp/string-extra/zipball/0abea0e39f24db0bd847165533d77c93fcbb5025",
|
"url": "https://api.github.com/repos/twigphp/string-extra/zipball/148e869d87cf4bea9d97896ab49e048e4add3310",
|
||||||
"reference": "0abea0e39f24db0bd847165533d77c93fcbb5025",
|
"reference": "148e869d87cf4bea9d97896ab49e048e4add3310",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.0.2",
|
"php": ">=8.0.2",
|
||||||
"symfony/string": "^5.4|^6.4|^7.0",
|
"symfony/string": "^5.4|^6.4|^7.0",
|
||||||
"symfony/translation-contracts": "^1.1|^2|^3",
|
"symfony/translation-contracts": "^1.1|^2|^3",
|
||||||
"twig/twig": "^3.0"
|
"twig/twig": "^3.13|^4.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/phpunit-bridge": "^6.4|^7.0"
|
"symfony/phpunit-bridge": "^6.4|^7.0"
|
||||||
@@ -9987,7 +9985,7 @@
|
|||||||
"unicode"
|
"unicode"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/twigphp/string-extra/tree/v3.12.0"
|
"source": "https://github.com/twigphp/string-extra/tree/v3.13.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9999,20 +9997,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-10T10:32:24+00:00"
|
"time": "2024-09-03T13:08:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/twig",
|
"name": "twig/twig",
|
||||||
"version": "v3.12.0",
|
"version": "v3.14.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/twigphp/Twig.git",
|
"url": "https://github.com/twigphp/Twig.git",
|
||||||
"reference": "4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea"
|
"reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea",
|
"url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72",
|
||||||
"reference": "4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea",
|
"reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -10066,7 +10064,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/twigphp/Twig/issues",
|
"issues": "https://github.com/twigphp/Twig/issues",
|
||||||
"source": "https://github.com/twigphp/Twig/tree/v3.12.0"
|
"source": "https://github.com/twigphp/Twig/tree/v3.14.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -10078,7 +10076,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-29T09:51:12+00:00"
|
"time": "2024-09-09T17:55:12+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "webmozart/assert",
|
"name": "webmozart/assert",
|
||||||
@@ -10940,16 +10938,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "friendsofphp/php-cs-fixer",
|
"name": "friendsofphp/php-cs-fixer",
|
||||||
"version": "v3.63.2",
|
"version": "v3.64.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
||||||
"reference": "9d427f3f14984403a6ae9fc726b61765ca0c005e"
|
"reference": "58dd9c931c785a79739310aef5178928305ffa67"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/9d427f3f14984403a6ae9fc726b61765ca0c005e",
|
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/58dd9c931c785a79739310aef5178928305ffa67",
|
||||||
"reference": "9d427f3f14984403a6ae9fc726b61765ca0c005e",
|
"reference": "58dd9c931c785a79739310aef5178928305ffa67",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11031,7 +11029,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
||||||
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.63.2"
|
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.64.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -11039,7 +11037,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-28T10:47:21+00:00"
|
"time": "2024-08-30T23:09:38+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "masterminds/html5",
|
"name": "masterminds/html5",
|
||||||
@@ -11110,16 +11108,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nikic/php-parser",
|
"name": "nikic/php-parser",
|
||||||
"version": "v5.1.0",
|
"version": "v5.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||||
"reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1"
|
"reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1",
|
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb",
|
||||||
"reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1",
|
"reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11162,9 +11160,9 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/nikic/PHP-Parser/issues",
|
"issues": "https://github.com/nikic/PHP-Parser/issues",
|
||||||
"source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0"
|
"source": "https://github.com/nikic/PHP-Parser/tree/v5.2.0"
|
||||||
},
|
},
|
||||||
"time": "2024-07-01T20:03:41+00:00"
|
"time": "2024-09-15T16:40:33+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phar-io/manifest",
|
"name": "phar-io/manifest",
|
||||||
@@ -11286,16 +11284,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan",
|
"name": "phpstan/phpstan",
|
||||||
"version": "1.12.0",
|
"version": "1.12.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpstan.git",
|
"url": "https://github.com/phpstan/phpstan.git",
|
||||||
"reference": "384af967d35b2162f69526c7276acadce534d0e1"
|
"reference": "ffa517cb918591b93acc9b95c0bebdcd0e4538bd"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/384af967d35b2162f69526c7276acadce534d0e1",
|
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/ffa517cb918591b93acc9b95c0bebdcd0e4538bd",
|
||||||
"reference": "384af967d35b2162f69526c7276acadce534d0e1",
|
"reference": "ffa517cb918591b93acc9b95c0bebdcd0e4538bd",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11340,25 +11338,25 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-08-27T09:18:05+00:00"
|
"time": "2024-09-19T07:58:01+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan-deprecation-rules",
|
"name": "phpstan/phpstan-deprecation-rules",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
|
"url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
|
||||||
"reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26"
|
"reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/fa8cce7720fa782899a0aa97b6a41225d1bb7b26",
|
"url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/f94d246cc143ec5a23da868f8f7e1393b50eaa82",
|
||||||
"reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26",
|
"reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.2 || ^8.0",
|
"php": "^7.2 || ^8.0",
|
||||||
"phpstan/phpstan": "^1.11"
|
"phpstan/phpstan": "^1.12"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"php-parallel-lint/php-parallel-lint": "^1.2",
|
"php-parallel-lint/php-parallel-lint": "^1.2",
|
||||||
@@ -11385,22 +11383,22 @@
|
|||||||
"description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
|
"description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
|
"issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
|
||||||
"source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.0"
|
"source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.1"
|
||||||
},
|
},
|
||||||
"time": "2024-04-20T06:39:48+00:00"
|
"time": "2024-09-11T15:52:35+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan-doctrine",
|
"name": "phpstan/phpstan-doctrine",
|
||||||
"version": "1.5.2",
|
"version": "1.5.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpstan-doctrine.git",
|
"url": "https://github.com/phpstan/phpstan-doctrine.git",
|
||||||
"reference": "4d17bed8a33aa8220c1f2a21a6b14fcdb0e5b02c"
|
"reference": "38db3bad8f1567d7bf64806738d724261f8a2b5c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/4d17bed8a33aa8220c1f2a21a6b14fcdb0e5b02c",
|
"url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/38db3bad8f1567d7bf64806738d724261f8a2b5c",
|
||||||
"reference": "4d17bed8a33aa8220c1f2a21a6b14fcdb0e5b02c",
|
"reference": "38db3bad8f1567d7bf64806738d724261f8a2b5c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11457,9 +11455,9 @@
|
|||||||
"description": "Doctrine extensions for PHPStan",
|
"description": "Doctrine extensions for PHPStan",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpstan/phpstan-doctrine/issues",
|
"issues": "https://github.com/phpstan/phpstan-doctrine/issues",
|
||||||
"source": "https://github.com/phpstan/phpstan-doctrine/tree/1.5.2"
|
"source": "https://github.com/phpstan/phpstan-doctrine/tree/1.5.3"
|
||||||
},
|
},
|
||||||
"time": "2024-08-23T11:07:15+00:00"
|
"time": "2024-09-01T13:17:34+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan-phpunit",
|
"name": "phpstan/phpstan-phpunit",
|
||||||
@@ -11564,22 +11562,22 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan-symfony",
|
"name": "phpstan/phpstan-symfony",
|
||||||
"version": "1.4.8",
|
"version": "1.4.9",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpstan-symfony.git",
|
"url": "https://github.com/phpstan/phpstan-symfony.git",
|
||||||
"reference": "14eec8c011b856eee4d744a2a3f709db1e1858bd"
|
"reference": "51ab2438fb2695467cf96b58d2f8f28d4dd1e3e9"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/14eec8c011b856eee4d744a2a3f709db1e1858bd",
|
"url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/51ab2438fb2695467cf96b58d2f8f28d4dd1e3e9",
|
||||||
"reference": "14eec8c011b856eee4d744a2a3f709db1e1858bd",
|
"reference": "51ab2438fb2695467cf96b58d2f8f28d4dd1e3e9",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-simplexml": "*",
|
"ext-simplexml": "*",
|
||||||
"php": "^7.2 || ^8.0",
|
"php": "^7.2 || ^8.0",
|
||||||
"phpstan/phpstan": "^1.11.7"
|
"phpstan/phpstan": "^1.12"
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
"symfony/framework-bundle": "<3.0"
|
"symfony/framework-bundle": "<3.0"
|
||||||
@@ -11630,9 +11628,9 @@
|
|||||||
"description": "Symfony Framework extensions and rules for PHPStan",
|
"description": "Symfony Framework extensions and rules for PHPStan",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpstan/phpstan-symfony/issues",
|
"issues": "https://github.com/phpstan/phpstan-symfony/issues",
|
||||||
"source": "https://github.com/phpstan/phpstan-symfony/tree/1.4.8"
|
"source": "https://github.com/phpstan/phpstan-symfony/tree/1.4.9"
|
||||||
},
|
},
|
||||||
"time": "2024-08-13T19:43:40+00:00"
|
"time": "2024-09-05T16:15:09+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-code-coverage",
|
"name": "phpunit/php-code-coverage",
|
||||||
|
|||||||
@@ -117,10 +117,10 @@ kimai:
|
|||||||
ROLE_SUPER_ADMIN: ['ACTIVITIES','PROJECTS','CUSTOMERS','INVOICE','INVOICE_ADMIN','TIMESHEET','TIMESHEET_OTHER','PROFILE','PROFILE_OTHER','USER','TEAMS','RATE','RATE_OTHER','EXPORT','BILLABLE','TAGS','LOCKDOWN','REPORTING', 'EVERYONE']
|
ROLE_SUPER_ADMIN: ['ACTIVITIES','PROJECTS','CUSTOMERS','INVOICE','INVOICE_ADMIN','TIMESHEET','TIMESHEET_OTHER','PROFILE','PROFILE_OTHER','USER','TEAMS','RATE','RATE_OTHER','EXPORT','BILLABLE','TAGS','LOCKDOWN','REPORTING', 'EVERYONE']
|
||||||
# mapping a "role name" to an array of "permission names"
|
# mapping a "role name" to an array of "permission names"
|
||||||
roles:
|
roles:
|
||||||
ROLE_USER: ['view_team_member','time_team_project','create_tag','view_reporting']
|
ROLE_USER: ['view_team_member','time_team_project','create_tag','view_reporting','hours_own_profile']
|
||||||
ROLE_TEAMLEAD: ['view_rate_own_timesheet','view_rate_other_timesheet','hourly-rate_own_profile','view_team_member','hours_other_profile']
|
ROLE_TEAMLEAD: ['view_rate_own_timesheet','view_rate_other_timesheet','hourly-rate_own_profile','view_team_member','hours_other_profile','hours_own_profile']
|
||||||
ROLE_ADMIN: ['hourly-rate_own_profile','edit_exported_timesheet','teams_own_profile','view_team_member','view_all_data','contract_other_profile','hours_other_profile']
|
ROLE_ADMIN: ['hourly-rate_own_profile','edit_exported_timesheet','teams_own_profile','view_team_member','view_all_data','contract_other_profile','hours_other_profile','hours_own_profile']
|
||||||
ROLE_SUPER_ADMIN: ['hourly-rate_own_profile','hourly-rate_other_profile','roles_own_profile','supervisor_own_profile','system_information','system_configuration','plugins','edit_exported_timesheet','teams_own_profile','view_team_member','upload_invoice_template','view_all_data','contract_other_profile','hours_other_profile']
|
ROLE_SUPER_ADMIN: ['hourly-rate_own_profile','hourly-rate_other_profile','roles_own_profile','supervisor_own_profile','system_information','system_configuration','plugins','edit_exported_timesheet','teams_own_profile','view_team_member','upload_invoice_template','view_all_data','contract_other_profile','hours_other_profile','hours_own_profile']
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ services:
|
|||||||
- '../src/API/Model/'
|
- '../src/API/Model/'
|
||||||
- '../src/DependencyInjection/'
|
- '../src/DependencyInjection/'
|
||||||
- '../src/Entity/'
|
- '../src/Entity/'
|
||||||
|
- '../src/Form/Model/'
|
||||||
- '../src/Repository/Loader/'
|
- '../src/Repository/Loader/'
|
||||||
- '../src/Repository/Paginator/'
|
- '../src/Repository/Paginator/'
|
||||||
- '../src/Repository/Query/'
|
- '../src/Repository/Query/'
|
||||||
|
|||||||
@@ -24,11 +24,15 @@ final class <className> extends AbstractMigration
|
|||||||
|
|
||||||
public function up(Schema $schema): void
|
public function up(Schema $schema): void
|
||||||
{
|
{
|
||||||
|
$this->abortIf(true, 'Migration was auto-generated, adapt to your needs before running it.');
|
||||||
|
|
||||||
<up>
|
<up>
|
||||||
}
|
}
|
||||||
|
|
||||||
public function down(Schema $schema): void
|
public function down(Schema $schema): void
|
||||||
{
|
{
|
||||||
|
$this->abortIf(true, 'Migration was auto-generated, adapt to your needs before running it.');
|
||||||
|
|
||||||
<down>
|
<down>
|
||||||
}<override>
|
}<override>
|
||||||
}
|
}
|
||||||
|
|||||||
35
phpstan.neon
35
phpstan.neon
@@ -154,16 +154,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/API/UserController.php
|
path: src/API/UserController.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Activity\\\\ActivityStatisticService\\:\\:createStatisticQueryBuilder\\(\\) has parameter \\$activities with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Activity/ActivityStatisticService.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Activity\\\\ActivityStatisticService\\:\\:getBudgetStatistic\\(\\) should return array\\<int, App\\\\Model\\\\ActivityStatistic\\> but returns array\\<int\\|string, App\\\\Model\\\\ActivityStatistic\\>\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Activity/ActivityStatisticService.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#2 \\$statistic of class App\\\\Event\\\\ActivityStatisticEvent constructor expects App\\\\Model\\\\ActivityStatistic, App\\\\Model\\\\ActivityStatistic\\|null given\\.$#"
|
message: "#^Parameter \\#2 \\$statistic of class App\\\\Event\\\\ActivityStatisticEvent constructor expects App\\\\Model\\\\ActivityStatistic, App\\\\Model\\\\ActivityStatistic\\|null given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
@@ -2094,36 +2084,11 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Form/DataTransformer/StringToArrayTransformer.php
|
path: src/Form/DataTransformer/StringToArrayTransformer.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Extension\\\\DocumentationLinkExtension\\:\\:buildView\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Extension/DocumentationLinkExtension.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Extension\\\\EnhancedChoiceTypeExtension\\:\\:buildView\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Extension/EnhancedChoiceTypeExtension.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Extension\\\\IconExtension\\:\\:buildView\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Extension/IconExtension.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Cannot call method getName\\(\\) on Symfony\\\\Component\\\\Form\\\\FormInterface\\|null\\.$#"
|
message: "#^Cannot call method getName\\(\\) on Symfony\\\\Component\\\\Form\\\\FormInterface\\|null\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/Form/Extension/SelectWithApiDataExtension.php
|
path: src/Form/Extension/SelectWithApiDataExtension.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Cannot call method getParent\\(\\) on Symfony\\\\Component\\\\Form\\\\FormInterface\\|null\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Extension/SelectWithApiDataExtension.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Extension\\\\SelectWithApiDataExtension\\:\\:buildView\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Extension/SelectWithApiDataExtension.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$name of method Symfony\\\\Component\\\\Routing\\\\Generator\\\\UrlGeneratorInterface\\:\\:generate\\(\\) expects string, mixed given\\.$#"
|
message: "#^Parameter \\#1 \\$name of method Symfony\\\\Component\\\\Routing\\\\Generator\\\\UrlGeneratorInterface\\:\\:generate\\(\\) expects string, mixed given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
public/build/app.3611eec9.js
Normal file
2
public/build/app.3611eec9.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -3,10 +3,10 @@
|
|||||||
"app": {
|
"app": {
|
||||||
"js": [
|
"js": [
|
||||||
"/build/runtime.74179306.js",
|
"/build/runtime.74179306.js",
|
||||||
"/build/app.13d5a0d9.js"
|
"/build/app.3611eec9.js"
|
||||||
],
|
],
|
||||||
"css": [
|
"css": [
|
||||||
"/build/app.a7ba9fd6.css"
|
"/build/app.c4fc7cc8.css"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"app-rtl": {
|
"app-rtl": {
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
"/build/app-rtl.97153087.js"
|
"/build/app-rtl.97153087.js"
|
||||||
],
|
],
|
||||||
"css": [
|
"css": [
|
||||||
"/build/app-rtl.6516df2d.css"
|
"/build/app-rtl.83358c8a.css"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"export-pdf": {
|
"export-pdf": {
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
"calendar": {
|
"calendar": {
|
||||||
"js": [
|
"js": [
|
||||||
"/build/runtime.74179306.js",
|
"/build/runtime.74179306.js",
|
||||||
"/build/calendar.bb629e51.js"
|
"/build/calendar.e52c9d34.js"
|
||||||
],
|
],
|
||||||
"css": [
|
"css": [
|
||||||
"/build/calendar.bb473428.css"
|
"/build/calendar.bb473428.css"
|
||||||
@@ -72,10 +72,10 @@
|
|||||||
},
|
},
|
||||||
"integrity": {
|
"integrity": {
|
||||||
"/build/runtime.74179306.js": "sha384-OC1hTNUXUalKJcvmzrZ0TMCOIwnhxCxgG9dQkbcwR7WcBBCkl2H8bs3giiT2pAwG",
|
"/build/runtime.74179306.js": "sha384-OC1hTNUXUalKJcvmzrZ0TMCOIwnhxCxgG9dQkbcwR7WcBBCkl2H8bs3giiT2pAwG",
|
||||||
"/build/app.13d5a0d9.js": "sha384-1g1GY1GLRW3qbMZV2ZywyP9MR1Z8N65ayJqb+hyV2xyrhzY3JoVPyFF9IWozaEK4",
|
"/build/app.3611eec9.js": "sha384-uBLSZpUnOLWU2TLPGZ0gZDqmiAEa2xrKhWVkHheU+vBjcStIq8ZQg3/iqxLS9Su0",
|
||||||
"/build/app.a7ba9fd6.css": "sha384-GfMYf1vYI9zkkywMoxYk6wpC4UyK185zjDBi16qa0237oztrtOuWdBZsKjWOkyeY",
|
"/build/app.c4fc7cc8.css": "sha384-icbl3mA5CyeJXjF1YzLObStpJHF5qZ5GdqALtvDYN4KPOCqREwGdFWDu27GYkI+U",
|
||||||
"/build/app-rtl.97153087.js": "sha384-jX7jRUAa8rH29Eg8jLIUKGfGcOT6RBz/P90plXmZPadf2CXKUBdcNGrspaejCHkr",
|
"/build/app-rtl.97153087.js": "sha384-jX7jRUAa8rH29Eg8jLIUKGfGcOT6RBz/P90plXmZPadf2CXKUBdcNGrspaejCHkr",
|
||||||
"/build/app-rtl.6516df2d.css": "sha384-5hF5akg98Hnj/bihpbsiTjMyZ3BsAC4+Z1kzqi1O3/U+tgpnQ+JmwsOADDpMld6d",
|
"/build/app-rtl.83358c8a.css": "sha384-eKnlBDnocNJ68nIc2l4AWCLn3oUEEbsRJoZ1TUP3mii+ToGt9xs08ih8wEmvO+Dq",
|
||||||
"/build/export-pdf.1442bee7.js": "sha384-C6agvjJnQUsMCxaZ/J7dUZU3cpC7uHKI9ZtnfGpRqYbjyw91YLy1oV3iNYgwYyCF",
|
"/build/export-pdf.1442bee7.js": "sha384-C6agvjJnQUsMCxaZ/J7dUZU3cpC7uHKI9ZtnfGpRqYbjyw91YLy1oV3iNYgwYyCF",
|
||||||
"/build/export-pdf.d8a6c23b.css": "sha384-ztepocHE4rnGE9eKZ4kL6jTKaePUyiwiB9TjJjstjpf/ckcKg1HedrEOOk/8ElJg",
|
"/build/export-pdf.d8a6c23b.css": "sha384-ztepocHE4rnGE9eKZ4kL6jTKaePUyiwiB9TjJjstjpf/ckcKg1HedrEOOk/8ElJg",
|
||||||
"/build/invoice.7ef8a0c8.js": "sha384-z4lZ1Ig3+NPigrRyGPZoff0gG3n5PnCjaDJ73ATnzdUYk0lOCEtNV9fg35VRD0vG",
|
"/build/invoice.7ef8a0c8.js": "sha384-z4lZ1Ig3+NPigrRyGPZoff0gG3n5PnCjaDJ73ATnzdUYk0lOCEtNV9fg35VRD0vG",
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
"/build/invoice-pdf.6091a528.js": "sha384-yJz/MDBgBpNHNxF7DuSyFbJN9EL7oDJjraoPRB7VYlHMdb1T0ZfTcI0L8VMDB46U",
|
"/build/invoice-pdf.6091a528.js": "sha384-yJz/MDBgBpNHNxF7DuSyFbJN9EL7oDJjraoPRB7VYlHMdb1T0ZfTcI0L8VMDB46U",
|
||||||
"/build/invoice-pdf.2b749265.css": "sha384-DXXgkz2WWnrWnfBnXX5fmfPQSPb98upMnWxYKwTGYS04EhrPIWfDCutB2unIrWh7",
|
"/build/invoice-pdf.2b749265.css": "sha384-DXXgkz2WWnrWnfBnXX5fmfPQSPb98upMnWxYKwTGYS04EhrPIWfDCutB2unIrWh7",
|
||||||
"/build/chart.80ee190c.js": "sha384-KrQszq859PR0u+KHpGy+RO6K1rcMqCFZx+sNiLVNVZHwEi7RwTXqnYbu8zvfWzUI",
|
"/build/chart.80ee190c.js": "sha384-KrQszq859PR0u+KHpGy+RO6K1rcMqCFZx+sNiLVNVZHwEi7RwTXqnYbu8zvfWzUI",
|
||||||
"/build/calendar.bb629e51.js": "sha384-uihkC7VSrD8l4gSiveJxM2g8dLFCR9+VQwVmcIb2LlNmA2PKDQ/uV0TN5gzmgpo+",
|
"/build/calendar.e52c9d34.js": "sha384-a6P/nyvUkmPZglNqIfSKEyon791oFKB2+zgfUZHpy1awKi/FBchr5TqeRYupRDQn",
|
||||||
"/build/calendar.bb473428.css": "sha384-900W9o8666Qpw21rLP7hn5Ql8tWd40k0IcE3QpFm7E7V6bKva7xQgGlyzVuuh4GK",
|
"/build/calendar.bb473428.css": "sha384-900W9o8666Qpw21rLP7hn5Ql8tWd40k0IcE3QpFm7E7V6bKva7xQgGlyzVuuh4GK",
|
||||||
"/build/dashboard.10118fb0.js": "sha384-pasZR1GYf8/7lMFS9OrsxX8nJ9tSlRYr32fWKUhGoF2mNAGrokLEWdgtbYMRHgFB",
|
"/build/dashboard.10118fb0.js": "sha384-pasZR1GYf8/7lMFS9OrsxX8nJ9tSlRYr32fWKUhGoF2mNAGrokLEWdgtbYMRHgFB",
|
||||||
"/build/dashboard.18f5a8b7.css": "sha384-PBD8ftb2yBoSjRe2sN5Xb4dEz045kOEUfcIufdSis+tWoWdAx5j4Yic+F/6CYbrP"
|
"/build/dashboard.18f5a8b7.css": "sha384-PBD8ftb2yBoSjRe2sN5Xb4dEz045kOEUfcIufdSis+tWoWdAx5j4Yic+F/6CYbrP"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"build/app.css": "/build/app.a7ba9fd6.css",
|
"build/app.css": "/build/app.c4fc7cc8.css",
|
||||||
"build/app.js": "/build/app.13d5a0d9.js",
|
"build/app.js": "/build/app.3611eec9.js",
|
||||||
"build/app-rtl.css": "/build/app-rtl.6516df2d.css",
|
"build/app-rtl.css": "/build/app-rtl.83358c8a.css",
|
||||||
"build/app-rtl.js": "/build/app-rtl.97153087.js",
|
"build/app-rtl.js": "/build/app-rtl.97153087.js",
|
||||||
"build/export-pdf.css": "/build/export-pdf.d8a6c23b.css",
|
"build/export-pdf.css": "/build/export-pdf.d8a6c23b.css",
|
||||||
"build/export-pdf.js": "/build/export-pdf.1442bee7.js",
|
"build/export-pdf.js": "/build/export-pdf.1442bee7.js",
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
"build/invoice-pdf.js": "/build/invoice-pdf.6091a528.js",
|
"build/invoice-pdf.js": "/build/invoice-pdf.6091a528.js",
|
||||||
"build/chart.js": "/build/chart.80ee190c.js",
|
"build/chart.js": "/build/chart.80ee190c.js",
|
||||||
"build/calendar.css": "/build/calendar.bb473428.css",
|
"build/calendar.css": "/build/calendar.bb473428.css",
|
||||||
"build/calendar.js": "/build/calendar.bb629e51.js",
|
"build/calendar.js": "/build/calendar.e52c9d34.js",
|
||||||
"build/dashboard.css": "/build/dashboard.18f5a8b7.css",
|
"build/dashboard.css": "/build/dashboard.18f5a8b7.css",
|
||||||
"build/dashboard.js": "/build/dashboard.10118fb0.js",
|
"build/dashboard.js": "/build/dashboard.10118fb0.js",
|
||||||
"build/runtime.js": "/build/runtime.74179306.js",
|
"build/runtime.js": "/build/runtime.74179306.js",
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ class ActivityStatisticService
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Activity[] $activities
|
* @param Activity[] $activities
|
||||||
* @return array<int, ActivityStatistic>
|
* @return array<int|string, ActivityStatistic>
|
||||||
*/
|
*/
|
||||||
private function getBudgetStatistic(array $activities, ?DateTimeInterface $begin = null, ?DateTimeInterface $end = null): array
|
private function getBudgetStatistic(array $activities, ?DateTimeInterface $begin = null, ?DateTimeInterface $end = null): array
|
||||||
{
|
{
|
||||||
@@ -159,6 +159,9 @@ class ActivityStatisticService
|
|||||||
return $statistics;
|
return $statistics;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Activity[] $activities
|
||||||
|
*/
|
||||||
private function createStatisticQueryBuilder(array $activities, \DateTimeInterface $begin = null, ?\DateTimeInterface $end = null): QueryBuilder
|
private function createStatisticQueryBuilder(array $activities, \DateTimeInterface $begin = null, ?\DateTimeInterface $end = null): QueryBuilder
|
||||||
{
|
{
|
||||||
$qb = $this->timesheetRepository->createQueryBuilder('t');
|
$qb = $this->timesheetRepository->createQueryBuilder('t');
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ class Constants
|
|||||||
/**
|
/**
|
||||||
* The current release version
|
* The current release version
|
||||||
*/
|
*/
|
||||||
public const VERSION = '2.21.0';
|
public const VERSION = '2.22.0';
|
||||||
/**
|
/**
|
||||||
* The current release: major * 10000 + minor * 100 + patch
|
* The current release: major * 10000 + minor * 100 + patch
|
||||||
*/
|
*/
|
||||||
public const VERSION_ID = 22100;
|
public const VERSION_ID = 22200;
|
||||||
/**
|
/**
|
||||||
* The software name
|
* The software name
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ final class ContractController extends AbstractController
|
|||||||
|
|
||||||
/** @var User $profile */
|
/** @var User $profile */
|
||||||
$profile = $values->getUser();
|
$profile = $values->getUser();
|
||||||
if ($this->getUser() !== $profile && !$canChangeUser) {
|
if (!$this->isGranted('hours', $profile)) {
|
||||||
throw $this->createAccessDeniedException('Cannot access user contract settings');
|
throw $this->createAccessDeniedException('Cannot access user contract settings');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,9 +79,10 @@ final class ContractController extends AbstractController
|
|||||||
|
|
||||||
$boxConfiguration = new BoxConfiguration();
|
$boxConfiguration = new BoxConfiguration();
|
||||||
$boxConfiguration->setDecimal(false);
|
$boxConfiguration->setDecimal(false);
|
||||||
$boxConfiguration->setCollapsed($profile->hasWorkHourConfiguration() && $summary->count() > 0);
|
$boxConfiguration->setCollapsed($summary->count() > 0);
|
||||||
|
|
||||||
return $this->render('contract/status.html.twig', [
|
return $this->render('contract/status.html.twig', [
|
||||||
|
'withWorkHourConfiguration' => $profile->hasWorkHourConfiguration(),
|
||||||
'box_configuration' => $boxConfiguration,
|
'box_configuration' => $boxConfiguration,
|
||||||
'page_setup' => $page,
|
'page_setup' => $page,
|
||||||
'decimal' => $boxConfiguration->isDecimal(),
|
'decimal' => $boxConfiguration->isDecimal(),
|
||||||
|
|||||||
@@ -61,9 +61,8 @@ final class TeamController extends AbstractController
|
|||||||
$table->setReloadEvents('kimai.teamUpdate');
|
$table->setReloadEvents('kimai.teamUpdate');
|
||||||
|
|
||||||
$table->addColumn('name', ['class' => 'alwaysVisible']);
|
$table->addColumn('name', ['class' => 'alwaysVisible']);
|
||||||
$table->addColumn('teamlead', ['class' => 'd-none badges', 'orderBy' => false]);
|
$table->addColumn('avatar', ['title' => 'team.member', 'translation_domain' => 'teams', 'class' => 'd-none d-sm-table-cell avatars avatar-list avatar-list-stacked', 'orderBy' => false]);
|
||||||
$table->addColumn('teamlead_avatar', ['title' => 'team.member', 'translation_domain' => 'teams', 'class' => 'd-none d-lg-table-cell avatars avatar-list avatar-list-stacked', 'orderBy' => false]);
|
$table->addColumn('amount', ['title' => 'amount', 'class' => 'd-sm-none text-center', 'orderBy' => false]);
|
||||||
$table->addColumn('user', ['class' => 'd-none badges', 'orderBy' => false, 'title' => 'user']);
|
|
||||||
$table->addColumn('actions', ['class' => 'actions']);
|
$table->addColumn('actions', ['class' => 'actions']);
|
||||||
|
|
||||||
$page = new PageSetup('teams');
|
$page = new PageSetup('teams');
|
||||||
|
|||||||
@@ -1117,9 +1117,7 @@ class User implements UserInterface, EquatableInterface, ThemeUserInterface, Pas
|
|||||||
$initial = mb_substr($initial, 0, $length, 'UTF-8');
|
$initial = mb_substr($initial, 0, $length, 'UTF-8');
|
||||||
}
|
}
|
||||||
|
|
||||||
$initial = mb_strtoupper($initial);
|
return mb_strtoupper($initial);
|
||||||
|
|
||||||
return $initial;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAccountNumber(): ?string
|
public function getAccountNumber(): ?string
|
||||||
|
|||||||
@@ -71,6 +71,9 @@ final class ConfigureMainMenuEvent extends Event
|
|||||||
return $this->menu->getChild('reporting');
|
return $this->menu->getChild('reporting');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated since 2.22 - use getMenu() or getAdminMenu() instead
|
||||||
|
*/
|
||||||
public function getAppsMenu(): MenuItemModel
|
public function getAppsMenu(): MenuItemModel
|
||||||
{
|
{
|
||||||
return $this->apps;
|
return $this->apps;
|
||||||
|
|||||||
@@ -17,7 +17,11 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
|
|||||||
|
|
||||||
final class UserSubscriber extends AbstractActionsSubscriber
|
final class UserSubscriber extends AbstractActionsSubscriber
|
||||||
{
|
{
|
||||||
public function __construct(AuthorizationCheckerInterface $auth, UrlGeneratorInterface $urlGenerator, private EventDispatcherInterface $eventDispatcher)
|
public function __construct(
|
||||||
|
AuthorizationCheckerInterface $auth,
|
||||||
|
UrlGeneratorInterface $urlGenerator,
|
||||||
|
private readonly EventDispatcherInterface $eventDispatcher
|
||||||
|
)
|
||||||
{
|
{
|
||||||
parent::__construct($auth, $urlGenerator);
|
parent::__construct($auth, $urlGenerator);
|
||||||
}
|
}
|
||||||
@@ -47,6 +51,10 @@ final class UserSubscriber extends AbstractActionsSubscriber
|
|||||||
$event->addActionToSubmenu('edit', $id, $action);
|
$event->addActionToSubmenu('edit', $id, $action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->isGranted('hours', $user)) {
|
||||||
|
$event->addActionToSubmenu('report', 'work_times', ['url' => $this->path('user_contract', ['user' => $user->getId()]), 'title' => 'work_times']);
|
||||||
|
}
|
||||||
|
|
||||||
if (($event->getUser()->getId() === $user->getId() && $this->isGranted('report:user')) || $this->isGranted('report:other')) {
|
if (($event->getUser()->getId() === $user->getId() && $this->isGranted('report:user')) || $this->isGranted('report:other')) {
|
||||||
$event->addActionToSubmenu('report', 'weekly', ['url' => $this->path('report_user_week', ['user' => $user->getId()]), 'translation_domain' => 'reporting', 'title' => 'report_user_week']);
|
$event->addActionToSubmenu('report', 'weekly', ['url' => $this->path('report_user_week', ['user' => $user->getId()]), 'translation_domain' => 'reporting', 'title' => 'report_user_week']);
|
||||||
$event->addActionToSubmenu('report', 'monthly', ['url' => $this->path('report_user_month', ['user' => $user->getId()]), 'translation_domain' => 'reporting', 'title' => 'report_user_month']);
|
$event->addActionToSubmenu('report', 'monthly', ['url' => $this->path('report_user_month', ['user' => $user->getId()]), 'translation_domain' => 'reporting', 'title' => 'report_user_month']);
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ final class MenuBuilderSubscriber implements EventSubscriberInterface
|
|||||||
$event->addItem($child);
|
$event->addItem($child);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($menuEvent->getAppsMenu()->hasChildren()) {
|
if ($menuEvent->getAppsMenu()->hasChildren()) { // @phpstan-ignore-line
|
||||||
$event->addItem($menuEvent->getAppsMenu());
|
$event->addItem($menuEvent->getAppsMenu()); // @phpstan-ignore-line
|
||||||
}
|
}
|
||||||
if ($menuEvent->getAdminMenu()->hasChildren()) {
|
if ($menuEvent->getAdminMenu()->hasChildren()) {
|
||||||
$event->addItem($menuEvent->getAdminMenu());
|
$event->addItem($menuEvent->getAdminMenu());
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ final class MenuSubscriber implements EventSubscriberInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
$contract = new MenuItemModel('contract', 'work_contract', null, [], 'contract');
|
$contract = new MenuItemModel('contract', 'work_contract', null, [], 'contract');
|
||||||
if ($user->hasContractSettings() || $auth->isGranted('hours_other_profile')) {
|
if ($auth->isGranted('hours', $user)) {
|
||||||
$contract->addChild(new MenuItemModel('contract_status', 'work_times', 'user_contract', [], 'work_times'));
|
$contract->addChild(new MenuItemModel('contract_status', 'work_times', 'user_contract', [], 'work_times'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,19 +25,11 @@ final class DocumentationLinkExtension extends AbstractTypeExtension
|
|||||||
return [FormType::class];
|
return [FormType::class];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param FormView $view
|
|
||||||
* @param FormInterface $form
|
|
||||||
* @param array $options
|
|
||||||
*/
|
|
||||||
public function buildView(FormView $view, FormInterface $form, array $options): void
|
public function buildView(FormView $view, FormInterface $form, array $options): void
|
||||||
{
|
{
|
||||||
$view->vars['docu_chapter'] = $options['docu_chapter'] ?? null;
|
$view->vars['docu_chapter'] = $options['docu_chapter'] ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param OptionsResolver $resolver
|
|
||||||
*/
|
|
||||||
public function configureOptions(OptionsResolver $resolver): void
|
public function configureOptions(OptionsResolver $resolver): void
|
||||||
{
|
{
|
||||||
$resolver->setDefined(['docu_chapter']);
|
$resolver->setDefined(['docu_chapter']);
|
||||||
|
|||||||
@@ -26,11 +26,6 @@ final class EnhancedChoiceTypeExtension extends AbstractTypeExtension
|
|||||||
return [EntityType::class, ChoiceType::class];
|
return [EntityType::class, ChoiceType::class];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param FormView $view
|
|
||||||
* @param FormInterface $form
|
|
||||||
* @param array $options
|
|
||||||
*/
|
|
||||||
public function buildView(FormView $view, FormInterface $form, array $options): void
|
public function buildView(FormView $view, FormInterface $form, array $options): void
|
||||||
{
|
{
|
||||||
if (isset($options['selectpicker']) && false === $options['selectpicker']) {
|
if (isset($options['selectpicker']) && false === $options['selectpicker']) {
|
||||||
@@ -59,7 +54,7 @@ final class EnhancedChoiceTypeExtension extends AbstractTypeExtension
|
|||||||
|
|
||||||
// there is a very weird logic in vendor/symfony/twig-bridge/Resources/views/Form/form_div_layout.html.twig
|
// there is a very weird logic in vendor/symfony/twig-bridge/Resources/views/Form/form_div_layout.html.twig
|
||||||
// in block "block choice_widget_collapsed" that resets "{% set required = false %}", so we fake it into the select
|
// in block "block choice_widget_collapsed" that resets "{% set required = false %}", so we fake it into the select
|
||||||
if (true === $options['required'] && (!\array_key_exists('size', $options['attr']) || $options['attr']['size'] <= 1)) {
|
if (true === $options['required'] && \is_array($options['attr']) && (!\array_key_exists('size', $options['attr']) || $options['attr']['size'] <= 1)) {
|
||||||
$extendedOptions['required'] = 'required';
|
$extendedOptions['required'] = 'required';
|
||||||
$extendedOptions['placeholder'] = '';
|
$extendedOptions['placeholder'] = '';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,11 +25,6 @@ final class IconExtension extends AbstractTypeExtension
|
|||||||
return [TextType::class];
|
return [TextType::class];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param FormView $view
|
|
||||||
* @param FormInterface $form
|
|
||||||
* @param array $options
|
|
||||||
*/
|
|
||||||
public function buildView(FormView $view, FormInterface $form, array $options): void
|
public function buildView(FormView $view, FormInterface $form, array $options): void
|
||||||
{
|
{
|
||||||
$view->vars['icon'] = $options['icon'] ?? null;
|
$view->vars['icon'] = $options['icon'] ?? null;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
|||||||
*/
|
*/
|
||||||
final class SelectWithApiDataExtension extends AbstractTypeExtension
|
final class SelectWithApiDataExtension extends AbstractTypeExtension
|
||||||
{
|
{
|
||||||
public function __construct(private UrlGeneratorInterface $router)
|
public function __construct(private readonly UrlGeneratorInterface $router)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,11 +30,6 @@ final class SelectWithApiDataExtension extends AbstractTypeExtension
|
|||||||
return [EntityType::class];
|
return [EntityType::class];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param FormView $view
|
|
||||||
* @param FormInterface $form
|
|
||||||
* @param array $options
|
|
||||||
*/
|
|
||||||
public function buildView(FormView $view, FormInterface $form, array $options): void
|
public function buildView(FormView $view, FormInterface $form, array $options): void
|
||||||
{
|
{
|
||||||
if (!isset($options['api_data'])) {
|
if (!isset($options['api_data'])) {
|
||||||
@@ -69,7 +64,7 @@ final class SelectWithApiDataExtension extends AbstractTypeExtension
|
|||||||
$parent = $form->getParent();
|
$parent = $form->getParent();
|
||||||
do {
|
do {
|
||||||
$formPrefixes[] = $parent->getName();
|
$formPrefixes[] = $parent->getName();
|
||||||
} while (($parent = $parent->getParent()) !== null);
|
} while (($parent = $parent?->getParent()) !== null);
|
||||||
|
|
||||||
$formPrefix = implode('_', array_reverse($formPrefixes));
|
$formPrefix = implode('_', array_reverse($formPrefixes));
|
||||||
$formField = $apiData['select'];
|
$formField = $apiData['select'];
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ final class MenuChoiceType extends AbstractType
|
|||||||
$this->eventDispatcher->dispatch($event);
|
$this->eventDispatcher->dispatch($event);
|
||||||
|
|
||||||
$choices = $this->getChoicesFromMenu($event->getMenu(), $filter);
|
$choices = $this->getChoicesFromMenu($event->getMenu(), $filter);
|
||||||
$choices += $this->getChoicesFromMenu($event->getAppsMenu(), $filter);
|
$choices += $this->getChoicesFromMenu($event->getAppsMenu(), $filter); // @phpstan-ignore-line
|
||||||
$choices += $this->getChoicesFromMenu($event->getAdminMenu(), $filter);
|
$choices += $this->getChoicesFromMenu($event->getAdminMenu(), $filter);
|
||||||
$choices += $this->getChoicesFromMenu($event->getSystemMenu(), $filter);
|
$choices += $this->getChoicesFromMenu($event->getSystemMenu(), $filter);
|
||||||
|
|
||||||
|
|||||||
@@ -82,12 +82,14 @@ final class ActivityLoader implements LoaderInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
// required on "Activity listing" page for non super-admins
|
// required on "Activity listing" page for non super-admins
|
||||||
$qb = $em->createQueryBuilder();
|
if (\count($activityIds) > 0) {
|
||||||
$qb->select('PARTIAL a.{id}', 'teams')
|
$qb = $em->createQueryBuilder();
|
||||||
->from(Activity::class, 'a')
|
$qb->select('PARTIAL a.{id}', 'teams')
|
||||||
->leftJoin('a.teams', 'teams')
|
->from(Activity::class, 'a')
|
||||||
->andWhere($qb->expr()->in('a.id', $activityIds))
|
->leftJoin('a.teams', 'teams')
|
||||||
->getQuery()
|
->andWhere($qb->expr()->in('a.id', $activityIds))
|
||||||
->execute();
|
->getQuery()
|
||||||
|
->execute();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,13 +66,15 @@ final class CustomerLoader implements LoaderInterface
|
|||||||
$em = $this->entityManager;
|
$em = $this->entityManager;
|
||||||
|
|
||||||
// required where we need to check team permissions, e.g. "Customer listing"
|
// required where we need to check team permissions, e.g. "Customer listing"
|
||||||
$qb = $em->createQueryBuilder();
|
if (\count($customerIds) > 0) {
|
||||||
$qb->select('PARTIAL c.{id}', 'teams')
|
$qb = $em->createQueryBuilder();
|
||||||
->from(Customer::class, 'c')
|
$qb->select('PARTIAL c.{id}', 'teams')
|
||||||
->leftJoin('c.teams', 'teams')
|
->from(Customer::class, 'c')
|
||||||
->andWhere($qb->expr()->in('c.id', $customerIds))
|
->leftJoin('c.teams', 'teams')
|
||||||
->getQuery()
|
->andWhere($qb->expr()->in('c.id', $customerIds))
|
||||||
->execute();
|
->getQuery()
|
||||||
|
->execute();
|
||||||
|
}
|
||||||
|
|
||||||
// do not load team members or leads by default, because they will only be used on detail pages
|
// do not load team members or leads by default, because they will only be used on detail pages
|
||||||
if ($hydrateTeamMembers) {
|
if ($hydrateTeamMembers) {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ final class ProjectLoader implements LoaderInterface
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @var array<int> $projectIds */
|
||||||
$projectIds = array_filter(array_unique(array_map(function (Project $project) {
|
$projectIds = array_filter(array_unique(array_map(function (Project $project) {
|
||||||
// make sure that this potential doctrine proxy is initialized and filled with all data
|
// make sure that this potential doctrine proxy is initialized and filled with all data
|
||||||
$project->getName();
|
$project->getName();
|
||||||
@@ -48,7 +49,7 @@ final class ProjectLoader implements LoaderInterface
|
|||||||
|
|
||||||
$em = $this->entityManager;
|
$em = $this->entityManager;
|
||||||
|
|
||||||
if ($this->hydrateTeams) {
|
if ($this->hydrateTeams && \count($projectIds) > 0) {
|
||||||
$customerIds = array_filter(array_unique(array_map(function (Project $project) {
|
$customerIds = array_filter(array_unique(array_map(function (Project $project) {
|
||||||
return $project->getCustomer()->getId();
|
return $project->getCustomer()->getId();
|
||||||
}, $results)), function ($value) { return $value !== null; });
|
}, $results)), function ($value) { return $value !== null; });
|
||||||
@@ -61,13 +62,15 @@ final class ProjectLoader implements LoaderInterface
|
|||||||
->getQuery()
|
->getQuery()
|
||||||
->execute();
|
->execute();
|
||||||
|
|
||||||
$qb = $em->createQueryBuilder();
|
if (\count($customerIds) > 0) {
|
||||||
$qb->select('PARTIAL customer.{id}', 'teams')
|
$qb = $em->createQueryBuilder();
|
||||||
->from(Customer::class, 'customer')
|
$qb->select('PARTIAL customer.{id}', 'teams')
|
||||||
->leftJoin('customer.teams', 'teams')
|
->from(Customer::class, 'customer')
|
||||||
->andWhere($qb->expr()->in('customer.id', $customerIds))
|
->leftJoin('customer.teams', 'teams')
|
||||||
->getQuery()
|
->andWhere($qb->expr()->in('customer.id', $customerIds))
|
||||||
->execute();
|
->getQuery()
|
||||||
|
->execute();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// do not load team members or leads by default, because they will only be used on detail pages
|
// do not load team members or leads by default, because they will only be used on detail pages
|
||||||
|
|||||||
@@ -45,24 +45,26 @@ final class TeamLoader implements LoaderInterface
|
|||||||
$em = $this->entityManager;
|
$em = $this->entityManager;
|
||||||
|
|
||||||
// required wherever users are shown, e.g. on "Custom details" page
|
// required wherever users are shown, e.g. on "Custom details" page
|
||||||
$qb = $em->createQueryBuilder();
|
if (\count($teamIds) > 0) {
|
||||||
$qb->select('PARTIAL team.{id}', 'members', 'user')
|
$qb = $em->createQueryBuilder();
|
||||||
->from(Team::class, 'team')
|
$qb->select('PARTIAL team.{id}', 'members', 'user')
|
||||||
->leftJoin('team.members', 'members')
|
->from(Team::class, 'team')
|
||||||
->leftJoin('members.user', 'user')
|
->leftJoin('team.members', 'members')
|
||||||
->andWhere($qb->expr()->in('team.id', $teamIds))
|
->leftJoin('members.user', 'user')
|
||||||
->getQuery()
|
->andWhere($qb->expr()->in('team.id', $teamIds))
|
||||||
->execute();
|
->getQuery()
|
||||||
|
->execute();
|
||||||
|
|
||||||
// used in UserTeamProjects widget
|
// used in UserTeamProjects widget
|
||||||
$qb = $em->createQueryBuilder();
|
$qb = $em->createQueryBuilder();
|
||||||
/** @var array<Team> $teams */
|
/** @var array<Team> $teams */
|
||||||
$teams = $qb->select('PARTIAL team.{id}', 'projects')
|
$teams = $qb->select('PARTIAL team.{id}', 'projects')
|
||||||
->from(Team::class, 'team')
|
->from(Team::class, 'team')
|
||||||
->leftJoin('team.projects', 'projects')
|
->leftJoin('team.projects', 'projects')
|
||||||
->andWhere($qb->expr()->in('team.id', $teamIds))
|
->andWhere($qb->expr()->in('team.id', $teamIds))
|
||||||
->getQuery()
|
->getQuery()
|
||||||
->execute();
|
->execute();
|
||||||
|
}
|
||||||
|
|
||||||
$projectIds = [];
|
$projectIds = [];
|
||||||
foreach ($results as $team) {
|
foreach ($results as $team) {
|
||||||
@@ -71,7 +73,7 @@ final class TeamLoader implements LoaderInterface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->loadCustomer) {
|
if ($this->loadCustomer && \count($projectIds) > 0) {
|
||||||
// used in UserTeamProjects widget
|
// used in UserTeamProjects widget
|
||||||
$qb = $em->createQueryBuilder();
|
$qb = $em->createQueryBuilder();
|
||||||
$qb->select('PARTIAL project.{id}', 'customer')
|
$qb->select('PARTIAL project.{id}', 'customer')
|
||||||
|
|||||||
@@ -135,8 +135,9 @@ class TagRepository extends EntityRepository
|
|||||||
$qb1 = $this->getEntityManager()->createQueryBuilder();
|
$qb1 = $this->getEntityManager()->createQueryBuilder();
|
||||||
$qb1->from(Timesheet::class, 't')->select('COUNT(tags)')->innerJoin('t.tags', 'tags')->where('tags.id = tag.id');
|
$qb1->from(Timesheet::class, 't')->select('COUNT(tags)')->innerJoin('t.tags', 'tags')->where('tags.id = tag.id');
|
||||||
|
|
||||||
|
$dql = $qb1->getDQL(); // see https://github.com/phpstan/phpstan-doctrine/issues/606
|
||||||
$qb->select('tag.id, tag.name, tag.color, tag.visible');
|
$qb->select('tag.id, tag.name, tag.color, tag.visible');
|
||||||
$qb->addSelect('(' . $qb1->getDQL() . ') as amount');
|
$qb->addSelect('(' . $dql . ') as amount');
|
||||||
|
|
||||||
$orderBy = $query->getOrderBy();
|
$orderBy = $query->getOrderBy();
|
||||||
$orderBy = match ($orderBy) {
|
$orderBy = match ($orderBy) {
|
||||||
|
|||||||
@@ -19,11 +19,7 @@ final class Util
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the rate for a hourly rate and a given duration in seconds.
|
* Calculates the rate by an hourly rate and a given duration in seconds.
|
||||||
*
|
|
||||||
* @param float $hourlyRate
|
|
||||||
* @param int $seconds
|
|
||||||
* @return float
|
|
||||||
*/
|
*/
|
||||||
public static function calculateRate(float $hourlyRate, int $seconds): float
|
public static function calculateRate(float $hourlyRate, int $seconds): float
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ use App\Utils\JavascriptFormatConverter;
|
|||||||
use App\Utils\LocaleFormatter;
|
use App\Utils\LocaleFormatter;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use DateTimeInterface;
|
use DateTimeInterface;
|
||||||
use Symfony\Bundle\SecurityBundle\Security;
|
|
||||||
use Symfony\Contracts\Translation\LocaleAwareInterface;
|
use Symfony\Contracts\Translation\LocaleAwareInterface;
|
||||||
use Twig\Extension\AbstractExtension;
|
use Twig\Extension\AbstractExtension;
|
||||||
use Twig\TwigFilter;
|
use Twig\TwigFilter;
|
||||||
@@ -30,7 +29,7 @@ final class LocaleFormatExtensions extends AbstractExtension implements LocaleAw
|
|||||||
private ?LocaleFormatter $formatter = null;
|
private ?LocaleFormatter $formatter = null;
|
||||||
private ?string $locale = null;
|
private ?string $locale = null;
|
||||||
|
|
||||||
public function __construct(private LocaleService $localeService, private Security $security)
|
public function __construct(private readonly LocaleService $localeService)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +110,7 @@ final class LocaleFormatExtensions extends AbstractExtension implements LocaleAw
|
|||||||
return $this->locale;
|
return $this->locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function isWeekend(\DateTimeInterface|string|null $dateTime, ?User $user = null): bool
|
public function isWeekend(\DateTimeInterface|string|null $dateTime): bool
|
||||||
{
|
{
|
||||||
if (!$dateTime instanceof \DateTimeInterface) {
|
if (!$dateTime instanceof \DateTimeInterface) {
|
||||||
return false;
|
return false;
|
||||||
@@ -119,12 +118,6 @@ final class LocaleFormatExtensions extends AbstractExtension implements LocaleAw
|
|||||||
|
|
||||||
$day = (int) $dateTime->format('N');
|
$day = (int) $dateTime->format('N');
|
||||||
|
|
||||||
/** @var User|null $tmp */
|
|
||||||
$tmp = $user ?? $this->security->getUser();
|
|
||||||
if ($tmp !== null && $tmp->hasWorkHourConfiguration()) {
|
|
||||||
return !$tmp->isWorkDay($dateTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ($day === 6 || $day === 7);
|
return ($day === 6 || $day === 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,10 +74,6 @@ final class UserVoter extends Voter
|
|||||||
return $this->permissionManager->hasRolePermission($user, 'contract_other_profile');
|
return $this->permissionManager->hasRolePermission($user, 'contract_other_profile');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($attribute === 'hours') {
|
|
||||||
return $this->permissionManager->hasRolePermission($user, 'hours_other_profile');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($attribute === 'access_user') {
|
if ($attribute === 'access_user') {
|
||||||
return $user->canSeeUser($subject);
|
return $user->canSeeUser($subject);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
|
|
||||||
{% block main %}
|
{% block main %}
|
||||||
|
|
||||||
{% set withWorkHourConfiguration = user.hasWorkHourConfiguration() %}
|
|
||||||
|
|
||||||
{% if not withWorkHourConfiguration %}
|
{% if not withWorkHourConfiguration %}
|
||||||
{% set warningMsg %}
|
{% set warningMsg %}
|
||||||
{{ 'work_times_should.none_configured'|trans }}
|
{{ 'work_times_should.none_configured'|trans }}
|
||||||
@@ -127,8 +125,8 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<th>{{ 'month'|trans }}</th>
|
<th>{{ 'month'|trans }}</th>
|
||||||
<th class="text-end total">{{ 'sum.total'|trans }}</th>
|
<th class="text-end total">{{ 'sum.total'|trans }}</th>
|
||||||
<th class="text-end">{{ 'work_times_should'|trans }}</th>
|
<th class="text-end hw-min">{{ 'work_times_should'|trans }}</th>
|
||||||
<th class="text-end">{{ 'work_times_is'|trans }}</th>
|
<th class="text-end hw-min">{{ 'work_times_is'|trans }}</th>
|
||||||
{% for day in 1..31 %}
|
{% for day in 1..31 %}
|
||||||
<th class="text-end contractDay">{% if day < 10 %}0{% endif %}{{ day }}</th>
|
<th class="text-end contractDay">{% if day < 10 %}0{% endif %}{{ day }}</th>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@@ -167,7 +165,7 @@
|
|||||||
{% set dayCount = 0 %}
|
{% set dayCount = 0 %}
|
||||||
{% for day in month.days %}
|
{% for day in month.days %}
|
||||||
{% set class = 'text-end contractDay text-nowrap' %}
|
{% set class = 'text-end contractDay text-nowrap' %}
|
||||||
{% if day.day is weekend(user) %}
|
{% if day.workingTime.expectedTime == 0 %}
|
||||||
{% set class = class ~ ' weekend' %}
|
{% set class = class ~ ' weekend' %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if day.workingTime.expectedTime > 0 and day.workingTime.actualTime == 0 and now > day.day %}
|
{% if day.workingTime.expectedTime > 0 and day.workingTime.actualTime == 0 and now > day.day %}
|
||||||
@@ -230,51 +228,6 @@
|
|||||||
{% endembed %}
|
{% endembed %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if withWorkHourConfiguration %}
|
|
||||||
{% set expectedWeekTimes = user.workHoursMonday + user.workHoursTuesday + user.workHoursWednesday + user.workHoursThursday + user.workHoursFriday + user.workHoursSaturday + user.workHoursSunday %}
|
|
||||||
|
|
||||||
{% embed '@theme/embeds/collapsible.html.twig' with {id: 'work_contract_should_preview', border: false, item: {options: {bodyExtraClass: 'border-top'}}} %}
|
|
||||||
{% from "macros/status.html.twig" import status_duration %}
|
|
||||||
{% block title %}
|
|
||||||
{{ 'work_times_should'|trans }}
|
|
||||||
|
|
||||||
{{ status_duration(expectedWeekTimes|duration) }}
|
|
||||||
{% endblock %}
|
|
||||||
{% block body %}
|
|
||||||
<div class="datagrid">
|
|
||||||
<div class="datagrid-item">
|
|
||||||
<div class="datagrid-title">{{ 'Monday'|trans({}, 'system-configuration') }}</div>
|
|
||||||
<div class="datagrid-content">{{ user.workHoursMonday|duration }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="datagrid-item">
|
|
||||||
<div class="datagrid-title">{{ 'Tuesday'|trans({}, 'system-configuration') }}</div>
|
|
||||||
<div class="datagrid-content">{{ user.workHoursTuesday|duration }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="datagrid-item">
|
|
||||||
<div class="datagrid-title">{{ 'Wednesday'|trans({}, 'system-configuration') }}</div>
|
|
||||||
<div class="datagrid-content">{{ user.workHoursWednesday|duration }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="datagrid-item">
|
|
||||||
<div class="datagrid-title">{{ 'Thursday'|trans({}, 'system-configuration') }}</div>
|
|
||||||
<div class="datagrid-content">{{ user.workHoursThursday|duration }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="datagrid-item">
|
|
||||||
<div class="datagrid-title">{{ 'Friday'|trans({}, 'system-configuration') }}</div>
|
|
||||||
<div class="datagrid-content">{{ user.workHoursFriday|duration }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="datagrid-item">
|
|
||||||
<div class="datagrid-title">{{ 'Saturday'|trans({}, 'system-configuration') }}</div>
|
|
||||||
<div class="datagrid-content">{{ user.workHoursSaturday|duration }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="datagrid-item">
|
|
||||||
<div class="datagrid-title">{{ 'Sunday'|trans({}, 'system-configuration') }}</div>
|
|
||||||
<div class="datagrid-content">{{ user.workHoursSunday|duration }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
{% endembed %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% for controller in boxes %}
|
{% for controller in boxes %}
|
||||||
{{ render(controller(controller, {'year': year, 'boxConfiguration': box_configuration})) }}
|
{{ render(controller(controller, {'year': year, 'boxConfiguration': box_configuration})) }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
@@ -3,19 +3,19 @@
|
|||||||
{% block report_content %}
|
{% block report_content %}
|
||||||
{% embed 'reporting/report_by_user_data.html.twig' with {with_links: true} %}
|
{% embed 'reporting/report_by_user_data.html.twig' with {with_links: true} %}
|
||||||
{% block period_name %}
|
{% block period_name %}
|
||||||
<th class="text-center text-nowrap{% if column is weekend(user) %} weekend{% endif %}{% if column is today %} today{% endif %}">
|
<th class="text-center text-nowrap{% if column is weekend %} weekend{% endif %}{% if column is today %} today{% endif %}">
|
||||||
{{ column|date_weekday }}
|
{{ column|date_weekday }}
|
||||||
</th>
|
</th>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block upper_left %} {% endblock %}
|
{% block upper_left %} {% endblock %}
|
||||||
{% block column_classes_project -%}
|
{% block column_classes_project -%}
|
||||||
{% if column.date is weekend(user) %} weekend{% endif %}{% if column.date is today %} today{% endif %}
|
{% if column.date is weekend %} weekend{% endif %}{% if column.date is today %} today{% endif %}
|
||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
{% block column_classes_activity -%}
|
{% block column_classes_activity -%}
|
||||||
{% if column.date is weekend(user) %} weekend{% endif %}{% if column.date is today %} today{% endif %}
|
{% if column.date is weekend %} weekend{% endif %}{% if column.date is today %} today{% endif %}
|
||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
{% block column_classes_total -%}
|
{% block column_classes_total -%}
|
||||||
{% if column is weekend(user) %} weekend{% endif %}
|
{% if column is weekend %} weekend{% endif %}
|
||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
{% endembed %}
|
{% endembed %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
{% block report_content %}
|
{% block report_content %}
|
||||||
{% embed 'reporting/user_list_period_data.html.twig' with {stats: stats, dataType: dataType, period_attribute: period_attribute, subReportRoute: subReportRoute, subReportDate: subReportDate, decimal: decimal} only %}
|
{% embed 'reporting/user_list_period_data.html.twig' with {stats: stats, dataType: dataType, period_attribute: period_attribute, subReportRoute: subReportRoute, subReportDate: subReportDate, decimal: decimal} only %}
|
||||||
{% block period_name %}
|
{% block period_name %}
|
||||||
<th class="text-center text-nowrap{% if column is today %} today{% endif %}">
|
<th class="text-center text-nowrap{% if column is weekend %} weekend{% endif %}{% if column is today %} today{% endif %}">
|
||||||
{{ column|date_weekday }}
|
{{ column|date_weekday }}
|
||||||
</th>
|
</th>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -25,6 +25,6 @@
|
|||||||
{% block duration %}
|
{% block duration %}
|
||||||
{{ period.totalDuration|duration(decimal) }}
|
{{ period.totalDuration|duration(decimal) }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block period_cell_class %}{% if period.date is weekend(userPeriod.user) %} weekend{% endif %}{% if period.date is today %} today{% endif %}{% endblock %}
|
{% block period_cell_class %}{% if period.date is weekend %} weekend{% endif %}{% if period.date is today %} today{% endif %}{% endblock %}
|
||||||
{% endembed %}
|
{% endembed %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -2,35 +2,23 @@
|
|||||||
{% import "macros/widgets.html.twig" as widgets %}
|
{% import "macros/widgets.html.twig" as widgets %}
|
||||||
{% import "macros/datatables.html.twig" as tables %}
|
{% import "macros/datatables.html.twig" as tables %}
|
||||||
|
|
||||||
{% block datatable_row %}
|
{% block datatable_row_attr %}
|
||||||
<tr{% if is_granted('edit', entry) %} class="open-edit alternative-link" data-href="{{ path('admin_team_edit', {'id': entry.id}) }}"{% endif %}>
|
{%- if is_granted('edit', entry) %} class="open-edit alternative-link" data-href="{{ path('admin_team_edit', {'id': entry.id}) }}"{% endif %}
|
||||||
<td class="{{ tables.class(dataTable, 'name') }}">
|
{% endblock %}
|
||||||
{{ widgets.label_name(entry.name, entry.color|colorize(entry.name)) }}
|
|
||||||
</td>
|
{% block datatable_column_value %}
|
||||||
<td class="{{ tables.class(dataTable, 'teamlead') }}">
|
{% if column == 'name' %}
|
||||||
{% for member in entry.members %}
|
{{ widgets.label_name(entry.name, entry.color|colorize(entry.name)) }}
|
||||||
{% if member.teamlead %}
|
{% elseif column == 'avatar' %}
|
||||||
{{ widgets.label_user(member.user) }}
|
{% for member in entry.members|sort((a, b) => b.teamlead <=> a.teamlead) %}
|
||||||
{% endif %}
|
{% set user = member.user %}
|
||||||
{% endfor %}
|
{% set tooltip = member.teamlead ? ('teamlead'|trans ~ ': ' ~ user.displayName) : null %}
|
||||||
</td>
|
{{ widgets.user_avatar(user, tooltip, 'avatar-rounded', (member.teamlead ? 'info' : null)) }}
|
||||||
<td class="{{ tables.class(dataTable, 'teamlead_avatar') }}">
|
{% endfor %}
|
||||||
{% for member in entry.members|sort((a, b) => b.teamlead <=> a.teamlead) %}
|
{% elseif column == 'amount' %}
|
||||||
{% set user = member.user %}
|
{{ widgets.badge_counter(entry.members|length) }}
|
||||||
{% set tooltip = member.teamlead ? ('teamlead'|trans ~ ': ' ~ user.displayName) : null %}
|
{% elseif column == 'actions' %}
|
||||||
{{ widgets.user_avatar(user, tooltip, 'avatar-rounded', (member.teamlead ? 'info' : null)) }}
|
{% set event = actions(app.user, 'team', 'index', {'team': entry}) %}
|
||||||
{% endfor %}
|
{{ widgets.table_actions(event.actions) }}
|
||||||
</td>
|
{% endif %}
|
||||||
<td class="{{ tables.class(dataTable, 'user') }}">
|
|
||||||
{% for member in entry.members %}
|
|
||||||
{% if not member.teamlead %}
|
|
||||||
{{ widgets.label_user(member.user) }}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</td>
|
|
||||||
<td class="{{ tables.class(dataTable, 'actions') }}">
|
|
||||||
{% set event = actions(app.user, 'team', 'index', {'team': entry}) %}
|
|
||||||
{{ widgets.table_actions(event.actions) }}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class PermissionControllerTest extends ControllerBaseTest
|
|||||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_SUPER_ADMIN);
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_SUPER_ADMIN);
|
||||||
$this->assertAccessIsGranted($client, '/admin/permissions');
|
$this->assertAccessIsGranted($client, '/admin/permissions');
|
||||||
$this->assertHasDataTable($client);
|
$this->assertHasDataTable($client);
|
||||||
$this->assertDataTableRowCount($client, 'datatable_user_admin_permissions', 134);
|
$this->assertDataTableRowCount($client, 'datatable_user_admin_permissions', 135);
|
||||||
$this->assertPageActions($client, [
|
$this->assertPageActions($client, [
|
||||||
'create modal-ajax-form' => $this->createUrl('/admin/permissions/roles/create'),
|
'create modal-ajax-form' => $this->createUrl('/admin/permissions/roles/create'),
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -18,13 +18,23 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
class ConfigureMainMenuEventTest extends TestCase
|
class ConfigureMainMenuEventTest extends TestCase
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* @group legacy
|
||||||
|
*/
|
||||||
|
public function testLegacy(): void
|
||||||
|
{
|
||||||
|
$sut = new ConfigureMainMenuEvent();
|
||||||
|
|
||||||
|
self::assertNotNull($sut->getAppsMenu());
|
||||||
|
}
|
||||||
|
|
||||||
public function testGetterAndSetter(): void
|
public function testGetterAndSetter(): void
|
||||||
{
|
{
|
||||||
$sut = new ConfigureMainMenuEvent();
|
$sut = new ConfigureMainMenuEvent();
|
||||||
|
|
||||||
self::assertNotNull($sut->getMenu());
|
self::assertNotNull($sut->getMenu());
|
||||||
self::assertNotNull($sut->getAdminMenu());
|
self::assertNotNull($sut->getAdminMenu());
|
||||||
self::assertNotNull($sut->getAppsMenu());
|
|
||||||
self::assertNotNull($sut->getSystemMenu());
|
self::assertNotNull($sut->getSystemMenu());
|
||||||
|
|
||||||
self::assertNull($sut->getTimesheetMenu());
|
self::assertNull($sut->getTimesheetMenu());
|
||||||
|
|||||||
@@ -34,15 +34,15 @@ use Symfony\Bundle\SecurityBundle\Security;
|
|||||||
use Symfony\Component\EventDispatcher\EventDispatcher;
|
use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
abstract class AbstractRendererTest extends KernelTestCase
|
abstract class AbstractRendererTest extends KernelTestCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param string $classname
|
* @param class-string $classname
|
||||||
* @return ExportRendererInterface|TimesheetExportInterface
|
|
||||||
*/
|
*/
|
||||||
protected function getAbstractRenderer(string $classname)
|
protected function getAbstractRenderer(string $classname): ExportRendererInterface|TimesheetExportInterface
|
||||||
{
|
{
|
||||||
$languages = [
|
$languages = [
|
||||||
'en' => LocaleService::DEFAULT_SETTINGS
|
'en' => LocaleService::DEFAULT_SETTINGS
|
||||||
@@ -53,7 +53,7 @@ abstract class AbstractRendererTest extends KernelTestCase
|
|||||||
$security->expects($this->any())->method('isGranted')->willReturn(true);
|
$security->expects($this->any())->method('isGranted')->willReturn(true);
|
||||||
|
|
||||||
$translator = $this->createMock(TranslatorInterface::class);
|
$translator = $this->createMock(TranslatorInterface::class);
|
||||||
$dateExtension = new LocaleFormatExtensions(new LocaleService($languages), $security);
|
$dateExtension = new LocaleFormatExtensions(new LocaleService($languages));
|
||||||
|
|
||||||
$dispatcher = new EventDispatcher();
|
$dispatcher = new EventDispatcher();
|
||||||
$dispatcher->addSubscriber(new MetaFieldColumnSubscriber());
|
$dispatcher->addSubscriber(new MetaFieldColumnSubscriber());
|
||||||
@@ -61,11 +61,7 @@ abstract class AbstractRendererTest extends KernelTestCase
|
|||||||
return new $classname($translator, $dateExtension, $dispatcher, $security);
|
return new $classname($translator, $dateExtension, $dispatcher, $security);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
protected function render(ExportRendererInterface $renderer): Response
|
||||||
* @param ExportRendererInterface $renderer
|
|
||||||
* @return \Symfony\Component\HttpFoundation\Response
|
|
||||||
*/
|
|
||||||
protected function render(ExportRendererInterface $renderer)
|
|
||||||
{
|
{
|
||||||
$customer = new Customer('Customer Name');
|
$customer = new Customer('Customer Name');
|
||||||
$customer->setNumber('A-0123456789');
|
$customer->setNumber('A-0123456789');
|
||||||
@@ -198,29 +194,29 @@ class MetaFieldColumnSubscriber implements EventSubscriberInterface
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadTimesheetField(TimesheetMetaDisplayEvent $event)
|
public function loadTimesheetField(TimesheetMetaDisplayEvent $event): void
|
||||||
{
|
{
|
||||||
$event->addField($this->prepareEntity(new TimesheetMeta(), 'foo'));
|
$event->addField($this->prepareEntity(new TimesheetMeta(), 'foo'));
|
||||||
$event->addField($this->prepareEntity(new TimesheetMeta(), 'foo2'));
|
$event->addField($this->prepareEntity(new TimesheetMeta(), 'foo2'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadCustomerField(CustomerMetaDisplayEvent $event)
|
public function loadCustomerField(CustomerMetaDisplayEvent $event): void
|
||||||
{
|
{
|
||||||
$event->addField($this->prepareEntity(new CustomerMeta(), 'customer-foo'));
|
$event->addField($this->prepareEntity(new CustomerMeta(), 'customer-foo'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadProjectField(ProjectMetaDisplayEvent $event)
|
public function loadProjectField(ProjectMetaDisplayEvent $event): void
|
||||||
{
|
{
|
||||||
$event->addField($this->prepareEntity(new ProjectMeta(), 'project-foo'));
|
$event->addField($this->prepareEntity(new ProjectMeta(), 'project-foo'));
|
||||||
$event->addField($this->prepareEntity(new ProjectMeta(), 'project-foo2')->setIsVisible(false));
|
$event->addField($this->prepareEntity(new ProjectMeta(), 'project-foo2')->setIsVisible(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadActivityField(ActivityMetaDisplayEvent $event)
|
public function loadActivityField(ActivityMetaDisplayEvent $event): void
|
||||||
{
|
{
|
||||||
$event->addField($this->prepareEntity(new ActivityMeta(), 'activity-foo'));
|
$event->addField($this->prepareEntity(new ActivityMeta(), 'activity-foo'));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function prepareEntity(MetaTableTypeInterface $meta, string $name)
|
private function prepareEntity(MetaTableTypeInterface $meta, string $name): MetaTableTypeInterface
|
||||||
{
|
{
|
||||||
return $meta
|
return $meta
|
||||||
->setLabel('Working place')
|
->setLabel('Working place')
|
||||||
|
|||||||
@@ -42,7 +42,9 @@ class UserExporterTest extends TestCase
|
|||||||
$user->setEmail('test@example.com');
|
$user->setEmail('test@example.com');
|
||||||
$user->setEnabled(false);
|
$user->setEnabled(false);
|
||||||
$user->addRole(User::ROLE_TEAMLEAD);
|
$user->addRole(User::ROLE_TEAMLEAD);
|
||||||
$date = $user->getRegisteredAt();
|
|
||||||
|
$date = new \DateTime('2024-09-01 14:45:00');
|
||||||
|
$user->setRegisteredAt($date);
|
||||||
|
|
||||||
$sut = new UserExporter($spreadsheetExporter, $annotationExtractor, $userPreferenceExtractor);
|
$sut = new UserExporter($spreadsheetExporter, $annotationExtractor, $userPreferenceExtractor);
|
||||||
$spreadsheet = $sut->export([$user], new UserPreferenceDisplayEvent(UserPreferenceDisplayEvent::EXPORT));
|
$spreadsheet = $sut->export([$user], new UserPreferenceDisplayEvent(UserPreferenceDisplayEvent::EXPORT));
|
||||||
|
|||||||
@@ -33,15 +33,15 @@ use Symfony\Bundle\SecurityBundle\Security;
|
|||||||
use Symfony\Component\EventDispatcher\EventDispatcher;
|
use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
abstract class AbstractRendererTest extends KernelTestCase
|
abstract class AbstractRendererTest extends KernelTestCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param string $classname
|
* @param class-string $classname
|
||||||
* @return TimesheetExportInterface
|
|
||||||
*/
|
*/
|
||||||
protected function getAbstractRenderer(string $classname)
|
protected function getAbstractRenderer(string $classname): TimesheetExportInterface
|
||||||
{
|
{
|
||||||
$languages = [
|
$languages = [
|
||||||
'en' => LocaleService::DEFAULT_SETTINGS
|
'en' => LocaleService::DEFAULT_SETTINGS
|
||||||
@@ -55,7 +55,7 @@ abstract class AbstractRendererTest extends KernelTestCase
|
|||||||
$security->expects($this->any())->method('isGranted')->willReturn(true);
|
$security->expects($this->any())->method('isGranted')->willReturn(true);
|
||||||
|
|
||||||
$translator = $this->getMockBuilder(TranslatorInterface::class)->getMock();
|
$translator = $this->getMockBuilder(TranslatorInterface::class)->getMock();
|
||||||
$dateExtension = new LocaleFormatExtensions(new LocaleService($languages), $security);
|
$dateExtension = new LocaleFormatExtensions(new LocaleService($languages));
|
||||||
|
|
||||||
$dispatcher = new EventDispatcher();
|
$dispatcher = new EventDispatcher();
|
||||||
$dispatcher->addSubscriber(new MetaFieldColumnSubscriber());
|
$dispatcher->addSubscriber(new MetaFieldColumnSubscriber());
|
||||||
@@ -63,11 +63,7 @@ abstract class AbstractRendererTest extends KernelTestCase
|
|||||||
return new $classname($translator, $dateExtension, $dispatcher, $security);
|
return new $classname($translator, $dateExtension, $dispatcher, $security);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
protected function render(TimesheetExportInterface $renderer): Response
|
||||||
* @param TimesheetExportInterface $renderer
|
|
||||||
* @return \Symfony\Component\HttpFoundation\Response
|
|
||||||
*/
|
|
||||||
protected function render(TimesheetExportInterface $renderer)
|
|
||||||
{
|
{
|
||||||
$customer = new Customer('Customer Name');
|
$customer = new Customer('Customer Name');
|
||||||
$customer->setNumber('A-0123456789');
|
$customer->setNumber('A-0123456789');
|
||||||
@@ -185,29 +181,29 @@ class MetaFieldColumnSubscriber implements EventSubscriberInterface
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadTimesheetField(TimesheetMetaDisplayEvent $event)
|
public function loadTimesheetField(TimesheetMetaDisplayEvent $event): void
|
||||||
{
|
{
|
||||||
$event->addField($this->prepareEntity(new TimesheetMeta(), 'foo'));
|
$event->addField($this->prepareEntity(new TimesheetMeta(), 'foo'));
|
||||||
$event->addField($this->prepareEntity(new TimesheetMeta(), 'foo2'));
|
$event->addField($this->prepareEntity(new TimesheetMeta(), 'foo2'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadCustomerField(CustomerMetaDisplayEvent $event)
|
public function loadCustomerField(CustomerMetaDisplayEvent $event): void
|
||||||
{
|
{
|
||||||
$event->addField($this->prepareEntity(new CustomerMeta(), 'customer-foo'));
|
$event->addField($this->prepareEntity(new CustomerMeta(), 'customer-foo'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadProjectField(ProjectMetaDisplayEvent $event)
|
public function loadProjectField(ProjectMetaDisplayEvent $event): void
|
||||||
{
|
{
|
||||||
$event->addField($this->prepareEntity(new ProjectMeta(), 'project-foo'));
|
$event->addField($this->prepareEntity(new ProjectMeta(), 'project-foo'));
|
||||||
$event->addField($this->prepareEntity(new ProjectMeta(), 'project-foo2')->setIsVisible(false));
|
$event->addField($this->prepareEntity(new ProjectMeta(), 'project-foo2')->setIsVisible(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadActivityField(ActivityMetaDisplayEvent $event)
|
public function loadActivityField(ActivityMetaDisplayEvent $event): void
|
||||||
{
|
{
|
||||||
$event->addField($this->prepareEntity(new ActivityMeta(), 'activity-foo'));
|
$event->addField($this->prepareEntity(new ActivityMeta(), 'activity-foo'));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function prepareEntity(MetaTableTypeInterface $meta, string $name)
|
private function prepareEntity(MetaTableTypeInterface $meta, string $name): MetaTableTypeInterface
|
||||||
{
|
{
|
||||||
return $meta
|
return $meta
|
||||||
->setLabel('Working place')
|
->setLabel('Working place')
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class CustomerLoaderTest extends AbstractLoaderTest
|
|||||||
{
|
{
|
||||||
public function testLoadResults(): void
|
public function testLoadResults(): void
|
||||||
{
|
{
|
||||||
$em = $this->getEntityManagerMock(1);
|
$em = $this->getEntityManagerMock(0);
|
||||||
|
|
||||||
$query = new CustomerQuery();
|
$query = new CustomerQuery();
|
||||||
$query->loadTeams();
|
$query->loadTeams();
|
||||||
@@ -31,4 +31,22 @@ class CustomerLoaderTest extends AbstractLoaderTest
|
|||||||
|
|
||||||
$sut->loadResults([$entity]);
|
$sut->loadResults([$entity]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testLoadResultsWithMocks(): void
|
||||||
|
{
|
||||||
|
$em = $this->getEntityManagerMock(1);
|
||||||
|
|
||||||
|
$query = new CustomerQuery();
|
||||||
|
$query->loadTeams();
|
||||||
|
|
||||||
|
$sut = new CustomerLoader($em, $query);
|
||||||
|
|
||||||
|
$entity = $this->createMock(Customer::class);
|
||||||
|
$entity->method('getId')->willReturn(1);
|
||||||
|
|
||||||
|
$entity2 = $this->createMock(Customer::class);
|
||||||
|
$entity->method('getId')->willReturn(2);
|
||||||
|
|
||||||
|
$sut->loadResults([$entity, $entity2]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ use App\Entity\Timesheet;
|
|||||||
use App\Entity\User;
|
use App\Entity\User;
|
||||||
use App\Twig\LocaleFormatExtensions;
|
use App\Twig\LocaleFormatExtensions;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Bundle\SecurityBundle\Security;
|
|
||||||
use Symfony\Component\Intl\Util\IntlTestHelper;
|
use Symfony\Component\Intl\Util\IntlTestHelper;
|
||||||
use Twig\TwigFilter;
|
use Twig\TwigFilter;
|
||||||
use Twig\TwigFunction;
|
use Twig\TwigFunction;
|
||||||
@@ -55,10 +54,7 @@ class LocaleFormatExtensionsTest extends TestCase
|
|||||||
$user = new User();
|
$user = new User();
|
||||||
$user->setTimezone('Europe/Vienna');
|
$user->setTimezone('Europe/Vienna');
|
||||||
|
|
||||||
$security = $this->createMock(Security::class);
|
$sut = new LocaleFormatExtensions(new LocaleService($languageSettings));
|
||||||
$security->expects($this->any())->method('getUser')->willReturn($user);
|
|
||||||
|
|
||||||
$sut = new LocaleFormatExtensions(new LocaleService($languageSettings), $security);
|
|
||||||
$sut->setLocale($locale);
|
$sut->setLocale($locale);
|
||||||
|
|
||||||
return $sut;
|
return $sut;
|
||||||
@@ -502,9 +498,7 @@ class LocaleFormatExtensionsTest extends TestCase
|
|||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
$security = $this->createMock(Security::class);
|
$sut = new LocaleFormatExtensions(new LocaleService($this->localeEn));
|
||||||
|
|
||||||
$sut = new LocaleFormatExtensions(new LocaleService($this->localeEn), $security);
|
|
||||||
$sut->setLocale('en');
|
$sut->setLocale('en');
|
||||||
|
|
||||||
self::assertEquals($expected, $sut->getJavascriptConfiguration());
|
self::assertEquals($expected, $sut->getJavascriptConfiguration());
|
||||||
@@ -586,22 +580,6 @@ class LocaleFormatExtensionsTest extends TestCase
|
|||||||
self::assertFalse($sut->isWeekend(new \DateTime('first friday this month')));
|
self::assertFalse($sut->isWeekend(new \DateTime('first friday this month')));
|
||||||
self::assertTrue($sut->isWeekend(new \DateTime('first saturday this month')));
|
self::assertTrue($sut->isWeekend(new \DateTime('first saturday this month')));
|
||||||
self::assertTrue($sut->isWeekend(new \DateTime('first sunday this month')));
|
self::assertTrue($sut->isWeekend(new \DateTime('first sunday this month')));
|
||||||
|
|
||||||
// seconds case: a user with work-hour configuration
|
|
||||||
$user = new User();
|
|
||||||
$user->setWorkHoursTuesday(1);
|
|
||||||
$user->setWorkHoursThursday(1);
|
|
||||||
$user->setWorkHoursSaturday(1);
|
|
||||||
$user->setWorkHoursSunday(1);
|
|
||||||
|
|
||||||
$sut = $this->getSut('en', $this->localeEn);
|
|
||||||
self::assertTrue($sut->isWeekend(new \DateTime('first monday this month'), $user));
|
|
||||||
self::assertFalse($sut->isWeekend(new \DateTime('first tuesday this month'), $user));
|
|
||||||
self::assertTrue($sut->isWeekend(new \DateTime('first wednesday this month'), $user));
|
|
||||||
self::assertFalse($sut->isWeekend(new \DateTime('first thursday this month'), $user));
|
|
||||||
self::assertTrue($sut->isWeekend(new \DateTime('first friday this month'), $user));
|
|
||||||
self::assertFalse($sut->isWeekend(new \DateTime('first saturday this month'), $user));
|
|
||||||
self::assertFalse($sut->isWeekend(new \DateTime('first sunday this month'), $user));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getTimesheet($seconds): Timesheet
|
protected function getTimesheet($seconds): Timesheet
|
||||||
|
|||||||
@@ -9,6 +9,9 @@
|
|||||||
|
|
||||||
require __DIR__ . '/../vendor/autoload.php';
|
require __DIR__ . '/../vendor/autoload.php';
|
||||||
|
|
||||||
|
// TODO remove once PARTIAL usage was replaced entirely
|
||||||
|
\Doctrine\Deprecations\Deprecation::ignoreDeprecations('https://github.com/doctrine/orm/issues/8471');
|
||||||
|
|
||||||
if (isset($_ENV['BOOTSTRAP_RESET_DATABASE']) && (bool) $_ENV['BOOTSTRAP_RESET_DATABASE'] === true) {
|
if (isset($_ENV['BOOTSTRAP_RESET_DATABASE']) && (bool) $_ENV['BOOTSTRAP_RESET_DATABASE'] === true) {
|
||||||
echo 'Re-Installing test database ...' . PHP_EOL;
|
echo 'Re-Installing test database ...' . PHP_EOL;
|
||||||
|
|
||||||
|
|||||||
@@ -1754,31 +1754,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: Export/Renderer/AbstractRendererTest.php
|
path: Export/Renderer/AbstractRendererTest.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Renderer\\\\MetaFieldColumnSubscriber\\:\\:loadActivityField\\(\\) has no return type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Renderer/AbstractRendererTest.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Renderer\\\\MetaFieldColumnSubscriber\\:\\:loadCustomerField\\(\\) has no return type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Renderer/AbstractRendererTest.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Renderer\\\\MetaFieldColumnSubscriber\\:\\:loadProjectField\\(\\) has no return type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Renderer/AbstractRendererTest.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Renderer\\\\MetaFieldColumnSubscriber\\:\\:loadTimesheetField\\(\\) has no return type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Renderer/AbstractRendererTest.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Renderer\\\\MetaFieldColumnSubscriber\\:\\:prepareEntity\\(\\) has no return type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Renderer/AbstractRendererTest.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Call to an undefined method App\\\\Export\\\\ExportRendererInterface\\|App\\\\Export\\\\TimesheetExportInterface\\:\\:getIcon\\(\\)\\.$#"
|
message: "#^Call to an undefined method App\\\\Export\\\\ExportRendererInterface\\|App\\\\Export\\\\TimesheetExportInterface\\:\\:getIcon\\(\\)\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
@@ -1984,11 +1959,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: Export/Spreadsheet/Entities/MethodRequiresParams.php
|
path: Export/Spreadsheet/Entities/MethodRequiresParams.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Cannot call method format\\(\\) on DateTime\\|null\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Spreadsheet/UserExporterTest.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#2 \\$haystack of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertStringContainsString\\(\\) expects string, string\\|null given\\.$#"
|
message: "#^Parameter \\#2 \\$haystack of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertStringContainsString\\(\\) expects string, string\\|null given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
@@ -1999,31 +1969,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: Export/Timesheet/AbstractRendererTest.php
|
path: Export/Timesheet/AbstractRendererTest.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\MetaFieldColumnSubscriber\\:\\:loadActivityField\\(\\) has no return type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Timesheet/AbstractRendererTest.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\MetaFieldColumnSubscriber\\:\\:loadCustomerField\\(\\) has no return type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Timesheet/AbstractRendererTest.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\MetaFieldColumnSubscriber\\:\\:loadProjectField\\(\\) has no return type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Timesheet/AbstractRendererTest.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\MetaFieldColumnSubscriber\\:\\:loadTimesheetField\\(\\) has no return type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Timesheet/AbstractRendererTest.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\MetaFieldColumnSubscriber\\:\\:prepareEntity\\(\\) has no return type specified\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Timesheet/AbstractRendererTest.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\CsvRendererTest\\:\\:getTestModel\\(\\) has no return type specified\\.$#"
|
message: "#^Method App\\\\Tests\\\\Export\\\\Timesheet\\\\CsvRendererTest\\:\\:getTestModel\\(\\) has no return type specified\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
|
|||||||
@@ -2,33 +2,7 @@
|
|||||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||||
<file source-language="en" target-language="ca" datatype="plaintext" original="messages.en.xlf">
|
<file source-language="en" target-language="ca" datatype="plaintext" original="messages.en.xlf">
|
||||||
<body>
|
<body>
|
||||||
<!-- Login / Security -->
|
<trans-unit id="XohImNo" resname="password" approved="no" xml:space="preserve">
|
||||||
<!-- Menu / Navbar items -->
|
|
||||||
<!-- Error templates -->
|
|
||||||
<!-- General labels -->
|
|
||||||
<!-- Buttons & Actions -->
|
|
||||||
<!-- Dashboard -->
|
|
||||||
<!-- Widgets -->
|
|
||||||
<!-- Timesheet -->
|
|
||||||
<!-- Column modal -->
|
|
||||||
<!-- User profile -->
|
|
||||||
<!-- 2FA -->
|
|
||||||
<!-- END 2FA -->
|
|
||||||
<!-- Notifications -->
|
|
||||||
<!-- Options for user-preference calendar_initial_view -->
|
|
||||||
<!-- User timesheet calendar -->
|
|
||||||
<!-- Projects -->
|
|
||||||
<!-- Customer -->
|
|
||||||
<!-- Users -->
|
|
||||||
<!-- Plugins -->
|
|
||||||
<!-- ROLES -->
|
|
||||||
<!-- Statistics data for Dashboard & Users profile -->
|
|
||||||
<!-- Invoice -->
|
|
||||||
<!-- Export -->
|
|
||||||
<!-- Navbar - recent entries and activities -->
|
|
||||||
<!-- TOOLBARS -->
|
|
||||||
<!-- QUICK ENTRIES -->
|
|
||||||
<trans-unit id="XohImNo" resname="password" approved="no" xml:space="preserve">
|
|
||||||
<source>Password</source>
|
<source>Password</source>
|
||||||
<target state="needs-translation">Password</target>
|
<target state="needs-translation">Password</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
|||||||
@@ -560,7 +560,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Fm.kwVn" resname="profile.first_entry">
|
<trans-unit id="Fm.kwVn" resname="profile.first_entry">
|
||||||
<source>profile.first_entry</source>
|
<source>profile.first_entry</source>
|
||||||
<target>Arbeitet seit</target>
|
<target>Erster Arbeitstag</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1c0EQaz" resname="profile.registration_date">
|
<trans-unit id="1c0EQaz" resname="profile.registration_date">
|
||||||
<source>profile.registration_date</source>
|
<source>profile.registration_date</source>
|
||||||
@@ -640,7 +640,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1btzNDa" resname="work_times_should">
|
<trans-unit id="1btzNDa" resname="work_times_should">
|
||||||
<source>Expected number of hours</source>
|
<source>Expected number of hours</source>
|
||||||
<target>Erwartete Stundenzahl</target>
|
<target>Erwartete Stunden</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s9NPI3v" resname="work_times_should.none_configured">
|
<trans-unit id="s9NPI3v" resname="work_times_should.none_configured">
|
||||||
<source>work_times_should.none_configured</source>
|
<source>work_times_should.none_configured</source>
|
||||||
@@ -648,7 +648,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="31dFXhR" resname="work_times_is">
|
<trans-unit id="31dFXhR" resname="work_times_is">
|
||||||
<source>work_times_is</source>
|
<source>work_times_is</source>
|
||||||
<target>Ist-Stunden</target>
|
<target>Geleistete Stunden</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="uHrZlbq" resname="work_times_result">
|
<trans-unit id="uHrZlbq" resname="work_times_result">
|
||||||
<source>work_times_result</source>
|
<source>work_times_result</source>
|
||||||
@@ -1766,6 +1766,30 @@
|
|||||||
<source>api_password_deprecated</source>
|
<source>api_password_deprecated</source>
|
||||||
<target>API Passwörter sind veraltet: bitte nutzen Sie stattdessen API-Tokens.</target>
|
<target>API Passwörter sind veraltet: bitte nutzen Sie stattdessen API-Tokens.</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="2qbRs28" resname="hours_per_day">
|
||||||
|
<source>hours_per_day</source>
|
||||||
|
<target>Stunden pro Tag</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="y7KtuSS" resname="hours_per_week">
|
||||||
|
<source>hours_per_week</source>
|
||||||
|
<target>Stunden pro Woche</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="07e8ywS" resname="hours_per_month">
|
||||||
|
<source>hours_per_month</source>
|
||||||
|
<target>Stunden pro Monat</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7p_pFHl" resname="work_days">
|
||||||
|
<source>work_days</source>
|
||||||
|
<target>Arbeitstage</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="2pbkbn_" resname="work_hours_mode">
|
||||||
|
<source>work_hours_mode</source>
|
||||||
|
<target>Arbeitszeitberechnung</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="IFT9pou" resname="last_working_day">
|
||||||
|
<source>last_working_day</source>
|
||||||
|
<target>Letzter Arbeitstag</target>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|||||||
@@ -560,7 +560,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Fm.kwVn" resname="profile.first_entry">
|
<trans-unit id="Fm.kwVn" resname="profile.first_entry">
|
||||||
<source>profile.first_entry</source>
|
<source>profile.first_entry</source>
|
||||||
<target>Working since</target>
|
<target>First working day</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1c0EQaz" resname="profile.registration_date">
|
<trans-unit id="1c0EQaz" resname="profile.registration_date">
|
||||||
<source>profile.registration_date</source>
|
<source>profile.registration_date</source>
|
||||||
@@ -640,7 +640,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1btzNDa" resname="work_times_should">
|
<trans-unit id="1btzNDa" resname="work_times_should">
|
||||||
<source>Expected number of hours</source>
|
<source>Expected number of hours</source>
|
||||||
<target>Expected number of hours</target>
|
<target>Expected hours</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="s9NPI3v" resname="work_times_should.none_configured">
|
<trans-unit id="s9NPI3v" resname="work_times_should.none_configured">
|
||||||
<source>work_times_should.none_configured</source>
|
<source>work_times_should.none_configured</source>
|
||||||
@@ -648,7 +648,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="31dFXhR" resname="work_times_is">
|
<trans-unit id="31dFXhR" resname="work_times_is">
|
||||||
<source>work_times_is</source>
|
<source>work_times_is</source>
|
||||||
<target>Is-hours</target>
|
<target>Hours worked</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="uHrZlbq" resname="work_times_result">
|
<trans-unit id="uHrZlbq" resname="work_times_result">
|
||||||
<source>work_times_result</source>
|
<source>work_times_result</source>
|
||||||
@@ -1766,6 +1766,30 @@
|
|||||||
<source>api_password_deprecated</source>
|
<source>api_password_deprecated</source>
|
||||||
<target>API passwords are outdated: please use API tokens instead.</target>
|
<target>API passwords are outdated: please use API tokens instead.</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="2qbRs28" resname="hours_per_day">
|
||||||
|
<source>hours_per_day</source>
|
||||||
|
<target>Hours per day</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="y7KtuSS" resname="hours_per_week">
|
||||||
|
<source>hours_per_week</source>
|
||||||
|
<target>Hours per week</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="07e8ywS" resname="hours_per_month">
|
||||||
|
<source>hours_per_month</source>
|
||||||
|
<target>Hours per month</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="7p_pFHl" resname="work_days">
|
||||||
|
<source>work_days</source>
|
||||||
|
<target>Working days</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="2pbkbn_" resname="work_hours_mode">
|
||||||
|
<source>work_hours_mode</source>
|
||||||
|
<target>Working time calculation</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="IFT9pou" resname="last_working_day">
|
||||||
|
<source>last_working_day</source>
|
||||||
|
<target>Last working day</target>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|||||||
@@ -1789,9 +1789,9 @@ __metadata:
|
|||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@popperjs/core@npm:^2.11.7":
|
"@popperjs/core@npm:^2.11.7":
|
||||||
version: 2.11.7
|
version: 2.11.8
|
||||||
resolution: "@popperjs/core@npm:2.11.7"
|
resolution: "@popperjs/core@npm:2.11.8"
|
||||||
checksum: 5b6553747899683452a1d28898c1b39173a4efd780e74360bfcda8eb42f1c5e819602769c81a10920fc68c881d07fb40429604517d499567eac079cfa6470f19
|
checksum: e5c69fdebf52a4012f6a1f14817ca8e9599cb1be73dd1387e1785e2ed5e5f0862ff817f420a87c7fc532add1f88a12e25aeb010ffcbdc98eace3d55ce2139cf0
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user