Compare commits
4
Commits
67c685f6c1
...
f08d9a9f40
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f08d9a9f40 | ||
|
|
7b49375efa | ||
|
|
91522ab32d | ||
|
|
a3e8c737de |
Generated
+138
-138
@@ -4935,16 +4935,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/cache",
|
"name": "symfony/cache",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/cache.git",
|
"url": "https://github.com/symfony/cache.git",
|
||||||
"reference": "6c521e19a99e8ae57e22aa85b9271534513ee850"
|
"reference": "e037fd41e9f8ec9ac270e2a4c76a1992d18d808c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/cache/zipball/6c521e19a99e8ae57e22aa85b9271534513ee850",
|
"url": "https://api.github.com/repos/symfony/cache/zipball/e037fd41e9f8ec9ac270e2a4c76a1992d18d808c",
|
||||||
"reference": "6c521e19a99e8ae57e22aa85b9271534513ee850",
|
"reference": "e037fd41e9f8ec9ac270e2a4c76a1992d18d808c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -5014,7 +5014,7 @@
|
|||||||
"psr6"
|
"psr6"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/cache/tree/v7.4.18"
|
"source": "https://github.com/symfony/cache/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5034,7 +5034,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T20:10:52+00:00"
|
"time": "2026-09-08T13:28:43+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/cache-contracts",
|
"name": "symfony/cache-contracts",
|
||||||
@@ -5275,16 +5275,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/console",
|
"name": "symfony/console",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/console.git",
|
"url": "https://github.com/symfony/console.git",
|
||||||
"reference": "23d6f88a29f6d0eac45bd77d70307adf83ba7ab0"
|
"reference": "3a1973458b153f566a8d7499bc06ece323d60063"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/console/zipball/23d6f88a29f6d0eac45bd77d70307adf83ba7ab0",
|
"url": "https://api.github.com/repos/symfony/console/zipball/3a1973458b153f566a8d7499bc06ece323d60063",
|
||||||
"reference": "23d6f88a29f6d0eac45bd77d70307adf83ba7ab0",
|
"reference": "3a1973458b153f566a8d7499bc06ece323d60063",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -5349,7 +5349,7 @@
|
|||||||
"terminal"
|
"terminal"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/console/tree/v7.4.18"
|
"source": "https://github.com/symfony/console/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5369,7 +5369,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-25T14:18:37+00:00"
|
"time": "2026-09-13T10:38:41+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/dependency-injection",
|
"name": "symfony/dependency-injection",
|
||||||
@@ -5528,16 +5528,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/doctrine-bridge",
|
"name": "symfony/doctrine-bridge",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/doctrine-bridge.git",
|
"url": "https://github.com/symfony/doctrine-bridge.git",
|
||||||
"reference": "d79e35e27ce56972ecc6878721cf20a29f4fef9d"
|
"reference": "d89437a59232a7e9b294652faea2469f2af66b63"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/d79e35e27ce56972ecc6878721cf20a29f4fef9d",
|
"url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/d89437a59232a7e9b294652faea2469f2af66b63",
|
||||||
"reference": "d79e35e27ce56972ecc6878721cf20a29f4fef9d",
|
"reference": "d89437a59232a7e9b294652faea2469f2af66b63",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -5617,7 +5617,7 @@
|
|||||||
"description": "Provides integration for Doctrine with various Symfony components",
|
"description": "Provides integration for Doctrine with various Symfony components",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/doctrine-bridge/tree/v7.4.18"
|
"source": "https://github.com/symfony/doctrine-bridge/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5637,20 +5637,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T18:34:10+00:00"
|
"time": "2026-09-11T14:46:58+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/doctrine-messenger",
|
"name": "symfony/doctrine-messenger",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/doctrine-messenger.git",
|
"url": "https://github.com/symfony/doctrine-messenger.git",
|
||||||
"reference": "2356265da4dd8e8b689e735dcce33f5fd40506e5"
|
"reference": "edee21e6307105f0aca6b82a1dc201e6789c5ed1"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/2356265da4dd8e8b689e735dcce33f5fd40506e5",
|
"url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/edee21e6307105f0aca6b82a1dc201e6789c5ed1",
|
||||||
"reference": "2356265da4dd8e8b689e735dcce33f5fd40506e5",
|
"reference": "edee21e6307105f0aca6b82a1dc201e6789c5ed1",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -5693,7 +5693,7 @@
|
|||||||
"description": "Symfony Doctrine Messenger Bridge",
|
"description": "Symfony Doctrine Messenger Bridge",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/doctrine-messenger/tree/v7.4.18"
|
"source": "https://github.com/symfony/doctrine-messenger/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5713,7 +5713,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-07-29T06:18:55+00:00"
|
"time": "2026-09-13T08:27:19+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/dom-crawler",
|
"name": "symfony/dom-crawler",
|
||||||
@@ -6252,16 +6252,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/finder",
|
"name": "symfony/finder",
|
||||||
"version": "v7.4.17",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/finder.git",
|
"url": "https://github.com/symfony/finder.git",
|
||||||
"reference": "5ce28827081f6d1f0c32eaf3882750f19cb5bbe6"
|
"reference": "1b900bc6ae5ba60c5eee69c11ba44566190576fe"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/finder/zipball/5ce28827081f6d1f0c32eaf3882750f19cb5bbe6",
|
"url": "https://api.github.com/repos/symfony/finder/zipball/1b900bc6ae5ba60c5eee69c11ba44566190576fe",
|
||||||
"reference": "5ce28827081f6d1f0c32eaf3882750f19cb5bbe6",
|
"reference": "1b900bc6ae5ba60c5eee69c11ba44566190576fe",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -6296,7 +6296,7 @@
|
|||||||
"description": "Finds files and directories via an intuitive fluent interface",
|
"description": "Finds files and directories via an intuitive fluent interface",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/finder/tree/v7.4.17"
|
"source": "https://github.com/symfony/finder/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6316,7 +6316,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-21T12:09:28+00:00"
|
"time": "2026-09-10T19:14:10+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/flex",
|
"name": "symfony/flex",
|
||||||
@@ -6393,16 +6393,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/form",
|
"name": "symfony/form",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/form.git",
|
"url": "https://github.com/symfony/form.git",
|
||||||
"reference": "14bbbc39af74c16d154bba3f70faceebdf138004"
|
"reference": "ededc326d2e5f271019b37d54c978e67cbc53ae3"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/form/zipball/14bbbc39af74c16d154bba3f70faceebdf138004",
|
"url": "https://api.github.com/repos/symfony/form/zipball/ededc326d2e5f271019b37d54c978e67cbc53ae3",
|
||||||
"reference": "14bbbc39af74c16d154bba3f70faceebdf138004",
|
"reference": "ededc326d2e5f271019b37d54c978e67cbc53ae3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -6472,7 +6472,7 @@
|
|||||||
"description": "Allows to easily create, process and reuse HTML forms",
|
"description": "Allows to easily create, process and reuse HTML forms",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/form/tree/v7.4.18"
|
"source": "https://github.com/symfony/form/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6492,20 +6492,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T00:47:26+00:00"
|
"time": "2026-09-15T06:01:15+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/framework-bundle",
|
"name": "symfony/framework-bundle",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/framework-bundle.git",
|
"url": "https://github.com/symfony/framework-bundle.git",
|
||||||
"reference": "45d6d66b6ea1ef7a3c4193dfe606370f0f80c9bf"
|
"reference": "666aece282b9c6f4664c5d81149b17ac5a0f4732"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/45d6d66b6ea1ef7a3c4193dfe606370f0f80c9bf",
|
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/666aece282b9c6f4664c5d81149b17ac5a0f4732",
|
||||||
"reference": "45d6d66b6ea1ef7a3c4193dfe606370f0f80c9bf",
|
"reference": "666aece282b9c6f4664c5d81149b17ac5a0f4732",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -6630,7 +6630,7 @@
|
|||||||
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
|
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/framework-bundle/tree/v7.4.18"
|
"source": "https://github.com/symfony/framework-bundle/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6650,20 +6650,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T20:10:52+00:00"
|
"time": "2026-09-14T09:18:42+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/html-sanitizer",
|
"name": "symfony/html-sanitizer",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/html-sanitizer.git",
|
"url": "https://github.com/symfony/html-sanitizer.git",
|
||||||
"reference": "5394e10c12b6190c019e3112e8b534180c22f0da"
|
"reference": "d49c351e24d38604466e5a51ab20cbc99f9493c7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/5394e10c12b6190c019e3112e8b534180c22f0da",
|
"url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/d49c351e24d38604466e5a51ab20cbc99f9493c7",
|
||||||
"reference": "5394e10c12b6190c019e3112e8b534180c22f0da",
|
"reference": "d49c351e24d38604466e5a51ab20cbc99f9493c7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -6704,7 +6704,7 @@
|
|||||||
"sanitizer"
|
"sanitizer"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/html-sanitizer/tree/v7.4.18"
|
"source": "https://github.com/symfony/html-sanitizer/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6724,20 +6724,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T00:47:26+00:00"
|
"time": "2026-09-04T10:11:42+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-client",
|
"name": "symfony/http-client",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/http-client.git",
|
"url": "https://github.com/symfony/http-client.git",
|
||||||
"reference": "68d81f78d127984ff2e741f0e0d9cb1078f8f3ea"
|
"reference": "3a523f38dc399337ec45b2ab9628e8c37ceb23c7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/http-client/zipball/68d81f78d127984ff2e741f0e0d9cb1078f8f3ea",
|
"url": "https://api.github.com/repos/symfony/http-client/zipball/3a523f38dc399337ec45b2ab9628e8c37ceb23c7",
|
||||||
"reference": "68d81f78d127984ff2e741f0e0d9cb1078f8f3ea",
|
"reference": "3a523f38dc399337ec45b2ab9628e8c37ceb23c7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -6805,7 +6805,7 @@
|
|||||||
"http"
|
"http"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/http-client/tree/v7.4.18"
|
"source": "https://github.com/symfony/http-client/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6825,7 +6825,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T13:49:59+00:00"
|
"time": "2026-09-08T13:28:43+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-client-contracts",
|
"name": "symfony/http-client-contracts",
|
||||||
@@ -6911,16 +6911,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-foundation",
|
"name": "symfony/http-foundation",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/http-foundation.git",
|
"url": "https://github.com/symfony/http-foundation.git",
|
||||||
"reference": "d070b716a32fbe3bf04204db0f58ace73b86d133"
|
"reference": "f7b953be7801974a5a0685e1228bbc3b12b35936"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/d070b716a32fbe3bf04204db0f58ace73b86d133",
|
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/f7b953be7801974a5a0685e1228bbc3b12b35936",
|
||||||
"reference": "d070b716a32fbe3bf04204db0f58ace73b86d133",
|
"reference": "f7b953be7801974a5a0685e1228bbc3b12b35936",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -6969,7 +6969,7 @@
|
|||||||
"description": "Defines an object-oriented layer for the HTTP specification",
|
"description": "Defines an object-oriented layer for the HTTP specification",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/http-foundation/tree/v7.4.18"
|
"source": "https://github.com/symfony/http-foundation/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6989,20 +6989,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T20:10:52+00:00"
|
"time": "2026-09-14T17:41:17+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-kernel",
|
"name": "symfony/http-kernel",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/http-kernel.git",
|
"url": "https://github.com/symfony/http-kernel.git",
|
||||||
"reference": "275d2d2d24530f2a0eaf17704a3a93860a036351"
|
"reference": "683507424cc84ca85ac1551adb609b6b98216667"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/275d2d2d24530f2a0eaf17704a3a93860a036351",
|
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/683507424cc84ca85ac1551adb609b6b98216667",
|
||||||
"reference": "275d2d2d24530f2a0eaf17704a3a93860a036351",
|
"reference": "683507424cc84ca85ac1551adb609b6b98216667",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7088,7 +7088,7 @@
|
|||||||
"description": "Provides a structured process for converting a Request into a Response",
|
"description": "Provides a structured process for converting a Request into a Response",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/http-kernel/tree/v7.4.18"
|
"source": "https://github.com/symfony/http-kernel/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7108,7 +7108,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T21:24:29+00:00"
|
"time": "2026-09-15T07:09:35+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/intl",
|
"name": "symfony/intl",
|
||||||
@@ -7285,16 +7285,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/mailer",
|
"name": "symfony/mailer",
|
||||||
"version": "v7.4.17",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/mailer.git",
|
"url": "https://github.com/symfony/mailer.git",
|
||||||
"reference": "b17c9bf3a551d5f635638a3b6c05f06c4dc87584"
|
"reference": "6f6f2441bef07a42d2617b9b3aadf04a321aa514"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/mailer/zipball/b17c9bf3a551d5f635638a3b6c05f06c4dc87584",
|
"url": "https://api.github.com/repos/symfony/mailer/zipball/6f6f2441bef07a42d2617b9b3aadf04a321aa514",
|
||||||
"reference": "b17c9bf3a551d5f635638a3b6c05f06c4dc87584",
|
"reference": "6f6f2441bef07a42d2617b9b3aadf04a321aa514",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7345,7 +7345,7 @@
|
|||||||
"description": "Helps sending emails",
|
"description": "Helps sending emails",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/mailer/tree/v7.4.17"
|
"source": "https://github.com/symfony/mailer/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7365,20 +7365,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-21T17:40:08+00:00"
|
"time": "2026-09-15T06:01:15+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/messenger",
|
"name": "symfony/messenger",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/messenger.git",
|
"url": "https://github.com/symfony/messenger.git",
|
||||||
"reference": "b109f9f4e54470ee6835751bc39318fe3d8275e6"
|
"reference": "4070504211a16c4237247f7b2a91143c3a1f4e51"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/messenger/zipball/b109f9f4e54470ee6835751bc39318fe3d8275e6",
|
"url": "https://api.github.com/repos/symfony/messenger/zipball/4070504211a16c4237247f7b2a91143c3a1f4e51",
|
||||||
"reference": "b109f9f4e54470ee6835751bc39318fe3d8275e6",
|
"reference": "4070504211a16c4237247f7b2a91143c3a1f4e51",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7439,7 +7439,7 @@
|
|||||||
"description": "Helps applications send and receive messages to/from other applications or via message queues",
|
"description": "Helps applications send and receive messages to/from other applications or via message queues",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/messenger/tree/v7.4.18"
|
"source": "https://github.com/symfony/messenger/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7459,20 +7459,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T00:47:26+00:00"
|
"time": "2026-09-14T15:23:30+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/mime",
|
"name": "symfony/mime",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/mime.git",
|
"url": "https://github.com/symfony/mime.git",
|
||||||
"reference": "bf328d82105831db3e409195db0540ff57f27c80"
|
"reference": "f8ac7d0a800bcabbcd1f7de56594cf05e6cd5693"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/mime/zipball/bf328d82105831db3e409195db0540ff57f27c80",
|
"url": "https://api.github.com/repos/symfony/mime/zipball/f8ac7d0a800bcabbcd1f7de56594cf05e6cd5693",
|
||||||
"reference": "bf328d82105831db3e409195db0540ff57f27c80",
|
"reference": "f8ac7d0a800bcabbcd1f7de56594cf05e6cd5693",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7528,7 +7528,7 @@
|
|||||||
"mime-type"
|
"mime-type"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/mime/tree/v7.4.18"
|
"source": "https://github.com/symfony/mime/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7548,7 +7548,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-22T09:04:42+00:00"
|
"time": "2026-09-04T10:45:44+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/monolog-bridge",
|
"name": "symfony/monolog-bridge",
|
||||||
@@ -8777,16 +8777,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/process",
|
"name": "symfony/process",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/process.git",
|
"url": "https://github.com/symfony/process.git",
|
||||||
"reference": "058d17fc284cce14efb2385783b55014a461b176"
|
"reference": "ed0ae095b86994d370d5791612e55984f15aa30e"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/process/zipball/058d17fc284cce14efb2385783b55014a461b176",
|
"url": "https://api.github.com/repos/symfony/process/zipball/ed0ae095b86994d370d5791612e55984f15aa30e",
|
||||||
"reference": "058d17fc284cce14efb2385783b55014a461b176",
|
"reference": "ed0ae095b86994d370d5791612e55984f15aa30e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -8818,7 +8818,7 @@
|
|||||||
"description": "Executes commands in sub-processes",
|
"description": "Executes commands in sub-processes",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/process/tree/v7.4.18"
|
"source": "https://github.com/symfony/process/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -8838,7 +8838,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-21T17:40:08+00:00"
|
"time": "2026-09-02T12:38:34+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/property-access",
|
"name": "symfony/property-access",
|
||||||
@@ -8923,16 +8923,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/property-info",
|
"name": "symfony/property-info",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/property-info.git",
|
"url": "https://github.com/symfony/property-info.git",
|
||||||
"reference": "52420d499b03ec20c0d38f0dc2f940bc9c43dc8e"
|
"reference": "547d2acbe865d511809b96ab653304fd632abbaa"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/property-info/zipball/52420d499b03ec20c0d38f0dc2f940bc9c43dc8e",
|
"url": "https://api.github.com/repos/symfony/property-info/zipball/547d2acbe865d511809b96ab653304fd632abbaa",
|
||||||
"reference": "52420d499b03ec20c0d38f0dc2f940bc9c43dc8e",
|
"reference": "547d2acbe865d511809b96ab653304fd632abbaa",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -8989,7 +8989,7 @@
|
|||||||
"validator"
|
"validator"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/property-info/tree/v7.4.18"
|
"source": "https://github.com/symfony/property-info/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9009,7 +9009,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-25T14:18:37+00:00"
|
"time": "2026-09-04T10:11:42+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/psr-http-message-bridge",
|
"name": "symfony/psr-http-message-bridge",
|
||||||
@@ -9549,16 +9549,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/security-http",
|
"name": "symfony/security-http",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/security-http.git",
|
"url": "https://github.com/symfony/security-http.git",
|
||||||
"reference": "ca575e23a2b5e068ce0cdf157767b63b438125e0"
|
"reference": "c13182ec07b8a0c5316505a4c9c51948f87d87bb"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/security-http/zipball/ca575e23a2b5e068ce0cdf157767b63b438125e0",
|
"url": "https://api.github.com/repos/symfony/security-http/zipball/c13182ec07b8a0c5316505a4c9c51948f87d87bb",
|
||||||
"reference": "ca575e23a2b5e068ce0cdf157767b63b438125e0",
|
"reference": "c13182ec07b8a0c5316505a4c9c51948f87d87bb",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -9617,7 +9617,7 @@
|
|||||||
"description": "Symfony Security Component - HTTP Integration",
|
"description": "Symfony Security Component - HTTP Integration",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/security-http/tree/v7.4.18"
|
"source": "https://github.com/symfony/security-http/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9637,20 +9637,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T17:23:54+00:00"
|
"time": "2026-09-15T06:01:15+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/serializer",
|
"name": "symfony/serializer",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/serializer.git",
|
"url": "https://github.com/symfony/serializer.git",
|
||||||
"reference": "1f31d4e902c85b820af5dce27dbe17435524bed0"
|
"reference": "d631b82e0db971444651c4e6a076040d20878caa"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/serializer/zipball/1f31d4e902c85b820af5dce27dbe17435524bed0",
|
"url": "https://api.github.com/repos/symfony/serializer/zipball/d631b82e0db971444651c4e6a076040d20878caa",
|
||||||
"reference": "1f31d4e902c85b820af5dce27dbe17435524bed0",
|
"reference": "d631b82e0db971444651c4e6a076040d20878caa",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -9721,7 +9721,7 @@
|
|||||||
"description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
|
"description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/serializer/tree/v7.4.18"
|
"source": "https://github.com/symfony/serializer/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9741,7 +9741,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T00:47:26+00:00"
|
"time": "2026-09-08T13:28:43+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/service-contracts",
|
"name": "symfony/service-contracts",
|
||||||
@@ -9971,16 +9971,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/string",
|
"name": "symfony/string",
|
||||||
"version": "v7.4.15",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/string.git",
|
"url": "https://github.com/symfony/string.git",
|
||||||
"reference": "e394af32256bf9e7bf80849d95e589167c10097b"
|
"reference": "02731ce2bd26514bec9efc0baef2cd0b0cf67f46"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/string/zipball/e394af32256bf9e7bf80849d95e589167c10097b",
|
"url": "https://api.github.com/repos/symfony/string/zipball/02731ce2bd26514bec9efc0baef2cd0b0cf67f46",
|
||||||
"reference": "e394af32256bf9e7bf80849d95e589167c10097b",
|
"reference": "02731ce2bd26514bec9efc0baef2cd0b0cf67f46",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -10038,7 +10038,7 @@
|
|||||||
"utf8"
|
"utf8"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/string/tree/v7.4.15"
|
"source": "https://github.com/symfony/string/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -10058,7 +10058,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-07-28T07:33:02+00:00"
|
"time": "2026-09-11T14:46:58+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/translation",
|
"name": "symfony/translation",
|
||||||
@@ -10244,16 +10244,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/twig-bridge",
|
"name": "symfony/twig-bridge",
|
||||||
"version": "v7.4.17",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/twig-bridge.git",
|
"url": "https://github.com/symfony/twig-bridge.git",
|
||||||
"reference": "413485ee177ad5b321ad9a689a90fd3f2d3fefd7"
|
"reference": "10d369dd3845bb650a9450e643d6d9027e8a86af"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/twig-bridge/zipball/413485ee177ad5b321ad9a689a90fd3f2d3fefd7",
|
"url": "https://api.github.com/repos/symfony/twig-bridge/zipball/10d369dd3845bb650a9450e643d6d9027e8a86af",
|
||||||
"reference": "413485ee177ad5b321ad9a689a90fd3f2d3fefd7",
|
"reference": "10d369dd3845bb650a9450e643d6d9027e8a86af",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -10335,7 +10335,7 @@
|
|||||||
"description": "Provides integration for Twig with various Symfony components",
|
"description": "Provides integration for Twig with various Symfony components",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/twig-bridge/tree/v7.4.17"
|
"source": "https://github.com/symfony/twig-bridge/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -10355,20 +10355,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-22T09:04:42+00:00"
|
"time": "2026-09-14T12:19:06+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/twig-bundle",
|
"name": "symfony/twig-bundle",
|
||||||
"version": "v7.4.15",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/twig-bundle.git",
|
"url": "https://github.com/symfony/twig-bundle.git",
|
||||||
"reference": "e3d2bea0b594aa50c3482a278a5cd09d83d94517"
|
"reference": "231c0b37dada053458d47281261a3af0270a634d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/twig-bundle/zipball/e3d2bea0b594aa50c3482a278a5cd09d83d94517",
|
"url": "https://api.github.com/repos/symfony/twig-bundle/zipball/231c0b37dada053458d47281261a3af0270a634d",
|
||||||
"reference": "e3d2bea0b594aa50c3482a278a5cd09d83d94517",
|
"reference": "231c0b37dada053458d47281261a3af0270a634d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -10425,7 +10425,7 @@
|
|||||||
"description": "Provides a tight integration of Twig into the Symfony full-stack framework",
|
"description": "Provides a tight integration of Twig into the Symfony full-stack framework",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/twig-bundle/tree/v7.4.15"
|
"source": "https://github.com/symfony/twig-bundle/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -10445,7 +10445,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-07-21T15:13:06+00:00"
|
"time": "2026-09-11T14:46:58+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/type-info",
|
"name": "symfony/type-info",
|
||||||
@@ -10699,16 +10699,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/validator",
|
"name": "symfony/validator",
|
||||||
"version": "v7.4.18",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/validator.git",
|
"url": "https://github.com/symfony/validator.git",
|
||||||
"reference": "976bd879fda78de30ee4688fd38ae87bc4d2dc76"
|
"reference": "a6d275d96d107fb2000dae04ab23b2e0c29ceb66"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/validator/zipball/976bd879fda78de30ee4688fd38ae87bc4d2dc76",
|
"url": "https://api.github.com/repos/symfony/validator/zipball/a6d275d96d107fb2000dae04ab23b2e0c29ceb66",
|
||||||
"reference": "976bd879fda78de30ee4688fd38ae87bc4d2dc76",
|
"reference": "a6d275d96d107fb2000dae04ab23b2e0c29ceb66",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -10779,7 +10779,7 @@
|
|||||||
"description": "Provides tools to validate values",
|
"description": "Provides tools to validate values",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/validator/tree/v7.4.18"
|
"source": "https://github.com/symfony/validator/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -10799,7 +10799,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-30T00:47:26+00:00"
|
"time": "2026-09-09T19:50:33+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/var-dumper",
|
"name": "symfony/var-dumper",
|
||||||
@@ -15242,16 +15242,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/web-profiler-bundle",
|
"name": "symfony/web-profiler-bundle",
|
||||||
"version": "v7.4.17",
|
"version": "v7.4.19",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/web-profiler-bundle.git",
|
"url": "https://github.com/symfony/web-profiler-bundle.git",
|
||||||
"reference": "3abb070d460c61924c23edfda9e2e5af34e43a19"
|
"reference": "f9c5fed39f307b23c47e8a11c431d848390f8a67"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3abb070d460c61924c23edfda9e2e5af34e43a19",
|
"url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/f9c5fed39f307b23c47e8a11c431d848390f8a67",
|
||||||
"reference": "3abb070d460c61924c23edfda9e2e5af34e43a19",
|
"reference": "f9c5fed39f307b23c47e8a11c431d848390f8a67",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -15308,7 +15308,7 @@
|
|||||||
"dev"
|
"dev"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/web-profiler-bundle/tree/v7.4.17"
|
"source": "https://github.com/symfony/web-profiler-bundle/tree/v7.4.19"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -15328,7 +15328,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-22T09:04:42+00:00"
|
"time": "2026-09-04T10:11:42+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "theseer/tokenizer",
|
"name": "theseer/tokenizer",
|
||||||
|
|||||||
+13
@@ -87,6 +87,19 @@ host('prod')
|
|||||||
->set('rsync_src', __DIR__)
|
->set('rsync_src', __DIR__)
|
||||||
->set('rsync', $rsyncOptions)
|
->set('rsync', $rsyncOptions)
|
||||||
->set('cachetool_args', '--web=SymfonyHttpClient --web-path={{current_path}}/public/ --web-url=https://my.ep-reisen.de')
|
->set('cachetool_args', '--web=SymfonyHttpClient --web-path={{current_path}}/public/ --web-url=https://my.ep-reisen.de')
|
||||||
|
;
|
||||||
|
|
||||||
|
host('staging')
|
||||||
|
->setHostname('dedi10193.your-server.de')
|
||||||
|
->setRemoteUser('myepsf')
|
||||||
|
->setForwardAgent(true)
|
||||||
|
->setSshMultiplexing(true)
|
||||||
|
->setDeployPath('/usr/home/myepsf/public_html/staging')
|
||||||
|
->set('bin/php', '/usr/bin/php')
|
||||||
|
->set('http_user', 'myepsf')
|
||||||
|
->set('rsync_src', __DIR__)
|
||||||
|
->set('rsync', $rsyncOptions)
|
||||||
|
->set('cachetool_args', '--web=SymfonyHttpClient --web-path={{current_path}}/public/ --web-url=https://my.ep-reisen.net')
|
||||||
->add('shared_files', [
|
->add('shared_files', [
|
||||||
'public/.htpasswd',
|
'public/.htpasswd',
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ class BookingPayloadBuilder
|
|||||||
foreach ($bookingData->participants as $index => $participant) {
|
foreach ($bookingData->participants as $index => $participant) {
|
||||||
$participantPayload = [
|
$participantPayload = [
|
||||||
'@id' => $index + 1,
|
'@id' => $index + 1,
|
||||||
'status' => $bookingData->participantsStatus[$index],
|
'status' => $bookingData->participantsStatus[$index] ?? null,
|
||||||
...$participant->toPayload(),
|
...$participant->toPayload(),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -49,11 +49,13 @@ class BookingParser extends AbstractParser
|
|||||||
|
|
||||||
$booking->applicant = $this->parsePersonalData($node->filterXPath('//anmelder'));
|
$booking->applicant = $this->parsePersonalData($node->filterXPath('//anmelder'));
|
||||||
|
|
||||||
$participantsStatus = $this->getArrayValue($node->filterXPath('//status_teilnehmer'), '/');
|
|
||||||
$booking->participantsStatus = array_combine(range(0, count($participantsStatus) - 1), $participantsStatus);
|
|
||||||
|
|
||||||
$booking->participants = $this->parseParticipants($node->filterXPath('//teilnehmerliste/teilnehmer'));
|
$booking->participants = $this->parseParticipants($node->filterXPath('//teilnehmerliste/teilnehmer'));
|
||||||
|
|
||||||
|
$booking->participantsStatus = $this->mapParticipantsStatus(
|
||||||
|
array_keys($booking->participants),
|
||||||
|
$this->getArrayValue($node->filterXPath('//status_teilnehmer'), '/'),
|
||||||
|
);
|
||||||
|
|
||||||
$paymentData = $node->filterXPath('//zahlung');
|
$paymentData = $node->filterXPath('//zahlung');
|
||||||
$booking->paymentId = $this->getAttrOrNullValue($paymentData, 'idzahlungsart');
|
$booking->paymentId = $this->getAttrOrNullValue($paymentData, 'idzahlungsart');
|
||||||
$booking->paymentLabel = $this->getAttrOrNullValue($paymentData, 'bezeichnung');
|
$booking->paymentLabel = $this->getAttrOrNullValue($paymentData, 'bezeichnung');
|
||||||
@@ -129,6 +131,38 @@ class BookingParser extends AbstractParser
|
|||||||
return $participants;
|
return $participants;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps the positional status_teilnehmer list onto the participant keys.
|
||||||
|
*
|
||||||
|
* BusPro sends the statuses as a slash-separated list in teilnehmerliste order and
|
||||||
|
* without ids, while participants are keyed by "BusPro participant id - 1" (see
|
||||||
|
* parseParticipants()). Zipping the two in document order keeps both arrays on the same
|
||||||
|
* keys even when the ids are not contiguous from 1, which BookingPayloadBuilder relies
|
||||||
|
* on when it reads participantsStatus[$index] while iterating participants, and which
|
||||||
|
* gates editing in ParticipantController::isParticipantCanceled().
|
||||||
|
*
|
||||||
|
* Surplus entries on either side are dropped rather than shifting the remaining ones
|
||||||
|
* onto the wrong participant.
|
||||||
|
*
|
||||||
|
* @param list<int> $participantKeys Participant array keys, in document order
|
||||||
|
* @param list<string> $statusValues Status codes, in document order
|
||||||
|
*
|
||||||
|
* @return array<int, string>
|
||||||
|
*/
|
||||||
|
private function mapParticipantsStatus(array $participantKeys, array $statusValues): array
|
||||||
|
{
|
||||||
|
$count = min(count($participantKeys), count($statusValues));
|
||||||
|
|
||||||
|
if (0 === $count) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_combine(
|
||||||
|
array_slice($participantKeys, 0, $count),
|
||||||
|
array_slice($statusValues, 0, $count),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
private function parsePersonalData(Crawler $node): PersonalData
|
private function parsePersonalData(Crawler $node): PersonalData
|
||||||
{
|
{
|
||||||
$personalData = new PersonalData();
|
$personalData = new PersonalData();
|
||||||
|
|||||||
@@ -11,6 +11,11 @@ class BpnXmlAnonymizer
|
|||||||
{
|
{
|
||||||
private const SAFE_EMAIL_DOMAIN = 'example.com';
|
private const SAFE_EMAIL_DOMAIN = 'example.com';
|
||||||
|
|
||||||
|
/** Elements holding a person id, in the order resolvePersonId() prefers them. */
|
||||||
|
private const PERSON_ID_TAGS = ['personid', 'idperson', 'idadresseperson'];
|
||||||
|
|
||||||
|
private const ADDRESS_ID_TAG = 'idadresse';
|
||||||
|
|
||||||
private Generator $faker;
|
private Generator $faker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -20,6 +25,24 @@ class BpnXmlAnonymizer
|
|||||||
|
|
||||||
private int $fallbackIdentityCounter = 0;
|
private int $fallbackIdentityCounter = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps a person id as it appears in the source to its replacement.
|
||||||
|
*
|
||||||
|
* Person ids show up in several places for the same person - the root <idperson>, the
|
||||||
|
* anmelder's <idadresseperson>, each participant's own - and referential integrity only
|
||||||
|
* survives if every occurrence of one source value maps to the same replacement.
|
||||||
|
*
|
||||||
|
* @var array<string, string>
|
||||||
|
*/
|
||||||
|
private array $personIdReplacements = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps an address id as it appears in the source to its replacement.
|
||||||
|
*
|
||||||
|
* @var array<string, string>
|
||||||
|
*/
|
||||||
|
private array $addressIdReplacements = [];
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->faker = Factory::create('de_DE');
|
$this->faker = Factory::create('de_DE');
|
||||||
@@ -46,14 +69,24 @@ class BpnXmlAnonymizer
|
|||||||
throw new \RuntimeException('Unable to query person nodes.');
|
throw new \RuntimeException('Unable to query person nodes.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Resolving runs to completion before anything is replaced. resolvePersonId() falls
|
||||||
|
// back to walking up the ancestors when a node carries no person id of its own, so a
|
||||||
|
// single interleaved pass could read an id that an earlier replacement had already
|
||||||
|
// faked and split one person into two identities.
|
||||||
|
$resolved = [];
|
||||||
|
|
||||||
foreach ($personNodes as $index => $personNode) {
|
foreach ($personNodes as $index => $personNode) {
|
||||||
if (false === $personNode instanceof \DOMElement) {
|
if (false === $personNode instanceof \DOMElement) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$personId = $this->resolvePersonId($personNode, (int) $index);
|
$identity = $this->getOrCreateIdentity($this->resolvePersonId($personNode, (int) $index));
|
||||||
$identity = $this->getOrCreateIdentity($personId);
|
$this->collectIdReplacements($personNode, $identity);
|
||||||
|
|
||||||
|
$resolved[] = [$personNode, $identity];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($resolved as [$personNode, $identity]) {
|
||||||
if ('anfrage' === $personNode->tagName) {
|
if ('anfrage' === $personNode->tagName) {
|
||||||
$this->replaceRequestFields($personNode, $identity);
|
$this->replaceRequestFields($personNode, $identity);
|
||||||
continue;
|
continue;
|
||||||
@@ -67,6 +100,10 @@ class BpnXmlAnonymizer
|
|||||||
$this->replaceMetadataFields($personNode, $identity);
|
$this->replaceMetadataFields($personNode, $identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Person and address ids are swept document-wide rather than per person node: the
|
||||||
|
// same ids also appear outside any of them, as direct children of <ergebnis>.
|
||||||
|
$this->replaceIdReferences($xpath);
|
||||||
|
|
||||||
$result = $document->saveXML();
|
$result = $document->saveXML();
|
||||||
if (false === $result) {
|
if (false === $result) {
|
||||||
throw new \RuntimeException('Unable to serialize anonymized XML.');
|
throw new \RuntimeException('Unable to serialize anonymized XML.');
|
||||||
@@ -84,6 +121,8 @@ class BpnXmlAnonymizer
|
|||||||
{
|
{
|
||||||
$this->identities = [];
|
$this->identities = [];
|
||||||
$this->fallbackIdentityCounter = 0;
|
$this->fallbackIdentityCounter = 0;
|
||||||
|
$this->personIdReplacements = [];
|
||||||
|
$this->addressIdReplacements = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function resolvePersonId(\DOMElement $personNode, int $nodeIndex): string
|
private function resolvePersonId(\DOMElement $personNode, int $nodeIndex): string
|
||||||
@@ -419,16 +458,22 @@ class BpnXmlAnonymizer
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Replaces identifying attributes on the person node.
|
||||||
|
*
|
||||||
|
* teilnehmer/@id is deliberately left alone: it is not an identifier but the
|
||||||
|
* participant's 1-based slot within the booking, and zuordnung, status_teilnehmer,
|
||||||
|
* einzelpreis and the outbound payload all index against it. Rewriting it makes the
|
||||||
|
* dump self-contradictory - room and service assignments then resolve to nobody - so
|
||||||
|
* anonymized dumps stop being usable for debugging.
|
||||||
|
*
|
||||||
|
* kunde/@id is a real customer id and is replaced.
|
||||||
|
*
|
||||||
* @param array<string, string> $identity
|
* @param array<string, string> $identity
|
||||||
*/
|
*/
|
||||||
private function replaceMetadataFields(\DOMElement $personNode, array $identity): void
|
private function replaceMetadataFields(\DOMElement $personNode, array $identity): void
|
||||||
{
|
{
|
||||||
if (true === $personNode->hasAttribute('id')) {
|
|
||||||
if ('kunde' === $personNode->tagName) {
|
if ('kunde' === $personNode->tagName) {
|
||||||
$this->replaceAttributeValue($personNode, 'id', $identity['customerId']);
|
$this->replaceAttributeValue($personNode, 'id', $identity['customerId']);
|
||||||
} elseif ('teilnehmer' === $personNode->tagName || 'anmelder' === $personNode->tagName) {
|
|
||||||
$this->replaceAttributeValue($personNode, 'id', $identity['personId']);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,15 +521,120 @@ class BpnXmlAnonymizer
|
|||||||
$node->setAttribute($attributeName, $replacement);
|
$node->setAttribute($attributeName, $replacement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Records how this person's ids must be replaced wherever they occur.
|
||||||
|
*
|
||||||
|
* Every id the node carries itself is claimed. When it carries none, the nearest
|
||||||
|
* ancestor's is claimed instead - which is the same rule resolvePersonId() used to pick
|
||||||
|
* this node's identity in the first place, so the two can never disagree about who a
|
||||||
|
* given id belongs to. A response whose only person sits in <adressdaten> keeps its ids
|
||||||
|
* at the <ergebnis> level, and this is what ties them together.
|
||||||
|
*
|
||||||
|
* @param array<string, string> $identity
|
||||||
|
*/
|
||||||
|
private function collectIdReplacements(\DOMElement $personNode, array $identity): void
|
||||||
|
{
|
||||||
|
$ownPersonIds = [];
|
||||||
|
|
||||||
|
foreach (self::PERSON_ID_TAGS as $tagName) {
|
||||||
|
$value = $this->getDirectChildValue($personNode, $tagName);
|
||||||
|
if (null !== $value) {
|
||||||
|
$ownPersonIds[] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ([] === $ownPersonIds) {
|
||||||
|
$inherited = $this->findPersonIdInAncestors($personNode);
|
||||||
|
if (null !== $inherited) {
|
||||||
|
$ownPersonIds[] = $inherited;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($ownPersonIds as $value) {
|
||||||
|
$this->personIdReplacements[$value] ??= $identity['personId'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$addressId = $this->getDirectChildValue($personNode, self::ADDRESS_ID_TAG)
|
||||||
|
?? $this->findIdInAncestors($personNode, [self::ADDRESS_ID_TAG]);
|
||||||
|
|
||||||
|
if (null !== $addressId) {
|
||||||
|
$this->addressIdReplacements[$addressId] ??= $identity['addressId'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces every person and address id in the document.
|
||||||
|
*
|
||||||
|
* Runs after all person nodes have been resolved, so the lookup keys are the untouched
|
||||||
|
* source values. An id belonging to nobody the person-node query reached still gets a
|
||||||
|
* replacement of its own rather than being left in place - it identifies a real person
|
||||||
|
* either way.
|
||||||
|
*/
|
||||||
|
private function replaceIdReferences(\DOMXPath $xpath): void
|
||||||
|
{
|
||||||
|
$tagNames = [...self::PERSON_ID_TAGS, self::ADDRESS_ID_TAG];
|
||||||
|
$nodes = $xpath->query('//'.implode(' | //', $tagNames));
|
||||||
|
|
||||||
|
if (false === $nodes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($nodes as $node) {
|
||||||
|
if (false === $node instanceof \DOMElement) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = trim($node->textContent);
|
||||||
|
if ('' === $value) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$isAddressId = self::ADDRESS_ID_TAG === $node->tagName;
|
||||||
|
$replacements = $isAddressId ? $this->addressIdReplacements : $this->personIdReplacements;
|
||||||
|
|
||||||
|
if (false === isset($replacements[$value])) {
|
||||||
|
$identity = $this->getOrCreateIdentity(sprintf('%s:%s', $node->tagName, $value));
|
||||||
|
$replacements[$value] = $isAddressId ? $identity['addressId'] : $identity['personId'];
|
||||||
|
|
||||||
|
if (true === $isAddressId) {
|
||||||
|
$this->addressIdReplacements[$value] = $replacements[$value];
|
||||||
|
} else {
|
||||||
|
$this->personIdReplacements[$value] = $replacements[$value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->replaceNodeValue($node, $replacements[$value]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getDirectChildValue(\DOMElement $parent, string $name): ?string
|
||||||
|
{
|
||||||
|
$child = $this->getDirectChild($parent, $name);
|
||||||
|
if (null === $child) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = trim($child->textContent);
|
||||||
|
|
||||||
|
return '' === $value ? null : $value;
|
||||||
|
}
|
||||||
|
|
||||||
private function findPersonIdInAncestors(\DOMElement $node): ?string
|
private function findPersonIdInAncestors(\DOMElement $node): ?string
|
||||||
{
|
{
|
||||||
foreach (['personid', 'idperson', 'idadresseperson'] as $tagName) {
|
return $this->findIdInAncestors($node, self::PERSON_ID_TAGS);
|
||||||
$child = $this->getDirectChild($node, $tagName);
|
|
||||||
if (null !== $child) {
|
|
||||||
$value = trim($child->textContent);
|
|
||||||
if ('' !== $value) {
|
|
||||||
return $value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the nearest id of the given kind on the node or one of its ancestors.
|
||||||
|
*
|
||||||
|
* @param list<string> $tagNames
|
||||||
|
*/
|
||||||
|
private function findIdInAncestors(\DOMElement $node, array $tagNames): ?string
|
||||||
|
{
|
||||||
|
foreach ($tagNames as $tagName) {
|
||||||
|
$value = $this->getDirectChildValue($node, $tagName);
|
||||||
|
if (null !== $value) {
|
||||||
|
return $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -493,7 +643,7 @@ class BpnXmlAnonymizer
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->findPersonIdInAncestors($parent);
|
return $this->findIdInAncestors($parent, $tagNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getDirectChild(\DOMElement $parent, string $name): ?\DOMElement
|
private function getDirectChild(\DOMElement $parent, string $name): ?\DOMElement
|
||||||
|
|||||||
@@ -0,0 +1,108 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Tests\BusProNet\XmlParser;
|
||||||
|
|
||||||
|
use App\BusProNet\XmlCrawlerFactory;
|
||||||
|
use App\BusProNet\XmlParser\BookingParser;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that participantsStatus stays aligned with the participants array.
|
||||||
|
*
|
||||||
|
* Participants are keyed by "BusPro participant id - 1" while status_teilnehmer is an
|
||||||
|
* id-less, slash-separated list in document order. BookingPayloadBuilder reads
|
||||||
|
* participantsStatus[$index] while iterating participants, and
|
||||||
|
* ParticipantController::isParticipantCanceled() gates editing on it, so the two arrays
|
||||||
|
* must share their keys even when BusPro's ids are not contiguous from 1.
|
||||||
|
*/
|
||||||
|
class BookingParserParticipantsStatusTest extends TestCase
|
||||||
|
{
|
||||||
|
private BookingParser $parser;
|
||||||
|
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
$this->parser = new BookingParser();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testStatusesAreKeyedLikeParticipantsForContiguousIds(): void
|
||||||
|
{
|
||||||
|
$booking = $this->parse('F/S/F', [1, 2, 3]);
|
||||||
|
|
||||||
|
$this->assertSame([0, 1, 2], array_keys($booking->participants));
|
||||||
|
$this->assertSame([0 => 'F', 1 => 'S', 2 => 'F'], $booking->participantsStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testStatusesFollowParticipantIdsWhenIdsAreNotContiguous(): void
|
||||||
|
{
|
||||||
|
$booking = $this->parse('F/S/F', [1, 4, 7]);
|
||||||
|
|
||||||
|
$this->assertSame([0, 3, 6], array_keys($booking->participants));
|
||||||
|
$this->assertSame([0 => 'F', 3 => 'S', 6 => 'F'], $booking->participantsStatus);
|
||||||
|
|
||||||
|
// Every participant the payload builder iterates must find its own status.
|
||||||
|
foreach ($booking->participants as $index => $participant) {
|
||||||
|
$this->assertArrayHasKey($index, $booking->participantsStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSurplusStatusEntriesAreDroppedInsteadOfShifting(): void
|
||||||
|
{
|
||||||
|
$booking = $this->parse('F/S/F/F', [1, 2, 3]);
|
||||||
|
|
||||||
|
$this->assertSame([0 => 'F', 1 => 'S', 2 => 'F'], $booking->participantsStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testMissingStatusEntriesLeaveTheRemainingParticipantsAligned(): void
|
||||||
|
{
|
||||||
|
$booking = $this->parse('F/S', [1, 2, 3]);
|
||||||
|
|
||||||
|
$this->assertSame([0 => 'F', 1 => 'S'], $booking->participantsStatus);
|
||||||
|
$this->assertArrayNotHasKey(2, $booking->participantsStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testStatusListSurroundedByWhitespaceIsParsed(): void
|
||||||
|
{
|
||||||
|
// BusPro pretty-prints the element, so the text node carries newlines and indentation.
|
||||||
|
$booking = $this->parse("\n F/S/F\n ", [1, 2, 3]);
|
||||||
|
|
||||||
|
$this->assertSame([0 => 'F', 1 => 'S', 2 => 'F'], $booking->participantsStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testEmptyStatusListDoesNotFail(): void
|
||||||
|
{
|
||||||
|
$booking = $this->parse('', [1, 2]);
|
||||||
|
|
||||||
|
$this->assertSame([], $booking->participantsStatus);
|
||||||
|
$this->assertCount(2, $booking->participants);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param list<int> $participantIds */
|
||||||
|
private function parse(string $statusList, array $participantIds): \App\BusProNet\Model\Booking
|
||||||
|
{
|
||||||
|
$participants = '';
|
||||||
|
foreach ($participantIds as $id) {
|
||||||
|
$participants .= sprintf(
|
||||||
|
'<teilnehmer id="%d"><name>Teilnehmer %1$d</name><vorname>Test</vorname></teilnehmer>',
|
||||||
|
$id,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$xml = sprintf(
|
||||||
|
'<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ergebnis>
|
||||||
|
<satz typ="KUNDENKONTO" />
|
||||||
|
<art>Vorgang_Details</art>
|
||||||
|
<idbuchung>98787</idbuchung>
|
||||||
|
<status_teilnehmer>%s</status_teilnehmer>
|
||||||
|
<zahlung idzahlungsart="1" bezeichnung="Überweisung" art="U" />
|
||||||
|
<teilnehmerliste>%s</teilnehmerliste>
|
||||||
|
</ergebnis>',
|
||||||
|
$statusList,
|
||||||
|
$participants,
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->parser->parse(XmlCrawlerFactory::create($xml)->filterXPath('//ergebnis'));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -205,11 +205,127 @@ XML;
|
|||||||
$this->assertSame('170', $responseHeight);
|
$this->assertSame('170', $responseHeight);
|
||||||
$this->assertSame('70', $responseWeight);
|
$this->assertSame('70', $responseWeight);
|
||||||
$this->assertSame('42', $responseShoeSize);
|
$this->assertSame('42', $responseShoeSize);
|
||||||
$this->assertSame('123456', $responseRootPersonId);
|
// The root ids identify the same person as the <adressdaten> block, so they must be
|
||||||
$this->assertSame('654321', $responseRootAddressId);
|
// replaced too - and with that person's replacements, not fresh ones.
|
||||||
|
$this->assertSame('700001', $responseRootPersonId);
|
||||||
|
$this->assertSame('800001', $responseRootAddressId);
|
||||||
$this->assertSame(1, $anonymizer->getLastIdentityCount());
|
$this->assertSame(1, $anonymizer->getLastIdentityCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testAnonymizePreservesParticipantSlotIds(): void
|
||||||
|
{
|
||||||
|
$xml = <<<'XML'
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ergebnis>
|
||||||
|
<satz typ="KUNDENKONTO" />
|
||||||
|
<art>Vorgang_Details</art>
|
||||||
|
<status_teilnehmer>F/F/S</status_teilnehmer>
|
||||||
|
<teilnehmerliste>
|
||||||
|
<teilnehmer id="1">
|
||||||
|
<name>Alpha</name>
|
||||||
|
<vorname>Ada</vorname>
|
||||||
|
<idadresseperson>111111</idadresseperson>
|
||||||
|
</teilnehmer>
|
||||||
|
<teilnehmer id="2">
|
||||||
|
<name>Beta</name>
|
||||||
|
<vorname>Ben</vorname>
|
||||||
|
<idadresseperson>222222</idadresseperson>
|
||||||
|
</teilnehmer>
|
||||||
|
<teilnehmer id="3">
|
||||||
|
<name>Gamma</name>
|
||||||
|
<vorname>Cem</vorname>
|
||||||
|
<idadresseperson>333333</idadresseperson>
|
||||||
|
</teilnehmer>
|
||||||
|
</teilnehmerliste>
|
||||||
|
<ferienzielunterbringungen>
|
||||||
|
<ferienzielunterbringung idzimmer="74" anzahl="3" zuordnung="1,2,3" einzelpreis="439,00/439,00/439,00" />
|
||||||
|
</ferienzielunterbringungen>
|
||||||
|
</ergebnis>
|
||||||
|
XML;
|
||||||
|
|
||||||
|
$anonymizer = new BpnXmlAnonymizer();
|
||||||
|
$result = $anonymizer->anonymize($xml);
|
||||||
|
|
||||||
|
$document = new \DOMDocument();
|
||||||
|
$this->assertTrue($document->loadXML($result));
|
||||||
|
|
||||||
|
$xpath = new \DOMXPath($document);
|
||||||
|
|
||||||
|
// Names must be replaced - this is still an anonymizer.
|
||||||
|
$this->assertNotSame('Alpha', trim((string) $xpath->evaluate('string(//teilnehmer[1]/name)')));
|
||||||
|
|
||||||
|
// Slot ids must survive: zuordnung, status_teilnehmer and einzelpreis all index
|
||||||
|
// against them, so rewriting them would make the dump self-contradictory.
|
||||||
|
$this->assertSame('1', trim((string) $xpath->evaluate('string(//teilnehmer[1]/@id)')));
|
||||||
|
$this->assertSame('2', trim((string) $xpath->evaluate('string(//teilnehmer[2]/@id)')));
|
||||||
|
$this->assertSame('3', trim((string) $xpath->evaluate('string(//teilnehmer[3]/@id)')));
|
||||||
|
|
||||||
|
$this->assertSame('1,2,3', trim((string) $xpath->evaluate('string(//ferienzielunterbringung/@zuordnung)')));
|
||||||
|
$this->assertSame('F/F/S', trim((string) $xpath->evaluate('string(//status_teilnehmer)')));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAnonymizeReplacesPersonAndAddressIdsConsistently(): void
|
||||||
|
{
|
||||||
|
$xml = <<<'XML'
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ergebnis>
|
||||||
|
<satz typ="KUNDENKONTO" />
|
||||||
|
<art>Vorgang_Details</art>
|
||||||
|
<idadresse>162648</idadresse>
|
||||||
|
<idperson>275987</idperson>
|
||||||
|
<anmelder>
|
||||||
|
<name>Alpha</name>
|
||||||
|
<vorname>Ada</vorname>
|
||||||
|
<idadresse>162648</idadresse>
|
||||||
|
<idadresseperson>275987</idadresseperson>
|
||||||
|
</anmelder>
|
||||||
|
<teilnehmerliste>
|
||||||
|
<teilnehmer id="1">
|
||||||
|
<name>Alpha</name>
|
||||||
|
<vorname>Ada</vorname>
|
||||||
|
<idadresseperson>275987</idadresseperson>
|
||||||
|
</teilnehmer>
|
||||||
|
<teilnehmer id="2">
|
||||||
|
<name>Beta</name>
|
||||||
|
<vorname>Ben</vorname>
|
||||||
|
<idadresseperson>413732</idadresseperson>
|
||||||
|
</teilnehmer>
|
||||||
|
</teilnehmerliste>
|
||||||
|
</ergebnis>
|
||||||
|
XML;
|
||||||
|
|
||||||
|
$anonymizer = new BpnXmlAnonymizer();
|
||||||
|
$result = $anonymizer->anonymize($xml);
|
||||||
|
|
||||||
|
$this->assertStringNotContainsString('275987', $result);
|
||||||
|
$this->assertStringNotContainsString('413732', $result);
|
||||||
|
$this->assertStringNotContainsString('162648', $result);
|
||||||
|
|
||||||
|
$document = new \DOMDocument();
|
||||||
|
$this->assertTrue($document->loadXML($result));
|
||||||
|
|
||||||
|
$xpath = new \DOMXPath($document);
|
||||||
|
|
||||||
|
$rootPersonId = trim((string) $xpath->evaluate('string(/ergebnis/idperson)'));
|
||||||
|
$rootAddressId = trim((string) $xpath->evaluate('string(/ergebnis/idadresse)'));
|
||||||
|
$applicantPersonId = trim((string) $xpath->evaluate('string(//anmelder/idadresseperson)'));
|
||||||
|
$applicantAddressId = trim((string) $xpath->evaluate('string(//anmelder/idadresse)'));
|
||||||
|
$firstPersonId = trim((string) $xpath->evaluate('string(//teilnehmer[1]/idadresseperson)'));
|
||||||
|
$secondPersonId = trim((string) $xpath->evaluate('string(//teilnehmer[2]/idadresseperson)'));
|
||||||
|
|
||||||
|
// One source id maps to one replacement wherever it occurs, so the applicant stays
|
||||||
|
// recognisable as participant 1 and as the owner of the root ids.
|
||||||
|
$this->assertSame($applicantPersonId, $rootPersonId);
|
||||||
|
$this->assertSame($applicantPersonId, $firstPersonId);
|
||||||
|
$this->assertSame($applicantAddressId, $rootAddressId);
|
||||||
|
|
||||||
|
// Distinct people keep distinct ids.
|
||||||
|
$this->assertNotSame($applicantPersonId, $secondPersonId);
|
||||||
|
|
||||||
|
// The applicant and participant 1 are one person, so only two identities exist.
|
||||||
|
$this->assertSame(2, $anonymizer->getLastIdentityCount());
|
||||||
|
}
|
||||||
|
|
||||||
public function testAnonymizeReplacesKundeAttributes(): void
|
public function testAnonymizeReplacesKundeAttributes(): void
|
||||||
{
|
{
|
||||||
$xml = <<<'XML'
|
$xml = <<<'XML'
|
||||||
@@ -526,8 +642,10 @@ XML;
|
|||||||
$this->assertSame('170', $height);
|
$this->assertSame('170', $height);
|
||||||
$this->assertSame('70', $weight);
|
$this->assertSame('70', $weight);
|
||||||
$this->assertSame('42', $shoeSize);
|
$this->assertSame('42', $shoeSize);
|
||||||
$this->assertSame('123456', $personId);
|
// Same here: <adressdaten> carries no ids of its own, so the ones at the <ergebnis>
|
||||||
$this->assertSame('654321', $addressIdRoot);
|
// level are its own and must map onto this person's replacements.
|
||||||
|
$this->assertSame('700001', $personId);
|
||||||
|
$this->assertSame('800001', $addressIdRoot);
|
||||||
$this->assertSame(1, $anonymizer->getLastIdentityCount());
|
$this->assertSame(1, $anonymizer->getLastIdentityCount());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user