diff --git a/.gitignore b/.gitignore index b68d9e86c..dcc92e8e8 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ src/Resources/public/administration/js/ /tests/Cypress/cypress/results /src/Resources/app/administration/.stryker-tmp /.phpunuhi/ -/src/Resources/public/static +/src/Resources/public/static/css +/src/Resources/public/static/js /src/Resources/public/js /src/Resources/public/mollie-payments.js diff --git a/composer.json b/composer.json index bd114ce88..03e2e12ab 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,8 @@ "config": { "optimize-autoloader": true, "allow-plugins": { - "infection/extension-installer": true + "infection/extension-installer": true, + "php-http/discovery": true } }, "autoload": { @@ -64,7 +65,7 @@ "require": { "php": ">=7.4", "ext-curl": "*", - "mollie/mollie-api-php": "2.40.1" + "mollie/mollie-api-php": "2.61.0" }, "require-dev": { "phpunit/phpunit": "^9.5", diff --git a/composer.lock b/composer.lock index c97289de9..a1ad84c5b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2ffbf5f15690099f310448e96e981166", + "content-hash": "5cd478db4a08e7096ed3285163ebb7e6", "packages": [ { "name": "composer/ca-bundle", - "version": "1.3.6", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "90d087e988ff194065333d16bc5cf649872d9cdb" + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/90d087e988ff194065333d16bc5cf649872d9cdb", - "reference": "90d087e988ff194065333d16bc5cf649872d9cdb", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", "shasum": "" }, "require": { @@ -64,7 +64,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.6" + "source": "https://github.com/composer/ca-bundle/tree/1.3.7" }, "funding": [ { @@ -80,20 +80,20 @@ "type": "tidelift" } ], - "time": "2023-06-06T12:02:59+00:00" + "time": "2023-08-30T09:31:38+00:00" }, { "name": "mollie/mollie-api-php", - "version": "v2.40.1", + "version": "v2.61.0", "source": { "type": "git", "url": "https://github.com/mollie/mollie-api-php.git", - "reference": "b99ad3662b4141efa9ee8eb83a04c2d3c100f83c" + "reference": "d3ec7a191985aa57bec9b4425a665e95b4ba346a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/b99ad3662b4141efa9ee8eb83a04c2d3c100f83c", - "reference": "b99ad3662b4141efa9ee8eb83a04c2d3c100f83c", + "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/d3ec7a191985aa57bec9b4425a665e95b4ba346a", + "reference": "d3ec7a191985aa57bec9b4425a665e95b4ba346a", "shasum": "" }, "require": { @@ -101,13 +101,14 @@ "ext-curl": "*", "ext-json": "*", "ext-openssl": "*", - "php": ">=5.6" + "php": "^7.2|^8.0" }, "require-dev": { - "eloquent/liberator": "^2.0", + "eloquent/liberator": "^2.0||^3.0", "friendsofphp/php-cs-fixer": "^3.0", "guzzlehttp/guzzle": "^6.3 || ^7.0", - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.1 || ^8.5 || ^9.5" + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^8.5 || ^9.5" }, "suggest": { "mollie/oauth2-mollie-php": "Use OAuth to authenticate with the Mollie API. This is needed for some endpoints. Visit https://docs.mollie.com/ for more information." @@ -169,24 +170,24 @@ ], "support": { "issues": "https://github.com/mollie/mollie-api-php/issues", - "source": "https://github.com/mollie/mollie-api-php/tree/v2.40.1" + "source": "https://github.com/mollie/mollie-api-php/tree/v2.61.0" }, - "time": "2022-01-18T18:16:13+00:00" + "time": "2023-07-31T15:37:46+00:00" } ], "packages-dev": [ { "name": "aws/aws-crt-php", - "version": "v1.2.1", + "version": "v1.2.2", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5" + "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/1926277fc71d253dfa820271ac5987bdb193ccf5", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/2f1dc7b7eda080498be96a4a6d683a41583030e9", + "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9", "shasum": "" }, "require": { @@ -225,22 +226,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.1" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.2" }, - "time": "2023-03-24T20:22:19+00:00" + "time": "2023-07-20T16:49:55+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.271.9", + "version": "3.281.8", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "8593b1a898f2d0be56bea94aa9b379e670ae1eb3" + "reference": "eb349b9f31502a05c70362f57913b9fed6b65b1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8593b1a898f2d0be56bea94aa9b379e670ae1eb3", - "reference": "8593b1a898f2d0be56bea94aa9b379e670ae1eb3", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/eb349b9f31502a05c70362f57913b9fed6b65b1f", + "reference": "eb349b9f31502a05c70362f57913b9fed6b65b1f", "shasum": "" }, "require": { @@ -249,11 +250,11 @@ "ext-pcre": "*", "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0", + "guzzlehttp/promises": "^1.4.0 || ^2.0", "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "mtdowling/jmespath.php": "^2.6", - "php": ">=5.5", - "psr/http-message": "^1.0" + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", @@ -268,7 +269,7 @@ "ext-sockets": "*", "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", "psr/cache": "^1.0", "psr/simple-cache": "^1.0", "sebastian/comparator": "^1.2.3 || ^4.0", @@ -320,9 +321,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.271.9" + "source": "https://github.com/aws/aws-sdk-php/tree/3.281.8" }, - "time": "2023-06-06T18:22:57+00:00" + "time": "2023-09-15T18:34:59+00:00" }, { "name": "boxblinkracer/phpunuhi", @@ -330,12 +331,12 @@ "source": { "type": "git", "url": "https://github.com/boxblinkracer/phpunuhi.git", - "reference": "feb03e8998f85707726696d43b86a9486f453ad9" + "reference": "df3fb5c625c1105860ee26eaad116945f6b6e1ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/boxblinkracer/phpunuhi/zipball/feb03e8998f85707726696d43b86a9486f453ad9", - "reference": "feb03e8998f85707726696d43b86a9486f453ad9", + "url": "https://api.github.com/repos/boxblinkracer/phpunuhi/zipball/df3fb5c625c1105860ee26eaad116945f6b6e1ef", + "reference": "df3fb5c625c1105860ee26eaad116945f6b6e1ef", "shasum": "" }, "require": { @@ -388,9 +389,9 @@ ], "support": { "issues": "https://github.com/boxblinkracer/phpunuhi/issues", - "source": "https://github.com/boxblinkracer/phpunuhi/tree/v1.12.0" + "source": "https://github.com/boxblinkracer/phpunuhi/tree/v1.13.0" }, - "time": "2023-07-25T19:32:32+00:00" + "time": "2023-09-03T12:32:03+00:00" }, { "name": "brick/math", @@ -767,16 +768,16 @@ }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "shasum": "" }, "require": { @@ -826,9 +827,9 @@ "versioning" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.4.0" }, "funding": [ { @@ -844,7 +845,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2023-08-31T09:50:34+00:00" }, { "name": "composer/spdx-licenses", @@ -994,16 +995,16 @@ }, { "name": "deeplcom/deepl-php", - "version": "v1.4.0", + "version": "v1.5.1", "source": { "type": "git", "url": "https://github.com/DeepLcom/deepl-php.git", - "reference": "b235af7647418ac74275e70476eff3b84f6c0ecc" + "reference": "732c025b00d9240cfb4233ea0b5ec02f6ea1078f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DeepLcom/deepl-php/zipball/b235af7647418ac74275e70476eff3b84f6c0ecc", - "reference": "b235af7647418ac74275e70476eff3b84f6c0ecc", + "url": "https://api.github.com/repos/DeepLcom/deepl-php/zipball/732c025b00d9240cfb4233ea0b5ec02f6ea1078f", + "reference": "732c025b00d9240cfb4233ea0b5ec02f6ea1078f", "shasum": "" }, "require": { @@ -1011,10 +1012,16 @@ "ext-json": "*", "ext-mbstring": "*", "php": ">=7.3.0", + "php-http/discovery": "^1.18", + "php-http/multipart-stream-builder": "^1.3", + "psr/http-client": "^1.0", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3", + "guzzlehttp/guzzle": "^7.7.0", "php-mock/php-mock-phpunit": "^2.6", "phpunit/phpunit": "^9", "ramsey/uuid": "^4.2", @@ -1045,22 +1052,22 @@ ], "support": { "issues": "https://github.com/DeepLcom/deepl-php/issues", - "source": "https://github.com/DeepLcom/deepl-php/tree/v1.4.0" + "source": "https://github.com/DeepLcom/deepl-php/tree/v1.5.1" }, - "time": "2023-05-24T07:52:25+00:00" + "time": "2023-09-11T13:24:15+00:00" }, { "name": "defuse/php-encryption", - "version": "v2.3.1", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/defuse/php-encryption.git", - "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2" + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/defuse/php-encryption/zipball/77880488b9954b7884c25555c2a0ea9e7053f9d2", - "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828", "shasum": "" }, "require": { @@ -1069,7 +1076,8 @@ "php": ">=5.6.0" }, "require-dev": { - "phpunit/phpunit": "^4|^5|^6|^7|^8|^9" + "phpunit/phpunit": "^5|^6|^7|^8|^9|^10", + "yoast/phpunit-polyfills": "^2.0.0" }, "bin": [ "bin/generate-defuse-key" @@ -1111,9 +1119,9 @@ ], "support": { "issues": "https://github.com/defuse/php-encryption/issues", - "source": "https://github.com/defuse/php-encryption/tree/v2.3.1" + "source": "https://github.com/defuse/php-encryption/tree/v2.4.0" }, - "time": "2021-04-09T23:57:26+00:00" + "time": "2023-06-19T06:10:36+00:00" }, { "name": "doctrine/annotations", @@ -1280,76 +1288,6 @@ ], "time": "2022-05-20T20:07:39+00:00" }, - { - "name": "doctrine/collections", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e", - "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^0.5.3 || ^1", - "php": "^7.1.3 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0 || ^10.0", - "phpstan/phpstan": "^1.4.8", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", - "vimeo/psalm": "^4.22" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", - "homepage": "https://www.doctrine-project.org/projects/collections.html", - "keywords": [ - "array", - "collections", - "iterators", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.8.0" - }, - "time": "2022-09-01T20:12:10+00:00" - }, { "name": "doctrine/dbal", "version": "2.13.9", @@ -1842,44 +1780,40 @@ }, { "name": "doctrine/persistence", - "version": "2.5.7", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "e36f22765f4d10a7748228babbf73da5edfeed3c" + "reference": "63fee8c33bef740db6730eb2a750cd3da6495603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/e36f22765f4d10a7748228babbf73da5edfeed3c", - "reference": "e36f22765f4d10a7748228babbf73da5edfeed3c", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/63fee8c33bef740db6730eb2a750cd3da6495603", + "reference": "63fee8c33bef740db6730eb2a750cd3da6495603", "shasum": "" }, "require": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/collections": "^1.0", - "doctrine/deprecations": "^0.5.3 || ^1", "doctrine/event-manager": "^1 || ^2", - "php": "^7.1 || ^8.0", + "php": "^7.2 || ^8.0", "psr/cache": "^1.0 || ^2.0 || ^3.0" }, "conflict": { - "doctrine/annotations": "<1.0 || >=3.0", "doctrine/common": "<2.10" }, "require-dev": { "composer/package-versions-deprecated": "^1.11", - "doctrine/annotations": "^1 || ^2", - "doctrine/coding-standard": "^9 || ^11", + "doctrine/coding-standard": "^11", "doctrine/common": "^3.0", - "phpstan/phpstan": "~1.4.10 || 1.9.4", - "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.5", + "phpstan/phpstan": "1.9.4", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", "symfony/cache": "^4.4 || ^5.4 || ^6.0", "vimeo/psalm": "4.30.0 || 5.3.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\": "src/Common", "Doctrine\\Persistence\\": "src/Persistence" } }, @@ -1914,7 +1848,7 @@ } ], "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", - "homepage": "https://doctrine-project.org/projects/persistence.html", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", "keywords": [ "mapper", "object", @@ -1924,7 +1858,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/2.5.7" + "source": "https://github.com/doctrine/persistence/tree/3.2.0" }, "funding": [ { @@ -1940,7 +1874,7 @@ "type": "tidelift" } ], - "time": "2023-02-03T15:51:16+00:00" + "time": "2023-05-17T18:32:04+00:00" }, { "name": "egulias/email-validator", @@ -2011,21 +1945,21 @@ }, { "name": "enqueue/amqp-tools", - "version": "0.10.18", + "version": "0.10.19", "source": { "type": "git", "url": "https://github.com/php-enqueue/amqp-tools.git", - "reference": "1a68bcae51fcbe6e55cac42d455e6064513a5111" + "reference": "866d45420aa354c1b465ec7636247c3c20f67bb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/amqp-tools/zipball/1a68bcae51fcbe6e55cac42d455e6064513a5111", - "reference": "1a68bcae51fcbe6e55cac42d455e6064513a5111", + "url": "https://api.github.com/repos/php-enqueue/amqp-tools/zipball/866d45420aa354c1b465ec7636247c3c20f67bb5", + "reference": "866d45420aa354c1b465ec7636247c3c20f67bb5", "shasum": "" }, "require": { "enqueue/dsn": "^0.10", - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8" }, @@ -2066,26 +2000,26 @@ "issues": "https://github.com/php-enqueue/enqueue-dev/issues", "source": "https://github.com/php-enqueue/enqueue-dev" }, - "time": "2023-02-26T03:18:02+00:00" + "time": "2023-03-23T09:50:55+00:00" }, { "name": "enqueue/dbal", - "version": "0.10.18", + "version": "0.10.19", "source": { "type": "git", "url": "https://github.com/php-enqueue/dbal.git", - "reference": "39bc94d15f78771de1f8c3dd63e784fa10fc34be" + "reference": "2375961434e2a69b8710875f1c4e56f01b348a47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/dbal/zipball/39bc94d15f78771de1f8c3dd63e784fa10fc34be", - "reference": "39bc94d15f78771de1f8c3dd63e784fa10fc34be", + "url": "https://api.github.com/repos/php-enqueue/dbal/zipball/2375961434e2a69b8710875f1c4e56f01b348a47", + "reference": "2375961434e2a69b8710875f1c4e56f01b348a47", "shasum": "" }, "require": { "doctrine/dbal": "^2.12|^3.1", - "doctrine/persistence": "^1.3.3|^2.0", - "php": "^7.3|^8.0", + "doctrine/persistence": "^2.0|^3.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "ramsey/uuid": "^3.5|^4" }, @@ -2128,24 +2062,24 @@ "issues": "https://github.com/php-enqueue/enqueue-dev/issues", "source": "https://github.com/php-enqueue/enqueue-dev" }, - "time": "2023-02-26T03:18:02+00:00" + "time": "2023-05-12T13:06:33+00:00" }, { "name": "enqueue/dsn", - "version": "0.10.8", + "version": "0.10.19", "source": { "type": "git", "url": "https://github.com/php-enqueue/dsn.git", - "reference": "729fabaae6b24189d14598033b174bd72e825e9a" + "reference": "f4991fe46dd01477deb566727170341b255e8479" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/dsn/zipball/729fabaae6b24189d14598033b174bd72e825e9a", - "reference": "729fabaae6b24189d14598033b174bd72e825e9a", + "url": "https://api.github.com/repos/php-enqueue/dsn/zipball/f4991fe46dd01477deb566727170341b255e8479", + "reference": "f4991fe46dd01477deb566727170341b255e8479", "shasum": "" }, "require": { - "php": "^7.3|^8.0" + "php": "^7.4|^8.0" }, "require-dev": { "phpunit/phpunit": "^9.5" @@ -2181,26 +2115,26 @@ "issues": "https://github.com/php-enqueue/enqueue-dev/issues", "source": "https://github.com/php-enqueue/enqueue-dev" }, - "time": "2021-02-09T12:01:28+00:00" + "time": "2023-03-23T09:50:55+00:00" }, { "name": "enqueue/enqueue", - "version": "0.10.18", + "version": "0.10.19", "source": { "type": "git", "url": "https://github.com/php-enqueue/enqueue.git", - "reference": "fdd4ab8d70038711f076c2165df27afe5eb25191" + "reference": "9273d0760b40594bfc721c36117824f660a388df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/enqueue/zipball/fdd4ab8d70038711f076c2165df27afe5eb25191", - "reference": "fdd4ab8d70038711f076c2165df27afe5eb25191", + "url": "https://api.github.com/repos/php-enqueue/enqueue/zipball/9273d0760b40594bfc721c36117824f660a388df", + "reference": "9273d0760b40594bfc721c36117824f660a388df", "shasum": "" }, "require": { "enqueue/dsn": "^0.10", "enqueue/null": "^0.10", - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "psr/container": "^1.1 || ^2.0", "psr/log": "^1.0 || ^2.0 || ^3.0", "queue-interop/amqp-interop": "^0.8.2", @@ -2226,12 +2160,12 @@ "enqueue/stomp": "0.10.x-dev", "enqueue/test": "0.10.x-dev", "phpunit/phpunit": "^9.5", - "symfony/config": "^5.1|^6.0", - "symfony/console": "^5.1|^6.0", - "symfony/dependency-injection": "^5.1|^6.0", - "symfony/event-dispatcher": "^5.1|^6.0", - "symfony/http-kernel": "^5.1|^6.0", - "symfony/yaml": "^5.1|^6.0" + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.41|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "enqueue/amqp-ext": "AMQP transport (based on php extension)", @@ -2240,9 +2174,9 @@ "enqueue/redis": "Redis transport", "enqueue/sqs": "Amazon AWS SQS transport", "enqueue/stomp": "STOMP transport", - "symfony/config": "^5.1|^6.0", - "symfony/console": "^5.1|^6.0 If you want to use cli commands", - "symfony/dependency-injection": "^5.1|^6.0" + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0 If you want to use cli commands", + "symfony/dependency-injection": "^5.4|^6.0" }, "type": "library", "extra": { @@ -2277,33 +2211,33 @@ "issues": "https://github.com/php-enqueue/enqueue-dev/issues", "source": "https://github.com/php-enqueue/enqueue-dev" }, - "time": "2023-02-26T03:18:02+00:00" + "time": "2023-03-23T09:50:55+00:00" }, { "name": "enqueue/enqueue-bundle", - "version": "0.10.18", + "version": "0.10.19", "source": { "type": "git", "url": "https://github.com/php-enqueue/enqueue-bundle.git", - "reference": "32d1884ff33e6c0e34d106fb84e2181384b8191e" + "reference": "3eab4e7172ab0b4c021351bcdb5f44957c4e6789" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/enqueue-bundle/zipball/32d1884ff33e6c0e34d106fb84e2181384b8191e", - "reference": "32d1884ff33e6c0e34d106fb84e2181384b8191e", + "url": "https://api.github.com/repos/php-enqueue/enqueue-bundle/zipball/3eab4e7172ab0b4c021351bcdb5f44957c4e6789", + "reference": "3eab4e7172ab0b4c021351bcdb5f44957c4e6789", "shasum": "" }, "require": { "enqueue/enqueue": "^0.10", "enqueue/null": "^0.10", - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/amqp-interop": "^0.8.2", "queue-interop/queue-interop": "^0.8", - "symfony/framework-bundle": "^5.1|^6.0" + "symfony/framework-bundle": "^5.4|^6.0" }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.0", - "doctrine/doctrine-bundle": "^2.0", + "doctrine/doctrine-bundle": "^2.3.2", "doctrine/mongodb-odm-bundle": "^3.5|^4.3", "enqueue/amqp-bunny": "0.10.x-dev", "enqueue/amqp-ext": "0.10.x-dev", @@ -2320,9 +2254,10 @@ "enqueue/test": "0.10.x-dev", "php-amqplib/php-amqplib": "^3.0", "phpunit/phpunit": "^9.5", - "symfony/browser-kit": "^5.1|^6.0", - "symfony/expression-language": "^5.1|^6.0", - "symfony/yaml": "^5.1|^6.0" + "symfony/browser-kit": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/validator": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "enqueue/async-command": "If want to run Symfony command via message queue", @@ -2361,24 +2296,24 @@ "issues": "https://github.com/php-enqueue/enqueue-dev/issues", "source": "https://github.com/php-enqueue/enqueue-dev" }, - "time": "2023-02-26T03:18:02+00:00" + "time": "2023-03-23T09:50:55+00:00" }, { "name": "enqueue/null", - "version": "0.10.18", + "version": "0.10.19", "source": { "type": "git", "url": "https://github.com/php-enqueue/null.git", - "reference": "7f2c3d2695e7ac4dcefa67c3cb69031fb2a932ea" + "reference": "c7174da80c59b04391c5194cebe46b6f85d79fb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/null/zipball/7f2c3d2695e7ac4dcefa67c3cb69031fb2a932ea", - "reference": "7f2c3d2695e7ac4dcefa67c3cb69031fb2a932ea", + "url": "https://api.github.com/repos/php-enqueue/null/zipball/c7174da80c59b04391c5194cebe46b6f85d79fb4", + "reference": "c7174da80c59b04391c5194cebe46b6f85d79fb4", "shasum": "" }, "require": { - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8" }, "require-dev": { @@ -2418,25 +2353,25 @@ "issues": "https://github.com/php-enqueue/enqueue-dev/issues", "source": "https://github.com/php-enqueue/enqueue-dev" }, - "time": "2023-02-26T03:18:02+00:00" + "time": "2023-03-23T09:50:55+00:00" }, { "name": "enqueue/redis", - "version": "0.10.18", + "version": "0.10.19", "source": { "type": "git", "url": "https://github.com/php-enqueue/redis.git", - "reference": "7c3156c812c5d039d0296e3a109d6d07cb62dc16" + "reference": "7aa6f64dd7fbd106aa3695d4fbd6ef5d579a5411" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/redis/zipball/7c3156c812c5d039d0296e3a109d6d07cb62dc16", - "reference": "7c3156c812c5d039d0296e3a109d6d07cb62dc16", + "url": "https://api.github.com/repos/php-enqueue/redis/zipball/7aa6f64dd7fbd106aa3695d4fbd6ef5d579a5411", + "reference": "7aa6f64dd7fbd106aa3695d4fbd6ef5d579a5411", "shasum": "" }, "require": { "enqueue/dsn": "^0.10", - "php": "^7.3|^8.0", + "php": "^7.4|^8.0", "queue-interop/queue-interop": "^0.8", "ramsey/uuid": "^3.5|^4" }, @@ -2482,7 +2417,7 @@ "issues": "https://github.com/php-enqueue/enqueue-dev/issues", "source": "https://github.com/php-enqueue/enqueue-dev" }, - "time": "2023-02-26T03:18:02+00:00" + "time": "2023-05-20T05:16:02+00:00" }, { "name": "ezyang/htmlpurifier", @@ -2540,16 +2475,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.5.0", + "version": "v6.8.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "e94e7353302b0c11ec3cfff7180cd0b1743975d2" + "reference": "5dbc8959427416b8ee09a100d7a8588c00fb2e26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/e94e7353302b0c11ec3cfff7180cd0b1743975d2", - "reference": "e94e7353302b0c11ec3cfff7180cd0b1743975d2", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/5dbc8959427416b8ee09a100d7a8588c00fb2e26", + "reference": "5dbc8959427416b8ee09a100d7a8588c00fb2e26", "shasum": "" }, "require": { @@ -2597,9 +2532,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.5.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.8.1" }, - "time": "2023-05-12T15:47:07+00:00" + "time": "2023-07-14T18:33:00+00:00" }, { "name": "friendsofphp/php-cs-fixer", @@ -2852,32 +2787,32 @@ }, { "name": "google/cloud-core", - "version": "v1.51.2", + "version": "v1.52.4", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-core.git", - "reference": "85dc48d62143f4bbfaa34c24da95003371de7b79" + "reference": "21c004745a32c71e03ab62effd7fbee0cf3ae7c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/85dc48d62143f4bbfaa34c24da95003371de7b79", - "reference": "85dc48d62143f4bbfaa34c24da95003371de7b79", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/21c004745a32c71e03ab62effd7fbee0cf3ae7c6", + "reference": "21c004745a32c71e03ab62effd7fbee0cf3ae7c6", "shasum": "" }, "require": { "google/auth": "^1.18", - "guzzlehttp/guzzle": "^5.3|^6.5.7|^7.4.4", - "guzzlehttp/promises": "^1.3", + "guzzlehttp/guzzle": "^6.5.8|^7.4.4", + "guzzlehttp/promises": "^1.4||^2.0", "guzzlehttp/psr7": "^1.7|^2.0", "monolog/monolog": "^1.1|^2.0|^3.0", "php": ">=7.4", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0|^2.0", "rize/uri-template": "~0.3" }, "require-dev": { "erusev/parsedown": "^1.6", "google/cloud-common-protos": "^0.4", - "google/gax": "^1.9", + "google/gax": "^1.19.1", "opis/closure": "^3", "phpdocumentor/reflection": "^5.0", "phpspec/prophecy-phpunit": "^2.0", @@ -2911,9 +2846,9 @@ ], "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", "support": { - "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.51.2" + "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.52.4" }, - "time": "2023-05-05T23:01:42+00:00" + "time": "2023-09-15T20:50:36+00:00" }, { "name": "google/cloud-storage", @@ -2971,21 +2906,21 @@ }, { "name": "google/cloud-translate", - "version": "v1.14.0", + "version": "v1.15.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-translate.git", - "reference": "f8e07aa5def686458b31ad355f232d25cbba4cd1" + "reference": "ae9f93672e8dd12d49fa75b4fdba838d622f58c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-translate/zipball/f8e07aa5def686458b31ad355f232d25cbba4cd1", - "reference": "f8e07aa5def686458b31ad355f232d25cbba4cd1", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-translate/zipball/ae9f93672e8dd12d49fa75b4fdba838d622f58c8", + "reference": "ae9f93672e8dd12d49fa75b4fdba838d622f58c8", "shasum": "" }, "require": { "google/cloud-core": "^1.39", - "google/gax": "^1.1", + "google/gax": "^1.19.1", "php": ">=7.4" }, "require-dev": { @@ -3020,9 +2955,9 @@ ], "description": "Cloud Translation Client for PHP", "support": { - "source": "https://github.com/googleapis/google-cloud-php-translate/tree/v1.14.0" + "source": "https://github.com/googleapis/google-cloud-php-translate/tree/v1.15.1" }, - "time": "2023-06-02T23:56:27+00:00" + "time": "2023-09-15T20:50:36+00:00" }, { "name": "google/common-protos", @@ -3269,16 +3204,16 @@ }, { "name": "google/protobuf", - "version": "v3.23.2", + "version": "v3.24.3", "source": { "type": "git", "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "2349098298b847814e3af4f6452ec43c65c8c4fb" + "reference": "2fc191fc5e137829081b8700086ac6ed7003b925" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/2349098298b847814e3af4f6452ec43c65c8c4fb", - "reference": "2349098298b847814e3af4f6452ec43c65c8c4fb", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/2fc191fc5e137829081b8700086ac6ed7003b925", + "reference": "2fc191fc5e137829081b8700086ac6ed7003b925", "shasum": "" }, "require": { @@ -3307,22 +3242,22 @@ "proto" ], "support": { - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.23.2" + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.24.3" }, - "time": "2023-05-25T22:33:09+00:00" + "time": "2023-09-07T15:39:13+00:00" }, { "name": "grpc/grpc", - "version": "1.52.0", + "version": "1.57.0", "source": { "type": "git", "url": "https://github.com/grpc/grpc-php.git", - "reference": "98394cd601a587ca68294e6209bd713856969105" + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/grpc/grpc-php/zipball/98394cd601a587ca68294e6209bd713856969105", - "reference": "98394cd601a587ca68294e6209bd713856969105", + "url": "https://api.github.com/repos/grpc/grpc-php/zipball/b610c42022ed3a22f831439cb93802f2a4502fdf", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf", "shasum": "" }, "require": { @@ -3351,9 +3286,9 @@ "rpc" ], "support": { - "source": "https://github.com/grpc/grpc-php/tree/v1.52.0" + "source": "https://github.com/grpc/grpc-php/tree/v1.57.0" }, - "time": "2023-02-25T05:20:08+00:00" + "time": "2023-08-14T23:57:54+00:00" }, { "name": "guzzlehttp/guzzle", @@ -4561,26 +4496,26 @@ }, { "name": "league/mime-type-detection", - "version": "1.11.0", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/a6dfb1194a2946fcdc1f38219445234f65b35c96", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96", "shasum": "" }, "require": { "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3" + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { @@ -4601,7 +4536,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.13.0" }, "funding": [ { @@ -4613,7 +4548,7 @@ "type": "tidelift" } ], - "time": "2022-04-17T13:12:02+00:00" + "time": "2023-08-05T12:09:49+00:00" }, { "name": "league/oauth2-server", @@ -5091,25 +5026,25 @@ }, { "name": "mtdowling/jmespath.php", - "version": "2.6.1", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", - "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0 || ^8.0", + "php": "^7.2.5 || ^8.0", "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "composer/xdebug-handler": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^7.5.15" + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" }, "bin": [ "bin/jp.php" @@ -5117,7 +5052,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { @@ -5133,6 +5068,11 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", @@ -5146,9 +5086,9 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" + "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" }, - "time": "2021-06-14T00:11:39+00:00" + "time": "2023-08-25T10:54:48+00:00" }, { "name": "myclabs/deep-copy", @@ -5211,16 +5151,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.5", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e", - "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -5261,9 +5201,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.5" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-05-19T20:20:00+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "nyholm/psr7", @@ -5819,6 +5759,140 @@ "abandoned": true, "time": "2020-10-14T08:39:05+00:00" }, + { + "name": "php-http/discovery", + "version": "1.19.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/57f3de01d32085fea20865f9b16fb0e69347c39e", + "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "symfony/phpunit-bridge": "^6.2" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.19.1" + }, + "time": "2023-07-11T07:02:26+00:00" + }, + { + "name": "php-http/multipart-stream-builder", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/multipart-stream-builder.git", + "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/f5938fd135d9fa442cc297dc98481805acfe2b6a", + "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/discovery": "^1.15", + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "nyholm/psr7": "^1.0", + "php-http/message": "^1.5", + "php-http/message-factory": "^1.0.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Message\\MultipartStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "A builder class that help you create a multipart stream", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "multipart stream", + "stream" + ], + "support": { + "issues": "https://github.com/php-http/multipart-stream-builder/issues", + "source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.0" + }, + "time": "2023-04-28T14:10:22+00:00" + }, { "name": "phpcompatibility/php-compatibility", "version": "9.3.5", @@ -5942,16 +6016,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", + "version": "9.2.28", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "7134a5ccaaf0f1c92a4f5501a6c9f98ac4dcc0ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7134a5ccaaf0f1c92a4f5501a6c9f98ac4dcc0ef", + "reference": "7134a5ccaaf0f1c92a4f5501a6c9f98ac4dcc0ef", "shasum": "" }, "require": { @@ -6007,7 +6081,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.28" }, "funding": [ { @@ -6015,7 +6090,7 @@ "type": "github" } ], - "time": "2023-03-06T12:58:08+00:00" + "time": "2023-09-12T14:36:20+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6260,16 +6335,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.8", + "version": "9.6.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e" + "reference": "a122c2ebd469b751d774aa0f613dc0d67697653f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/17d621b3aff84d0c8b62539e269e87d8d5baa76e", - "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a122c2ebd469b751d774aa0f613dc0d67697653f", + "reference": "a122c2ebd469b751d774aa0f613dc0d67697653f", "shasum": "" }, "require": { @@ -6284,7 +6359,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -6343,7 +6418,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.8" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.12" }, "funding": [ { @@ -6359,7 +6434,7 @@ "type": "tidelift" } ], - "time": "2023-05-11T05:14:45+00:00" + "time": "2023-09-12T14:39:31+00:00" }, { "name": "psr/cache", @@ -7291,16 +7366,16 @@ }, { "name": "sanmai/pipeline", - "version": "v6.7", + "version": "v6.8.1", "source": { "type": "git", "url": "https://github.com/sanmai/pipeline.git", - "reference": "0e5c45c8046298212347a0bfb659126af8e75d2e" + "reference": "2e88e466dd49f20c10a15330b3953d4d49c326e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sanmai/pipeline/zipball/0e5c45c8046298212347a0bfb659126af8e75d2e", - "reference": "0e5c45c8046298212347a0bfb659126af8e75d2e", + "url": "https://api.github.com/repos/sanmai/pipeline/zipball/2e88e466dd49f20c10a15330b3953d4d49c326e3", + "reference": "2e88e466dd49f20c10a15330b3953d4d49c326e3", "shasum": "" }, "require": { @@ -7308,7 +7383,7 @@ }, "require-dev": { "ergebnis/composer-normalize": "^2.8", - "friendsofphp/php-cs-fixer": "^3", + "friendsofphp/php-cs-fixer": "^3.17", "infection/infection": ">=0.10.5", "league/pipeline": "^0.3 || ^1.0", "phan/phan": ">=1.1", @@ -7344,7 +7419,7 @@ "description": "General-purpose collections pipeline", "support": { "issues": "https://github.com/sanmai/pipeline/issues", - "source": "https://github.com/sanmai/pipeline/tree/v6.7" + "source": "https://github.com/sanmai/pipeline/tree/v6.8.1" }, "funding": [ { @@ -7352,7 +7427,7 @@ "type": "github" } ], - "time": "2023-04-29T11:21:51+00:00" + "time": "2023-06-15T09:14:47+00:00" }, { "name": "scssphp/scssphp", @@ -7940,16 +8015,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -7992,7 +8067,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -8000,7 +8075,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -9302,16 +9377,16 @@ }, { "name": "symfony/amqp-messenger", - "version": "v5.4.22", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/amqp-messenger.git", - "reference": "6343af983ba7460f7ea984aacb95d1ed382f6e40" + "reference": "24e5cc90da041e0e1b7bbe15b82ad7f27a508c01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/6343af983ba7460f7ea984aacb95d1ed382f6e40", - "reference": "6343af983ba7460f7ea984aacb95d1ed382f6e40", + "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/24e5cc90da041e0e1b7bbe15b82ad7f27a508c01", + "reference": "24e5cc90da041e0e1b7bbe15b82ad7f27a508c01", "shasum": "" }, "require": { @@ -9351,7 +9426,7 @@ "description": "Symfony AMQP extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.22" + "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.28" }, "funding": [ { @@ -9367,7 +9442,7 @@ "type": "tidelift" } ], - "time": "2023-03-10T09:58:14+00:00" + "time": "2023-08-09T17:16:27+00:00" }, { "name": "symfony/asset", @@ -9445,16 +9520,16 @@ }, { "name": "symfony/cache", - "version": "v5.4.23", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "983c79ff28612cdfd66d8e44e1a06e5afc87e107" + "reference": "62b7ae3bccc5b474a30fadc7ef6bbc362007d3f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/983c79ff28612cdfd66d8e44e1a06e5afc87e107", - "reference": "983c79ff28612cdfd66d8e44e1a06e5afc87e107", + "url": "https://api.github.com/repos/symfony/cache/zipball/62b7ae3bccc5b474a30fadc7ef6bbc362007d3f9", + "reference": "62b7ae3bccc5b474a30fadc7ef6bbc362007d3f9", "shasum": "" }, "require": { @@ -9522,7 +9597,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.23" + "source": "https://github.com/symfony/cache/tree/v5.4.28" }, "funding": [ { @@ -9538,7 +9613,7 @@ "type": "tidelift" } ], - "time": "2023-04-21T15:38:51+00:00" + "time": "2023-08-05T08:32:42+00:00" }, { "name": "symfony/cache-contracts", @@ -9621,16 +9696,16 @@ }, { "name": "symfony/config", - "version": "v5.4.21", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "2a6b1111d038adfa15d52c0871e540f3b352d1e4" + "reference": "8109892f27beed9252bd1f1c1880aeb4ad842650" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/2a6b1111d038adfa15d52c0871e540f3b352d1e4", - "reference": "2a6b1111d038adfa15d52c0871e540f3b352d1e4", + "url": "https://api.github.com/repos/symfony/config/zipball/8109892f27beed9252bd1f1c1880aeb4ad842650", + "reference": "8109892f27beed9252bd1f1c1880aeb4ad842650", "shasum": "" }, "require": { @@ -9680,7 +9755,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/v5.4.21" + "source": "https://github.com/symfony/config/tree/v5.4.26" }, "funding": [ { @@ -9696,20 +9771,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2023-07-19T20:21:11+00:00" }, { "name": "symfony/console", - "version": "v5.4.24", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8" + "reference": "f4f71842f24c2023b91237c72a365306f3c58827" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8", - "reference": "560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8", + "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", + "reference": "f4f71842f24c2023b91237c72a365306f3c58827", "shasum": "" }, "require": { @@ -9779,7 +9854,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.24" + "source": "https://github.com/symfony/console/tree/v5.4.28" }, "funding": [ { @@ -9795,20 +9870,20 @@ "type": "tidelift" } ], - "time": "2023-05-26T05:13:16+00:00" + "time": "2023-08-07T06:12:30+00:00" }, { "name": "symfony/debug-bundle", - "version": "v5.4.21", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "8b4360bf8ce9a917ef8796c5e6065a185d8722bd" + "reference": "17c372891d4554d5d2f5cf602aef02c859ad52d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/8b4360bf8ce9a917ef8796c5e6065a185d8722bd", - "reference": "8b4360bf8ce9a917ef8796c5e6065a185d8722bd", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/17c372891d4554d5d2f5cf602aef02c859ad52d8", + "reference": "17c372891d4554d5d2f5cf602aef02c859ad52d8", "shasum": "" }, "require": { @@ -9858,7 +9933,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v5.4.21" + "source": "https://github.com/symfony/debug-bundle/tree/v5.4.26" }, "funding": [ { @@ -9874,20 +9949,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2023-07-11T21:42:03+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.24", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "4645e032d0963fb614969398ca28e47605b1a7da" + "reference": "addc22fed594f9ce04e73ef6a9d3e2416f77192d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/4645e032d0963fb614969398ca28e47605b1a7da", - "reference": "4645e032d0963fb614969398ca28e47605b1a7da", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/addc22fed594f9ce04e73ef6a9d3e2416f77192d", + "reference": "addc22fed594f9ce04e73ef6a9d3e2416f77192d", "shasum": "" }, "require": { @@ -9947,7 +10022,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/v5.4.24" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.28" }, "funding": [ { @@ -9963,7 +10038,7 @@ "type": "tidelift" } ], - "time": "2023-05-05T14:42:55+00:00" + "time": "2023-08-14T10:47:38+00:00" }, { "name": "symfony/deprecation-contracts", @@ -10034,16 +10109,16 @@ }, { "name": "symfony/doctrine-messenger", - "version": "v5.4.23", + "version": "v5.4.25", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "1667cc4d3b2741ada859f76743d25936d3617909" + "reference": "96bd1e093bfa8587205f4413193545c6685d7cd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/1667cc4d3b2741ada859f76743d25936d3617909", - "reference": "1667cc4d3b2741ada859f76743d25936d3617909", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/96bd1e093bfa8587205f4413193545c6685d7cd6", + "reference": "96bd1e093bfa8587205f4413193545c6685d7cd6", "shasum": "" }, "require": { @@ -10087,7 +10162,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.23" + "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.25" }, "funding": [ { @@ -10103,7 +10178,7 @@ "type": "tidelift" } ], - "time": "2023-04-18T08:26:30+00:00" + "time": "2023-06-22T08:06:06+00:00" }, { "name": "symfony/dotenv", @@ -10178,16 +10253,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.4.24", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c1b9be3b8a6f60f720bec28c4ffb6fb5b00a8946" + "reference": "b26719213a39c9ba57520cbc5e52bfcc5e8d92f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c1b9be3b8a6f60f720bec28c4ffb6fb5b00a8946", - "reference": "c1b9be3b8a6f60f720bec28c4ffb6fb5b00a8946", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/b26719213a39c9ba57520cbc5e52bfcc5e8d92f9", + "reference": "b26719213a39c9ba57520cbc5e52bfcc5e8d92f9", "shasum": "" }, "require": { @@ -10229,7 +10304,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.24" + "source": "https://github.com/symfony/error-handler/tree/v5.4.26" }, "funding": [ { @@ -10245,20 +10320,20 @@ "type": "tidelift" } ], - "time": "2023-05-02T16:13:31+00:00" + "time": "2023-07-16T16:48:57+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.22", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "1df20e45d56da29a4b1d8259dd6e950acbf1b13f" + "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1df20e45d56da29a4b1d8259dd6e950acbf1b13f", - "reference": "1df20e45d56da29a4b1d8259dd6e950acbf1b13f", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5dcc00e03413f05c1e7900090927bb7247cb0aac", + "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac", "shasum": "" }, "require": { @@ -10314,7 +10389,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.22" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.26" }, "funding": [ { @@ -10330,7 +10405,7 @@ "type": "tidelift" } ], - "time": "2023-03-17T11:31:58+00:00" + "time": "2023-07-06T06:34:20+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -10413,16 +10488,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.23", + "version": "v5.4.25", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5" + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5", - "reference": "b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", "shasum": "" }, "require": { @@ -10457,7 +10532,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.23" + "source": "https://github.com/symfony/filesystem/tree/v5.4.25" }, "funding": [ { @@ -10473,20 +10548,20 @@ "type": "tidelift" } ], - "time": "2023-03-02T11:38:35+00:00" + "time": "2023-05-31T13:04:02+00:00" }, { "name": "symfony/finder", - "version": "v5.4.21", + "version": "v5.4.27", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", + "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", "shasum": "" }, "require": { @@ -10520,7 +10595,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.21" + "source": "https://github.com/symfony/finder/tree/v5.4.27" }, "funding": [ { @@ -10536,20 +10611,20 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:33:00+00:00" + "time": "2023-07-31T08:02:31+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.4.24", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "c06a56a47817d29318aaace1c655cbde16c998e8" + "reference": "b84ebb25405c7334976b5791bfbbe0e50f4e472c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c06a56a47817d29318aaace1c655cbde16c998e8", - "reference": "c06a56a47817d29318aaace1c655cbde16c998e8", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/b84ebb25405c7334976b5791bfbbe0e50f4e472c", + "reference": "b84ebb25405c7334976b5791bfbbe0e50f4e472c", "shasum": "" }, "require": { @@ -10595,7 +10670,7 @@ "symfony/translation": "<5.3", "symfony/twig-bridge": "<4.4", "symfony/twig-bundle": "<4.4", - "symfony/validator": "<5.2", + "symfony/validator": "<5.3.11", "symfony/web-profiler-bundle": "<4.4", "symfony/workflow": "<5.2" }, @@ -10628,7 +10703,7 @@ "symfony/string": "^5.0|^6.0", "symfony/translation": "^5.3|^6.0", "symfony/twig-bundle": "^4.4|^5.0|^6.0", - "symfony/validator": "^5.2|^6.0", + "symfony/validator": "^5.3.11|^6.0", "symfony/web-link": "^4.4|^5.0|^6.0", "symfony/workflow": "^5.2|^6.0", "symfony/yaml": "^4.4|^5.0|^6.0", @@ -10670,7 +10745,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/v5.4.24" + "source": "https://github.com/symfony/framework-bundle/tree/v5.4.28" }, "funding": [ { @@ -10686,20 +10761,20 @@ "type": "tidelift" } ], - "time": "2023-05-25T13:05:00+00:00" + "time": "2023-08-08T11:21:07+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.24", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "3c59f97f6249ce552a44f01b93bfcbd786a954f5" + "reference": "365992c83a836dfe635f1e903ccca43ee03d3dd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3c59f97f6249ce552a44f01b93bfcbd786a954f5", - "reference": "3c59f97f6249ce552a44f01b93bfcbd786a954f5", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/365992c83a836dfe635f1e903ccca43ee03d3dd2", + "reference": "365992c83a836dfe635f1e903ccca43ee03d3dd2", "shasum": "" }, "require": { @@ -10746,7 +10821,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.24" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.28" }, "funding": [ { @@ -10762,20 +10837,20 @@ "type": "tidelift" } ], - "time": "2023-05-19T07:21:23+00:00" + "time": "2023-08-21T07:23:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.24", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f38b722e1557eb3f487d351b48f5a1279b50e9d1" + "reference": "127a2322ca1828157901092518b8ea8e4e1109d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f38b722e1557eb3f487d351b48f5a1279b50e9d1", - "reference": "f38b722e1557eb3f487d351b48f5a1279b50e9d1", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/127a2322ca1828157901092518b8ea8e4e1109d4", + "reference": "127a2322ca1828157901092518b8ea8e4e1109d4", "shasum": "" }, "require": { @@ -10858,7 +10933,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/v5.4.24" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.28" }, "funding": [ { @@ -10874,7 +10949,7 @@ "type": "tidelift" } ], - "time": "2023-05-27T08:06:30+00:00" + "time": "2023-08-26T13:47:51+00:00" }, { "name": "symfony/inflector", @@ -10951,16 +11026,16 @@ }, { "name": "symfony/intl", - "version": "v5.4.23", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "962789bbc76c82c266623321ffc24416f574b636" + "reference": "c26c40b64ecdc056810e294ea67ac5b34182cd69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/962789bbc76c82c266623321ffc24416f574b636", - "reference": "962789bbc76c82c266623321ffc24416f574b636", + "url": "https://api.github.com/repos/symfony/intl/zipball/c26c40b64ecdc056810e294ea67ac5b34182cd69", + "reference": "c26c40b64ecdc056810e294ea67ac5b34182cd69", "shasum": "" }, "require": { @@ -10969,7 +11044,8 @@ "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "symfony/filesystem": "^4.4|^5.0|^6.0" + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -11019,7 +11095,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v5.4.23" + "source": "https://github.com/symfony/intl/tree/v5.4.26" }, "funding": [ { @@ -11035,20 +11111,20 @@ "type": "tidelift" } ], - "time": "2023-04-13T10:36:25+00:00" + "time": "2023-07-13T09:02:54+00:00" }, { "name": "symfony/lock", - "version": "v5.4.22", + "version": "v5.4.25", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "cc0565235e16ef403097fbd30eba59690bee6b3c" + "reference": "ed4055b2e03c8893ce2d0042c8f0e0707be8e179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/cc0565235e16ef403097fbd30eba59690bee6b3c", - "reference": "cc0565235e16ef403097fbd30eba59690bee6b3c", + "url": "https://api.github.com/repos/symfony/lock/zipball/ed4055b2e03c8893ce2d0042c8f0e0707be8e179", + "reference": "ed4055b2e03c8893ce2d0042c8f0e0707be8e179", "shasum": "" }, "require": { @@ -11098,7 +11174,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v5.4.22" + "source": "https://github.com/symfony/lock/tree/v5.4.25" }, "funding": [ { @@ -11114,7 +11190,7 @@ "type": "tidelift" } ], - "time": "2023-03-10T16:52:09+00:00" + "time": "2023-06-22T08:06:06+00:00" }, { "name": "symfony/mailer", @@ -11194,16 +11270,16 @@ }, { "name": "symfony/messenger", - "version": "v5.4.24", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "75e57d48758d43127377d1310970882446ec7d91" + "reference": "39b0c94ef74c3558caeb87fc480bcef6da65be82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/75e57d48758d43127377d1310970882446ec7d91", - "reference": "75e57d48758d43127377d1310970882446ec7d91", + "url": "https://api.github.com/repos/symfony/messenger/zipball/39b0c94ef74c3558caeb87fc480bcef6da65be82", + "reference": "39b0c94ef74c3558caeb87fc480bcef6da65be82", "shasum": "" }, "require": { @@ -11264,7 +11340,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v5.4.24" + "source": "https://github.com/symfony/messenger/tree/v5.4.28" }, "funding": [ { @@ -11280,20 +11356,20 @@ "type": "tidelift" } ], - "time": "2023-05-12T08:59:19+00:00" + "time": "2023-08-12T16:35:23+00:00" }, { "name": "symfony/mime", - "version": "v5.4.23", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ae0a1032a450a3abf305ee44fc55ed423fbf16e3" + "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ae0a1032a450a3abf305ee44fc55ed423fbf16e3", - "reference": "ae0a1032a450a3abf305ee44fc55ed423fbf16e3", + "url": "https://api.github.com/repos/symfony/mime/zipball/2ea06dfeee20000a319d8407cea1d47533d5a9d2", + "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2", "shasum": "" }, "require": { @@ -11308,7 +11384,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<4.4", - "symfony/serializer": "<5.4.14|>=6.0,<6.0.14|>=6.1,<6.1.6" + "symfony/serializer": "<5.4.26|>=6,<6.2.13|>=6.3,<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -11316,7 +11392,7 @@ "symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/property-access": "^4.4|^5.1|^6.0", "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.4.14|~6.0.14|^6.1.6" + "symfony/serializer": "^5.4.26|~6.2.13|^6.3.2" }, "type": "library", "autoload": { @@ -11348,7 +11424,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.23" + "source": "https://github.com/symfony/mime/tree/v5.4.26" }, "funding": [ { @@ -11364,7 +11440,7 @@ "type": "tidelift" } ], - "time": "2023-04-19T09:49:13+00:00" + "time": "2023-07-27T06:29:31+00:00" }, { "name": "symfony/monolog-bridge", @@ -11602,20 +11678,21 @@ }, { "name": "symfony/password-hasher", - "version": "v5.4.21", + "version": "v5.4.27", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "7ce4529b2b2ea7de3b6f344a1a41f58201999180" + "reference": "6dd2daf41b44384752f6b59e8ad3e56ffb81e35c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/7ce4529b2b2ea7de3b6f344a1a41f58201999180", - "reference": "7ce4529b2b2ea7de3b6f344a1a41f58201999180", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/6dd2daf41b44384752f6b59e8ad3e56ffb81e35c", + "reference": "6dd2daf41b44384752f6b59e8ad3e56ffb81e35c", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.15" }, "conflict": { @@ -11655,7 +11732,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v5.4.21" + "source": "https://github.com/symfony/password-hasher/tree/v5.4.27" }, "funding": [ { @@ -11671,20 +11748,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2023-07-28T14:44:35+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -11699,7 +11776,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -11737,7 +11814,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -11753,20 +11830,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -11778,7 +11855,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -11818,7 +11895,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -11834,20 +11911,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", "shasum": "" }, "require": { @@ -11861,7 +11938,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -11905,7 +11982,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" }, "funding": [ { @@ -11921,20 +11998,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:30:37+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -11946,7 +12023,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -11989,7 +12066,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -12005,20 +12082,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -12033,7 +12110,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -12072,7 +12149,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -12088,7 +12165,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php70", @@ -12160,16 +12237,16 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", "shasum": "" }, "require": { @@ -12178,7 +12255,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -12216,7 +12293,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" }, "funding": [ { @@ -12232,20 +12309,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "shasum": "" }, "require": { @@ -12254,7 +12331,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -12295,7 +12372,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" }, "funding": [ { @@ -12311,7 +12388,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", @@ -12477,16 +12554,16 @@ }, { "name": "symfony/process", - "version": "v5.4.24", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "e3c46cc5689c8782944274bb30702106ecbe3b64" + "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/e3c46cc5689c8782944274bb30702106ecbe3b64", - "reference": "e3c46cc5689c8782944274bb30702106ecbe3b64", + "url": "https://api.github.com/repos/symfony/process/zipball/45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", "shasum": "" }, "require": { @@ -12519,7 +12596,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.24" + "source": "https://github.com/symfony/process/tree/v5.4.28" }, "funding": [ { @@ -12535,20 +12612,20 @@ "type": "tidelift" } ], - "time": "2023-05-17T11:26:05+00:00" + "time": "2023-08-07T10:36:04+00:00" }, { "name": "symfony/property-access", - "version": "v5.4.22", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "ffee082889586b5718347b291e04071f4d07b38f" + "reference": "0249e46f69e92049a488f39fcf531cb42c50caaa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/ffee082889586b5718347b291e04071f4d07b38f", - "reference": "ffee082889586b5718347b291e04071f4d07b38f", + "url": "https://api.github.com/repos/symfony/property-access/zipball/0249e46f69e92049a488f39fcf531cb42c50caaa", + "reference": "0249e46f69e92049a488f39fcf531cb42c50caaa", "shasum": "" }, "require": { @@ -12600,7 +12677,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.4.22" + "source": "https://github.com/symfony/property-access/tree/v5.4.26" }, "funding": [ { @@ -12616,7 +12693,7 @@ "type": "tidelift" } ], - "time": "2023-03-14T14:59:20+00:00" + "time": "2023-07-13T15:20:41+00:00" }, { "name": "symfony/property-info", @@ -12866,16 +12943,16 @@ }, { "name": "symfony/rate-limiter", - "version": "v5.4.21", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "342acb2d23f6012f6150e7a8b167bf9cd931c0f8" + "reference": "189c8aa18be55c734d56d8ea8b0d1862e9a0e493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/342acb2d23f6012f6150e7a8b167bf9cd931c0f8", - "reference": "342acb2d23f6012f6150e7a8b167bf9cd931c0f8", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/189c8aa18be55c734d56d8ea8b0d1862e9a0e493", + "reference": "189c8aa18be55c734d56d8ea8b0d1862e9a0e493", "shasum": "" }, "require": { @@ -12916,7 +12993,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v5.4.21" + "source": "https://github.com/symfony/rate-limiter/tree/v5.4.26" }, "funding": [ { @@ -12932,20 +13009,20 @@ "type": "tidelift" } ], - "time": "2023-02-21T19:46:44+00:00" + "time": "2023-07-10T11:10:11+00:00" }, { "name": "symfony/redis-messenger", - "version": "v5.4.23", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/redis-messenger.git", - "reference": "d9c0a6d7e3e925817f1ce7ec7416cc0e29b331e1" + "reference": "55258642bca0d1869d147c85ee3277305549d5a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/d9c0a6d7e3e925817f1ce7ec7416cc0e29b331e1", - "reference": "d9c0a6d7e3e925817f1ce7ec7416cc0e29b331e1", + "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/55258642bca0d1869d147c85ee3277305549d5a3", + "reference": "55258642bca0d1869d147c85ee3277305549d5a3", "shasum": "" }, "require": { @@ -12983,7 +13060,7 @@ "description": "Symfony Redis extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/redis-messenger/tree/v5.4.23" + "source": "https://github.com/symfony/redis-messenger/tree/v5.4.26" }, "funding": [ { @@ -12999,20 +13076,20 @@ "type": "tidelift" } ], - "time": "2023-04-18T09:57:31+00:00" + "time": "2023-07-19T20:11:33+00:00" }, { "name": "symfony/routing", - "version": "v5.4.22", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "c2ac11eb34947999b7c38fb4c835a57306907e6d" + "reference": "853fc7df96befc468692de0a48831b38f04d2cb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/c2ac11eb34947999b7c38fb4c835a57306907e6d", - "reference": "c2ac11eb34947999b7c38fb4c835a57306907e6d", + "url": "https://api.github.com/repos/symfony/routing/zipball/853fc7df96befc468692de0a48831b38f04d2cb2", + "reference": "853fc7df96befc468692de0a48831b38f04d2cb2", "shasum": "" }, "require": { @@ -13073,7 +13150,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.22" + "source": "https://github.com/symfony/routing/tree/v5.4.26" }, "funding": [ { @@ -13089,7 +13166,7 @@ "type": "tidelift" } ], - "time": "2023-03-14T14:59:20+00:00" + "time": "2023-07-24T13:28:37+00:00" }, { "name": "symfony/security-core", @@ -13186,20 +13263,21 @@ }, { "name": "symfony/security-csrf", - "version": "v5.4.21", + "version": "v5.4.27", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "776a538e5f20fb560a182f790979c71455694203" + "reference": "995fcfcc5a3be09df157b4960668f61cceb86611" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/776a538e5f20fb560a182f790979c71455694203", - "reference": "776a538e5f20fb560a182f790979c71455694203", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/995fcfcc5a3be09df157b4960668f61cceb86611", + "reference": "995fcfcc5a3be09df157b4960668f61cceb86611", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16", "symfony/security-core": "^4.4|^5.0|^6.0" }, @@ -13238,7 +13316,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v5.4.21" + "source": "https://github.com/symfony/security-csrf/tree/v5.4.27" }, "funding": [ { @@ -13254,20 +13332,20 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:33:00+00:00" + "time": "2023-07-28T14:44:35+00:00" }, { "name": "symfony/serializer", - "version": "v5.4.24", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "12535bb7b1d3b53802bf18d61a98bb1145fabcdb" + "reference": "701e2b8d48a3a627ffe128b38fbe6c4cf3ddcb3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/12535bb7b1d3b53802bf18d61a98bb1145fabcdb", - "reference": "12535bb7b1d3b53802bf18d61a98bb1145fabcdb", + "url": "https://api.github.com/repos/symfony/serializer/zipball/701e2b8d48a3a627ffe128b38fbe6c4cf3ddcb3c", + "reference": "701e2b8d48a3a627ffe128b38fbe6c4cf3ddcb3c", "shasum": "" }, "require": { @@ -13282,7 +13360,7 @@ "phpdocumentor/type-resolver": "<1.4.0", "symfony/dependency-injection": "<4.4", "symfony/property-access": "<5.4", - "symfony/property-info": "<5.3.13", + "symfony/property-info": "<5.4.24|>=6,<6.2.11", "symfony/uid": "<5.3", "symfony/yaml": "<4.4" }, @@ -13299,7 +13377,7 @@ "symfony/http-kernel": "^4.4|^5.0|^6.0", "symfony/mime": "^4.4|^5.0|^6.0", "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.3.13|^6.0", + "symfony/property-info": "^5.4.24|^6.2.11", "symfony/uid": "^5.3|^6.0", "symfony/validator": "^4.4|^5.0|^6.0", "symfony/var-dumper": "^4.4|^5.0|^6.0", @@ -13341,7 +13419,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/v5.4.24" + "source": "https://github.com/symfony/serializer/tree/v5.4.28" }, "funding": [ { @@ -13357,7 +13435,7 @@ "type": "tidelift" } ], - "time": "2023-05-12T08:37:35+00:00" + "time": "2023-08-24T14:14:18+00:00" }, { "name": "symfony/service-contracts", @@ -13502,16 +13580,16 @@ }, { "name": "symfony/string", - "version": "v5.4.22", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "8036a4c76c0dd29e60b6a7cafcacc50cf088ea62" + "reference": "1181fe9270e373537475e826873b5867b863883c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/8036a4c76c0dd29e60b6a7cafcacc50cf088ea62", - "reference": "8036a4c76c0dd29e60b6a7cafcacc50cf088ea62", + "url": "https://api.github.com/repos/symfony/string/zipball/1181fe9270e373537475e826873b5867b863883c", + "reference": "1181fe9270e373537475e826873b5867b863883c", "shasum": "" }, "require": { @@ -13568,7 +13646,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.22" + "source": "https://github.com/symfony/string/tree/v5.4.26" }, "funding": [ { @@ -13584,7 +13662,7 @@ "type": "tidelift" } ], - "time": "2023-03-14T06:11:53+00:00" + "time": "2023-06-28T12:46:07+00:00" }, { "name": "symfony/translation", @@ -13763,16 +13841,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v5.4.22", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "e5b174464f68be6876046db3ad6e217d9a7dbbac" + "reference": "832461a5f556df7933fd82e75b097d76182c640b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e5b174464f68be6876046db3ad6e217d9a7dbbac", - "reference": "e5b174464f68be6876046db3ad6e217d9a7dbbac", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/832461a5f556df7933fd82e75b097d76182c640b", + "reference": "832461a5f556df7933fd82e75b097d76182c640b", "shasum": "" }, "require": { @@ -13864,7 +13942,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v5.4.22" + "source": "https://github.com/symfony/twig-bridge/tree/v5.4.26" }, "funding": [ { @@ -13880,25 +13958,26 @@ "type": "tidelift" } ], - "time": "2023-03-31T08:28:44+00:00" + "time": "2023-07-20T16:28:53+00:00" }, { "name": "symfony/twig-bundle", - "version": "v5.4.21", + "version": "v5.4.27", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "875d0edfc8df7505c1993419882c4071fc28c477" + "reference": "a16996ad54d75e220e91a0c7517437ad592eccca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/875d0edfc8df7505c1993419882c4071fc28c477", - "reference": "875d0edfc8df7505c1993419882c4071fc28c477", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/a16996ad54d75e220e91a0c7517437ad592eccca", + "reference": "a16996ad54d75e220e91a0c7517437ad592eccca", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/config": "^4.4|^5.0|^6.0", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/http-foundation": "^4.4|^5.0|^6.0", "symfony/http-kernel": "^5.0|^6.0", "symfony/polyfill-ctype": "~1.8", @@ -13953,7 +14032,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/v5.4.21" + "source": "https://github.com/symfony/twig-bundle/tree/v5.4.27" }, "funding": [ { @@ -13969,20 +14048,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2023-07-28T14:44:35+00:00" }, { "name": "symfony/validator", - "version": "v5.4.24", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "47794a3cb530e01593ecad9856ba80f5c011e36b" + "reference": "0acdcb86a8fc5ffd71c3b060184d2ed20a76a2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/47794a3cb530e01593ecad9856ba80f5c011e36b", - "reference": "47794a3cb530e01593ecad9856ba80f5c011e36b", + "url": "https://api.github.com/repos/symfony/validator/zipball/0acdcb86a8fc5ffd71c3b060184d2ed20a76a2c9", + "reference": "0acdcb86a8fc5ffd71c3b060184d2ed20a76a2c9", "shasum": "" }, "require": { @@ -14065,7 +14144,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v5.4.24" + "source": "https://github.com/symfony/validator/tree/v5.4.28" }, "funding": [ { @@ -14081,20 +14160,20 @@ "type": "tidelift" } ], - "time": "2023-05-25T13:05:00+00:00" + "time": "2023-08-14T13:04:17+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.4.24", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "8e12706bf9c68a2da633f23bfdc15b4dce5970b3" + "reference": "684b36ff415e1381d4a943c3ca2502cd2debad73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/8e12706bf9c68a2da633f23bfdc15b4dce5970b3", - "reference": "8e12706bf9c68a2da633f23bfdc15b4dce5970b3", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/684b36ff415e1381d4a943c3ca2502cd2debad73", + "reference": "684b36ff415e1381d4a943c3ca2502cd2debad73", "shasum": "" }, "require": { @@ -14108,6 +14187,7 @@ "require-dev": { "ext-iconv": "*", "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", "symfony/process": "^4.4|^5.0|^6.0", "symfony/uid": "^5.1|^6.0", "twig/twig": "^2.13|^3.0.4" @@ -14153,7 +14233,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.24" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.28" }, "funding": [ { @@ -14169,20 +14249,20 @@ "type": "tidelift" } ], - "time": "2023-05-25T13:05:00+00:00" + "time": "2023-08-24T13:38:36+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.4.21", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "be74908a6942fdd331554b3cec27ff41b45ccad4" + "reference": "11401fe94f960249b3c63a488c63ba73091c1e4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/be74908a6942fdd331554b3cec27ff41b45ccad4", - "reference": "be74908a6942fdd331554b3cec27ff41b45ccad4", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/11401fe94f960249b3c63a488c63ba73091c1e4a", + "reference": "11401fe94f960249b3c63a488c63ba73091c1e4a", "shasum": "" }, "require": { @@ -14226,7 +14306,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.21" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.26" }, "funding": [ { @@ -14242,7 +14322,7 @@ "type": "tidelift" } ], - "time": "2023-02-21T19:46:44+00:00" + "time": "2023-07-20T07:21:16+00:00" }, { "name": "symfony/yaml", @@ -15043,5 +15123,5 @@ "ext-curl": "*" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.2.0" } diff --git a/makefile b/makefile index 27dca0b11..900e016c9 100644 --- a/makefile +++ b/makefile @@ -47,7 +47,9 @@ clean: ## Cleans all dependencies and files rm -rf ./src/Resources/app/storefront/node_modules/* # ------------------------------------------------------ rm -rf ./src/Resources/app/storefront/dist/storefront - rm -rf ./src/Resources/public + # ------------------------------------------------------ + rm -rf ./src/Resources/public/administration + rm -rf ./src/Resources/public/molllie-payments.js build: ## Installs the plugin, and builds the artifacts using the Shopware build commands. php switch-composer.php prod diff --git a/src/Controller/Api/Webhook/WebhookControllerBase.php b/src/Controller/Api/Webhook/WebhookControllerBase.php index 86aeac87e..e40b8e591 100644 --- a/src/Controller/Api/Webhook/WebhookControllerBase.php +++ b/src/Controller/Api/Webhook/WebhookControllerBase.php @@ -7,6 +7,7 @@ use Kiener\MolliePayments\Controller\Storefront\Webhook\NotificationFacade; use Kiener\MolliePayments\Repository\Order\OrderRepository; use Kiener\MolliePayments\Repository\Order\OrderRepositoryInterface; +use Kiener\MolliePayments\Repository\OrderTransaction\OrderTransactionRepositoryInterface; use Psr\Log\LoggerInterface; use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity; use Shopware\Core\Framework\Context; @@ -39,18 +40,25 @@ class WebhookControllerBase extends AbstractController */ private $logger; + /** + * @var OrderTransactionRepositoryInterface + */ + private $repoOrderTransactions; + /** * @param NotificationFacade $notificationFacade * @param SubscriptionManager $subscriptions * @param OrderRepositoryInterface $repoOrders + * @param OrderTransactionRepositoryInterface $repoOrderTransactions * @param LoggerInterface $logger */ - public function __construct(NotificationFacade $notificationFacade, SubscriptionManager $subscriptions, OrderRepositoryInterface $repoOrders, LoggerInterface $logger) + public function __construct(NotificationFacade $notificationFacade, SubscriptionManager $subscriptions, OrderRepositoryInterface $repoOrders, OrderTransactionRepositoryInterface $repoOrderTransactions, LoggerInterface $logger) { $this->notificationFacade = $notificationFacade; $this->subscriptions = $subscriptions; $this->repoOrders = $repoOrders; + $this->repoOrderTransactions = $repoOrderTransactions; $this->logger = $logger; } @@ -151,8 +159,7 @@ public function webhookSubscriptionAction(string $swSubscriptionId, Request $req } # now lets grab the latest order transaction of our new order - /** @var OrderTransactionEntity $latestTransaction */ - $latestTransaction = $this->notificationFacade->getOrderTransactions($swOrder->getId(), $context)->last(); + $latestTransaction = $this->repoOrderTransactions->getLatestOrderTransaction($swOrder->getId(), $context); # now simply redirect to the official webhook # that handles the full order, validates the payment and diff --git a/src/Controller/StoreApi/POS/PosControllerBase.php b/src/Controller/StoreApi/POS/PosControllerBase.php new file mode 100644 index 000000000..72649d14b --- /dev/null +++ b/src/Controller/StoreApi/POS/PosControllerBase.php @@ -0,0 +1,89 @@ +customerService = $customerService; + $this->mollieGateway = $mollieGateway; + } + + + /** + * @Route("/store-api/mollie/pos/terminals", name="store-api.mollie.pos.terminals", methods={"GET"}) + * + * @param SalesChannelContext $context + * @return StoreApiResponse + */ + public function getIssuers(SalesChannelContext $context): StoreApiResponse + { + $this->mollieGateway->switchClient($context->getSalesChannelId()); + + $terminalsArray = []; + + $terminals = $this->mollieGateway->getPosTerminals(); + + foreach ($terminals as $terminal) { + $terminalsArray[] = [ + 'id' => $terminal->id, + 'name' => $terminal->description, + ]; + } + + return new TerminalsResponse($terminalsArray); + } + + /** + * @Route("/store-api/mollie/pos/store-terminal/{customerId}/{terminalID}", name="store-api.mollie.pos.store-terminal", methods={"POST"}) + * + * @param string $customerId + * @param string $terminalID + * @param SalesChannelContext $context + * @throws \Exception + * @return StoreApiResponse + */ + public function saveTerminalId(string $customerId, string $terminalID, SalesChannelContext $context): StoreApiResponse + { + $customer = $this->customerService->getCustomer($customerId, $context->getContext()); + + if (!$customer instanceof CustomerEntity) { + throw new \Exception('Customer with ID ' . $customerId . ' not found in Shopware'); + } + + $result = $this->customerService->setPosTerminal( + $customer, + $terminalID, + $context->getContext() + ); + + return new StoreTerminalResponse($result !== null); + } +} diff --git a/src/Controller/StoreApi/POS/Response/StoreTerminalResponse.php b/src/Controller/StoreApi/POS/Response/StoreTerminalResponse.php new file mode 100644 index 000000000..d0841362a --- /dev/null +++ b/src/Controller/StoreApi/POS/Response/StoreTerminalResponse.php @@ -0,0 +1,29 @@ + + */ + protected $object; + + /** + * @param bool $success + */ + public function __construct(bool $success) + { + $this->object = new ArrayStruct( + [ + 'success' => $success, + ], + 'mollie_payments_pos_terminal_stored' + ); + + parent::__construct($this->object); + } +} diff --git a/src/Controller/StoreApi/POS/Response/TerminalsResponse.php b/src/Controller/StoreApi/POS/Response/TerminalsResponse.php new file mode 100644 index 000000000..88925b81a --- /dev/null +++ b/src/Controller/StoreApi/POS/Response/TerminalsResponse.php @@ -0,0 +1,30 @@ + + */ + protected $object; + + + /** + * @param array $terminals + */ + public function __construct(array $terminals) + { + $this->object = new ArrayStruct( + [ + 'terminals' => $terminals, + ], + 'mollie_payments_pos_terminals' + ); + + parent::__construct($this->object); + } +} diff --git a/src/Controller/StoreApi/POS/Sw6/PosController.php b/src/Controller/StoreApi/POS/Sw6/PosController.php new file mode 100644 index 000000000..850f6e02b --- /dev/null +++ b/src/Controller/StoreApi/POS/Sw6/PosController.php @@ -0,0 +1,13 @@ + $issuers + * @param array $terminals */ - public function __construct(array $issuers) + public function __construct(array $terminals) { $this->object = new ArrayStruct( [ - 'issuers' => $issuers, + 'issuers' => $terminals, ], 'mollie_payments_ideal_issuers' ); diff --git a/src/Controller/Storefront/POS/PosControllerBase.php b/src/Controller/Storefront/POS/PosControllerBase.php new file mode 100644 index 000000000..3a3500935 --- /dev/null +++ b/src/Controller/Storefront/POS/PosControllerBase.php @@ -0,0 +1,177 @@ +customerService = $customerService; + $this->mollieGateway = $mollieGateway; + $this->router = $router; + $this->statusUpdater = $orderStatusUpdater; + $this->statusConverter = $statusConverter; + $this->repoTransactions = $repoTransactions; + } + + /** + * @Route("/mollie/pos/store-terminal/{customerId}/{terminalId}", name="frontend.mollie.pos.storeTerminal", options={"seo"="false"}, methods={"GET"}) + * + * @param SalesChannelContext $context + * @param string $customerId + * @param string $terminalId + * @return JsonResponse + */ + public function storeTerminal(SalesChannelContext $context, string $customerId, string $terminalId): JsonResponse + { + $result = null; + + $customer = $this->customerService->getCustomer($customerId, $context->getContext()); + + if ($customer instanceof CustomerEntity) { + $writtenEvent = $this->customerService->setPosTerminal( + $customer, + $terminalId, + $context->getContext() + ); + + $result = $writtenEvent->getErrors(); + } + + return new JsonResponse([ + 'success' => (bool)$result, + 'customerId' => $customerId, + 'result' => $result, + ]); + } + + /** + * @Route("/mollie/pos/checkout", name="frontend.mollie.pos.checkout", options={"seo"="false"}, methods={"GET"}) + * + * @param Request $request + * @param SalesChannelContext $salesChannelContext + * @return Response + */ + public function checkoutAction(Request $request, SalesChannelContext $salesChannelContext): Response + { + $orderId = $request->get('sw'); + $mollieId = $request->get('mo'); + $changeStatusUrl = (string)$request->get('cs'); + + $params = [ + 'swOrderId' => $orderId, + 'molliePaymentId' => $mollieId, + ]; + + if (!empty($changeStatusUrl)) { + $params['changeStatusUrl'] = $changeStatusUrl; + } + + return $this->renderStorefront('@Storefront/mollie/pos/checkout.html.twig', $params); + } + + /** + * @Route("/mollie/pos/{orderId}/{molliePaymentId}/status", name="frontend.mollie.pos.checkout_status", options={"seo"="false"}, methods={"GET"}) + * + * @param SalesChannelContext $context + * @param string $orderId + * @param string $molliePaymentId + * @return JsonResponse + */ + public function statusAction(SalesChannelContext $context, string $orderId, string $molliePaymentId): JsonResponse + { + $this->mollieGateway->switchClient($context->getSalesChannelId()); + + $molliePayment = $this->mollieGateway->getPayment($molliePaymentId); + + $ready = false; + + $status = $this->statusConverter->getMolliePaymentStatus($molliePayment); + + if ($status !== MolliePaymentStatus::MOLLIE_PAYMENT_OPEN) { + $ready = true; + } + + $url = ''; + + if ($ready) { + if (MolliePaymentStatus::isApprovedStatus($molliePayment->status)) { + $url = $this->getCheckoutFinishPage($orderId, $this->router); + } else { + $url = $this->getEditOrderPage($orderId, $this->router); + } + + $latestTransaction = $this->repoTransactions->getLatestOrderTransaction($orderId, $context->getContext()); + + $this->statusUpdater->updatePaymentStatus( + $latestTransaction, + $status, + $context->getContext() + ); + } + + $isSuccess = MolliePaymentStatus::isApprovedStatus($molliePayment->status); + + return new JsonResponse([ + 'ready' => $ready, + 'redirectUrl' => $url, + 'success' => $isSuccess + ]); + } +} diff --git a/src/Controller/Storefront/POS/Sw6/PosController.php b/src/Controller/Storefront/POS/Sw6/PosController.php new file mode 100644 index 000000000..aa46ec5c4 --- /dev/null +++ b/src/Controller/Storefront/POS/Sw6/PosController.php @@ -0,0 +1,15 @@ +getOrderTransactions($swOrder->getId(), $context)->last(); + $swTransaction = $this->repoOrderTransactions->getLatestOrderTransaction($swOrder->getId(), $context); # verify if the customer really paid with Mollie in the end $paymentMethod = $swTransaction->getPaymentMethod(); + + if (!$paymentMethod instanceof PaymentMethodEntity) { + throw new \Exception('Transaction ' . $swTransactionId . ' has no payment method!'); + } + $paymentMethodAttributes = new PaymentMethodAttributes($paymentMethod); if (!$paymentMethodAttributes->isMolliePayment()) { @@ -295,26 +300,6 @@ private function getTransaction(string $transactionId, Context $context): ?Order return $this->repoOrderTransactions->search($criteria, $context)->first(); } - /** - * @param string $orderID - * @param Context $context - * @return EntitySearchResult - */ - public function getOrderTransactions(string $orderID, Context $context): EntitySearchResult - { - $criteria = new Criteria(); - $criteria->addFilter(new EqualsFilter('order.id', $orderID)); - $criteria->addAssociation('order'); - $criteria->addAssociation('paymentMethod'); - $criteria->addSorting(new FieldSorting('createdAt')); - - /** @var EntitySearchResult $result */ - $result = $this->repoOrderTransactions->search($criteria, $context); - - return $result; - } - - /** * @param OrderTransactionEntity $transaction * @param Order $mollieOrder diff --git a/src/Controller/Storefront/Webhook/WebhookControllerBase.php b/src/Controller/Storefront/Webhook/WebhookControllerBase.php index b289ceec7..1c0b8d714 100644 --- a/src/Controller/Storefront/Webhook/WebhookControllerBase.php +++ b/src/Controller/Storefront/Webhook/WebhookControllerBase.php @@ -6,6 +6,7 @@ use Kiener\MolliePayments\Components\Subscription\SubscriptionManager; use Kiener\MolliePayments\Repository\Order\OrderRepository; use Kiener\MolliePayments\Repository\Order\OrderRepositoryInterface; +use Kiener\MolliePayments\Repository\OrderTransaction\OrderTransactionRepositoryInterface; use Psr\Log\LoggerInterface; use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity; use Shopware\Core\Framework\Routing\Annotation\RouteScope; @@ -38,19 +39,26 @@ class WebhookControllerBase extends StorefrontController */ private $repoOrders; + /** + * @var OrderTransactionRepositoryInterface + */ + private $repoOrderTransactions; + /** * @param NotificationFacade $notificationFacade * @param SubscriptionManager $subscriptionManager * @param OrderRepositoryInterface $repoOrders + * @param OrderTransactionRepositoryInterface $repoOrderTransactions * @param LoggerInterface $logger */ - public function __construct(NotificationFacade $notificationFacade, SubscriptionManager $subscriptionManager, OrderRepositoryInterface $repoOrders, LoggerInterface $logger) + public function __construct(NotificationFacade $notificationFacade, SubscriptionManager $subscriptionManager, OrderRepositoryInterface $repoOrders, OrderTransactionRepositoryInterface $repoOrderTransactions, LoggerInterface $logger) { $this->logger = $logger; $this->subscriptions = $subscriptionManager; $this->notificationFacade = $notificationFacade; $this->repoOrders = $repoOrders; + $this->repoOrderTransactions = $repoOrderTransactions; } /** @@ -148,8 +156,7 @@ public function onWebhookSubscriptionLegacyReceived(string $swSubscriptionId, Re # now lets grab the latest order transaction of our new order - /** @var OrderTransactionEntity $latestTransaction */ - $latestTransaction = $this->notificationFacade->getOrderTransactions($swOrder->getId(), $context->getContext())->last(); + $latestTransaction = $this->repoOrderTransactions->getLatestOrderTransaction($swOrder->getId(), $context->getContext()); # now simply redirect to the official webhook # that handles the full order, validates the payment and diff --git a/src/Facade/MolliePaymentData.php b/src/Facade/MolliePaymentData.php new file mode 100644 index 000000000..0bba8eec0 --- /dev/null +++ b/src/Facade/MolliePaymentData.php @@ -0,0 +1,72 @@ +id = $id; + $this->checkoutUrl = $checkoutUrl; + $this->mollieLineItems = $mollieLineItems; + $this->changeStatusUrl = $changeStatusUrl; + } + + /** + * @return string + */ + public function getId(): string + { + return $this->id; + } + + /** + * @return string + */ + public function getCheckoutUrl(): string + { + return $this->checkoutUrl; + } + + /** + * @return OrderLine[] + */ + public function getMollieLineItems(): array + { + return $this->mollieLineItems; + } + + public function getChangeStatusUrl(): string + { + return $this->changeStatusUrl; + } +} diff --git a/src/Facade/MolliePaymentDoPay.php b/src/Facade/MolliePaymentDoPay.php index e8af9b911..b58606af9 100644 --- a/src/Facade/MolliePaymentDoPay.php +++ b/src/Facade/MolliePaymentDoPay.php @@ -8,6 +8,7 @@ use Kiener\MolliePayments\Exception\MollieOrderCancelledException; use Kiener\MolliePayments\Exception\MollieOrderExpiredException; use Kiener\MolliePayments\Exception\PaymentUrlException; +use Kiener\MolliePayments\Handler\Method\PosPayment; use Kiener\MolliePayments\Handler\PaymentHandler; use Kiener\MolliePayments\Service\CustomerService; use Kiener\MolliePayments\Service\CustomFieldService; @@ -23,6 +24,7 @@ use Kiener\MolliePayments\Struct\Order\OrderAttributes; use Mollie\Api\Exceptions\ApiException; use Mollie\Api\Resources\Order as MollieOrder; +use Mollie\Api\Resources\OrderLine; use Psr\Log\LoggerInterface; use Shopware\Core\Checkout\Order\OrderEntity; use Shopware\Core\Checkout\Payment\Cart\AsyncPaymentTransactionStruct; @@ -134,6 +136,8 @@ public function __construct(OrderDataExtractor $extractor, MollieOrderBuilder $o */ public function startMolliePayment(string $paymentMethod, AsyncPaymentTransactionStruct $transactionStruct, SalesChannelContext $salesChannelContext, PaymentHandler $paymentHandler): MolliePaymentPrepareData { + $settings = $this->settingsService->getSettings($salesChannelContext->getSalesChannelId()); + # this is the current order transaction # of this payment attempt in Shopware $swOrderTransactionID = $transactionStruct->getOrderTransaction()->getId(); @@ -167,7 +171,8 @@ public function startMolliePayment(string $paymentMethod, AsyncPaymentTransactio # now let's check if we have another payment attempt for an existing order. # this is the case, if we already have a Mollie Order ID in our custom fields. # in this case, we just add a new payment (transaction) to the existing order in Mollie. - if (!empty($mollieOrderId)) { + # DO NEVER reuse a POS payment, because that only works with payments and not with orders!!! + if (!$paymentHandler instanceof PosPayment && !empty($mollieOrderId)) { try { return $this->handleNextPaymentAttempt( $order, @@ -204,7 +209,7 @@ public function startMolliePayment(string $paymentMethod, AsyncPaymentTransactio # let's create our real Mollie order # for this payment in Shopware. - $mollieOrder = $this->createMollieOrder($order, $paymentMethod, $transactionStruct, $salesChannelContext, $paymentHandler); + $molliePaymentData = $this->createMollieOrder($order, $paymentMethod, $transactionStruct, $salesChannelContext, $paymentHandler); # now create subscriptions from our order for # all products that are configured to be a subscription. @@ -214,8 +219,8 @@ public function startMolliePayment(string $paymentMethod, AsyncPaymentTransactio # now update our custom struct values # and immediately set our Mollie Order ID and more - $orderCustomFields->setMollieOrderId($mollieOrder->id); - $orderCustomFields->setMolliePaymentUrl($mollieOrder->getCheckoutUrl()); + $orderCustomFields->setMollieOrderId($molliePaymentData->getId()); + $orderCustomFields->setMolliePaymentUrl($molliePaymentData->getCheckoutUrl()); # if we have a subscription, make sure # to remember the ID in our order @@ -226,14 +231,27 @@ public function startMolliePayment(string $paymentMethod, AsyncPaymentTransactio # we save that data in both, the order and # the order line items $this->updaterOrderCustomFields->updateOrder($order->getId(), $orderCustomFields, $salesChannelContext->getContext()); - $this->updaterLineItemCustomFields->updateOrderLineItems($mollieOrder, $salesChannelContext); + $this->updaterLineItemCustomFields->updateOrderLineItems($molliePaymentData->getMollieLineItems(), $salesChannelContext); # this condition somehow looks weird to me (TODO) $checkoutURL = $orderCustomFields->getMolliePaymentUrl() ?? $orderCustomFields->getTransactionReturnUrl() ?? $transactionStruct->getReturnUrl(); + if (empty($checkoutURL)) { + # see if we have a POS payment + if ($paymentHandler instanceof PosPayment) { + # TODO use route builder?! but its only a temp solution...mollie will build a page anyway + $checkoutURL = '/mollie/pos/checkout?sw=' . $order->getId() . '&mo=' . $molliePaymentData->getId(); + + # if we are in test mode then + # also include the status change url + if ($settings->isTestMode() && !empty($molliePaymentData->getChangeStatusUrl())) { + $checkoutURL .= '&cs=' . urlencode($molliePaymentData->getChangeStatusUrl()); + } + } + } - return new MolliePaymentPrepareData((string)$checkoutURL, (string)$mollieOrder->id); + return new MolliePaymentPrepareData((string)$checkoutURL, (string)$molliePaymentData->getId()); } /** @@ -368,13 +386,42 @@ private function handleNextPaymentAttempt(OrderEntity $order, string $swOrderTra * @param SalesChannelContext $salesChannelContext * @param PaymentHandler $paymentHandler * @throws \Exception - * @return MollieOrder + * @return MolliePaymentData */ - private function createMollieOrder(OrderEntity $orderEntity, string $paymentMethod, AsyncPaymentTransactionStruct $transactionStruct, SalesChannelContext $salesChannelContext, PaymentHandler $paymentHandler): \Mollie\Api\Resources\Order + private function createMollieOrder(OrderEntity $orderEntity, string $paymentMethod, AsyncPaymentTransactionStruct $transactionStruct, SalesChannelContext $salesChannelContext, PaymentHandler $paymentHandler): MolliePaymentData { $salesChannelID = $orderEntity->getSalesChannelId(); - $params = $this->orderBuilder->build( + if ($paymentHandler instanceof PosPayment) { + $params = $this->orderBuilder->buildPaymentsPayload( + $orderEntity, + $transactionStruct->getOrderTransaction()->getId(), + $paymentMethod, + $salesChannelContext, + $paymentHandler + ); + + # add our additional custom terminalID parameter + $params['terminalId'] = $paymentHandler->getTerminalId(); + + $molliePayment = $this->mollieGateway->createPayment($params, $salesChannelID); + + $changeStatusUrl = ''; + + if (property_exists($molliePayment->_links, 'changePaymentState')) { + $changeStatusUrl = (string)$molliePayment->_links->changePaymentState->href; + } + + + return new MolliePaymentData( + $molliePayment->id, + (string)$molliePayment->getCheckoutUrl(), + [], + $changeStatusUrl + ); + } + + $params = $this->orderBuilder->buildOrderPayload( $orderEntity, $transactionStruct->getOrderTransaction()->getId(), $paymentMethod, @@ -382,10 +429,20 @@ private function createMollieOrder(OrderEntity $orderEntity, string $paymentMeth $paymentHandler ); - return $this->mollieGateway->createOrder( + $mollieOrder = $this->mollieGateway->createOrder( $params, $salesChannelID, $salesChannelContext ); + + /** @var OrderLine[] $orderLines */ + $orderLines = $mollieOrder->lines; + + return new MolliePaymentData( + $mollieOrder->id, + (string)$mollieOrder->getCheckoutUrl(), + $orderLines, + '' + ); } } diff --git a/src/Gateway/Mollie/MollieGateway.php b/src/Gateway/Mollie/MollieGateway.php index 3d392dd08..355032dc1 100644 --- a/src/Gateway/Mollie/MollieGateway.php +++ b/src/Gateway/Mollie/MollieGateway.php @@ -11,6 +11,7 @@ use Mollie\Api\Resources\Payment; use Mollie\Api\Resources\Profile; use Mollie\Api\Resources\Subscription; +use Mollie\Api\Resources\Terminal; use Mollie\Api\Types\PaymentMethod; class MollieGateway implements MollieGatewayInterface @@ -116,6 +117,24 @@ public function getIDealIssuers(): array return $issuers; } + /** + * @throws \Mollie\Api\Exceptions\ApiException + * @return array|Terminal[] + */ + public function getPosTerminals(): array + { + $terminals = $this->apiClient->terminals->page(); + + $list = []; + + /** @var Terminal $terminal */ + foreach ($terminals as $terminal) { + $list[] = $terminal; + } + + return $list; + } + /** * @param string $orderId * @throws \Mollie\Api\Exceptions\ApiException diff --git a/src/Gateway/MollieGatewayInterface.php b/src/Gateway/MollieGatewayInterface.php index a022754ed..6d484b4e6 100644 --- a/src/Gateway/MollieGatewayInterface.php +++ b/src/Gateway/MollieGatewayInterface.php @@ -6,6 +6,7 @@ use Mollie\Api\Resources\Order; use Mollie\Api\Resources\Payment; use Mollie\Api\Resources\Subscription; +use Mollie\Api\Resources\Terminal; interface MollieGatewayInterface { @@ -29,6 +30,11 @@ public function getProfileId(): string; */ public function getIDealIssuers(): array; + /** + * @return Terminal[] + */ + public function getPosTerminals(): array; + /** * @param string $orderId * @return Order diff --git a/src/Handler/Method/In3Payment.php b/src/Handler/Method/In3Payment.php index ceb1a81b5..1aa4e42c9 100644 --- a/src/Handler/Method/In3Payment.php +++ b/src/Handler/Method/In3Payment.php @@ -3,13 +3,14 @@ namespace Kiener\MolliePayments\Handler\Method; use Kiener\MolliePayments\Handler\PaymentHandler; +use Mollie\Api\Types\PaymentMethod; class In3Payment extends PaymentHandler { /** * */ - public const PAYMENT_METHOD_NAME = 'in3'; # not yet in API PaymentMethod::IDEAL; + public const PAYMENT_METHOD_NAME = PaymentMethod::IN3; /** * diff --git a/src/Handler/Method/PosPayment.php b/src/Handler/Method/PosPayment.php new file mode 100644 index 000000000..1340d9be9 --- /dev/null +++ b/src/Handler/Method/PosPayment.php @@ -0,0 +1,52 @@ + $orderData + * @param OrderEntity $orderEntity + * @param SalesChannelContext $salesChannelContext + * @param CustomerEntity $customer + * @return array + */ + public function processPaymentMethodSpecificParameters(array $orderData, OrderEntity $orderEntity, SalesChannelContext $salesChannelContext, CustomerEntity $customer): array + { + $customFields = $customer->getCustomFields() ?? []; + + $this->selectedTerminalId = $customFields[CustomFieldService::CUSTOM_FIELDS_KEY_MOLLIE_PAYMENTS][CustomerService::CUSTOM_FIELDS_KEY_PREFERRED_POS_TERMINAL] ?? ''; + + return $orderData; + } + + /** + * @return string + */ + public function getTerminalId(): string + { + return $this->selectedTerminalId; + } +} diff --git a/src/Hydrator/RefundHydrator.php b/src/Hydrator/RefundHydrator.php index 0e4a837cc..a16ff4b6d 100644 --- a/src/Hydrator/RefundHydrator.php +++ b/src/Hydrator/RefundHydrator.php @@ -36,7 +36,7 @@ public function hydrate(Refund $refund, OrderEntity $order): array $metaData = ''; if (property_exists($refund, 'metadata')) { - $metaData = (string)$refund->metadata; + $metaData = (string)json_encode($refund->metadata); } $internalDescription = null; diff --git a/src/MolliePayments.php b/src/MolliePayments.php index 979da2859..6af32bd77 100644 --- a/src/MolliePayments.php +++ b/src/MolliePayments.php @@ -6,7 +6,7 @@ use Kiener\MolliePayments\Compatibility\DependencyLoader; use Kiener\MolliePayments\Components\Installer\PluginInstaller; use Kiener\MolliePayments\Repository\CustomFieldSet\CustomFieldSetRepository; -use Kiener\MolliePayments\Service\CustomFieldService; +use Psr\Container\ContainerInterface; use Shopware\Core\Framework\Context; use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository; use Shopware\Core\Framework\Migration\MigrationCollection; @@ -89,11 +89,17 @@ public function install(InstallContext $context): void { parent::install($context); + /** @var ContainerInterface $container */ + $container = $this->container; + # that's the only part we use the Shopware repository directly, # and not our custom one, because our repositories are not yet registered in this function /** @var EntityRepository $shopwareRepoCustomFields */ - $shopwareRepoCustomFields = $this->container->get('custom_field_set.repository'); - $mollieRepoCustomFields = new CustomFieldSetRepository($shopwareRepoCustomFields); + $shopwareRepoCustomFields = $container->get('custom_field_set.repository'); + + if ($shopwareRepoCustomFields !== null) { + $mollieRepoCustomFields = new CustomFieldSetRepository($shopwareRepoCustomFields); + } $this->runDbMigrations($context->getMigrationCollection()); } @@ -164,8 +170,11 @@ public function deactivate(DeactivateContext $context): void */ private function preparePlugin(Context $context): void { + /** @var ContainerInterface $container */ + $container = $this->container; + /** @var PluginInstaller $pluginInstaller */ - $pluginInstaller = $this->container->get(PluginInstaller::class); + $pluginInstaller = $container->get(PluginInstaller::class); $pluginInstaller->install($context); } diff --git a/src/Repository/OrderTransaction/OrderTransactionRepository.php b/src/Repository/OrderTransaction/OrderTransactionRepository.php index 6022239d0..20113771f 100644 --- a/src/Repository/OrderTransaction/OrderTransactionRepository.php +++ b/src/Repository/OrderTransaction/OrderTransactionRepository.php @@ -3,11 +3,14 @@ namespace Kiener\MolliePayments\Repository\OrderTransaction; +use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity; use Shopware\Core\Framework\Context; use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository; use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent; use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult; +use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter; +use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting; class OrderTransactionRepository implements OrderTransactionRepositoryInterface { @@ -43,4 +46,23 @@ public function update(array $data, Context $context): EntityWrittenContainerEve { return $this->orderTransactionRepository->update($data, $context); } + + /** + * @param string $orderID + * @param Context $context + * @return OrderTransactionEntity + */ + public function getLatestOrderTransaction(string $orderID, Context $context): OrderTransactionEntity + { + $criteria = new Criteria(); + $criteria->addFilter(new EqualsFilter('order.id', $orderID)); + $criteria->addAssociation('order'); + $criteria->addAssociation('paymentMethod'); + $criteria->addSorting(new FieldSorting('createdAt')); + + /** @var EntitySearchResult $result */ + $result = $this->orderTransactionRepository->search($criteria, $context); + + return $result->last(); + } } diff --git a/src/Repository/OrderTransaction/OrderTransactionRepositoryInterface.php b/src/Repository/OrderTransaction/OrderTransactionRepositoryInterface.php index 2ae394d62..5e2356305 100644 --- a/src/Repository/OrderTransaction/OrderTransactionRepositoryInterface.php +++ b/src/Repository/OrderTransaction/OrderTransactionRepositoryInterface.php @@ -3,6 +3,7 @@ namespace Kiener\MolliePayments\Repository\OrderTransaction; +use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity; use Shopware\Core\Framework\Context; use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent; use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; @@ -24,4 +25,11 @@ public function search(Criteria $criteria, Context $context): EntitySearchResult * @return EntityWrittenContainerEvent */ public function update(array $data, Context $context): EntityWrittenContainerEvent; + + /** + * @param string $orderID + * @param Context $context + * @return OrderTransactionEntity + */ + public function getLatestOrderTransaction(string $orderID, Context $context): OrderTransactionEntity; } diff --git a/src/Resources/app/administration/src/module/mollie-payments/components/mollie-pluginconfig-section-order-lifetime-warning/index.js b/src/Resources/app/administration/src/module/mollie-payments/components/mollie-pluginconfig-section-order-lifetime-warning/index.js index 9591722b1..d18a18e0a 100644 --- a/src/Resources/app/administration/src/module/mollie-payments/components/mollie-pluginconfig-section-order-lifetime-warning/index.js +++ b/src/Resources/app/administration/src/module/mollie-payments/components/mollie-pluginconfig-section-order-lifetime-warning/index.js @@ -43,7 +43,7 @@ Component.register('mollie-pluginconfig-section-order-lifetime-warning', { this.klarnaOrderLifeTimeReached = limitDetector.isKlarnaOrderLifeTimeReached(value); - orderLifeTimeElement.addEventListener("keyup", (event) => { + orderLifeTimeElement.addEventListener('keyup', (event) => { const value = parseInt(event.target.value); this.oderLifeTimeLimitReached = limitDetector.isOderLifeTimeLimitReached(value); diff --git a/src/Resources/app/storefront/src/main.js b/src/Resources/app/storefront/src/main.js index cc7cba78c..41b14800b 100644 --- a/src/Resources/app/storefront/src/main.js +++ b/src/Resources/app/storefront/src/main.js @@ -1,4 +1,4 @@ -import MollieRegistration from "./register"; +import MollieRegistration from './register'; // this file will register all plugins according to shopware standard // we use our custom webpack so that it's available for Shopware 6.4 and 6.5. diff --git a/src/Resources/app/storefront/src/mollie-payments/plugins/pos-terminal.plugin.js b/src/Resources/app/storefront/src/mollie-payments/plugins/pos-terminal.plugin.js new file mode 100644 index 000000000..7aeadada5 --- /dev/null +++ b/src/Resources/app/storefront/src/mollie-payments/plugins/pos-terminal.plugin.js @@ -0,0 +1,193 @@ +import Plugin from '@shopware-storefront-sdk/plugin-system/plugin.class'; +import HttpClient from '../services/HttpClient' + + +export default class MolliePosTerminalPlugin extends Plugin { + + _shopUrl = ''; + _customerId = ''; + + + _dropdownTerminals = null; + + _isModalForm = false; + + _container = null; + _paymentForm = null; + _radioInputs = null; + _posRadioInput = null; + + + /** + * + */ + init() { + + this._container = document.querySelector('div.mollie-pos-terminals'); + + if (this._container === undefined || this._container === null) { + return; + } + + this.initControls(); + + // now check if we even have a payment form + // if not, then we are not on the checkout page + // but maybe in the accounts page instead...we dont need components there + if (this._paymentForm === null) { + return; + } + + // if we don't have the issuers dropdown available, then we can't even do anything + if (this._dropdownTerminals === null) { + return; + } + + this.registerEvents(); + + // update the visibility of our issuer dropdown list + this.updateDropdownVisibility(this._posRadioInput, this._container, this._dropdownTerminals) + + this.updateTerminal( + this._shopUrl, + this._customerId, + this._posRadioInput, + this._dropdownTerminals, + function () { + } + ); + } + + /** + * + */ + initControls() { + this._shopUrl = this._container.getAttribute('data-shop-url'); + + if (this._shopUrl.substr(-1) === '/') { + this._shopUrl = this._shopUrl.substr(0, this._shopUrl.length - 1); + } + + this._customerId = this._container.getAttribute('data-customer-id'); + this._dropdownTerminals = document.querySelector('#posTerminals'); + + this._paymentForm = document.querySelector('#changePaymentForm'); + + if (this._paymentForm === undefined || this._paymentForm === null) { + return; + } + + this._radioInputs = this._paymentForm.querySelectorAll('input[type="radio"]'); + this._posRadioInput = this._paymentForm.querySelector('input[type="radio"].pointofsale'); + } + + /** + * + */ + registerEvents() { + + if (this._paymentForm === null) { + return; + } + + // create locally scoped variables + // for async functions. this is required + const shopUrl = this._shopUrl; + const customerId = this._customerId; + const container = this._container; + const allRadioInputs = this._radioInputs; + const posRadioInput = this._posRadioInput; + const terminalsDropdown = this._dropdownTerminals; + + + // add event to toggle the dropdown visibility + // when switching payment methods + allRadioInputs.forEach((element) => { + element.addEventListener('change', () => { + this.updateDropdownVisibility(posRadioInput, container, terminalsDropdown) + }); + }); + + terminalsDropdown.addEventListener('change', async () => { + this.updateTerminal(shopUrl, customerId, posRadioInput, terminalsDropdown, function () { + }); + }); + } + + /** + * + * @param posRadio + * @param container + * @param dropdown + */ + updateDropdownVisibility(posRadio, container, dropdown) { + + let terminalRequired = false; + + if (posRadio === undefined || posRadio.checked === false) { + container.classList.add('d-none'); + } else { + container.classList.remove('d-none'); + terminalRequired = true; + } + + if (dropdown !== undefined) { + dropdown.required = terminalRequired; + } + } + + /** + * + * @param shopUrl + * @param customerId + * @param posRadio + * @param terminalsDropdown + * @param onCompleted + */ + updateTerminal(shopUrl, customerId, posRadio, terminalsDropdown, onCompleted) { + + if (posRadio === undefined) { + onCompleted('POS Radio Input not defined'); + return; + } + + if (posRadio === null) { + onCompleted('POS Radio Input not found'); + return; + } + + if (posRadio.checked === false) { + onCompleted('POS payment not active'); + return; + } + + if (terminalsDropdown === undefined) { + onCompleted('POS terminals not defined'); + return; + } + + if (terminalsDropdown === null) { + onCompleted('POS terminals not found'); + return; + } + + if (terminalsDropdown.value === '') { + onCompleted('no POS terminal selected'); + return; + } + + const client = new HttpClient(); + + client.get( + shopUrl + '/mollie/pos/store-terminal/' + customerId + '/' + terminalsDropdown.value, + function () { + onCompleted('terminal updated successfully'); + }, + function () { + onCompleted('error when updating terminal'); + }, + 'application/json; charset=utf-8' + ); + } + +} \ No newline at end of file diff --git a/src/Resources/app/storefront/src/register.js b/src/Resources/app/storefront/src/register.js index 064fe2199..9de86e174 100644 --- a/src/Resources/app/storefront/src/register.js +++ b/src/Resources/app/storefront/src/register.js @@ -4,6 +4,7 @@ import MollieIDealIssuer from './mollie-payments/plugins/ideal-issuer.plugin'; import MollieApplePayDirect from './mollie-payments/plugins/apple-pay-direct.plugin'; import MollieApplePayPaymentMethod from './mollie-payments/plugins/apple-pay-payment-method.plugin'; import MollieCreditCardMandateManage from './mollie-payments/plugins/creditcard-mandate-manage.plugin'; +import MolliePosTerminalPlugin from './mollie-payments/plugins/pos-terminal.plugin'; export default class MolliRegistration { @@ -22,7 +23,6 @@ export default class MolliRegistration { // this is just the iDEAL dropdown..not quite sure why its not bound to the DOM -> TODO? pluginManager.register('MollieIDealIssuer', MollieIDealIssuer); - // hiding the standard Apple Pay method in the checkout and account area // ----------------------------------------------------------------------------- pluginManager.register('MollieApplePayPaymentMethod', MollieApplePayPaymentMethod, '[data-mollie-template-applepay-account]'); @@ -38,6 +38,10 @@ export default class MolliRegistration { // manage credit card mandate // ----------------------------------------------------------------------------- pluginManager.register('MollieCreditCardMandateManage', MollieCreditCardMandateManage, '[data-mollie-credit-card-mandate-manage]'); + + // POS Terminal + // ----------------------------------------------------------------------------- + pluginManager.register('MolliePosTerminal', MolliePosTerminalPlugin, '[data-mollie-template-pos-terminal]'); } } diff --git a/src/Resources/app/storefront/src/scss/checkout/payment-selection.scss b/src/Resources/app/storefront/src/scss/checkout/payment-selection.scss index ada8b34ff..6536b54ca 100644 --- a/src/Resources/app/storefront/src/scss/checkout/payment-selection.scss +++ b/src/Resources/app/storefront/src/scss/checkout/payment-selection.scss @@ -9,6 +9,10 @@ margin-top: 15px; } + .mollie-pos-terminals { + margin-top: 15px; + } + .payment-method-description { order: -1; } @@ -22,5 +26,13 @@ border: 1px solid red; } } + + .mollie-pos-terminals { + margin-top: 15px; + + .custom-select:invalid { + border: 1px solid red; + } + } } diff --git a/src/Resources/app/storefront/tests/sample.spec.js b/src/Resources/app/storefront/tests/sample.spec.js deleted file mode 100644 index 2ed2c7101..000000000 --- a/src/Resources/app/storefront/tests/sample.spec.js +++ /dev/null @@ -1,5 +0,0 @@ -test('sample', (done) => { - expect(1).toBe(1); - done(); -}); - diff --git a/src/Resources/config/compatibility/controller.xml b/src/Resources/config/compatibility/controller.xml index d902025d1..60e9ee634 100644 --- a/src/Resources/config/compatibility/controller.xml +++ b/src/Resources/config/compatibility/controller.xml @@ -76,6 +76,7 @@ + @@ -112,6 +113,7 @@ + @@ -134,14 +136,28 @@ - + + + + + + + + + + + + + - + @@ -157,7 +173,8 @@ - + @@ -168,7 +185,8 @@ - + @@ -185,9 +203,15 @@ - + + + + + + diff --git a/src/Resources/config/compatibility/controller_6.5.xml b/src/Resources/config/compatibility/controller_6.5.xml index 27f4350de..ef39bd795 100644 --- a/src/Resources/config/compatibility/controller_6.5.xml +++ b/src/Resources/config/compatibility/controller_6.5.xml @@ -75,6 +75,7 @@ + @@ -114,6 +115,7 @@ + @@ -136,6 +138,21 @@ + + + + + + + + + + + + + + + @@ -194,5 +211,10 @@ + + + + + diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml index 81bab8f81..f822b00ad 100644 --- a/src/Resources/config/services.xml +++ b/src/Resources/config/services.xml @@ -151,6 +151,7 @@ + diff --git a/src/Resources/config/services/handlers.xml b/src/Resources/config/services/handlers.xml index 773c797f9..fc21046ae 100644 --- a/src/Resources/config/services/handlers.xml +++ b/src/Resources/config/services/handlers.xml @@ -169,5 +169,12 @@ + + + + + + + diff --git a/src/Resources/public/static/failed.png b/src/Resources/public/static/failed.png new file mode 100644 index 000000000..57138962b Binary files /dev/null and b/src/Resources/public/static/failed.png differ diff --git a/src/Resources/public/static/failed@2x.png b/src/Resources/public/static/failed@2x.png new file mode 100644 index 000000000..2ead7c628 Binary files /dev/null and b/src/Resources/public/static/failed@2x.png differ diff --git a/src/Resources/public/static/failed@3x.png b/src/Resources/public/static/failed@3x.png new file mode 100644 index 000000000..7e7715f03 Binary files /dev/null and b/src/Resources/public/static/failed@3x.png differ diff --git a/src/Resources/public/static/loading.png b/src/Resources/public/static/loading.png new file mode 100644 index 000000000..b931189c7 Binary files /dev/null and b/src/Resources/public/static/loading.png differ diff --git a/src/Resources/public/static/loading@2x.png b/src/Resources/public/static/loading@2x.png new file mode 100644 index 000000000..ec28f6820 Binary files /dev/null and b/src/Resources/public/static/loading@2x.png differ diff --git a/src/Resources/public/static/loading@3x.png b/src/Resources/public/static/loading@3x.png new file mode 100644 index 000000000..b6735ca66 Binary files /dev/null and b/src/Resources/public/static/loading@3x.png differ diff --git a/src/Resources/public/static/success.png b/src/Resources/public/static/success.png new file mode 100644 index 000000000..5ce950da6 Binary files /dev/null and b/src/Resources/public/static/success.png differ diff --git a/src/Resources/public/static/success@2x.png b/src/Resources/public/static/success@2x.png new file mode 100644 index 000000000..6bbf59127 Binary files /dev/null and b/src/Resources/public/static/success@2x.png differ diff --git a/src/Resources/public/static/success@3x.png b/src/Resources/public/static/success@3x.png new file mode 100644 index 000000000..9c445c3c4 Binary files /dev/null and b/src/Resources/public/static/success@3x.png differ diff --git a/src/Resources/snippet/de_DE/mollie-payments.de-DE.json b/src/Resources/snippet/de_DE/mollie-payments.de-DE.json index 39afa114c..bd1bd667e 100644 --- a/src/Resources/snippet/de_DE/mollie-payments.de-DE.json +++ b/src/Resources/snippet/de_DE/mollie-payments.de-DE.json @@ -25,6 +25,9 @@ "ideal": { "selectBank": "Bank auswählen" }, + "pos": { + "selectTerminal": "Terminal auswählen" + }, "mandate": { "sectionTitle": "Gespeicherte Karten", "cardTitleLabel": "%name% •••• %number%", diff --git a/src/Resources/snippet/en_GB/mollie-payments.en-GB.json b/src/Resources/snippet/en_GB/mollie-payments.en-GB.json index 57ea47808..afb3601c2 100644 --- a/src/Resources/snippet/en_GB/mollie-payments.en-GB.json +++ b/src/Resources/snippet/en_GB/mollie-payments.en-GB.json @@ -25,6 +25,9 @@ "ideal": { "selectBank": "Select bank" }, + "pos": { + "selectTerminal": "Terminal auswählen" + }, "mandate": { "sectionTitle": "Saved cards", "cardTitleLabel": "%name% •••• %number%", diff --git a/src/Resources/snippet/nl_NL/mollie-payments.nl-NL.json b/src/Resources/snippet/nl_NL/mollie-payments.nl-NL.json index 42dd83193..a8ca26978 100644 --- a/src/Resources/snippet/nl_NL/mollie-payments.nl-NL.json +++ b/src/Resources/snippet/nl_NL/mollie-payments.nl-NL.json @@ -25,6 +25,9 @@ "ideal": { "selectBank": "Selecteer bank" }, + "pos": { + "selectTerminal": "Selecteer terminal" + }, "mandate": { "sectionTitle": "Opgeslagen kaarten", "cardTitleLabel": "%name% •••• %number%", diff --git a/src/Resources/views/mollie/pos/checkout.html.twig b/src/Resources/views/mollie/pos/checkout.html.twig new file mode 100644 index 000000000..25d8eefd0 --- /dev/null +++ b/src/Resources/views/mollie/pos/checkout.html.twig @@ -0,0 +1,273 @@ + + + + + + + + + + +
+
+
+
+

Follow the instructions on the terminal

+ + + + +
+ {% if changeStatusUrl %} + + Change Status in Test Mode + + + + + + {% endif %} +
+
+ Mollie +
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/src/Resources/views/storefront/component/payment/component/pos-fields.html.twig b/src/Resources/views/storefront/component/payment/component/pos-fields.html.twig new file mode 100644 index 000000000..e7e6fa474 --- /dev/null +++ b/src/Resources/views/storefront/component/payment/component/pos-fields.html.twig @@ -0,0 +1,14 @@ +
+ + {% if page.mollie_terminals %} + + {% endif %} +
diff --git a/src/Resources/views/storefront/component/payment/payment-fields.html.twig b/src/Resources/views/storefront/component/payment/payment-fields.html.twig index afbefbaae..a9b5d6eb7 100644 --- a/src/Resources/views/storefront/component/payment/payment-fields.html.twig +++ b/src/Resources/views/storefront/component/payment/payment-fields.html.twig @@ -30,8 +30,10 @@ {% if payment.translated.customFields.mollie_payment_method_name == 'creditcard' %} {% sw_include '@MolliePayments/storefront/component/payment/component/cc-fields.html.twig' with { showIfActive: false - }%} + } %} {% elseif payment.translated.customFields.mollie_payment_method_name == 'ideal' %} {% sw_include '@MolliePayments/storefront/component/payment/component/ideal-fields.html.twig' %} + {% elseif payment.translated.customFields.mollie_payment_method_name == 'pointofsale' %} + {% sw_include '@MolliePayments/storefront/component/payment/component/pos-fields.html.twig' %} {% endif %} {% endblock %} diff --git a/src/Resources/views/storefront/component/payment/payment-method.html.twig b/src/Resources/views/storefront/component/payment/payment-method.html.twig index 6218184c5..af3746b8b 100644 --- a/src/Resources/views/storefront/component/payment/payment-method.html.twig +++ b/src/Resources/views/storefront/component/payment/payment-method.html.twig @@ -37,5 +37,7 @@ } %} {% elseif payment.translated.customFields.mollie_payment_method_name == 'ideal' %} {% sw_include '@MolliePayments/storefront/component/payment/component/ideal-fields.html.twig' %} + {% elseif payment.translated.customFields.mollie_payment_method_name == 'pointofsale' %} + {% sw_include '@MolliePayments/storefront/component/payment/component/pos-fields.html.twig' %} {% endif %} {% endblock %} diff --git a/src/Service/CustomerService.php b/src/Service/CustomerService.php index 4c60e9305..eb3917637 100644 --- a/src/Service/CustomerService.php +++ b/src/Service/CustomerService.php @@ -36,6 +36,7 @@ class CustomerService implements CustomerServiceInterface public const CUSTOM_FIELDS_KEY_MANDATE_ID = 'mandate_id'; public const CUSTOM_FIELDS_KEY_SHOULD_SAVE_CARD_DETAIL = 'shouldSaveCardDetail'; public const CUSTOM_FIELDS_KEY_PREFERRED_IDEAL_ISSUER = 'preferred_ideal_issuer'; + public const CUSTOM_FIELDS_KEY_PREFERRED_POS_TERMINAL = 'preferred_pos_terminal'; /** * @var CountryRepositoryInterface @@ -291,6 +292,28 @@ public function setIDealIssuer(CustomerEntity $customer, string $issuerId, Conte ]], $context); } + /** + * @param CustomerEntity $customer + * @param string $terminalId + * @param Context $context + * @return EntityWrittenContainerEvent + */ + public function setPosTerminal(CustomerEntity $customer, string $terminalId, Context $context): EntityWrittenContainerEvent + { + $customFields = $customer->getCustomFields(); + + if (!is_array($customFields)) { + $customFields = []; + } + + $customFields[CustomFieldService::CUSTOM_FIELDS_KEY_MOLLIE_PAYMENTS][self::CUSTOM_FIELDS_KEY_PREFERRED_POS_TERMINAL] = $terminalId; + + return $this->customerRepository->update([[ + 'id' => $customer->getId(), + 'customFields' => $customFields + ]], $context); + } + /** * @param string $customerId * @param string $salesChannelId diff --git a/src/Service/MollieApi/Builder/MollieOrderBuilder.php b/src/Service/MollieApi/Builder/MollieOrderBuilder.php index 7dbd381a8..8c37d69f1 100644 --- a/src/Service/MollieApi/Builder/MollieOrderBuilder.php +++ b/src/Service/MollieApi/Builder/MollieOrderBuilder.php @@ -3,6 +3,7 @@ namespace Kiener\MolliePayments\Service\MollieApi\Builder; use Kiener\MolliePayments\Event\MollieOrderBuildEvent; +use Kiener\MolliePayments\Exception\CustomerCouldNotBeFoundException; use Kiener\MolliePayments\Handler\Method\CreditCardPayment; use Kiener\MolliePayments\Handler\PaymentHandler; use Kiener\MolliePayments\Service\MollieApi\MollieOrderCustomerEnricher; @@ -107,7 +108,31 @@ public function __construct(SettingsService $settingsService, OrderDataExtractor * @throws \Exception * @return array */ - public function build(OrderEntity $order, string $transactionId, string $paymentMethod, SalesChannelContext $salesChannelContext, ?PaymentHandler $handler, array $paymentData = []): array + public function buildPaymentsPayload(OrderEntity $order, string $transactionId, string $paymentMethod, SalesChannelContext $salesChannelContext, ?PaymentHandler $handler, array $paymentData = []): array + { + $orderPayload = $this->buildOrderPayload($order, $transactionId, $paymentMethod, $salesChannelContext, $handler, $paymentData); + + return [ + 'amount' => $orderPayload['amount'], + 'method' => $orderPayload['method'], + 'description' => $orderPayload['orderNumber'], + 'locale' => $orderPayload['locale'], + 'redirectUrl' => $orderPayload['redirectUrl'], + 'webhookUrl' => $orderPayload['webhookUrl'], + ]; + } + + /** + * @param OrderEntity $order + * @param string $transactionId + * @param string $paymentMethod + * @param SalesChannelContext $salesChannelContext + * @param null|PaymentHandler $handler + * @param array $paymentData + * @throws CustomerCouldNotBeFoundException + * @return array + */ + public function buildOrderPayload(OrderEntity $order, string $transactionId, string $paymentMethod, SalesChannelContext $salesChannelContext, ?PaymentHandler $handler, array $paymentData = []): array { /** @var MollieSettingStruct $settings */ $settings = $this->settingsService->getSettings($order->getSalesChannelId()); diff --git a/src/Service/MollieApi/Order.php b/src/Service/MollieApi/Order.php index 140c87c47..a329c4764 100644 --- a/src/Service/MollieApi/Order.php +++ b/src/Service/MollieApi/Order.php @@ -148,6 +148,19 @@ public function getMollieOrderLine(string $mollieOrderId, string $mollieOrderLin return $orderLine; } + /** + * @param array $params + * @param string $orderSalesChannelContextId + * @throws ApiException + * @return Payment + */ + public function createPayment(array $params, string $orderSalesChannelContextId): Payment + { + $apiClient = $this->clientFactory->getClient($orderSalesChannelContextId); + + return $apiClient->payments->create($params); + } + /** * @param array $orderData * @param string $orderSalesChannelContextId diff --git a/src/Service/Order/UpdateOrderLineItems.php b/src/Service/Order/UpdateOrderLineItems.php index eb7215541..9fc158495 100644 --- a/src/Service/Order/UpdateOrderLineItems.php +++ b/src/Service/Order/UpdateOrderLineItems.php @@ -25,13 +25,13 @@ public function __construct(OrderLineItemRepositoryInterface $orderLineRepositor } /** - * @param Order $mollieOrder + * @param OrderLine[] $orderLines * @param SalesChannelContext $salesChannelContext + * @return void */ - public function updateOrderLineItems(Order $mollieOrder, SalesChannelContext $salesChannelContext): void + public function updateOrderLineItems(array $orderLines, SalesChannelContext $salesChannelContext): void { - /** @var OrderLine $orderLine */ - foreach ($mollieOrder->lines() as $orderLine) { + foreach ($orderLines as $orderLine) { if ($orderLine->type === OrderLineType::TYPE_SHIPPING_FEE) { continue; } diff --git a/src/Service/PaymentMethodService.php b/src/Service/PaymentMethodService.php index 9c6a68ed6..a511c923a 100644 --- a/src/Service/PaymentMethodService.php +++ b/src/Service/PaymentMethodService.php @@ -20,6 +20,7 @@ use Kiener\MolliePayments\Handler\Method\KlarnaSliceItPayment; use Kiener\MolliePayments\Handler\Method\PayPalPayment; use Kiener\MolliePayments\Handler\Method\PaySafeCardPayment; +use Kiener\MolliePayments\Handler\Method\PosPayment; use Kiener\MolliePayments\Handler\Method\Przelewy24Payment; use Kiener\MolliePayments\Handler\Method\SofortPayment; use Kiener\MolliePayments\Handler\Method\VoucherPayment; @@ -382,7 +383,8 @@ public function getPaymentHandlers(): array Przelewy24Payment::class, SofortPayment::class, VoucherPayment::class, - In3Payment::class + In3Payment::class, + PosPayment::class, // IngHomePayPayment::class, // not allowed anymore // DirectDebitPayment::class, // only allowed when updating subsriptions, aka => not allowed anymore ]; diff --git a/src/Subscriber/CheckoutConfirmPageSubscriber.php b/src/Subscriber/CheckoutConfirmPageSubscriber.php index f9fce265b..5623540b1 100644 --- a/src/Subscriber/CheckoutConfirmPageSubscriber.php +++ b/src/Subscriber/CheckoutConfirmPageSubscriber.php @@ -4,7 +4,9 @@ use Exception; use Kiener\MolliePayments\Factory\MollieApiFactory; +use Kiener\MolliePayments\Gateway\MollieGatewayInterface; use Kiener\MolliePayments\Handler\Method\CreditCardPayment; +use Kiener\MolliePayments\Handler\Method\PosPayment; use Kiener\MolliePayments\Repository\Language\LanguageRepositoryInterface; use Kiener\MolliePayments\Repository\Locale\LocaleRepositoryInterface; use Kiener\MolliePayments\Service\CustomerService; @@ -15,6 +17,7 @@ use Mollie\Api\Exceptions\ApiException; use Mollie\Api\MollieApiClient; use Mollie\Api\Resources\Method; +use Mollie\Api\Resources\Terminal; use Mollie\Api\Types\PaymentMethod; use Shopware\Core\Checkout\Customer\CustomerEntity; use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; @@ -60,6 +63,12 @@ class CheckoutConfirmPageSubscriber implements EventSubscriberInterface */ private $mandateService; + /** + * @var MollieGatewayInterface + */ + private $mollieGateway; + + /** * @return array> */ @@ -79,14 +88,16 @@ public static function getSubscribedEvents(): array * @param LanguageRepositoryInterface $languageRepositoryInterface * @param LocaleRepositoryInterface $localeRepositoryInterface * @param MandateServiceInterface $mandateService + * @param MollieGatewayInterface $mollieGateway */ - public function __construct(MollieApiFactory $apiFactory, SettingsService $settingsService, LanguageRepositoryInterface $languageRepositoryInterface, LocaleRepositoryInterface $localeRepositoryInterface, MandateServiceInterface $mandateService) + public function __construct(MollieApiFactory $apiFactory, SettingsService $settingsService, LanguageRepositoryInterface $languageRepositoryInterface, LocaleRepositoryInterface $localeRepositoryInterface, MandateServiceInterface $mandateService, MollieGatewayInterface $mollieGateway) { $this->apiFactory = $apiFactory; $this->settingsService = $settingsService; $this->repoLanguages = $languageRepositoryInterface; $this->repoLocales = $localeRepositoryInterface; $this->mandateService = $mandateService; + $this->mollieGateway = $mollieGateway; } @@ -100,11 +111,13 @@ public function addDataToPage($args): void # current request $this->settings = $this->settingsService->getSettings($args->getSalesChannelContext()->getSalesChannel()->getId()); + $scId = $args->getSalesChannelContext()->getSalesChannel()->getId(); + # now use our factory to get the correct # client with the correct sales channel settings - $this->apiClient = $this->apiFactory->getClient( - $args->getSalesChannelContext()->getSalesChannel()->getId() - ); + $this->apiClient = $this->apiFactory->getClient($scId); + + $this->mollieGateway->switchClient($scId); $this->addMollieLocaleVariableToPage($args); $this->addMollieProfileIdVariableToPage($args); @@ -112,6 +125,7 @@ public function addDataToPage($args): void $this->addMollieComponentsVariableToPage($args); $this->addMollieIdealIssuersVariableToPage($args); $this->addMollieSingleClickPaymentDataToPage($args); + $this->addMolliePosTerminalsVariableToPage($args); } /** @@ -322,6 +336,34 @@ private function addMollieIdealIssuersVariableToPage($args): void } } + /** + * Adds ideal issuers variable to the storefront. + * + * @param AccountEditOrderPageLoadedEvent|CheckoutConfirmPageLoadedEvent $args + */ + private function addMolliePosTerminalsVariableToPage($args): void + { + try { + $terminalsArray = []; + + $terminals = $this->mollieGateway->getPosTerminals(); + + foreach ($terminals as $terminal) { + $terminalsArray[] = [ + 'id' => $terminal->id, + 'name' => $terminal->description, + ]; + } + + $args->getPage()->assign( + [ + 'mollie_terminals' => $terminalsArray + ] + ); + } catch (Exception $e) { + } + } + /** * Adds the components variable to the storefront. * diff --git a/tests/Cypress/cypress/e2e/store-api/pos.cy.js b/tests/Cypress/cypress/e2e/store-api/pos.cy.js new file mode 100644 index 000000000..7b1e48b02 --- /dev/null +++ b/tests/Cypress/cypress/e2e/store-api/pos.cy.js @@ -0,0 +1,47 @@ +import StoreAPIClient from "Services/shopware/StoreAPIClient"; +import Shopware from "Services/shopware/Shopware" + + +const shopware = new Shopware(); + + +const client = new StoreAPIClient(shopware.getStoreApiToken()); + +const storeApiPrefix = '/store-api'; + + +context(storeApiPrefix +"/mollie/ideal/issuers", () => { + + it('C1341122: POS fetch terminals (Store API)', () => { + + const request = new Promise((resolve) => { + client.get('/mollie/pos/terminals').then(response => { + resolve({'data': response.data}); + }); + }) + + cy.wrap(request).its('data').then(response => { + cy.wrap(response).its('apiAlias').should('eq', 'mollie_payments_pos_terminals') + cy.wrap(response).its('terminals').its('length').should('be.gte', 1) + }); + }) + +}) + +context(storeApiPrefix +"/mollie/ideal/store-issuer", () => { + + it('C1341123: POS store terminal with invalid customer id (Store API) @core', () => { + + const request = new Promise((resolve) => { + client.post('/mollie/pos/store-terminal/cust-123/ideal_ABNANL2A').then(response => { + resolve({'data': response.data}); + }); + }) + + cy.wrap(request).its('data').then(response => { + cy.wrap(response).its('status').should('eq', 500) + expect(response.data.errors[0].detail).to.contain('Customer with ID cust-123 not found in Shopware'); + }); + }) + +}) diff --git a/tests/Cypress/cypress/e2e/storefront/checkout/checkout-success.cy.js b/tests/Cypress/cypress/e2e/storefront/checkout/checkout-success.cy.js index ea4dac03a..4387e45a6 100644 --- a/tests/Cypress/cypress/e2e/storefront/checkout/checkout-success.cy.js +++ b/tests/Cypress/cypress/e2e/storefront/checkout/checkout-success.cy.js @@ -57,6 +57,7 @@ const payments = [ {caseId: 'C4127', key: 'belfius', name: 'Belfius'}, {caseId: 'C4121', key: 'giftcard', name: 'Gift cards'}, {caseId: 'C4143', key: 'voucher', name: 'Voucher'}, + {caseId: 'C1341120', key: 'pointofsale', name: 'POS Terminal'}, // unfortunately address and product prices need to match, so we cannot do in3 automatically for now // {caseId: '', key: 'in3', name: 'in3'}, ]; @@ -145,7 +146,7 @@ context("Checkout Tests", () => { } else if (payment.key === 'credit-card') { cy.wait(2000); - + mollieCreditCard.enterValidCard(); mollieCreditCard.submitForm(); molliePayment.selectPaid(); diff --git a/tests/Cypress/cypress/e2e/storefront/payment-methods/pos.cy.js b/tests/Cypress/cypress/e2e/storefront/payment-methods/pos.cy.js new file mode 100644 index 000000000..bbf8727b2 --- /dev/null +++ b/tests/Cypress/cypress/e2e/storefront/payment-methods/pos.cy.js @@ -0,0 +1,72 @@ +import Devices from "Services/utils/Devices"; +import Session from "Services/utils/Session" +import Shopware from "Services/shopware/Shopware"; +// ------------------------------------------------------ +import ShopConfigurationAction from "Actions/admin/ShopConfigurationAction"; +// ------------------------------------------------------ +import PaymentAction from "Actions/storefront/checkout/PaymentAction"; +import DummyBasketScenario from "Scenarios/DummyBasketScenario"; +import CheckoutAction from "Actions/storefront/checkout/CheckoutAction"; + + +const devices = new Devices(); +const session = new Session(); +const shopware = new Shopware(); + +const checkout = new CheckoutAction(); +const configAction = new ShopConfigurationAction(); +const paymentAction = new PaymentAction(); + + +const testDevices = [devices.getFirstDevice()]; + +const scenarioDummyBasket = new DummyBasketScenario(1); + + +describe('POS Terminals', () => { + + testDevices.forEach(device => { + + context(devices.getDescription(device), () => { + + beforeEach(() => { + devices.setDevice(device); + configAction.setupShop(true, false, false); + session.resetBrowserSession(); + }); + + it('C1341121: Terminals List on payment selection page', () => { + + scenarioDummyBasket.execute(); + + if (shopware.isVersionGreaterEqual(6.4)) { + paymentAction.showAllPaymentMethods(); + } else { + paymentAction.openPaymentsModal(); + } + + paymentAction.selectPaymentMethod('POS Terminal'); + paymentAction.selectPosTerminal(); + }) + + it('C1504402: POS Terminal Checkout redirects to custom waiting screen', () => { + + scenarioDummyBasket.execute(); + + if (shopware.isVersionGreaterEqual(6.4)) { + paymentAction.showAllPaymentMethods(); + } else { + paymentAction.openPaymentsModal(); + } + + paymentAction.selectPaymentMethod('POS Terminal'); + paymentAction.selectPosTerminal(); + + shopware.prepareDomainChange(); + checkout.placeOrderOnConfirm(); + + cy.contains('Follow the instructions on the terminal'); + }) + }) + }) +}) diff --git a/tests/Cypress/cypress/support/actions/storefront/checkout/PaymentAction.js b/tests/Cypress/cypress/support/actions/storefront/checkout/PaymentAction.js index 4798976a8..6738ac710 100644 --- a/tests/Cypress/cypress/support/actions/storefront/checkout/PaymentAction.js +++ b/tests/Cypress/cypress/support/actions/storefront/checkout/PaymentAction.js @@ -60,6 +60,10 @@ export default class PaymentAction { this.selectIDealIssuer('bunq'); } + if (paymentName === 'POS Terminal') { + this.selectPosTerminal(); + } + } else { this.openPaymentsModal(); this.selectPaymentMethod(paymentName); @@ -69,6 +73,10 @@ export default class PaymentAction { this.selectIDealIssuer('bunq'); } + if (paymentName === 'POS Terminal') { + this.selectPosTerminal(); + } + this.closePaymentsModal(); } } @@ -84,7 +92,7 @@ export default class PaymentAction { // always make sure that the iFrame is loaded cy.wait(2500); - + // that iframe seems to need a bit. had some missing characters recently // so we click in a textfield, wait and then type const clickTimeMS = 100; @@ -134,4 +142,12 @@ export default class PaymentAction { cy.get('#iDealIssuer').select(issuer); } + /** + * + */ + selectPosTerminal() { + const testTerminalID = 'Test terminal'; + cy.get('#posTerminals').select(testTerminalID); + } + } diff --git a/tests/PHPUnit/Service/MollieApi/Builder/MollieOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/MollieOrderBuilderTest.php index c6855084c..d06ffcb75 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/MollieOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/MollieOrderBuilderTest.php @@ -55,7 +55,7 @@ public function testOrderNumberFormat(string $expected, string $format): void $customer->setCustomerNumber('5000'); $order->setOrderCustomer($customer); - $data = $this->builder->build( + $data = $this->builder->buildOrderPayload( $order, '123', 'paypal', diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/ApplePayOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/ApplePayOrderBuilderTest.php index 8fb292093..54aaba26c 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/ApplePayOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/ApplePayOrderBuilderTest.php @@ -42,7 +42,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) @@ -94,7 +94,7 @@ public function testOrderBuildWithToken(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/BanContactOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/BanContactOrderBuilderTest.php index 34d805777..ae1c80653 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/BanContactOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/BanContactOrderBuilderTest.php @@ -42,7 +42,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/BankTransferOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/BankTransferOrderBuilderTest.php index b99df5ff2..0891e2f63 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/BankTransferOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/BankTransferOrderBuilderTest.php @@ -59,7 +59,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $bankDueDatetime = (new DateTime()) ->setTimezone(new DateTimeZone('UTC')) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/BelfiusOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/BelfiusOrderBuilderTest.php index 423ea6880..19b2b305a 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/BelfiusOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/BelfiusOrderBuilderTest.php @@ -42,7 +42,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/CreditCardOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/CreditCardOrderBuilderTest.php index 35d562eeb..f5f8a81e1 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/CreditCardOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/CreditCardOrderBuilderTest.php @@ -46,7 +46,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) @@ -101,7 +101,7 @@ public function testOrderBuildWithToken(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new \DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/DirectDebitOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/DirectDebitOrderBuilderTest.php index 5a3b1ee66..a04fca05b 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/DirectDebitOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/DirectDebitOrderBuilderTest.php @@ -46,7 +46,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/EpsOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/EpsOrderBuilderTest.php index 38ab47a47..e0cf50a5f 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/EpsOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/EpsOrderBuilderTest.php @@ -41,7 +41,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/GiftCardOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/GiftCardOrderBuilderTest.php index 115348e7b..282c62f75 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/GiftCardOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/GiftCardOrderBuilderTest.php @@ -41,7 +41,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/GiroPayOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/GiroPayOrderBuilderTest.php index bd06690ef..f336c1fc8 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/GiroPayOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/GiroPayOrderBuilderTest.php @@ -41,7 +41,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/IDealOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/IDealOrderBuilderTest.php index a2d057588..2edebad0a 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/IDealOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/IDealOrderBuilderTest.php @@ -46,7 +46,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/In3OrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/In3OrderBuilderTest.php index 5ab7def78..27a590c10 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/In3OrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/In3OrderBuilderTest.php @@ -42,7 +42,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build( + $actual = $this->builder->buildOrderPayload( $order, $transactionId, $paymentMethod, diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/KbcOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/KbcOrderBuilderTest.php index bf1be980f..57c3651e2 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/KbcOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/KbcOrderBuilderTest.php @@ -41,7 +41,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/PayLaterOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/PayLaterOrderBuilderTest.php index b583d43ba..f348ae186 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/PayLaterOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/PayLaterOrderBuilderTest.php @@ -41,7 +41,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/PayPalOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/PayPalOrderBuilderTest.php index 070672d41..5004197d0 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/PayPalOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/PayPalOrderBuilderTest.php @@ -42,7 +42,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) @@ -100,7 +100,7 @@ public function testOrderBuildWithDelivery(): void $order->setDeliveries($deliveries); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/PaySafeOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/PaySafeOrderBuilderTest.php index 5a741f735..a9780548f 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/PaySafeOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/PaySafeOrderBuilderTest.php @@ -45,7 +45,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/PosOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/PosOrderBuilderTest.php new file mode 100644 index 000000000..3e2422cbd --- /dev/null +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/PosOrderBuilderTest.php @@ -0,0 +1,68 @@ +assertEquals('pointofsale', PosPayment::PAYMENT_METHOD_NAME); + } + + /** + * This test verifies that the default name of our payment is correct. + * This is also used in Cypress tests. + * @return void + */ + public function testDefaultName(): void + { + $this->assertEquals('POS Terminal', PosPayment::PAYMENT_METHOD_DESCRIPTION); + } + + /** + * This test verifies that the terminal ID is extracted from the customers + * custom fields, if it is set. + * @return void + */ + public function testTerminalIsExtractedFromCustomer(): void + { + $pos = new PosPayment( + $this->loggerService, + new FakeContainer() + ); + + $customer = new CustomerEntity(); + + $customer->setCustomFields( + [ + 'mollie_payments' => [ + 'preferred_pos_terminal' => 'term_123' + ] + ] + ); + + $pos->processPaymentMethodSpecificParameters( + [], + new OrderEntity(), + $this->salesChannelContext, + $customer + ); + + $terminalID = $pos->getTerminalId(); + + $this->assertEquals('term_123', $terminalID); + } + +} diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/Przelewy24OrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/Przelewy24OrderBuilderTest.php index cd6be6501..50b494626 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/Przelewy24OrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/Przelewy24OrderBuilderTest.php @@ -41,7 +41,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/SliceItOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/SliceItOrderBuilderTest.php index 11ad24819..c1448682e 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/SliceItOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/SliceItOrderBuilderTest.php @@ -41,7 +41,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/MollieApi/Builder/Payments/SofortOrderBuilderTest.php b/tests/PHPUnit/Service/MollieApi/Builder/Payments/SofortOrderBuilderTest.php index 20e9c6597..f7554127f 100644 --- a/tests/PHPUnit/Service/MollieApi/Builder/Payments/SofortOrderBuilderTest.php +++ b/tests/PHPUnit/Service/MollieApi/Builder/Payments/SofortOrderBuilderTest.php @@ -42,7 +42,7 @@ public function testOrderBuild(): void $order = $this->getOrderEntity($amountTotal, $taxStatus, $currencyISO, $lineItems, $orderNumber); - $actual = $this->builder->build($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); + $actual = $this->builder->buildOrderPayload($order, $transactionId, $paymentMethod, $this->salesChannelContext, $this->paymentHandler, []); $expectedOrderLifeTime = (new DateTime())->setTimezone(new DateTimeZone('UTC')) ->modify(sprintf('+%d day', $this->expiresAt)) diff --git a/tests/PHPUnit/Service/PaymentMethodServiceTest.php b/tests/PHPUnit/Service/PaymentMethodServiceTest.php index 6c046d14b..9e03666d5 100644 --- a/tests/PHPUnit/Service/PaymentMethodServiceTest.php +++ b/tests/PHPUnit/Service/PaymentMethodServiceTest.php @@ -19,6 +19,7 @@ use Kiener\MolliePayments\Handler\Method\KlarnaSliceItPayment; use Kiener\MolliePayments\Handler\Method\PayPalPayment; use Kiener\MolliePayments\Handler\Method\PaySafeCardPayment; +use Kiener\MolliePayments\Handler\Method\PosPayment; use Kiener\MolliePayments\Handler\Method\Przelewy24Payment; use Kiener\MolliePayments\Handler\Method\SofortPayment; use Kiener\MolliePayments\Handler\Method\VoucherPayment; @@ -110,7 +111,8 @@ public function testSupportedMethods(): void Przelewy24Payment::class, SofortPayment::class, VoucherPayment::class, - In3Payment::class + In3Payment::class, + PosPayment::class, ]; $handlers = $this->paymentMethodService->getPaymentHandlers(); diff --git a/tests/Swagger/mollie-headless.yaml b/tests/Swagger/mollie-headless.yaml index ef0b54628..6f6fdbd1a 100644 --- a/tests/Swagger/mollie-headless.yaml +++ b/tests/Swagger/mollie-headless.yaml @@ -198,6 +198,40 @@ paths: description: "successful operation" + /store-api/mollie/pos/terminals: + get: + tags: + - "POS" + summary: "Gets a list of available POS terminals" + security: + - AccessKey: [ ] + - AccessToken: [ ] + responses: + "200": + description: "successful operation" + + /store-api/mollie/pos/store-terminal/{customerId}/{terminalId}: + post: + tags: + - "POS" + summary: "Save the selected terminal for an upcoming payment in Shopware" + security: + - AccessKey: [ ] + - AccessToken: [ ] + parameters: + - name: "customerId" + in: "path" + description: "Shopware Customer ID" + required: true + - name: "terminalId" + in: "path" + description: "Mollie Terminal ID of Mollie, e.g. term_X9X..., ..." + required: true + responses: + "200": + description: "successful operation" + + /store-api/mollie/applepay/enabled: get: tags: