diff --git a/.drone.yml b/.drone.yml
index 69ae684..444af2b 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -1,6 +1,7 @@
kind: pipeline
name: default
+load: [docker, composer]
steps:
- name: install
image: composer
@@ -17,7 +18,9 @@ steps:
- chmod +x /usr/local/bin/phpcs
- chmod +x /usr/local/bin/phpcbf
- curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
- - phpcs -d memory_limit=512M --extensions=php --standard=PSR2 ./src/
+
+ - phpcbf -w ./src/
+
- name: test
image: php:8.1
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
index ffa1385..1297f1c 100644
--- a/.idea/dataSources.xml
+++ b/.idea/dataSources.xml
@@ -8,13 +8,13 @@
jdbc:mysql://127.0.0.1:3306
$ProjectFileDir$
-
+
mariadb
true
true
DDEV generated data source
org.mariadb.jdbc.Driver
- jdbc:mariadb://127.0.0.1:51773/db?user=db&password=db
+ jdbc:mariadb://127.0.0.1:55034/db?user=db&password=db
$ProjectFileDir$
diff --git a/composer.lock b/composer.lock
index c68d4f6..7720fa2 100644
--- a/composer.lock
+++ b/composer.lock
@@ -8,16 +8,16 @@
"packages": [
{
"name": "api-platform/core",
- "version": "v3.2.0",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/api-platform/core.git",
- "reference": "de8d5835f0a349f80a32b268be893d8e2cf85a07"
+ "reference": "3ab7e8791bd836a7b2c64b0cb326654ba69e8257"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/api-platform/core/zipball/de8d5835f0a349f80a32b268be893d8e2cf85a07",
- "reference": "de8d5835f0a349f80a32b268be893d8e2cf85a07",
+ "url": "https://api.github.com/repos/api-platform/core/zipball/3ab7e8791bd836a7b2c64b0cb326654ba69e8257",
+ "reference": "3ab7e8791bd836a7b2c64b0cb326654ba69e8257",
"shasum": ""
},
"require": {
@@ -166,9 +166,9 @@
],
"support": {
"issues": "https://github.com/api-platform/core/issues",
- "source": "https://github.com/api-platform/core/tree/v3.2.0"
+ "source": "https://github.com/api-platform/core/tree/v3.2.4"
},
- "time": "2023-10-12T10:35:19+00:00"
+ "time": "2023-11-06T08:14:18+00:00"
},
{
"name": "doctrine/annotations",
@@ -1943,29 +1943,29 @@
},
{
"name": "laminas/laminas-code",
- "version": "4.12.0",
+ "version": "4.13.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-code.git",
- "reference": "36cbee228b427446419dd51944bdfb6bb8ddbcd0"
+ "reference": "7353d4099ad5388e84737dd16994316a04f48dbf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laminas/laminas-code/zipball/36cbee228b427446419dd51944bdfb6bb8ddbcd0",
- "reference": "36cbee228b427446419dd51944bdfb6bb8ddbcd0",
+ "url": "https://api.github.com/repos/laminas/laminas-code/zipball/7353d4099ad5388e84737dd16994316a04f48dbf",
+ "reference": "7353d4099ad5388e84737dd16994316a04f48dbf",
"shasum": ""
},
"require": {
- "php": "~8.1.0 || ~8.2.0"
+ "php": "~8.1.0 || ~8.2.0 || ~8.3.0"
},
"require-dev": {
- "doctrine/annotations": "^2.0.0",
+ "doctrine/annotations": "^2.0.1",
"ext-phar": "*",
- "laminas/laminas-coding-standard": "^2.3.0",
- "laminas/laminas-stdlib": "^3.6.1",
- "phpunit/phpunit": "^10.0.9",
+ "laminas/laminas-coding-standard": "^2.5.0",
+ "laminas/laminas-stdlib": "^3.17.0",
+ "phpunit/phpunit": "^10.3.3",
"psalm/plugin-phpunit": "^0.18.4",
- "vimeo/psalm": "^5.7.1"
+ "vimeo/psalm": "^5.15.0"
},
"suggest": {
"doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
@@ -2002,7 +2002,7 @@
"type": "community_bridge"
}
],
- "time": "2023-09-06T14:56:25+00:00"
+ "time": "2023-10-18T10:00:55+00:00"
},
{
"name": "league/csv",
@@ -2853,16 +2853,16 @@
},
{
"name": "symfony/asset",
- "version": "v6.3.0",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/asset.git",
- "reference": "b77a4cc8e266b7e0db688de740f9ee7253aa411c"
+ "reference": "b2382a403f2111836301623d89e9af3d84989525"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/asset/zipball/b77a4cc8e266b7e0db688de740f9ee7253aa411c",
- "reference": "b77a4cc8e266b7e0db688de740f9ee7253aa411c",
+ "url": "https://api.github.com/repos/symfony/asset/zipball/b2382a403f2111836301623d89e9af3d84989525",
+ "reference": "b2382a403f2111836301623d89e9af3d84989525",
"shasum": ""
},
"require": {
@@ -2902,7 +2902,7 @@
"description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/asset/tree/v6.3.0"
+ "source": "https://github.com/symfony/asset/tree/v6.3.8"
},
"funding": [
{
@@ -2918,20 +2918,20 @@
"type": "tidelift"
}
],
- "time": "2023-04-21T14:41:17+00:00"
+ "time": "2023-10-31T08:07:48+00:00"
},
{
"name": "symfony/cache",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
- "reference": "6c1a3ea078c4d88ee892530945df63a87981b2da"
+ "reference": "ba33517043c22c94c7ab04b056476f6f86816cf8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/cache/zipball/6c1a3ea078c4d88ee892530945df63a87981b2da",
- "reference": "6c1a3ea078c4d88ee892530945df63a87981b2da",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/ba33517043c22c94c7ab04b056476f6f86816cf8",
+ "reference": "ba33517043c22c94c7ab04b056476f6f86816cf8",
"shasum": ""
},
"require": {
@@ -2940,7 +2940,7 @@
"psr/log": "^1.1|^2|^3",
"symfony/cache-contracts": "^2.5|^3",
"symfony/service-contracts": "^2.5|^3",
- "symfony/var-exporter": "^6.2.10"
+ "symfony/var-exporter": "^6.3.6"
},
"conflict": {
"doctrine/dbal": "<2.13.1",
@@ -2955,7 +2955,7 @@
},
"require-dev": {
"cache/integration-tests": "dev-master",
- "doctrine/dbal": "^2.13.1|^3.0",
+ "doctrine/dbal": "^2.13.1|^3|^4",
"predis/predis": "^1.1|^2.0",
"psr/simple-cache": "^1.0|^2.0|^3.0",
"symfony/config": "^5.4|^6.0",
@@ -2998,7 +2998,7 @@
"psr6"
],
"support": {
- "source": "https://github.com/symfony/cache/tree/v6.3.5"
+ "source": "https://github.com/symfony/cache/tree/v6.3.8"
},
"funding": [
{
@@ -3014,7 +3014,7 @@
"type": "tidelift"
}
],
- "time": "2023-09-26T15:48:55+00:00"
+ "time": "2023-11-07T10:17:15+00:00"
},
{
"name": "symfony/cache-contracts",
@@ -3167,16 +3167,16 @@
},
{
"name": "symfony/config",
- "version": "v6.3.2",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
- "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467"
+ "reference": "b7a63887960359e5b59b15826fa9f9be10acbe88"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467",
- "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467",
+ "url": "https://api.github.com/repos/symfony/config/zipball/b7a63887960359e5b59b15826fa9f9be10acbe88",
+ "reference": "b7a63887960359e5b59b15826fa9f9be10acbe88",
"shasum": ""
},
"require": {
@@ -3222,7 +3222,7 @@
"description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/config/tree/v6.3.2"
+ "source": "https://github.com/symfony/config/tree/v6.3.8"
},
"funding": [
{
@@ -3238,20 +3238,20 @@
"type": "tidelift"
}
],
- "time": "2023-07-19T20:22:16+00:00"
+ "time": "2023-11-09T08:28:21+00:00"
},
{
"name": "symfony/console",
- "version": "v6.3.4",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6"
+ "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6",
- "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6",
+ "url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92",
+ "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92",
"shasum": ""
},
"require": {
@@ -3312,7 +3312,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.3.4"
+ "source": "https://github.com/symfony/console/tree/v6.3.8"
},
"funding": [
{
@@ -3328,20 +3328,20 @@
"type": "tidelift"
}
],
- "time": "2023-08-16T10:10:12+00:00"
+ "time": "2023-10-31T08:09:35+00:00"
},
{
"name": "symfony/dependency-injection",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993"
+ "reference": "1f30f545c4151f611148fc19e28d54d39e0a00bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2ed62b3bf98346e1f45529a7b6be2196739bb993",
- "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1f30f545c4151f611148fc19e28d54d39e0a00bc",
+ "reference": "1f30f545c4151f611148fc19e28d54d39e0a00bc",
"shasum": ""
},
"require": {
@@ -3393,7 +3393,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/dependency-injection/tree/v6.3.5"
+ "source": "https://github.com/symfony/dependency-injection/tree/v6.3.8"
},
"funding": [
{
@@ -3409,7 +3409,7 @@
"type": "tidelift"
}
],
- "time": "2023-09-25T16:46:40+00:00"
+ "time": "2023-10-31T08:07:48+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -3480,16 +3480,16 @@
},
{
"name": "symfony/doctrine-bridge",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/doctrine-bridge.git",
- "reference": "9977eb1adf999ceded213e88c1ac6dff7a1a0306"
+ "reference": "8842d289d41320a0f725e996b4e58d84af398a9e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9977eb1adf999ceded213e88c1ac6dff7a1a0306",
- "reference": "9977eb1adf999ceded213e88c1ac6dff7a1a0306",
+ "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/8842d289d41320a0f725e996b4e58d84af398a9e",
+ "reference": "8842d289d41320a0f725e996b4e58d84af398a9e",
"shasum": ""
},
"require": {
@@ -3522,8 +3522,8 @@
"doctrine/annotations": "^1.13.1|^2",
"doctrine/collections": "^1.0|^2.0",
"doctrine/data-fixtures": "^1.1",
- "doctrine/dbal": "^2.13.1|^3.0",
- "doctrine/orm": "^2.12",
+ "doctrine/dbal": "^2.13.1|^3|^4",
+ "doctrine/orm": "^2.12|^3",
"psr/log": "^1|^2|^3",
"symfony/cache": "^5.4|^6.0",
"symfony/config": "^5.4|^6.0",
@@ -3570,7 +3570,7 @@
"description": "Provides integration for Doctrine with various Symfony components",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/doctrine-bridge/tree/v6.3.5"
+ "source": "https://github.com/symfony/doctrine-bridge/tree/v6.3.8"
},
"funding": [
{
@@ -3586,20 +3586,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-29T16:16:03+00:00"
+ "time": "2023-10-31T08:07:48+00:00"
},
{
"name": "symfony/dotenv",
- "version": "v6.3.0",
+ "version": "v6.3.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/dotenv.git",
- "reference": "ceadb434fe2a6763a03d2d110441745834f3dd1e"
+ "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dotenv/zipball/ceadb434fe2a6763a03d2d110441745834f3dd1e",
- "reference": "ceadb434fe2a6763a03d2d110441745834f3dd1e",
+ "url": "https://api.github.com/repos/symfony/dotenv/zipball/7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e",
+ "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e",
"shasum": ""
},
"require": {
@@ -3644,7 +3644,7 @@
"environment"
],
"support": {
- "source": "https://github.com/symfony/dotenv/tree/v6.3.0"
+ "source": "https://github.com/symfony/dotenv/tree/v6.3.7"
},
"funding": [
{
@@ -3660,7 +3660,7 @@
"type": "tidelift"
}
],
- "time": "2023-04-21T14:41:17+00:00"
+ "time": "2023-10-26T18:15:14+00:00"
},
{
"name": "symfony/error-handler",
@@ -4085,16 +4085,16 @@
},
{
"name": "symfony/flex",
- "version": "v2.3.3",
+ "version": "v2.4.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/flex.git",
- "reference": "9c402af768c6c9f8126a9ffa192ecf7c16581e35"
+ "reference": "ae6dea68771c5fca9d172e0c0910bdd06199f6f4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/flex/zipball/9c402af768c6c9f8126a9ffa192ecf7c16581e35",
- "reference": "9c402af768c6c9f8126a9ffa192ecf7c16581e35",
+ "url": "https://api.github.com/repos/symfony/flex/zipball/ae6dea68771c5fca9d172e0c0910bdd06199f6f4",
+ "reference": "ae6dea68771c5fca9d172e0c0910bdd06199f6f4",
"shasum": ""
},
"require": {
@@ -4130,7 +4130,7 @@
"description": "Composer plugin for Symfony",
"support": {
"issues": "https://github.com/symfony/flex/issues",
- "source": "https://github.com/symfony/flex/tree/v2.3.3"
+ "source": "https://github.com/symfony/flex/tree/v2.4.1"
},
"funding": [
{
@@ -4146,20 +4146,20 @@
"type": "tidelift"
}
],
- "time": "2023-08-04T09:02:35+00:00"
+ "time": "2023-10-30T18:35:17+00:00"
},
{
"name": "symfony/form",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/form.git",
- "reference": "0f9ad8600c1021983d096512066ee54332aa3139"
+ "reference": "b7a8098163cce87c0b6ce05d0f361dc12d5a2788"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/form/zipball/0f9ad8600c1021983d096512066ee54332aa3139",
- "reference": "0f9ad8600c1021983d096512066ee54332aa3139",
+ "url": "https://api.github.com/repos/symfony/form/zipball/b7a8098163cce87c0b6ce05d0f361dc12d5a2788",
+ "reference": "b7a8098163cce87c0b6ce05d0f361dc12d5a2788",
"shasum": ""
},
"require": {
@@ -4227,7 +4227,7 @@
"description": "Allows to easily create, process and reuse HTML forms",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/form/tree/v6.3.5"
+ "source": "https://github.com/symfony/form/tree/v6.3.8"
},
"funding": [
{
@@ -4243,20 +4243,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-10T17:47:23+00:00"
+ "time": "2023-11-06T10:58:05+00:00"
},
{
"name": "symfony/framework-bundle",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/framework-bundle.git",
- "reference": "567cafcfc08e3076b47290a7558b0ca17a98b0ce"
+ "reference": "e88be137ea0652ee2caf2eacb21283820904be4f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/567cafcfc08e3076b47290a7558b0ca17a98b0ce",
- "reference": "567cafcfc08e3076b47290a7558b0ca17a98b0ce",
+ "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/e88be137ea0652ee2caf2eacb21283820904be4f",
+ "reference": "e88be137ea0652ee2caf2eacb21283820904be4f",
"shasum": ""
},
"require": {
@@ -4371,7 +4371,7 @@
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/framework-bundle/tree/v6.3.5"
+ "source": "https://github.com/symfony/framework-bundle/tree/v6.3.8"
},
"funding": [
{
@@ -4387,20 +4387,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-29T10:45:15+00:00"
+ "time": "2023-11-09T14:35:42+00:00"
},
{
"name": "symfony/http-client",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
- "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d"
+ "reference": "0314e2d49939a9831929d6fc81c01c6df137fd0a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-client/zipball/213e564da4cbf61acc9728d97e666bcdb868c10d",
- "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/0314e2d49939a9831929d6fc81c01c6df137fd0a",
+ "reference": "0314e2d49939a9831929d6fc81c01c6df137fd0a",
"shasum": ""
},
"require": {
@@ -4463,7 +4463,7 @@
"http"
],
"support": {
- "source": "https://github.com/symfony/http-client/tree/v6.3.5"
+ "source": "https://github.com/symfony/http-client/tree/v6.3.8"
},
"funding": [
{
@@ -4479,7 +4479,7 @@
"type": "tidelift"
}
],
- "time": "2023-09-29T15:57:12+00:00"
+ "time": "2023-11-06T18:31:59+00:00"
},
{
"name": "symfony/http-client-contracts",
@@ -4561,16 +4561,16 @@
},
{
"name": "symfony/http-foundation",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957"
+ "reference": "ce332676de1912c4389222987193c3ef38033df6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b50f5e281d722cb0f4c296f908bacc3e2b721957",
- "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce332676de1912c4389222987193c3ef38033df6",
+ "reference": "ce332676de1912c4389222987193c3ef38033df6",
"shasum": ""
},
"require": {
@@ -4580,12 +4580,12 @@
"symfony/polyfill-php83": "^1.27"
},
"conflict": {
- "symfony/cache": "<6.2"
+ "symfony/cache": "<6.3"
},
"require-dev": {
- "doctrine/dbal": "^2.13.1|^3.0",
+ "doctrine/dbal": "^2.13.1|^3|^4",
"predis/predis": "^1.1|^2.0",
- "symfony/cache": "^5.4|^6.0",
+ "symfony/cache": "^6.3",
"symfony/dependency-injection": "^5.4|^6.0",
"symfony/expression-language": "^5.4|^6.0",
"symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4",
@@ -4618,7 +4618,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v6.3.5"
+ "source": "https://github.com/symfony/http-foundation/tree/v6.3.8"
},
"funding": [
{
@@ -4634,20 +4634,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-04T21:33:54+00:00"
+ "time": "2023-11-07T10:17:15+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc"
+ "reference": "929202375ccf44a309c34aeca8305408442ebcc1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f991a964368bee8d883e8d57ced4fe9fff04dfc",
- "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/929202375ccf44a309c34aeca8305408442ebcc1",
+ "reference": "929202375ccf44a309c34aeca8305408442ebcc1",
"shasum": ""
},
"require": {
@@ -4731,7 +4731,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v6.3.5"
+ "source": "https://github.com/symfony/http-kernel/tree/v6.3.8"
},
"funding": [
{
@@ -4747,20 +4747,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-30T06:37:04+00:00"
+ "time": "2023-11-10T13:47:32+00:00"
},
{
"name": "symfony/notifier",
- "version": "v6.3.0",
+ "version": "v6.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/notifier.git",
- "reference": "a30aee1bf767835d7948138c1629e310cee26a8b"
+ "reference": "2e39d4a9a96e25d127ffe30171127f6ef73934df"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/notifier/zipball/a30aee1bf767835d7948138c1629e310cee26a8b",
- "reference": "a30aee1bf767835d7948138c1629e310cee26a8b",
+ "url": "https://api.github.com/repos/symfony/notifier/zipball/2e39d4a9a96e25d127ffe30171127f6ef73934df",
+ "reference": "2e39d4a9a96e25d127ffe30171127f6ef73934df",
"shasum": ""
},
"require": {
@@ -4809,7 +4809,7 @@
"notifier"
],
"support": {
- "source": "https://github.com/symfony/notifier/tree/v6.3.0"
+ "source": "https://github.com/symfony/notifier/tree/v6.3.6"
},
"funding": [
{
@@ -4825,7 +4825,7 @@
"type": "tidelift"
}
],
- "time": "2023-05-12T10:17:15+00:00"
+ "time": "2023-10-07T07:32:05+00:00"
},
{
"name": "symfony/options-resolver",
@@ -4896,16 +4896,16 @@
},
{
"name": "symfony/password-hasher",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/password-hasher.git",
- "reference": "278d3a49715073879f75e372ad80b8cfeca949d3"
+ "reference": "82161c4bebf77900372083ec6e484b5f055b0cba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/password-hasher/zipball/278d3a49715073879f75e372ad80b8cfeca949d3",
- "reference": "278d3a49715073879f75e372ad80b8cfeca949d3",
+ "url": "https://api.github.com/repos/symfony/password-hasher/zipball/82161c4bebf77900372083ec6e484b5f055b0cba",
+ "reference": "82161c4bebf77900372083ec6e484b5f055b0cba",
"shasum": ""
},
"require": {
@@ -4948,7 +4948,7 @@
"password"
],
"support": {
- "source": "https://github.com/symfony/password-hasher/tree/v6.3.5"
+ "source": "https://github.com/symfony/password-hasher/tree/v6.3.8"
},
"funding": [
{
@@ -4964,7 +4964,7 @@
"type": "tidelift"
}
],
- "time": "2023-09-25T17:05:16+00:00"
+ "time": "2023-11-06T10:58:05+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
@@ -5859,16 +5859,16 @@
},
{
"name": "symfony/security-bundle",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/security-bundle.git",
- "reference": "2df460eacceb11b9287cfafddda4d27023dd9001"
+ "reference": "57889ebb1ac3403d550c787c4fde127261abacb6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/security-bundle/zipball/2df460eacceb11b9287cfafddda4d27023dd9001",
- "reference": "2df460eacceb11b9287cfafddda4d27023dd9001",
+ "url": "https://api.github.com/repos/symfony/security-bundle/zipball/57889ebb1ac3403d550c787c4fde127261abacb6",
+ "reference": "57889ebb1ac3403d550c787c4fde127261abacb6",
"shasum": ""
},
"require": {
@@ -5885,7 +5885,8 @@
"symfony/password-hasher": "^5.4|^6.0",
"symfony/security-core": "^6.2",
"symfony/security-csrf": "^5.4|^6.0",
- "symfony/security-http": "^6.3.4"
+ "symfony/security-http": "^6.3.6",
+ "symfony/service-contracts": "^2.5|^3"
},
"conflict": {
"symfony/browser-kit": "<5.4",
@@ -5949,7 +5950,7 @@
"description": "Provides a tight integration of the Security component into the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/security-bundle/tree/v6.3.5"
+ "source": "https://github.com/symfony/security-bundle/tree/v6.3.8"
},
"funding": [
{
@@ -5965,20 +5966,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-25T17:05:55+00:00"
+ "time": "2023-11-09T09:33:10+00:00"
},
{
"name": "symfony/security-core",
- "version": "v6.3.5",
+ "version": "v6.3.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/security-core.git",
- "reference": "ec8f24dc1195f46483510892271d01a5202bba70"
+ "reference": "7ceb30fed93f5ea40ccde3173d1f7712527c0d62"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/security-core/zipball/ec8f24dc1195f46483510892271d01a5202bba70",
- "reference": "ec8f24dc1195f46483510892271d01a5202bba70",
+ "url": "https://api.github.com/repos/symfony/security-core/zipball/7ceb30fed93f5ea40ccde3173d1f7712527c0d62",
+ "reference": "7ceb30fed93f5ea40ccde3173d1f7712527c0d62",
"shasum": ""
},
"require": {
@@ -6034,7 +6035,7 @@
"description": "Symfony Security Component - Core Library",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/security-core/tree/v6.3.5"
+ "source": "https://github.com/symfony/security-core/tree/v6.3.7"
},
"funding": [
{
@@ -6050,7 +6051,7 @@
"type": "tidelift"
}
],
- "time": "2023-09-10T17:47:23+00:00"
+ "time": "2023-10-28T23:11:45+00:00"
},
{
"name": "symfony/security-csrf",
@@ -6122,16 +6123,16 @@
},
{
"name": "symfony/security-http",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/security-http.git",
- "reference": "47058ea557a4c64ba86e9249651222842bd52e2a"
+ "reference": "19f7b5f5d20879a976d6d376e359bc975dfc6002"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/security-http/zipball/47058ea557a4c64ba86e9249651222842bd52e2a",
- "reference": "47058ea557a4c64ba86e9249651222842bd52e2a",
+ "url": "https://api.github.com/repos/symfony/security-http/zipball/19f7b5f5d20879a976d6d376e359bc975dfc6002",
+ "reference": "19f7b5f5d20879a976d6d376e359bc975dfc6002",
"shasum": ""
},
"require": {
@@ -6141,7 +6142,8 @@
"symfony/http-kernel": "^6.3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/property-access": "^5.4|^6.0",
- "symfony/security-core": "^6.3"
+ "symfony/security-core": "^6.3",
+ "symfony/service-contracts": "^2.5|^3"
},
"conflict": {
"symfony/clock": "<6.3",
@@ -6189,7 +6191,7 @@
"description": "Symfony Security Component - HTTP Integration",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/security-http/tree/v6.3.5"
+ "source": "https://github.com/symfony/security-http/tree/v6.3.8"
},
"funding": [
{
@@ -6205,20 +6207,20 @@
"type": "tidelift"
}
],
- "time": "2023-08-30T06:30:46+00:00"
+ "time": "2023-11-09T21:20:12+00:00"
},
{
"name": "symfony/serializer",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/serializer.git",
- "reference": "855fc058c8bdbb69f53834f2fdb3876c9bc0ab7c"
+ "reference": "b3ad1515a276473f7919ac97e560017284a7c4bf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/serializer/zipball/855fc058c8bdbb69f53834f2fdb3876c9bc0ab7c",
- "reference": "855fc058c8bdbb69f53834f2fdb3876c9bc0ab7c",
+ "url": "https://api.github.com/repos/symfony/serializer/zipball/b3ad1515a276473f7919ac97e560017284a7c4bf",
+ "reference": "b3ad1515a276473f7919ac97e560017284a7c4bf",
"shasum": ""
},
"require": {
@@ -6283,7 +6285,7 @@
"description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/serializer/tree/v6.3.5"
+ "source": "https://github.com/symfony/serializer/tree/v6.3.8"
},
"funding": [
{
@@ -6299,7 +6301,7 @@
"type": "tidelift"
}
],
- "time": "2023-09-29T16:18:53+00:00"
+ "time": "2023-11-07T10:11:25+00:00"
},
{
"name": "symfony/service-contracts",
@@ -6514,16 +6516,16 @@
},
{
"name": "symfony/string",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339"
+ "reference": "13880a87790c76ef994c91e87efb96134522577a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339",
- "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339",
+ "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a",
+ "reference": "13880a87790c76ef994c91e87efb96134522577a",
"shasum": ""
},
"require": {
@@ -6580,7 +6582,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v6.3.5"
+ "source": "https://github.com/symfony/string/tree/v6.3.8"
},
"funding": [
{
@@ -6596,7 +6598,7 @@
"type": "tidelift"
}
],
- "time": "2023-09-18T10:38:32+00:00"
+ "time": "2023-11-09T08:28:21+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -6678,16 +6680,16 @@
},
{
"name": "symfony/twig-bridge",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/twig-bridge.git",
- "reference": "18f2cbe1d46ad43c4d3bd45e5e6279172068e064"
+ "reference": "c51407623959a626784ff302419026f56dc4e1ba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/18f2cbe1d46ad43c4d3bd45e5e6279172068e064",
- "reference": "18f2cbe1d46ad43c4d3bd45e5e6279172068e064",
+ "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/c51407623959a626784ff302419026f56dc4e1ba",
+ "reference": "c51407623959a626784ff302419026f56dc4e1ba",
"shasum": ""
},
"require": {
@@ -6766,7 +6768,7 @@
"description": "Provides integration for Twig with various Symfony components",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/twig-bridge/tree/v6.3.5"
+ "source": "https://github.com/symfony/twig-bridge/tree/v6.3.8"
},
"funding": [
{
@@ -6782,20 +6784,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-12T06:57:20+00:00"
+ "time": "2023-11-09T21:20:12+00:00"
},
{
"name": "symfony/twig-bundle",
- "version": "v6.3.0",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/twig-bundle.git",
- "reference": "d0cd4d1675c0582d27c2e8bb0dc27c0303d8e3ea"
+ "reference": "82429320fe931dd50825ec08140c54b3a315bf79"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/d0cd4d1675c0582d27c2e8bb0dc27c0303d8e3ea",
- "reference": "d0cd4d1675c0582d27c2e8bb0dc27c0303d8e3ea",
+ "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/82429320fe931dd50825ec08140c54b3a315bf79",
+ "reference": "82429320fe931dd50825ec08140c54b3a315bf79",
"shasum": ""
},
"require": {
@@ -6851,7 +6853,7 @@
"description": "Provides a tight integration of Twig into the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/twig-bundle/tree/v6.3.0"
+ "source": "https://github.com/symfony/twig-bundle/tree/v6.3.8"
},
"funding": [
{
@@ -6867,20 +6869,20 @@
"type": "tidelift"
}
],
- "time": "2023-05-06T09:53:41+00:00"
+ "time": "2023-10-31T08:07:48+00:00"
},
{
"name": "symfony/validator",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/validator.git",
- "reference": "48e815ba3b5eb72e632588dbf7ea2dc4e608ee47"
+ "reference": "f75b40e088d095db1e788b81605a76f4563cb80e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/validator/zipball/48e815ba3b5eb72e632588dbf7ea2dc4e608ee47",
- "reference": "48e815ba3b5eb72e632588dbf7ea2dc4e608ee47",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/f75b40e088d095db1e788b81605a76f4563cb80e",
+ "reference": "f75b40e088d095db1e788b81605a76f4563cb80e",
"shasum": ""
},
"require": {
@@ -6947,7 +6949,7 @@
"description": "Provides tools to validate values",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/validator/tree/v6.3.5"
+ "source": "https://github.com/symfony/validator/tree/v6.3.8"
},
"funding": [
{
@@ -6963,20 +6965,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-29T07:41:15+00:00"
+ "time": "2023-11-07T10:17:15+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v6.3.5",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5"
+ "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3d9999376be5fea8de47752837a3e1d1c5f69ef5",
- "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/81acabba9046550e89634876ca64bfcd3c06aa0a",
+ "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a",
"shasum": ""
},
"require": {
@@ -7031,7 +7033,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v6.3.5"
+ "source": "https://github.com/symfony/var-dumper/tree/v6.3.8"
},
"funding": [
{
@@ -7047,20 +7049,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-12T10:11:35+00:00"
+ "time": "2023-11-08T10:42:36+00:00"
},
{
"name": "symfony/var-exporter",
- "version": "v6.3.4",
+ "version": "v6.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-exporter.git",
- "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691"
+ "reference": "374d289c13cb989027274c86206ddc63b16a2441"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df1f8aac5751871b83d30bf3e2c355770f8f0691",
- "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/374d289c13cb989027274c86206ddc63b16a2441",
+ "reference": "374d289c13cb989027274c86206ddc63b16a2441",
"shasum": ""
},
"require": {
@@ -7105,7 +7107,7 @@
"serialize"
],
"support": {
- "source": "https://github.com/symfony/var-exporter/tree/v6.3.4"
+ "source": "https://github.com/symfony/var-exporter/tree/v6.3.6"
},
"funding": [
{
@@ -7121,7 +7123,7 @@
"type": "tidelift"
}
],
- "time": "2023-08-16T18:14:47+00:00"
+ "time": "2023-10-13T09:16:49+00:00"
},
{
"name": "symfony/web-link",
@@ -7208,16 +7210,16 @@
},
{
"name": "symfony/yaml",
- "version": "v6.3.3",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add"
+ "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add",
- "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/3493af8a8dad7fa91c77fa473ba23ecd95334a92",
+ "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92",
"shasum": ""
},
"require": {
@@ -7260,7 +7262,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v6.3.3"
+ "source": "https://github.com/symfony/yaml/tree/v6.3.8"
},
"funding": [
{
@@ -7276,7 +7278,7 @@
"type": "tidelift"
}
],
- "time": "2023-07-31T07:08:24+00:00"
+ "time": "2023-11-06T10:58:05+00:00"
},
{
"name": "twig/twig",
@@ -7534,16 +7536,16 @@
},
{
"name": "monolog/monolog",
- "version": "3.4.0",
+ "version": "3.5.0",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "e2392369686d420ca32df3803de28b5d6f76867d"
+ "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/e2392369686d420ca32df3803de28b5d6f76867d",
- "reference": "e2392369686d420ca32df3803de28b5d6f76867d",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448",
+ "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448",
"shasum": ""
},
"require": {
@@ -7619,7 +7621,7 @@
],
"support": {
"issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/3.4.0"
+ "source": "https://github.com/Seldaek/monolog/tree/3.5.0"
},
"funding": [
{
@@ -7631,7 +7633,7 @@
"type": "tidelift"
}
],
- "time": "2023-06-21T08:46:11+00:00"
+ "time": "2023-10-27T15:32:31+00:00"
},
{
"name": "myclabs/deep-copy",
@@ -9247,16 +9249,16 @@
},
{
"name": "symfony/browser-kit",
- "version": "v6.3.2",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/browser-kit.git",
- "reference": "ca4a988488f61ac18f8f845445eabdd36f89aa8d"
+ "reference": "e270297dbee59168274c2b535ab1bccd593e6ffe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/browser-kit/zipball/ca4a988488f61ac18f8f845445eabdd36f89aa8d",
- "reference": "ca4a988488f61ac18f8f845445eabdd36f89aa8d",
+ "url": "https://api.github.com/repos/symfony/browser-kit/zipball/e270297dbee59168274c2b535ab1bccd593e6ffe",
+ "reference": "e270297dbee59168274c2b535ab1bccd593e6ffe",
"shasum": ""
},
"require": {
@@ -9295,7 +9297,7 @@
"description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/browser-kit/tree/v6.3.2"
+ "source": "https://github.com/symfony/browser-kit/tree/v6.3.8"
},
"funding": [
{
@@ -9311,7 +9313,7 @@
"type": "tidelift"
}
],
- "time": "2023-07-06T06:56:43+00:00"
+ "time": "2023-10-31T08:07:48+00:00"
},
{
"name": "symfony/css-selector",
@@ -9613,16 +9615,16 @@
},
{
"name": "symfony/monolog-bridge",
- "version": "v6.3.1",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/monolog-bridge.git",
- "reference": "04b04b8e465e0fa84940e5609b6796a8b4e51bf1"
+ "reference": "2bbfc8bd9d6f966b69eda20c66762580a0410c78"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/04b04b8e465e0fa84940e5609b6796a8b4e51bf1",
- "reference": "04b04b8e465e0fa84940e5609b6796a8b4e51bf1",
+ "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/2bbfc8bd9d6f966b69eda20c66762580a0410c78",
+ "reference": "2bbfc8bd9d6f966b69eda20c66762580a0410c78",
"shasum": ""
},
"require": {
@@ -9671,7 +9673,7 @@
"description": "Provides integration for Monolog with various Symfony components",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/monolog-bridge/tree/v6.3.1"
+ "source": "https://github.com/symfony/monolog-bridge/tree/v6.3.8"
},
"funding": [
{
@@ -9687,34 +9689,34 @@
"type": "tidelift"
}
],
- "time": "2023-06-08T11:13:32+00:00"
+ "time": "2023-10-31T08:07:48+00:00"
},
{
"name": "symfony/monolog-bundle",
- "version": "v3.8.0",
+ "version": "v3.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/monolog-bundle.git",
- "reference": "a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d"
+ "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d",
- "reference": "a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d",
+ "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181",
+ "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181",
"shasum": ""
},
"require": {
- "monolog/monolog": "^1.22 || ^2.0 || ^3.0",
- "php": ">=7.1.3",
- "symfony/config": "~4.4 || ^5.0 || ^6.0",
- "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0",
- "symfony/http-kernel": "~4.4 || ^5.0 || ^6.0",
- "symfony/monolog-bridge": "~4.4 || ^5.0 || ^6.0"
+ "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0",
+ "php": ">=7.2.5",
+ "symfony/config": "^5.4 || ^6.0 || ^7.0",
+ "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0",
+ "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0",
+ "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0"
},
"require-dev": {
- "symfony/console": "~4.4 || ^5.0 || ^6.0",
- "symfony/phpunit-bridge": "^5.2 || ^6.0",
- "symfony/yaml": "~4.4 || ^5.0 || ^6.0"
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/phpunit-bridge": "^6.3 || ^7.0",
+ "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
},
"type": "symfony-bundle",
"extra": {
@@ -9752,7 +9754,7 @@
],
"support": {
"issues": "https://github.com/symfony/monolog-bundle/issues",
- "source": "https://github.com/symfony/monolog-bundle/tree/v3.8.0"
+ "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0"
},
"funding": [
{
@@ -9768,20 +9770,20 @@
"type": "tidelift"
}
],
- "time": "2022-05-10T14:24:36+00:00"
+ "time": "2023-11-06T17:08:13+00:00"
},
{
"name": "symfony/phpunit-bridge",
- "version": "v6.3.2",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/phpunit-bridge.git",
- "reference": "e020e1efbd1b42cb670fcd7d19a25abbddba035d"
+ "reference": "45610900872a35b77db7698651f36129906041ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e020e1efbd1b42cb670fcd7d19a25abbddba035d",
- "reference": "e020e1efbd1b42cb670fcd7d19a25abbddba035d",
+ "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/45610900872a35b77db7698651f36129906041ea",
+ "reference": "45610900872a35b77db7698651f36129906041ea",
"shasum": ""
},
"require": {
@@ -9833,7 +9835,7 @@
"description": "Provides utilities for PHPUnit, especially user deprecation notices management",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/phpunit-bridge/tree/v6.3.2"
+ "source": "https://github.com/symfony/phpunit-bridge/tree/v6.3.8"
},
"funding": [
{
@@ -9849,7 +9851,7 @@
"type": "tidelift"
}
],
- "time": "2023-07-12T16:00:22+00:00"
+ "time": "2023-10-31T08:07:48+00:00"
},
{
"name": "symfony/process",
@@ -9914,22 +9916,22 @@
},
{
"name": "symfony/web-profiler-bundle",
- "version": "v6.3.2",
+ "version": "v6.3.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/web-profiler-bundle.git",
- "reference": "6101b5ab7857c373d237e121f9060c68b32e1373"
+ "reference": "4167c20cbdbb1152007fa731718c8c0362f28617"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6101b5ab7857c373d237e121f9060c68b32e1373",
- "reference": "6101b5ab7857c373d237e121f9060c68b32e1373",
+ "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/4167c20cbdbb1152007fa731718c8c0362f28617",
+ "reference": "4167c20cbdbb1152007fa731718c8c0362f28617",
"shasum": ""
},
"require": {
"php": ">=8.1",
"symfony/config": "^5.4|^6.0",
- "symfony/framework-bundle": "^5.4|^6.0",
+ "symfony/framework-bundle": "^5.4|^6.0,<6.4",
"symfony/http-kernel": "^6.3",
"symfony/routing": "^5.4|^6.0",
"symfony/twig-bundle": "^5.4|^6.0",
@@ -9975,7 +9977,7 @@
"dev"
],
"support": {
- "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.3.2"
+ "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.3.8"
},
"funding": [
{
@@ -9991,7 +9993,7 @@
"type": "tidelift"
}
],
- "time": "2023-07-19T20:17:28+00:00"
+ "time": "2023-10-31T14:41:59+00:00"
},
{
"name": "theseer/tokenizer",
diff --git a/config/services.yaml b/config/services.yaml
index 0a38397..e20161b 100644
--- a/config/services.yaml
+++ b/config/services.yaml
@@ -22,9 +22,6 @@ services:
App\EventSubscriber\SlackNotifySubscriber:
arguments:
$slackWebhookUrl: '%env(SLACK_DSN)%'
-# App\Helper\Hiltes:
-# arguments:
-# $orderRepository: '@App\Repository\OrderRepository'
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
\ No newline at end of file
diff --git a/migrations/Version20231110153931.php b/migrations/Version20231110153931.php
new file mode 100644
index 0000000..8258943
--- /dev/null
+++ b/migrations/Version20231110153931.php
@@ -0,0 +1,33 @@
+addSql('ALTER TABLE `order` CHANGE data data JSON NOT NULL COMMENT \'(DC2Type:json)\'');
+ $this->addSql('CREATE UNIQUE INDEX UNIQ_F52993988D9F6D38 ON `order` (order_id)');
+ }
+
+ public function down(Schema $schema): void
+ {
+ // this down() migration is auto-generated, please modify it to your needs
+ $this->addSql('DROP INDEX UNIQ_F52993988D9F6D38 ON `order`');
+ $this->addSql('ALTER TABLE `order` CHANGE data data JSON NOT NULL COMMENT \'(DC2Type:json)\'');
+ }
+}
diff --git a/public/bundles/apiplatform/fonts/open-sans/400.css b/public/bundles/apiplatform/fonts/open-sans/400.css
index 4a3ee47..9e07f0b 100644
--- a/public/bundles/apiplatform/fonts/open-sans/400.css
+++ b/public/bundles/apiplatform/fonts/open-sans/400.css
@@ -2,9 +2,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 400;
- src: url(./files/open-sans-cyrillic-ext-400-normal.woff2) format('woff2'), url(./files/open-sans-cyrillic-ext-400-normal.woff) format('woff');
+ src: url(./files/open-sans-cyrillic-ext-400-normal.woff2) format('woff2');
unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
}
@@ -12,9 +12,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 400;
- src: url(./files/open-sans-cyrillic-400-normal.woff2) format('woff2'), url(./files/open-sans-cyrillic-400-normal.woff) format('woff');
+ src: url(./files/open-sans-cyrillic-400-normal.woff2) format('woff2');
unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
}
@@ -22,9 +22,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 400;
- src: url(./files/open-sans-greek-ext-400-normal.woff2) format('woff2'), url(./files/open-sans-greek-ext-400-normal.woff) format('woff');
+ src: url(./files/open-sans-greek-ext-400-normal.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
@@ -32,9 +32,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 400;
- src: url(./files/open-sans-greek-400-normal.woff2) format('woff2'), url(./files/open-sans-greek-400-normal.woff) format('woff');
+ src: url(./files/open-sans-greek-400-normal.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
@@ -42,9 +42,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 400;
- src: url(./files/open-sans-hebrew-400-normal.woff2) format('woff2'), url(./files/open-sans-hebrew-400-normal.woff) format('woff');
+ src: url(./files/open-sans-hebrew-400-normal.woff2) format('woff2');
unicode-range: U+0590-05FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;
}
@@ -52,9 +52,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 400;
- src: url(./files/open-sans-vietnamese-400-normal.woff2) format('woff2'), url(./files/open-sans-vietnamese-400-normal.woff) format('woff');
+ src: url(./files/open-sans-vietnamese-400-normal.woff2) format('woff2');
unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
}
@@ -62,18 +62,18 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 400;
- src: url(./files/open-sans-latin-ext-400-normal.woff2) format('woff2'), url(./files/open-sans-latin-ext-400-normal.woff) format('woff');
- unicode-range: U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;
+ src: url(./files/open-sans-latin-ext-400-normal.woff2) format('woff2');
+ unicode-range: U+0100-02AF,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
/* open-sans-latin-400-normal */
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 400;
- src: url(./files/open-sans-latin-400-normal.woff2) format('woff2'), url(./files/open-sans-latin-400-normal.woff) format('woff');
- unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
-}
\ No newline at end of file
+ src: url(./files/open-sans-latin-400-normal.woff2) format('woff2');
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
+}
diff --git a/public/bundles/apiplatform/fonts/open-sans/700.css b/public/bundles/apiplatform/fonts/open-sans/700.css
index f20bbcf..bc61ca3 100644
--- a/public/bundles/apiplatform/fonts/open-sans/700.css
+++ b/public/bundles/apiplatform/fonts/open-sans/700.css
@@ -2,9 +2,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 700;
- src: url(./files/open-sans-cyrillic-ext-700-normal.woff2) format('woff2'), url(./files/open-sans-cyrillic-ext-700-normal.woff) format('woff');
+ src: url(./files/open-sans-cyrillic-ext-700-normal.woff2) format('woff2');
unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
}
@@ -12,9 +12,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 700;
- src: url(./files/open-sans-cyrillic-700-normal.woff2) format('woff2'), url(./files/open-sans-cyrillic-700-normal.woff) format('woff');
+ src: url(./files/open-sans-cyrillic-700-normal.woff2) format('woff2');
unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
}
@@ -22,9 +22,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 700;
- src: url(./files/open-sans-greek-ext-700-normal.woff2) format('woff2'), url(./files/open-sans-greek-ext-700-normal.woff) format('woff');
+ src: url(./files/open-sans-greek-ext-700-normal.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
@@ -32,9 +32,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 700;
- src: url(./files/open-sans-greek-700-normal.woff2) format('woff2'), url(./files/open-sans-greek-700-normal.woff) format('woff');
+ src: url(./files/open-sans-greek-700-normal.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
@@ -42,9 +42,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 700;
- src: url(./files/open-sans-hebrew-700-normal.woff2) format('woff2'), url(./files/open-sans-hebrew-700-normal.woff) format('woff');
+ src: url(./files/open-sans-hebrew-700-normal.woff2) format('woff2');
unicode-range: U+0590-05FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;
}
@@ -52,9 +52,9 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 700;
- src: url(./files/open-sans-vietnamese-700-normal.woff2) format('woff2'), url(./files/open-sans-vietnamese-700-normal.woff) format('woff');
+ src: url(./files/open-sans-vietnamese-700-normal.woff2) format('woff2');
unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
}
@@ -62,18 +62,18 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 700;
- src: url(./files/open-sans-latin-ext-700-normal.woff2) format('woff2'), url(./files/open-sans-latin-ext-700-normal.woff) format('woff');
- unicode-range: U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;
+ src: url(./files/open-sans-latin-ext-700-normal.woff2) format('woff2');
+ unicode-range: U+0100-02AF,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
/* open-sans-latin-700-normal */
@font-face {
font-family: 'Open Sans';
font-style: normal;
- font-display: swap;
+ font-display: var(--fontsource-display, swap);
font-weight: 700;
- src: url(./files/open-sans-latin-700-normal.woff2) format('woff2'), url(./files/open-sans-latin-700-normal.woff) format('woff');
- unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
-}
\ No newline at end of file
+ src: url(./files/open-sans-latin-700-normal.woff2) format('woff2');
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
+}
diff --git a/src/Command/HiltesExportCommand.php b/src/Command/HiltesExportCommand.php
index 7b63430..0275d80 100644
--- a/src/Command/HiltesExportCommand.php
+++ b/src/Command/HiltesExportCommand.php
@@ -3,6 +3,7 @@
namespace App\Command;
use App\Entity\Order;
+use App\Helper\Hiltes;
use App\Repository\OrderRepository;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Attribute\AsCommand;
@@ -12,7 +13,6 @@ use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
-use App\Helper\Hiltes;
#[AsCommand(
name: 'hiltes:export',
@@ -22,10 +22,10 @@ class HiltesExportCommand extends Command
{
public function __construct(OrderRepository $orderRepository, LoggerInterface $logger, private Hiltes $hiltes)
{
- $this->orderRepository = $orderRepository;
- $this->logger = $logger;
+ $this->orderRepository = $orderRepository;
+ $this->logger = $logger;
- parent::__construct();
+ parent::__construct();
}
@@ -33,8 +33,7 @@ class HiltesExportCommand extends Command
{
$this
->addArgument('arg1', InputArgument::OPTIONAL, 'Argument description')
- ->addOption('option1', null, InputOption::VALUE_NONE, 'Option description')
- ;
+ ->addOption('option1', null, InputOption::VALUE_NONE, 'Option description');
}
/**
@@ -46,131 +45,131 @@ class HiltesExportCommand extends Command
protected function execute(InputInterface $input, OutputInterface $output): int
{
- $io = new SymfonyStyle($input, $output);
+ $io = new SymfonyStyle($input, $output);
$io->info('Start Hiltes Export');
- $l = $this->hiltes->loginToHiltes('','');
- if(!$l){
- dd('Login faild'.'STOP '.__METHOD__.' / '.__LINE__);
- }
+ $l = $this->hiltes->loginToHiltes('', '');
+ if (!$l) {
+ dd('Login faild' . 'STOP ' . __METHOD__ . ' / ' . __LINE__);
+ }
$orders = $this->orderRepository->findAll();
#dump($orders);
- /**
- * @var Order
- */
- $order = false;
- foreach ($orders as $order) {
- if($order->getStatus()>0) continue;
- $tA = $order->getData();#json_decode($order->getData());
+ /**
+ * @var Order
+ */
+ $order = false;
+ foreach ($orders as $order) {
+ if ($order->getStatus() > 0) continue;
+ $tA = $order->getData();#json_decode($order->getData());
$tA['orderdate'] = "2023-08-30T12:05:24.000Z";
- #dd($order->getData());
- #dd(array(
- # 'orderdate'=> $tA['orderdate'],
- # 'time'=> strtotime($tA['orderdate']),
- # 'gmdate '=> gmdate ('d-m-Y\TH:i:s.v\Z',strtotime($tA['orderdate'])),
- #));
- #*** Umkonvertieren des Datumstings *****************
- $tA['orderdate'] = gmdate ('Y-m-d\TH:i:s.v\Z',strtotime($tA['orderdate']));
- #****
- $arr = array(
- 'SalesDate' => $tA['orderdate'],
- "BranchNumber" => 8, #Die Filialnummer
- "ShopNumber" => 1, #Die Shopnummer
- "DistributionChannel" => 5, #Der Vertriebskanal
- 'SaleList' => array(),
- 'CustomerList' => array(),
- );
- #*** Items ***************
- if(!empty($tA['data']) && is_array($tA['data'])){
- # Noch nötig
- # "CalculatedSellingPrice" => 0, #X Kalkulierter Verkaufspreis
- # "AchievedSalesPrice" => 0, #X Erzielter Verkaufspreis
- $tSalNr = array();
- foreach ($tA['data'] as $v){
- $SalesNumber = (!empty($v['gtin']) ? $v['gtin'] : $v['sku']);
- if(preg_match('/^([0-9]+)_/',$SalesNumber,$tP)){
- $SalesNumber = $tP[1];
- }
- if(isset($tSalNr[$SalesNumber])){
- $tSalNr[$SalesNumber]++;
- $SalesNumber.= $tSalNr[$SalesNumber];
- }else{
- $tSalNr[$SalesNumber] = 0;
- }
- #dump($SalesNumber);
- #********
- $v['CalculatedSellingPrice'] = 100.00;
- $v['AchievedSalesPrice'] = 90.00;
- $arr['SaleList'][] = array(
- "SalesLabel" => 'Ean',#$v['sku'],#X
- "SalesLabelNumber" => $SalesNumber,#X
- "SalesGoodsGroupNumber" => 0,
- "SizeDescription" => '',#"string",
- "CustomerNumber" => 0,
- "TypeOfEstate" => 0,
- "Amount" => $v['menge'],#X
- "CalculatedSellingPrice" => $v['CalculatedSellingPrice'], #X Kalkulierter Verkaufspreis
- "AchievedSalesPrice" => $v['AchievedSalesPrice'], #X Erzielter Verkaufspreis
- "TransactionType" => "Sale", #X Die Vorgangsart Sale=Verkauf Exchange=Umtausch / Storno
- "ReceiptNumber" => 0, #Die Belegnummer
- "DateOfSale" => $tA['orderdate'],#X das Verkaufsdatum mit Verkaufszeit
- "PaymentMethod" => 'Invoice',#X "CreditCard",
- "Currency" => 'EUR',#X "string",
- "Unit" => "Piece",#X
- "DistributionChannel" => 'JTL',#"string"
- );
+ #dd($order->getData());
+ #dd(array(
+ # 'orderdate'=> $tA['orderdate'],
+ # 'time'=> strtotime($tA['orderdate']),
+ # 'gmdate '=> gmdate ('d-m-Y\TH:i:s.v\Z',strtotime($tA['orderdate'])),
+ #));
+ #*** Umkonvertieren des Datumstings *****************
+ $tA['orderdate'] = gmdate('Y-m-d\TH:i:s.v\Z', strtotime($tA['orderdate']));
+ #****
+ $arr = array(
+ 'SalesDate' => $tA['orderdate'],
+ "BranchNumber" => 8, #Die Filialnummer
+ "ShopNumber" => 1, #Die Shopnummer
+ "DistributionChannel" => 5, #Der Vertriebskanal
+ 'SaleList' => array(),
+ 'CustomerList' => array(),
+ );
+ #*** Items ***************
+ if (!empty($tA['data']) && is_array($tA['data'])) {
+ # Noch nötig
+ # "CalculatedSellingPrice" => 0, #X Kalkulierter Verkaufspreis
+ # "AchievedSalesPrice" => 0, #X Erzielter Verkaufspreis
+ $tSalNr = array();
+ foreach ($tA['data'] as $v) {
+ $SalesNumber = (!empty($v['gtin']) ? $v['gtin'] : $v['sku']);
+ if (preg_match('/^([0-9]+)_/', $SalesNumber, $tP)) {
+ $SalesNumber = $tP[1];
+ }
+ if (isset($tSalNr[$SalesNumber])) {
+ $tSalNr[$SalesNumber]++;
+ $SalesNumber .= $tSalNr[$SalesNumber];
+ } else {
+ $tSalNr[$SalesNumber] = 0;
+ }
+ #dump($SalesNumber);
+ #********
+ $v['CalculatedSellingPrice'] = 100.00;
+ $v['AchievedSalesPrice'] = 90.00;
+ $arr['SaleList'][] = array(
+ "SalesLabel" => 'Ean',#$v['sku'],#X
+ "SalesLabelNumber" => $SalesNumber,#X
+ "SalesGoodsGroupNumber" => 0,
+ "SizeDescription" => '',#"string",
+ "CustomerNumber" => 0,
+ "TypeOfEstate" => 0,
+ "Amount" => $v['menge'],#X
+ "CalculatedSellingPrice" => $v['CalculatedSellingPrice'], #X Kalkulierter Verkaufspreis
+ "AchievedSalesPrice" => $v['AchievedSalesPrice'], #X Erzielter Verkaufspreis
+ "TransactionType" => "Sale", #X Die Vorgangsart Sale=Verkauf Exchange=Umtausch / Storno
+ "ReceiptNumber" => 0, #Die Belegnummer
+ "DateOfSale" => $tA['orderdate'],#X das Verkaufsdatum mit Verkaufszeit
+ "PaymentMethod" => 'Invoice',#X "CreditCard",
+ "Currency" => 'EUR',#X "string",
+ "Unit" => "Piece",#X
+ "DistributionChannel" => 'JTL',#"string"
+ );
- }
- }
- #*** Kundne *******************************
- $arr['CustomerList'][] = array(
- "CustomerNumber" => 99999, # Fake Daten
- "Surname" => 'MAX',#"string",
- "Forename" => 'MUSTERMANN',#"string",
- "AddressCity" => 'ERFURT',#"string",
- "AddressZipCode" => '99084',"string",
- "AddressStreet" => 'MusterStrasse 22',#"string",
- "AddressCountry" => 'DE',#"string",
- #*** Nicht nötig
- #"CardNumber" => 0,
- #"SalutionNumber" => 0,
- #"PostOfficeBox" => '',#"string",
- #"PostOfficeBoxZipCode" => '',#"string",
- #"Title" => '',#"string",
- #"PhoneNumber1" => '',#"string",
- #"PhoneNumber2" => '',#"string",
- #"FaxNumber" => '',#"string",
- #"BirthDay" => '',#"2023-09-14T11:54:26.708Z",
- #"Gender" => 'Male',
- #"EmailAddress" => '',#"string",
- #"Discount" => 0,
- #"Limit" => 0,
- #"LockMark" => 'Unblocked',
- #"DubiousMark" => 'Undubious',
- #"DubiousText" => '',#"string",
- #"DirectDebit" => '',#true,
- #"BankName1" => '',#"string",
- #"BankAccountNumber1" => '',#"string",
- #"BankCodeNumber1" => '',#"string",
- #"BankName2" => '',#"string",
- #"BankAccountNumber2" => '',#"string",
- #"BankCodeNumber2" => '',#"string",
- #"BankName3" => '',#"string",
- #"BankAccountNumber3" => '',#"string",
- #"BankCodeNumber3" => '',#"string",
- #"CreditcardNumber1" => '',#"string",
- #"CreditcardNumber2" => '',#"string",
- #"CreditcardNumber3" => '',#"string",
- #"CreditcardNumber4" => '',#"string",
- #"ChangeIndicator" => '',#true,
- #"Newsletter" => '',#true,
- #"Password" => '',#"string",
- #"AdBan" => '',#true
- );
- $data = $this->hiltes->createJson($arr);
- }
+ }
+ }
+ #*** Kundne *******************************
+ $arr['CustomerList'][] = array(
+ "CustomerNumber" => 99999, # Fake Daten
+ "Surname" => 'MAX',#"string",
+ "Forename" => 'MUSTERMANN',#"string",
+ "AddressCity" => 'ERFURT',#"string",
+ "AddressZipCode" => '99084', "string",
+ "AddressStreet" => 'MusterStrasse 22',#"string",
+ "AddressCountry" => 'DE',#"string",
+ #*** Nicht nötig
+ #"CardNumber" => 0,
+ #"SalutionNumber" => 0,
+ #"PostOfficeBox" => '',#"string",
+ #"PostOfficeBoxZipCode" => '',#"string",
+ #"Title" => '',#"string",
+ #"PhoneNumber1" => '',#"string",
+ #"PhoneNumber2" => '',#"string",
+ #"FaxNumber" => '',#"string",
+ #"BirthDay" => '',#"2023-09-14T11:54:26.708Z",
+ #"Gender" => 'Male',
+ #"EmailAddress" => '',#"string",
+ #"Discount" => 0,
+ #"Limit" => 0,
+ #"LockMark" => 'Unblocked',
+ #"DubiousMark" => 'Undubious',
+ #"DubiousText" => '',#"string",
+ #"DirectDebit" => '',#true,
+ #"BankName1" => '',#"string",
+ #"BankAccountNumber1" => '',#"string",
+ #"BankCodeNumber1" => '',#"string",
+ #"BankName2" => '',#"string",
+ #"BankAccountNumber2" => '',#"string",
+ #"BankCodeNumber2" => '',#"string",
+ #"BankName3" => '',#"string",
+ #"BankAccountNumber3" => '',#"string",
+ #"BankCodeNumber3" => '',#"string",
+ #"CreditcardNumber1" => '',#"string",
+ #"CreditcardNumber2" => '',#"string",
+ #"CreditcardNumber3" => '',#"string",
+ #"CreditcardNumber4" => '',#"string",
+ #"ChangeIndicator" => '',#true,
+ #"Newsletter" => '',#true,
+ #"Password" => '',#"string",
+ #"AdBan" => '',#true
+ );
+ $data = $this->hiltes->createJson($arr);
+ }
$this->hiltes->sendOrderToHiltes($data);
diff --git a/src/Command/HiltesImportCommand.php b/src/Command/HiltesImportCommand.php
index e3bdef5..6471951 100644
--- a/src/Command/HiltesImportCommand.php
+++ b/src/Command/HiltesImportCommand.php
@@ -10,14 +10,11 @@ use App\Repository\WarehouseRepository;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
-use Symfony\Component\Finder\Finder;
-
#[AsCommand(
name: 'hiltes:import',
description: 'Importiert die Bestandsdaten von Hiltes',
@@ -28,11 +25,12 @@ class HiltesImportCommand extends Command
private $warehouseRepository;
private $productRepository;
private $logger;
+
public function __construct(
- ProductRepository $productRepository,
- StockRepository $stockRepository,
+ ProductRepository $productRepository,
+ StockRepository $stockRepository,
WarehouseRepository $warehouseRepository,
- LoggerInterface $logger
+ LoggerInterface $logger
)
{
$this->productRepository = $productRepository;
@@ -41,6 +39,7 @@ class HiltesImportCommand extends Command
$this->logger = $logger;
parent::__construct();
}
+
protected function configure(): void
{
$this->addOption('delta', 'd', InputOption::VALUE_NONE, 'Delta Import');
@@ -52,22 +51,22 @@ class HiltesImportCommand extends Command
$io->success('Start Hiltes Import');
- /**
- * @var HiltesImport
- */
- $hiltesImport = new HiltesImport($this->productRepository,$this->warehouseRepository,$this->stockRepository,$this->logger);
+ /**
+ * @var HiltesImport
+ */
+ $hiltesImport = new HiltesImport($this->productRepository, $this->warehouseRepository, $this->stockRepository, $this->logger);
$r = $hiltesImport->startImport($input->getOption('delta'));
- if(isset($r['error'])){
+ if (isset($r['error'])) {
$io->error($r['text']);
$this->logger->error($r['text']);
return Command::FAILURE;
- }else{
+ } else {
$io->info('Start Hiltes Push JTL');
- $jtl = new Jtl($this->productRepository,$this->warehouseRepository,$this->stockRepository,$this->logger);
+ $jtl = new Jtl($this->productRepository, $this->warehouseRepository, $this->stockRepository, $this->logger);
$jtl->createExportFile($jtl->getProducts());
$io->success('Done.');
diff --git a/src/Command/JtlExportCommand.php b/src/Command/JtlExportCommand.php
index 95abcc3..857067a 100644
--- a/src/Command/JtlExportCommand.php
+++ b/src/Command/JtlExportCommand.php
@@ -26,11 +26,12 @@ class JtlExportCommand extends Command
private $warehouseRepository;
private $productRepository;
private $logger;
+
public function __construct(
- ProductRepository $productRepository,
- StockRepository $stockRepository,
+ ProductRepository $productRepository,
+ StockRepository $stockRepository,
WarehouseRepository $warehouseRepository,
- LoggerInterface $logger
+ LoggerInterface $logger
)
{
$this->productRepository = $productRepository;
@@ -44,8 +45,7 @@ class JtlExportCommand extends Command
{
$this
->addArgument('arg1', InputArgument::OPTIONAL, 'Argument description')
- ->addOption('option1', null, InputOption::VALUE_NONE, 'Option description')
- ;
+ ->addOption('option1', null, InputOption::VALUE_NONE, 'Option description');
}
protected function execute(InputInterface $input, OutputInterface $output): int
@@ -68,13 +68,12 @@ class JtlExportCommand extends Command
/**
* @var HiltesImport
*/
- $jtl = new Jtl($this->productRepository,$this->warehouseRepository,$this->stockRepository,$this->logger);
+ $jtl = new Jtl($this->productRepository, $this->warehouseRepository, $this->stockRepository, $this->logger);
$data = $jtl->getProducts();
$jtl->createExportFile($data);
-
$io->success('Ende JTL Export');
return Command::SUCCESS;
diff --git a/src/Command/JtlImportCommand.php b/src/Command/JtlImportCommand.php
index a651571..f188e8a 100644
--- a/src/Command/JtlImportCommand.php
+++ b/src/Command/JtlImportCommand.php
@@ -11,7 +11,6 @@ use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Notifier\Chatter;
use Symfony\Component\Notifier\Message\ChatMessage;
-use Symfony\Component\Notifier\ChatterInterface;
use Symfony\Component\Notifier\Transport;
#[AsCommand(
@@ -24,8 +23,7 @@ class JtlImportCommand extends Command
{
$this
->addArgument('arg1', InputArgument::OPTIONAL, 'Argument description')
- ->addOption('option1', null, InputOption::VALUE_NONE, 'Option description')
- ;
+ ->addOption('option1', null, InputOption::VALUE_NONE, 'Option description');
}
protected function execute(InputInterface $input, OutputInterface $output): int
@@ -50,7 +48,6 @@ class JtlImportCommand extends Command
->transport('slack');
-
$sentMessage = $chatter->send($message);
$io->success('You have a new command! Now make it your own! Pass --help to see your options.');
diff --git a/src/Controller/OrdersController.php b/src/Controller/OrdersController.php
deleted file mode 100644
index c884166..0000000
--- a/src/Controller/OrdersController.php
+++ /dev/null
@@ -1,40 +0,0 @@
-logger = $logger;
- $this->ordersRepository = $ordersRepository;
- }
-
-
- public function getOrders(): Orders
- {
- $this->logger->info('I just got the logger');
-
- $orders = $this->ordersRepository->findAll();
-
-
- return $orders->getData();
- }
-
-}
diff --git a/src/Entity/Order.php b/src/Entity/Order.php
index ab84e4c..9b7027b 100644
--- a/src/Entity/Order.php
+++ b/src/Entity/Order.php
@@ -2,8 +2,10 @@
namespace App\Entity;
+use ApiPlatform\Metadata\ApiProperty;
use ApiPlatform\Metadata\ApiResource;
use App\Repository\OrderRepository;
+use DateTimeInterface;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
@@ -14,6 +16,7 @@ use Doctrine\ORM\Mapping as ORM;
* 2 = Bestellung in Bearbeitung
* 3 = Bestellung versendet
*/
+
#[ORM\Entity(repositoryClass: OrderRepository::class)]
#[ORM\Table(name: '`order`')]
#[ApiResource]
@@ -22,9 +25,12 @@ class Order
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
+ #[ApiProperty(identifier: false)]
private ?int $id = null;
- #[ORM\Column(length: 255)]
+ #[ORM\Column(length: 255,unique: true)]
+ #[ApiProperty(identifier: true)]
+
private ?string $orderId = null;
#[ORM\Column]
@@ -33,8 +39,8 @@ class Order
#[ORM\Column]
private array $data = [];
- #[ORM\Column(name: 'change_date',type: Types::DATETIME_MUTABLE, nullable: true, options: ['default' => 'CURRENT_TIMESTAMP'])]
- private ?\DateTimeInterface $changeDate = null;
+ #[ORM\Column(name: 'change_date', type: Types::DATETIME_MUTABLE, nullable: true, options: ['default' => 'CURRENT_TIMESTAMP'])]
+ private ?DateTimeInterface $changeDate = null;
public function getId(): ?int
{
@@ -77,12 +83,12 @@ class Order
return $this;
}
- public function getChangeDate(): ?\DateTimeInterface
+ public function getChangeDate(): ?DateTimeInterface
{
return $this->changeDate;
}
- public function setChangeDate(\DateTimeInterface $changeDate): static
+ public function setChangeDate(DateTimeInterface $changeDate): static
{
$this->changeDate = $changeDate;
diff --git a/src/Entity/Product.php b/src/Entity/Product.php
index b294424..fef833a 100644
--- a/src/Entity/Product.php
+++ b/src/Entity/Product.php
@@ -4,7 +4,7 @@ namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use App\Repository\ProductRepository;
-use App\Repository\StockRepository;
+use DateTimeInterface;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
@@ -21,7 +21,7 @@ class Product
private ?string $gtin = null;
#[ORM\Column(name: 'update_time', type: Types::DATETIME_MUTABLE, nullable: true, options: ['default' => 'CURRENT_TIMESTAMP'])]
- private ?\DateTimeInterface $updateTime = null;
+ private ?DateTimeInterface $updateTime = null;
public function getId(): ?int
@@ -41,12 +41,12 @@ class Product
return $this;
}
- public function getUpdateTime(): ?\DateTimeInterface
+ public function getUpdateTime(): ?DateTimeInterface
{
return $this->updateTime;
}
- public function setUpdateTime(\DateTimeInterface $updateTime): self
+ public function setUpdateTime(DateTimeInterface $updateTime): self
{
$this->updateTime = $updateTime;
diff --git a/src/Entity/Stock.php b/src/Entity/Stock.php
index 55b05ca..dbbb93d 100644
--- a/src/Entity/Stock.php
+++ b/src/Entity/Stock.php
@@ -3,16 +3,17 @@
namespace App\Entity;
use App\Repository\StockRepository;
-#use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
-
+use DateTimeInterface;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
+#use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
+
#[ORM\Entity(repositoryClass: StockRepository::class)]
#[ORM\UniqueEntity(['warehouse_id', 'product_id'])]
#[ORM\UniqueConstraint(
- name: 'UNIQ_D34A04ADDCD6110',
- columns: ['warehouse_id', 'product_id']
+ name: 'UNIQ_D34A04ADDCD6110',
+ columns: ['warehouse_id', 'product_id']
)]
class Stock
{
@@ -29,19 +30,19 @@ class Stock
#[ORM\ManyToOne(inversedBy: 'stocks')]
private ?Warehouse $warehouse = null;
- #[ORM\Column(name: 'update_time',type: Types::DATETIME_MUTABLE, nullable: true, options: ['default' => 'CURRENT_TIMESTAMP'])]
- private ?\DateTimeInterface $update_time = null;
-
+ #[ORM\Column(name: 'update_time', type: Types::DATETIME_MUTABLE, nullable: true, options: ['default' => 'CURRENT_TIMESTAMP'])]
+ private ?DateTimeInterface $update_time = null;
public function getId(): ?int
{
return $this->id;
}
+
public function setId(int $id): ?self
{
$this->id = $id;
- return $this;
+ return $this;
}
public function getInstock(): ?int
@@ -55,6 +56,7 @@ class Stock
return $this;
}
+
public function getProductId(): ?int
{
return $this->product_id;
@@ -66,6 +68,7 @@ class Stock
return $this;
}
+
public function getWarehouseId(): ?int
{
return $this->warehouse_id;
@@ -112,12 +115,12 @@ class Stock
return $this;
}
- public function getUpdateTime(): ?\DateTimeInterface
+ public function getUpdateTime(): ?DateTimeInterface
{
return $this->update_time;
}
- public function setUpdateTime(?\DateTimeInterface $update_time): self
+ public function setUpdateTime(?DateTimeInterface $update_time): self
{
$this->update_time = $update_time;
diff --git a/src/Entity/Warehouse.php b/src/Entity/Warehouse.php
index ba0ee8e..04c0e1d 100644
--- a/src/Entity/Warehouse.php
+++ b/src/Entity/Warehouse.php
@@ -33,6 +33,7 @@ class Warehouse
{
return $this->id;
}
+
public function setId(int $id): self
{
$this->id = $id;
@@ -92,4 +93,4 @@ class Warehouse
return $this;
}
-}
+}
\ No newline at end of file
diff --git a/src/EventSubscriber/SlackNotifySubscriber.php b/src/EventSubscriber/SlackNotifySubscriber.php
index 289336e..dae0ce1 100644
--- a/src/EventSubscriber/SlackNotifySubscriber.php
+++ b/src/EventSubscriber/SlackNotifySubscriber.php
@@ -3,16 +3,15 @@
namespace App\EventSubscriber;
use ApiPlatform\Symfony\EventListener\EventPriorities;
+use App\Entity\Order;
use App\Helper\Hiltes;
use App\Helper\Slack;
-use App\Entity\Order;
use Maknz\Slack\Client;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
-use Symfony\Component\Notifier\ChatterInterface;
class SlackNotifySubscriber implements EventSubscriberInterface
@@ -26,7 +25,7 @@ class SlackNotifySubscriber implements EventSubscriberInterface
private $hiltes;
- public function __construct(string $slackWebhookUrl, LoggerInterface $logger, Hiltes $hiltes)
+ public function __construct(string $slackWebhookUrl, LoggerInterface $logger, Hiltes $hiltes)
{
$this->slackWebhookUrl = $slackWebhookUrl;
$this->logger = $logger;
@@ -58,29 +57,29 @@ class SlackNotifySubscriber implements EventSubscriberInterface
$order = $event->getControllerResult();
$method = $event->getRequest()->getMethod();
- //wenn es keine Bestellung ist oder es kein POST Request ist, dann return
- if (!$order instanceof Order || Request::METHOD_POST !== $method) {
+ //wenn es keine Bestellung ist oder es kein POST Request ist, dann return
+ if (!$order instanceof Order || Request::METHOD_POST !== $method) {
return;
- }
+ }
- $msg = "Bestellung {$order->getOrderId()}: \n";
+ $msg = "Bestellung {$order->getOrderId()}: \n";
- foreach($order->getData() as $item) {
- if($item['menge'] > 0 && strlen($item['sku']) > 0) {
- $msg .= $item['name'];
- $msg .= ' '.$item['sku'];
- $msg .= ' Menge: '.$item['menge']."\n";
- }
- }
+ foreach ($order->getData() as $item) {
+ if ($item['menge'] > 0 && strlen($item['sku']) > 0) {
+ $msg .= $item['name'];
+ $msg .= ' ' . $item['sku'];
+ $msg .= ' Menge: ' . $item['menge'] . "\n";
+ }
+ }
- if($order->getStatus() == 1) {
- $slack->from('CDS-Notify')
- ->send($msg);
- }elseif($order->getStatus() == 2){
+ if ($order->getStatus() == 1) {
+ $slack->from('CDS-Notify')
+ ->send($msg);
+ } elseif ($order->getStatus() == 2) {
//Send to Hiltes
- $this->hiltes->createRequest($order);
- }else{
- $this->logger->error('Status ist nicht 1 oder 2');
- }
+ $this->hiltes->createRequest($order);
+ } else {
+ $this->logger->error('Status ist nicht 1 oder 2');
+ }
}
}
\ No newline at end of file
diff --git a/src/Helper/Ftp.php b/src/Helper/Ftp.php
index 8c2ba5f..c0757a0 100644
--- a/src/Helper/Ftp.php
+++ b/src/Helper/Ftp.php
@@ -3,6 +3,8 @@
namespace App\Helper;
+use Exception;
+
class Ftp
{
private string $host;
@@ -23,6 +25,55 @@ class Ftp
}
+ /**
+ * Uploads a local file to a remote FTP server.
+ *
+ * @param string $localFile The local file path to upload.
+ *
+ * @return void
+ * @throws Exception If the upload fails or encounters an error.
+ *
+ */
+ public function uploadFile(string $localFile): void
+ {
+ $ftp = ftp_ssl_connect($this->getHost(), $this->getPort());
+
+ if (!$ftp) {
+ throw new Exception("Failed to connect to FTP server");
+ }
+
+ $ftp_login = ftp_login($ftp, $this->getUser(), $this->getPassword());
+
+ if (!$ftp_login) {
+ throw new Exception("FTP login failed");
+ }
+
+ ftp_pasv($ftp, true);
+
+ $remoteFile = 'stock_hiltes.csv';
+
+ if (!file_exists($localFile)) {
+ throw new Exception("Local file does not exist: $localFile");
+ }
+
+ $r = ftp_nb_put($ftp, $this->getRemoteDir() . $remoteFile, $localFile, FTP_BINARY);
+
+ while ($r == FTP_MOREDATA) {
+ // Continue uploading...
+ $r = ftp_nb_continue($ftp);
+ }
+
+ if ($r != FTP_FINISHED) {
+ throw new Exception("File upload failed");
+ }
+
+ ftp_close($ftp);
+
+ if (!unlink($localFile)) {
+ throw new Exception("Failed to delete local file: $localFile");
+ }
+ }
+
public function getHost(): string
{
return $this->host;
@@ -32,6 +83,7 @@ class Ftp
{
$this->host = $host;
}
+
public function getPort(): int
{
return $this->port;
@@ -71,53 +123,4 @@ class Ftp
{
$this->remoteDir = $remoteDir;
}
-
- /**
- * Uploads a local file to a remote FTP server.
- *
- * @param string $localFile The local file path to upload.
- *
- * @throws \Exception If the upload fails or encounters an error.
- *
- * @return void
- */
- public function uploadFile(string $localFile): void
- {
- $ftp = ftp_ssl_connect($this->getHost(), $this->getPort());
-
- if (!$ftp) {
- throw new \Exception("Failed to connect to FTP server");
- }
-
- $ftp_login = ftp_login($ftp, $this->getUser(), $this->getPassword());
-
- if (!$ftp_login) {
- throw new \Exception("FTP login failed");
- }
-
- ftp_pasv($ftp, true);
-
- $remoteFile = 'stock_hiltes.csv';
-
- if (!file_exists($localFile)) {
- throw new \Exception("Local file does not exist: $localFile");
- }
-
- $r = ftp_nb_put($ftp, $this->getRemoteDir() . $remoteFile, $localFile, FTP_BINARY);
-
- while ($r == FTP_MOREDATA) {
- // Continue uploading...
- $r = ftp_nb_continue($ftp);
- }
-
- if ($r != FTP_FINISHED) {
- throw new \Exception("File upload failed");
- }
-
- ftp_close($ftp);
-
- if (!unlink($localFile)) {
- throw new \Exception("Failed to delete local file: $localFile");
- }
- }
}
\ No newline at end of file
diff --git a/src/Helper/Hiltes.php b/src/Helper/Hiltes.php
index c326e08..935c618 100644
--- a/src/Helper/Hiltes.php
+++ b/src/Helper/Hiltes.php
@@ -4,7 +4,6 @@ namespace App\Helper;
use App\Entity\Order;
use App\Repository\OrderRepository;
-use Doctrine\Common\Collections\Criteria;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
@@ -97,8 +96,8 @@ class Hiltes
if ($order) {
- //foreach ($orders as $order) {
- // if ($order->getStatus() > 0) continue;
+ //foreach ($orders as $order) {
+ // if ($order->getStatus() > 0) continue;
$tA = $order->getData();#json_decode($order->getData());
#$tA['orderdate'] = "2023-08-30T12:05:24.000Z";
@@ -211,7 +210,7 @@ class Hiltes
dd($arr);
$data = $this->createJson($arr);
- // }
+ // }
return $this->sendOrderToHiltes($data);
diff --git a/src/Helper/HiltesImport.php b/src/Helper/HiltesImport.php
index ea52a57..8c52b8c 100644
--- a/src/Helper/HiltesImport.php
+++ b/src/Helper/HiltesImport.php
@@ -9,118 +9,122 @@ use App\Entity\Warehouse;
use App\Repository\ProductRepository;
use App\Repository\StockRepository;
use App\Repository\WarehouseRepository;
+use Exception;
use Psr\Log\LoggerInterface;
+use RuntimeException;
+use SplFileObject;
use Symfony\Component\Finder\Finder;
class HiltesImport
{
+ protected $currentDirPath;
+ protected $cachedWarehouseIds;
+ protected $arrData = array();
private $productRepository;
- private $stockRepository;
+ private $stockRepository;
private $warehouseRepository;
private $logger;
- protected $currentDirPath;
- protected $cachedWarehouseIds;
- private $cachedProdIds;
- private $cachedStockIds;
- protected $arrData = array();
+ private $cachedProdIds;
+ private $cachedStockIds;
- public function __construct(ProductRepository $productRepository,WarehouseRepository $warehouseRepository,StockRepository $stockRepository, LoggerInterface $logger)
- {
+ public function __construct(ProductRepository $productRepository, WarehouseRepository $warehouseRepository, StockRepository $stockRepository, LoggerInterface $logger)
+ {
$this->productRepository = $productRepository;
$this->warehouseRepository = $warehouseRepository;
- $this->stockRepository = $stockRepository;
+ $this->stockRepository = $stockRepository;
$this->logger = $logger;
- $this->currentDirPath = getcwd();
- }
+ $this->currentDirPath = getcwd();
+ }
/**
* @return array|void
*/
- public function startImport($delta = false)
- {
- #*** Holt alle Dateien
- if($this->getFiles($delta)){
- #*** Holt alle Stocks und setzt ein Array **************
- $this->getStocks();
+ public function startImport($delta = false)
+ {
+ #*** Holt alle Dateien
+ if ($this->getFiles($delta)) {
+ #*** Holt alle Stocks und setzt ein Array **************
+ $this->getStocks();
$count = 0;
- if(!empty($this->arrData['orgFiles']['data']) && count($this->arrData['orgFiles']['data'])){
- foreach ($this->arrData['orgFiles']['data'] as $file) {
+ if (!empty($this->arrData['orgFiles']['data']) && count($this->arrData['orgFiles']['data'])) {
+ foreach ($this->arrData['orgFiles']['data'] as $file) {
- if(is_file($file['realPath'])){
- $count += $this->loadFiles($file['realPath']);
- }else{
- throw new \RuntimeException("Error: File not found - " . $file['realPath']);
+ if (is_file($file['realPath'])) {
+ $count += $this->loadFiles($file['realPath']);
+ } else {
+ throw new RuntimeException("Error: File not found - " . $file['realPath']);
}
}
$this->logger->info("Imported $count stocks");
} else {
$this->logger->info('No Files');
- }
+ }
} else {
- throw new \RuntimeException('Error in getFiles or no file WS.FERTIG');
+ throw new RuntimeException('Error in getFiles or no file WS.FERTIG');
}
- }
+ }
/**
* @return bool
*/
- protected function getFiles($delta = false)
- {
- $finder = Finder::create();
- $finder
- ->in($this->currentDirPath.'/hiltes/h2c/')
- ->depth(0);
+ protected function getFiles($delta = false)
+ {
+ $finder = Finder::create();
+ $finder
+ ->in($this->currentDirPath . '/hiltes/h2c/')
+ ->depth(0);
- if($delta) {
+ if ($delta) {
$finder->name('/_D/');
- }else{
+ } else {
$finder->notName('/_D/');
}
- if ($finder->hasResults()) {
- foreach ($finder as $file) {
- if($file->getExtension() != 'Ende') {
+ if ($finder->hasResults()) {
+ foreach ($finder as $file) {
+ if ($file->getExtension() != 'Ende') {
//prüfen ob Ende Datei vorhanden ist
- if(file_exists($this->currentDirPath.'/hiltes/h2c/'.$file->getRelativePathname().'.Ende')) {
+ if (file_exists($this->currentDirPath . '/hiltes/h2c/' . $file->getRelativePathname() . '.Ende')) {
$this->arrData['orgFiles']['data'][] = array(
- 'realPath' => $file->getRealPath(),
- 'fileSize' => $file->getFileInfo()->getSize(),
- 'onlyFileName' => $file->getRelativePathname(),
+ 'realPath' => $file->getRealPath(),
+ 'fileSize' => $file->getFileInfo()->getSize(),
+ 'onlyFileName' => $file->getRelativePathname(),
);
}
}
- }
- }else{
- return false;
- }
+ }
+ } else {
+ return false;
+ }
return true;
- }
- protected function getStocks()
- {
+ }
+
+ protected function getStocks()
+ {
$stocks = $this->stockRepository->findAll();
foreach ($stocks as $stock) {
$this->cachedStockIds[$stock->getProductId()][$stock->getWarehouse()->getId()] = $stock;
- }
- }
+ }
+ }
- protected function loadFiles($srcFile)
- {
+ protected function loadFiles($srcFile)
+ {
try {
- $file = new \SplFileObject($srcFile);
+ $file = new SplFileObject($srcFile);
$this->logger->info('Starte Import von ' . $file->getRealPath());
$count = 0;
while (!$file->eof()) {
$this->processLine($file->fgets());
$count++;
- }
- }catch (\Exception $e) {
+ }
+ } catch (Exception $e) {
$this->logger->error($e->getMessage());
}
@@ -130,7 +134,7 @@ class HiltesImport
$this->logger->info($count . ' Datensätze importiert');
return $count;
- }
+ }
protected function processLine($line)
{
@@ -139,15 +143,15 @@ class HiltesImport
if (!empty($data[0])) {
$this->trimArray($data);
$this->saveData($data);
- }
- }
+ }
+ }
protected function trimArray(array &$arr)
{
- foreach ($arr as $k=>$v) {
- $arr[$k] = trim($v);
- }
- }
+ foreach ($arr as $k => $v) {
+ $arr[$k] = trim($v);
+ }
+ }
protected function saveData(array $data)
{
@@ -156,63 +160,64 @@ class HiltesImport
if (!empty($warehouse) && !empty($this->cachedStockIds[$gtin][$warehouse->getId()])) {
$stock = $this->cachedStockIds[$gtin][$warehouse->getId()];
- }else{
- $stock = new Stock();
- $stock->setProductId($gtin);
+ } else {
+ $stock = new Stock();
+ $stock->setProductId($gtin);
$stock->setWarehouse($warehouse);
- }
+ }
- $stock->setInstock((int) $data[1] / 100);
- $this->stockRepository->save($stock,true);
- }
+ $stock->setInstock((int)$data[1] / 100);
+ $this->stockRepository->save($stock, true);
+ }
private function checkWarehouseName(string $warehouseName)
{
$warehouseName = ltrim($warehouseName, 0);
if (empty($this->cachedWarehouseIds[$warehouseName])) {
- $warehouse = $this->warehouseRepository->findOneBy(['id' => (int) $warehouseName]);
+ $warehouse = $this->warehouseRepository->findOneBy(['id' => (int)$warehouseName]);
if (empty($warehouse)) {
- $warehouse = new Warehouse();
- $warehouse->setId((int) $warehouseName);
+ $warehouse = new Warehouse();
+ $warehouse->setId((int)$warehouseName);
$warehouse->setName($warehouseName);
- $this->warehouseRepository->save($warehouse,true);
+ $this->warehouseRepository->save($warehouse, true);
$this->cachedWarehouseIds[$warehouseName] = $warehouse;
- }else{
+ } else {
$this->cachedWarehouseIds[$warehouseName] = $warehouse;
}
- }
+ }
if (!empty($this->cachedWarehouseIds[$warehouseName])) {
return $this->cachedWarehouseIds[$warehouseName];
- }
+ }
- return false;
- }
+ return false;
+ }
/**
* @param string $gtin
* @return false|int|mixed|null
*/
- private function checkProduct(string $gtin){
- #*** WEnn keine geCached Id Vorhanden
- if(empty($this->cachedProdIds[$gtin])){
+ private function checkProduct(string $gtin)
+ {
+ #*** WEnn keine geCached Id Vorhanden
+ if (empty($this->cachedProdIds[$gtin])) {
$product = $this->productRepository->findOneBy(['gtin' => $gtin]);
if (empty($product)) {
$product = new Product();
$product->setGtin($gtin);
$this->cachedProdIds[$gtin] = $this->productRepository->save($product, true);
- }else{
+ } else {
$this->cachedProdIds[$gtin] = $product->getId();
}
- }
-
- if (!empty($this->cachedProdIds[$gtin])) {
- return $this->cachedProdIds[$gtin];
}
- return false;
- }
+ if (!empty($this->cachedProdIds[$gtin])) {
+ return $this->cachedProdIds[$gtin];
+ }
+
+ return false;
+ }
}
\ No newline at end of file
diff --git a/src/Helper/Jtl.php b/src/Helper/Jtl.php
index f4f37f3..98b7817 100644
--- a/src/Helper/Jtl.php
+++ b/src/Helper/Jtl.php
@@ -5,8 +5,10 @@ namespace App\Helper;
use App\Repository\ProductRepository;
use App\Repository\StockRepository;
use App\Repository\WarehouseRepository;
-use Psr\Log\LoggerInterface;
+use ArrayIterator;
+use Exception;
use League\Csv\Writer;
+use Psr\Log\LoggerInterface;
class Jtl
@@ -28,7 +30,7 @@ class Jtl
10 => 'Lager 10 - OJ EF',
);
- public function __construct(ProductRepository $productRepository,WarehouseRepository $warehouseRepository,StockRepository $stockRepository, LoggerInterface $logger)
+ public function __construct(ProductRepository $productRepository, WarehouseRepository $warehouseRepository, StockRepository $stockRepository, LoggerInterface $logger)
{
$this->productRepository = $productRepository;
$this->warehouseRepository = $warehouseRepository;
@@ -47,31 +49,31 @@ class Jtl
$data = array();
- foreach($r as $product){
- $stock = $this->stockRepository->findBy(['product_id'=>$product->getId()]);
+ foreach ($r as $product) {
+ $stock = $this->stockRepository->findBy(['product_id' => $product->getId()]);
- if($stock){
- foreach($stock as $s){
+ if ($stock) {
+ foreach ($stock as $s) {
$warehouse = $s->getWarehouse();
$warehouseName = $warehouse->getName();
- $data[$product->getId().$warehouseName] = [
+ $data[$product->getId() . $warehouseName] = [
'gtin' => $product->getGtin(),
'stock' => $s->getInstock(),
'warehouse' => $this->arrLager[$warehouseName] ?? 'Lager ' . $warehouseName
];
}
- }else{
+ } else {
$data[$product->getId()] = [
'gtin' => $product->getGtin(),
'stock' => 0,
'warehouse' => 0
];
- $this->logger->info('No stock for product '.$product->getId());
+ $this->logger->info('No stock for product ' . $product->getId());
}
- // dump($data);
+ // dump($data);
}
@@ -86,22 +88,20 @@ class Jtl
public function createExportFile($data): void
{
try {
- $writer = Writer::createFromPath(getcwd().'/jtl/cds-export.csv', 'w+');
- $bytes = $writer->insertAll(new \ArrayIterator($data));
+ $writer = Writer::createFromPath(getcwd() . '/jtl/cds-export.csv', 'w+');
+ $bytes = $writer->insertAll(new ArrayIterator($data));
- if($bytes){
- $this->logger->info('Exported '.$bytes.' bytes');
+ if ($bytes) {
+ $this->logger->info('Exported ' . $bytes . ' bytes');
$FTP = new Ftp();
- $FTP->uploadFile(getcwd().'/jtl/cds-export.csv');
+ $FTP->uploadFile(getcwd() . '/jtl/cds-export.csv');
}
- }catch (\Exception $e){
+ } catch (Exception $e) {
$this->logger->error($e->getMessage());
}
}
-
-
}
\ No newline at end of file
diff --git a/src/Helper/Slack.php b/src/Helper/Slack.php
index 6cab4e9..4b5b9e7 100644
--- a/src/Helper/Slack.php
+++ b/src/Helper/Slack.php
@@ -2,7 +2,6 @@
namespace App\Helper;
-use Symfony\Component\Notifier\Chatter;
use Symfony\Component\Notifier\ChatterInterface;
use Symfony\Component\Notifier\Exception\TransportExceptionInterface;
use Symfony\Component\Notifier\Message\ChatMessage;
@@ -16,7 +15,7 @@ class Slack
$this->chatter = $chatter;
}
- public function sendMessage(String $message): void
+ public function sendMessage(string $message): void
{
$message = (new ChatMessage($message))
->transport('slack');
diff --git a/src/Repository/OrderRepository.php b/src/Repository/OrderRepository.php
index b01df00..573a241 100644
--- a/src/Repository/OrderRepository.php
+++ b/src/Repository/OrderRepository.php
@@ -5,6 +5,7 @@ namespace App\Repository;
use App\Entity\Order;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
+use Exception;
/**
* @extends ServiceEntityRepository
@@ -39,6 +40,22 @@ class OrderRepository extends ServiceEntityRepository
}
}
+ /**
+ * @throws Exception
+ */
+ public function update(Order $entity, bool $flush = false): void
+ {
+ $order = $this->getEntityManager()->find(Order::class, $entity->getId());
+
+ if (!$order) {
+ throw $this->createNotFoundException('Order not found: ' . $entity->getId());
+ }
+
+ if ($flush) {
+ $this->getEntityManager()->flush();
+ }
+ }
+
// /**
// * @return Order[] Returns an array of Order objects
// */
@@ -63,4 +80,11 @@ class OrderRepository extends ServiceEntityRepository
// ->getOneOrNullResult()
// ;
// }
-}
+ /**
+ * @throws Exception
+ */
+ private function createNotFoundException(string $string)
+ {
+ throw new Exception($string);
+ }
+}
\ No newline at end of file
diff --git a/src/Repository/OrdersRepository.php b/src/Repository/OrdersRepository.php
deleted file mode 100644
index c76e085..0000000
--- a/src/Repository/OrdersRepository.php
+++ /dev/null
@@ -1,105 +0,0 @@
-
- *
- * @method Orders|null find($id, $lockMode = null, $lockVersion = null)
- * @method Orders|null findOneBy(array $criteria, array $orderBy = null)
- * @method Orders[] findAll()
- * @method Orders[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
- */
-class OrdersRepository extends ServiceEntityRepository
-{
- private ValidatorInterface $validator;
-
- public function __construct(ManagerRegistry $registry, ValidatorInterface $validator)
- {
- parent::__construct($registry, Orders::class);
- $this->validator = $validator;
- }
-
- /**
- * @param Orders $entity
- * @param bool $flush
- * @return void
- */
- public function add(Orders $entity, bool $flush = false): void
- {
-
- $errors = $this->validator->validate($entity);
- if (count($errors) > 0) {
- var_dump($errors);
- }
-
- $this->getEntityManager()->persist($entity);
-
- if ($flush) {
- $this->getEntityManager()->flush();
- }
- }
-
- /**
- * @param Orders $entity
- * @param bool $flush
- * @return void
- */
- public function update(Orders $entity, bool $flush = false): void
- {
- $order = $this->getEntityManager()->find(Orders::class, $entity->getId());
-
- if (!$order) {
- throw $this->createNotFoundException('Order not found: '.$entity->getId());
- }
- }
-
- /**
- * @param Orders $entity
- * @param bool $flush
- * @return void
- */
- public function remove(Orders $entity, bool $flush = false): void
- {
- $this->getEntityManager()->remove($entity);
-
- if ($flush) {
- $this->getEntityManager()->flush();
- }
- }
-
- /**
- * @return Orders[] Returns an array of Orders objects
- */
- public function findByStatus($status): array
- {
- return $this->createQueryBuilder('o')
- ->andWhere('o.status = :val')
- ->setParameter('val', $status)
- ->orderBy('o.id', 'ASC')
- ->setMaxResults(100)
- ->getQuery()
- ->getResult()
- ;
- }
-
- /**
- * @param $orderId
- * @return Orders|null
- * @throws \Doctrine\ORM\NonUniqueResultException
- */
- public function findOneByOrderId($orderId): ?Orders
- {
- return $this->createQueryBuilder('o')
- ->andWhere('o.order_id = :val')
- ->setParameter('val', $orderId)
- ->getQuery()
- ->getOneOrNullResult()
- ;
- }
-}
diff --git a/src/Repository/ProductRepository.php b/src/Repository/ProductRepository.php
index 2d14203..0fa91d0 100644
--- a/src/Repository/ProductRepository.php
+++ b/src/Repository/ProductRepository.php
@@ -3,6 +3,7 @@
namespace App\Repository;
use App\Entity\Product;
+use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
@@ -24,7 +25,7 @@ class ProductRepository extends ServiceEntityRepository
public function save(Product $entity, bool $flush = false): ?int
{
- $entity->setUpdateTime(new \DateTime());
+ $entity->setUpdateTime(new DateTime());
$this->getEntityManager()->persist($entity);
@@ -68,4 +69,4 @@ class ProductRepository extends ServiceEntityRepository
// ->getOneOrNullResult()
// ;
// }
-}
+}
\ No newline at end of file
diff --git a/src/Repository/StockRepository.php b/src/Repository/StockRepository.php
index 2b77b59..e3c6da7 100644
--- a/src/Repository/StockRepository.php
+++ b/src/Repository/StockRepository.php
@@ -3,6 +3,7 @@
namespace App\Repository;
use App\Entity\Stock;
+use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
@@ -23,7 +24,7 @@ class StockRepository extends ServiceEntityRepository
public function save(Stock $entity, bool $flush = false): void
{
- $entity->setUpdateTime(new \DateTime());
+ $entity->setUpdateTime(new DateTime());
$this->getEntityManager()->persist($entity);
diff --git a/src/Repository/WarehouseRepository.php b/src/Repository/WarehouseRepository.php
index 9f45889..d94cf3b 100644
--- a/src/Repository/WarehouseRepository.php
+++ b/src/Repository/WarehouseRepository.php
@@ -23,7 +23,7 @@ class WarehouseRepository extends ServiceEntityRepository
public function save(Warehouse $entity, bool $flush = false): ?int
{
- $entity->setPrio(0);
+ $entity->setPrio(0);
$this->getEntityManager()->persist($entity);
if ($flush) {
@@ -66,4 +66,4 @@ class WarehouseRepository extends ServiceEntityRepository
// ->getOneOrNullResult()
// ;
// }
-}
+}
\ No newline at end of file
diff --git a/src/Security/ApiKeyAuthenticator.php b/src/Security/ApiKeyAuthenticator.php
index 913d405..0abc5d8 100644
--- a/src/Security/ApiKeyAuthenticator.php
+++ b/src/Security/ApiKeyAuthenticator.php
@@ -52,7 +52,7 @@ class ApiKeyAuthenticator extends AbstractAuthenticator
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response
{
- # dump($exception);
+ # dump($exception);
$data = [
'message' => $exception->getMessage()