diff --git a/.env.dist b/.env.dist index f6d35eec..33902df3 100644 --- a/.env.dist +++ b/.env.dist @@ -57,6 +57,7 @@ COUNTRY_CODE=+insert_country_code_here # redis hash LATEST_ACTIVE_JO=latest_active_jo +HUB_JO_KEY=hub_jo_count # dashboard DASHBOARD_ENABLE=set_to_true_or_false diff --git a/composer.json b/composer.json index 20b9c833..5313b64a 100644 --- a/composer.json +++ b/composer.json @@ -25,6 +25,7 @@ "symfony/flex": "^1.0", "symfony/framework-bundle": "^4.0", "symfony/maker-bundle": "^1.0", + "symfony/monolog-bundle": "^3.7", "symfony/orm-pack": "^1.0", "symfony/process": "^4.0", "symfony/profiler-pack": "^1.0", diff --git a/composer.lock b/composer.lock index 6f8cb6bb..b4855595 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ad9d56a6dff26742f024917e58b919f9", + "content-hash": "ec7f40b23cfd3577e34ebf2646576889", "packages": [ { "name": "catalyst/auth-bundle", @@ -26,6 +26,7 @@ "php": "^7.0", "symfony/framework-bundle": "~4.0" }, + "default-branch": true, "type": "symfony-bundle", "autoload": { "psr-4": { @@ -41,6 +42,9 @@ "email": "kc@jankstudio.com" } ], + "support": { + "issues": "https://gitlab.com/api/v4/projects/12709261/issues" + }, "time": "2019-07-01T09:45:41+00:00" }, { @@ -63,6 +67,7 @@ "php": "^7.0", "symfony/framework-bundle": "~4.0" }, + "default-branch": true, "type": "symfony-bundle", "autoload": { "psr-4": { @@ -78,8 +83,84 @@ "email": "kc@jankstudio.com" } ], + "support": { + "issues": "https://gitlab.com/api/v4/projects/12712039/issues" + }, "time": "2019-06-14T09:43:30+00:00" }, + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.1", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6", + "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-11-11T10:22:58+00:00" + }, { "name": "creof/doctrine2-spatial", "version": "1.2.0", @@ -135,6 +216,10 @@ "postgresql", "spatial" ], + "support": { + "issues": "https://github.com/creof/doctrine2-spatial/issues", + "source": "https://github.com/creof/doctrine2-spatial/tree/master" + }, "time": "2017-07-13T16:48:25+00:00" }, { @@ -188,6 +273,10 @@ "string", "text" ], + "support": { + "issues": "https://github.com/creof/geo-parser/issues", + "source": "https://github.com/creof/geo-parser/tree/master" + }, "time": "2019-08-07T17:45:01+00:00" }, { @@ -240,6 +329,10 @@ "text", "wkb" ], + "support": { + "issues": "https://github.com/creof/wkb-parser/issues", + "source": "https://github.com/creof/wkb-parser/tree/master" + }, "time": "2016-05-22T22:47:16+00:00" }, { @@ -293,20 +386,24 @@ "text", "wkt" ], + "support": { + "issues": "https://github.com/creof/wkt-parser/issues", + "source": "https://github.com/creof/wkt-parser/tree/master" + }, "time": "2016-05-03T16:15:16+00:00" }, { "name": "data-dog/audit-bundle", - "version": "v0.1.18", + "version": "v0.1.20", "source": { "type": "git", "url": "https://github.com/DATA-DOG/DataDogAuditBundle.git", - "reference": "9012a272f1aebd590ab1e324d951655cb48b097c" + "reference": "d80a751dd55f105045222a2061de9603c1a23153" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DATA-DOG/DataDogAuditBundle/zipball/9012a272f1aebd590ab1e324d951655cb48b097c", - "reference": "9012a272f1aebd590ab1e324d951655cb48b097c", + "url": "https://api.github.com/repos/DATA-DOG/DataDogAuditBundle/zipball/d80a751dd55f105045222a2061de9603c1a23153", + "reference": "d80a751dd55f105045222a2061de9603c1a23153", "shasum": "" }, "require": { @@ -363,37 +460,38 @@ "log", "orm" ], - "time": "2020-01-08T10:45:29+00:00" + "support": { + "issues": "https://github.com/DATA-DOG/DataDogAuditBundle/issues", + "source": "https://github.com/DATA-DOG/DataDogAuditBundle/tree/v0.1.20" + }, + "time": "2021-02-04T10:44:09+00:00" }, { "name": "doctrine/annotations", - "version": "1.10.2", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "b9d758e831c70751155c698c2f7df4665314a1cb" + "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/b9d758e831c70751155c698c2f7df4665314a1cb", - "reference": "b9d758e831c70751155c698c2f7df4665314a1cb", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/b17c5014ef81d212ac539f07a1001832df1b6d3b", + "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b", "shasum": "" }, "require": { "doctrine/lexer": "1.*", "ext-tokenizer": "*", - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "^7.5" + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^9.1.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" @@ -426,50 +524,53 @@ } ], "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", "keywords": [ "annotations", "docblock", "parser" ], - "time": "2020-04-20T09:18:32+00:00" + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.12.1" + }, + "time": "2021-02-21T21:00:45+00:00" }, { "name": "doctrine/cache", - "version": "1.10.0", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62" + "reference": "a9c1b59eba5a08ca2770a76eddb88922f504e8e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/382e7f4db9a12dc6c19431743a2b096041bcdd62", - "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62", + "url": "https://api.github.com/repos/doctrine/cache/zipball/a9c1b59eba5a08ca2770a76eddb88922f504e8e0", + "reference": "a9c1b59eba5a08ca2770a76eddb88922f504e8e0", "shasum": "" }, "require": { - "php": "~7.1" + "php": "~7.1 || ^8.0" }, "conflict": { - "doctrine/common": ">2.2,<2.4" + "doctrine/common": ">2.2,<2.4", + "psr/cache": ">=3" }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0", + "symfony/cache": "^4.4 || ^5.2" }, "suggest": { "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" @@ -514,37 +615,50 @@ "redis", "xcache" ], - "time": "2019-11-29T15:36:20+00:00" + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/1.11.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2021-04-13T14:46:17+00:00" }, { "name": "doctrine/collections", - "version": "1.6.4", + "version": "1.6.7", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7" + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7", - "reference": "6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7", + "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^6.0", "phpstan/phpstan-shim": "^0.9.2", "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.2.2" + "vimeo/psalm": "^3.8.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" @@ -584,20 +698,24 @@ "iterators", "php" ], - "time": "2019-11-13T13:07:11+00:00" + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/1.6.7" + }, + "time": "2020-07-27T17:53:49+00:00" }, { "name": "doctrine/common", - "version": "2.13.0", + "version": "2.13.3", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "308728eae8d90412d850c155d40b1cfbede549da" + "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/308728eae8d90412d850c155d40b1cfbede549da", - "reference": "308728eae8d90412d850c155d40b1cfbede549da", + "url": "https://api.github.com/repos/doctrine/common/zipball/f3812c026e557892c34ef37f6ab808a6b567da7f", + "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f", "shasum": "" }, "require": { @@ -609,7 +727,7 @@ "doctrine/lexer": "^1.0", "doctrine/persistence": "^1.3.3", "doctrine/reflection": "^1.0", - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^1.0", @@ -667,36 +785,55 @@ "doctrine", "php" ], - "time": "2020-05-15T05:51:54+00:00" + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/2.13.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2020-06-05T16:46:05+00:00" }, { "name": "doctrine/dbal", - "version": "2.10.2", + "version": "2.13.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8" + "reference": "c800380457948e65bbd30ba92cc17cda108bf8c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/aab745e7b6b2de3b47019da81e7225e14dcfdac8", - "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c800380457948e65bbd30ba92cc17cda108bf8c9", + "reference": "c800380457948e65bbd30ba92cc17cda108bf8c9", "shasum": "" }, "require": { "doctrine/cache": "^1.0", + "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", "ext-pdo": "*", - "php": "^7.2" + "php": "^7.1 || ^8" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "jetbrains/phpstorm-stubs": "^2019.1", - "nikic/php-parser": "^4.4", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^8.4.1", + "doctrine/coding-standard": "8.2.0", + "jetbrains/phpstorm-stubs": "2020.2", + "phpstan/phpstan": "0.12.81", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.0", + "squizlabs/php_codesniffer": "3.6.0", "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "^3.11" + "vimeo/psalm": "4.6.4" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -705,12 +842,6 @@ "bin/doctrine-dbal" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.10.x-dev", - "dev-develop": "3.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" @@ -761,32 +892,93 @@ "sqlserver", "sqlsrv" ], - "time": "2020-04-20T17:19:26+00:00" + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.13.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2021-04-17T17:30:19+00:00" }, { - "name": "doctrine/doctrine-bundle", - "version": "2.0.8", + "name": "doctrine/deprecations", + "version": "v0.5.3", "source": { "type": "git", - "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "b0e0deb6e700438401ede433a15a6372d2285202" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/b0e0deb6e700438401ede433a15a6372d2285202", - "reference": "b0e0deb6e700438401ede433a15a6372d2285202", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", "shasum": "" }, "require": { - "doctrine/dbal": "^2.9.0", - "doctrine/persistence": "^1.3.3", - "jdorn/sql-formatter": "^1.2.16", - "php": "^7.1", + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0|^7.0|^8.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" + }, + "time": "2021-03-21T12:59:47+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "a08bc3b4d8567cdff05e89b272ba1e06e9d71c21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/a08bc3b4d8567cdff05e89b272ba1e06e9d71c21", + "reference": "a08bc3b4d8567cdff05e89b272ba1e06e9d71c21", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9.0|^3.0", + "doctrine/persistence": "^1.3.3|^2.0", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.1 || ^8.0", "symfony/cache": "^4.3.3|^5.0", "symfony/config": "^4.3.3|^5.0", "symfony/console": "^3.4.30|^4.3.3|^5.0", "symfony/dependency-injection": "^4.3.3|^5.0", - "symfony/doctrine-bridge": "^4.3.7|^5.0", + "symfony/doctrine-bridge": "^4.4.7|^5.0", "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0", "symfony/service-contracts": "^1.1.1|^2.0" }, @@ -795,29 +987,29 @@ "twig/twig": "<1.34|>=2.0,<2.4" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "doctrine/orm": "^2.6", - "ocramius/proxy-manager": "^2.1", - "phpunit/phpunit": "^7.5", - "symfony/phpunit-bridge": "^4.2", + "friendsofphp/proxy-manager-lts": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", + "psalm/plugin-phpunit": "^0.15.1", + "psalm/plugin-symfony": "^2.2.4", + "symfony/phpunit-bridge": "^5.2", "symfony/property-info": "^4.3.3|^5.0", "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", + "symfony/security-bundle": "^4.4|5.0", "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", "symfony/validator": "^3.4.30|^4.3.3|^5.0", "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", "symfony/yaml": "^3.4.30|^4.3.3|^5.0", - "twig/twig": "^1.34|^2.12" + "twig/twig": "^1.34|^2.12|^3.0", + "vimeo/psalm": "^4.7" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", "symfony/web-profiler-bundle": "To use the data collector." }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Bundle\\DoctrineBundle\\": "" @@ -853,7 +1045,25 @@ "orm", "persistence" ], - "time": "2020-04-23T10:52:09+00:00" + "support": { + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.3.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2021-04-05T14:21:02+00:00" }, { "name": "doctrine/doctrine-cache-bundle", @@ -944,35 +1154,39 @@ "cache", "caching" ], + "support": { + "issues": "https://github.com/doctrine/DoctrineCacheBundle/issues", + "source": "https://github.com/doctrine/DoctrineCacheBundle/tree/1.4.0" + }, "abandoned": true, "time": "2019-11-29T11:22:01+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "2.1.2", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "856437e8de96a70233e1f0cc2352fc8dd15a899d" + "reference": "85f0b847174daf243362c7da80efe1539be64f47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/856437e8de96a70233e1f0cc2352fc8dd15a899d", - "reference": "856437e8de96a70233e1f0cc2352fc8dd15a899d", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/85f0b847174daf243362c7da80efe1539be64f47", + "reference": "85f0b847174daf243362c7da80efe1539be64f47", "shasum": "" }, "require": { "doctrine/doctrine-bundle": "~1.0|~2.0", "doctrine/migrations": "^2.2", - "php": "^7.1", + "php": "^7.1|^8.0", "symfony/framework-bundle": "~3.4|~4.0|~5.0" }, "require-dev": { - "doctrine/coding-standard": "^5.0", + "doctrine/coding-standard": "^8.0", "mikey179/vfsstream": "^1.6", - "phpstan/phpstan": "^0.9.2", - "phpstan/phpstan-strict-rules": "^0.9", - "phpunit/phpunit": "^6.4|^7.0" + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "symfony-bundle", "extra": { @@ -1013,24 +1227,42 @@ "migrations", "schema" ], - "time": "2019-11-13T12:57:41+00:00" + "support": { + "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-migrations-bundle", + "type": "tidelift" + } + ], + "time": "2020-12-23T15:06:17+00:00" }, { "name": "doctrine/event-manager", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "629572819973f13486371cb611386eb17851e85c" + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/629572819973f13486371cb611386eb17851e85c", - "reference": "629572819973f13486371cb611386eb17851e85c", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.9@dev" @@ -1089,30 +1321,48 @@ "event system", "events" ], - "time": "2019-11-10T09:48:07+00:00" + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2020-05-29T18:28:51+00:00" }, { "name": "doctrine/inflector", - "version": "1.4.1", + "version": "1.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "4111f6853aea6f28b2b1dcfdde83d12dd3d5e6e3" + "reference": "4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4111f6853aea6f28b2b1dcfdde83d12dd3d5e6e3", - "reference": "4111f6853aea6f28b2b1dcfdde83d12dd3d5e6e3", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9", + "reference": "4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9", "shasum": "" }, "require": { - "php": "^7.2" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", + "doctrine/coding-standard": "^8.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", @@ -1167,40 +1417,53 @@ "uppercase", "words" ], - "time": "2020-05-09T15:09:09+00:00" + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/1.4.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-04-16T17:34:40+00:00" }, { "name": "doctrine/instantiator", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" @@ -1214,7 +1477,7 @@ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", @@ -1223,24 +1486,42 @@ "constructor", "instantiate" ], - "time": "2019-10-21T16:45:58+00:00" + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-11-10T18:47:58+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6" + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", - "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", "shasum": "" }, "require": { - "php": "^7.2" + "php": "^7.2 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^6.0", @@ -1285,41 +1566,59 @@ "parser", "php" ], - "time": "2019-10-30T14:39:59+00:00" + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" }, { "name": "doctrine/migrations", - "version": "2.2.1", + "version": "2.3.3", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "a3987131febeb0e9acb3c47ab0df0af004588934" + "reference": "c4c46f7064f6e7795bd7f26549579918b46790fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/a3987131febeb0e9acb3c47ab0df0af004588934", - "reference": "a3987131febeb0e9acb3c47ab0df0af004588934", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/c4c46f7064f6e7795bd7f26549579918b46790fa", + "reference": "c4c46f7064f6e7795bd7f26549579918b46790fa", "shasum": "" }, "require": { + "composer/package-versions-deprecated": "^1.8", "doctrine/dbal": "^2.9", - "ocramius/package-versions": "^1.3", - "ocramius/proxy-manager": "^2.0.2", - "php": "^7.1", - "symfony/console": "^3.4||^4.0||^5.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "php": "^7.1 || ^8.0", + "symfony/console": "^3.4||^4.4.16||^5.0", "symfony/stopwatch": "^3.4||^4.0||^5.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.2", "doctrine/orm": "^2.6", "ext-pdo_sqlite": "*", "jdorn/sql-formatter": "^1.1", "mikey179/vfsstream": "^1.6", - "phpstan/phpstan": "^0.10", - "phpstan/phpstan-deprecation-rules": "^0.10", - "phpstan/phpstan-phpunit": "^0.10", - "phpstan/phpstan-strict-rules": "^0.10", - "phpunit/phpunit": "^7.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", "symfony/process": "^3.4||^4.0||^5.0", "symfony/yaml": "^3.4||^4.0||^5.0" }, @@ -1367,40 +1666,62 @@ "migrations", "php" ], - "time": "2019-12-04T06:09:14+00:00" + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/2.3.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2021-03-14T10:22:48+00:00" }, { "name": "doctrine/orm", - "version": "v2.7.2", + "version": "2.7.5", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "dafe298ce5d0b995ebe1746670704c0a35868a6a" + "reference": "01187c9260cd085529ddd1273665217cae659640" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/dafe298ce5d0b995ebe1746670704c0a35868a6a", - "reference": "dafe298ce5d0b995ebe1746670704c0a35868a6a", + "url": "https://api.github.com/repos/doctrine/orm/zipball/01187c9260cd085529ddd1273665217cae659640", + "reference": "01187c9260cd085529ddd1273665217cae659640", "shasum": "" }, "require": { - "doctrine/annotations": "^1.8", + "composer/package-versions-deprecated": "^1.8", + "doctrine/annotations": "^1.11.1", "doctrine/cache": "^1.9.1", "doctrine/collections": "^1.5", - "doctrine/common": "^2.11", + "doctrine/common": "^2.11 || ^3.0", "doctrine/dbal": "^2.9.3", "doctrine/event-manager": "^1.1", + "doctrine/inflector": "^1.0", "doctrine/instantiator": "^1.3", - "doctrine/persistence": "^1.2", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^1.3.3 || ^2.0", "ext-pdo": "*", - "ocramius/package-versions": "^1.2", "php": "^7.1", "symfony/console": "^3.0|^4.0|^5.0" }, "require-dev": { - "doctrine/coding-standard": "^5.0", - "phpunit/phpunit": "^7.5", - "symfony/yaml": "^3.4|^4.0|^5.0" + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^8.0", + "symfony/yaml": "^3.4|^4.0|^5.0", + "vimeo/psalm": "^3.11" }, "suggest": { "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" @@ -1451,20 +1772,24 @@ "database", "orm" ], - "time": "2020-03-19T06:41:02+00:00" + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/2.7.5" + }, + "time": "2020-12-03T08:52:14+00:00" }, { "name": "doctrine/persistence", - "version": "1.3.7", + "version": "1.3.8", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0" + "reference": "7a6eac9fb6f61bba91328f15aa7547f4806ca288" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0", - "reference": "0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/7a6eac9fb6f61bba91328f15aa7547f4806ca288", + "reference": "7a6eac9fb6f61bba91328f15aa7547f4806ca288", "shasum": "" }, "require": { @@ -1473,7 +1798,7 @@ "doctrine/collections": "^1.0", "doctrine/event-manager": "^1.0", "doctrine/reflection": "^1.2", - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.10@dev" @@ -1481,7 +1806,8 @@ "require-dev": { "doctrine/coding-standard": "^6.0", "phpstan/phpstan": "^0.11", - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^3.11" }, "type": "library", "extra": { @@ -1534,36 +1860,54 @@ "orm", "persistence" ], - "time": "2020-03-21T15:13:52+00:00" + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/1.3.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2020-06-20T12:56:16+00:00" }, { "name": "doctrine/reflection", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/reflection.git", - "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79" + "reference": "fa587178be682efe90d005e3a322590d6ebb59a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/55e71912dfcd824b2fdd16f2d9afe15684cfce79", - "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/fa587178be682efe90d005e3a322590d6ebb59a5", + "reference": "fa587178be682efe90d005e3a322590d6ebb59a5", "shasum": "" }, "require": { "doctrine/annotations": "^1.0", "ext-tokenizer": "*", - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^5.0", + "doctrine/coding-standard": "^6.0 || ^8.2.0", "doctrine/common": "^2.10", - "phpstan/phpstan": "^0.11.0", - "phpstan/phpstan-phpunit": "^0.11.0", - "phpunit/phpunit": "^7.0" + "phpstan/phpstan": "^0.11.0 || ^0.12.20", + "phpstan/phpstan-phpunit": "^0.11.0 || ^0.12.16", + "phpunit/phpunit": "^7.5 || ^9.1.5" }, "type": "library", "extra": { @@ -1612,29 +1956,91 @@ "reflection", "static" ], + "support": { + "issues": "https://github.com/doctrine/reflection/issues", + "source": "https://github.com/doctrine/reflection/tree/1.2.2" + }, "abandoned": "roave/better-reflection", - "time": "2020-03-27T11:06:43+00:00" + "time": "2020-10-27T21:46:55+00:00" }, { - "name": "edwinhoksberg/php-fcm", - "version": "1.0.0", + "name": "doctrine/sql-formatter", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/EdwinHoksberg/php-fcm.git", - "reference": "7be637139fe54ec23f37c8dba519bafa7543e336" + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "56070bebac6e77230ed7d306ad13528e60732871" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/EdwinHoksberg/php-fcm/zipball/7be637139fe54ec23f37c8dba519bafa7543e336", - "reference": "7be637139fe54ec23f37c8dba519bafa7543e336", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/56070bebac6e77230ed7d306ad13528e60732871", + "reference": "56070bebac6e77230ed7d306ad13528e60732871", "shasum": "" }, "require": { - "guzzlehttp/guzzle": "^6.3", - "php": ">= 7.0" + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.1.x" + }, + "time": "2020-07-30T16:57:33+00:00" + }, + { + "name": "edwinhoksberg/php-fcm", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/EdwinHoksberg/php-fcm.git", + "reference": "660bbe4ae71e02090f16b11b4a993dfebab83f7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/EdwinHoksberg/php-fcm/zipball/660bbe4ae71e02090f16b11b4a993dfebab83f7f", + "reference": "660bbe4ae71e02090f16b11b4a993dfebab83f7f", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.3 || ^7.0", + "php": ">= 7.2" }, "require-dev": { "mockery/mockery": "^1.0", + "php-coveralls/php-coveralls": "^2.3", "phpunit/phpunit": "^6.5" }, "type": "library", @@ -1662,27 +2068,114 @@ "google", "notifications" ], - "time": "2018-04-09T19:32:41+00:00" + "support": { + "issues": "https://github.com/EdwinHoksberg/php-fcm/issues", + "source": "https://github.com/EdwinHoksberg/php-fcm/tree/v1.2.0" + }, + "time": "2021-01-19T01:15:30+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "6.5.2", + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.3", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", - "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/121af47c9aee9c03031bdeca3fac0540f59aa5c3", + "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0" + }, + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" + }, + "require-dev": { + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" + } + }, + "autoload": { + "psr-4": { + "ProxyManager\\": "src/ProxyManager" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "support": { + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2021-01-14T21:52:44+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.0", "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5" + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" }, "require-dev": { "ext-curl": "*", @@ -1690,7 +2183,6 @@ "psr/log": "^1.1" }, "suggest": { - "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", @@ -1729,27 +2221,31 @@ "rest", "web service" ], - "time": "2019-12-23T11:57:10+00:00" + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/6.5" + }, + "time": "2020-06-16T21:01:06+00:00" }, { "name": "guzzlehttp/promises", - "version": "v1.3.1", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", "shasum": "" }, "require": { - "php": ">=5.5.0" + "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.0" + "symfony/phpunit-bridge": "^4.4 || ^5.1" }, "type": "library", "extra": { @@ -1780,20 +2276,24 @@ "keywords": [ "promise" ], - "time": "2016-12-20T10:07:11+00:00" + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.4.1" + }, + "time": "2021-03-07T09:25:29+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.6.1", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + "reference": "dc960a912984efb74d0a90222870c72c87f10c91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91", "shasum": "" }, "require": { @@ -1806,15 +2306,15 @@ }, "require-dev": { "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" }, "suggest": { - "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.7-dev" } }, "autoload": { @@ -1851,57 +2351,206 @@ "uri", "url" ], - "time": "2019-07-01T23:21:34+00:00" + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.8.2" + }, + "time": "2021-04-26T09:17:50+00:00" }, { - "name": "jdorn/sql-formatter", - "version": "v1.2.17", + "name": "laminas/laminas-code", + "version": "3.4.1", "source": { "type": "git", - "url": "https://github.com/jdorn/sql-formatter.git", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" + "url": "https://github.com/laminas/laminas-code.git", + "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1cb8f203389ab1482bf89c0e70a04849bacd7766", + "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766", "shasum": "" }, "require": { - "php": ">=5.2.4" + "laminas/laminas-eventmanager": "^2.6 || ^3.0", + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^7.1" + }, + "conflict": { + "phpspec/prophecy": "<1.9.0" + }, + "replace": { + "zendframework/zend-code": "self.version" }, "require-dev": { - "phpunit/phpunit": "3.7.*" + "doctrine/annotations": "^1.7", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^1.0", + "laminas/laminas-stdlib": "^2.7 || ^3.0", + "phpunit/phpunit": "^7.5.16 || ^8.4" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "3.4.x-dev", + "dev-develop": "3.5.x-dev", + "dev-dev-4.0": "4.0.x-dev" } }, "autoload": { - "classmap": [ - "lib" - ] + "psr-4": { + "Laminas\\Code\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], - "authors": [ + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" + }, + "time": "2019-12-31T16:28:24+00:00" + }, + { + "name": "laminas/laminas-eventmanager", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-eventmanager.git", + "reference": "ce4dc0bdf3b14b7f9815775af9dfee80a63b4748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/ce4dc0bdf3b14b7f9815775af9dfee80a63b4748", + "reference": "ce4dc0bdf3b14b7f9815775af9dfee80a63b4748", + "shasum": "" + }, + "require": { + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^5.6 || ^7.0" + }, + "replace": { + "zendframework/zend-eventmanager": "self.version" + }, + "require-dev": { + "athletic/athletic": "^0.1", + "container-interop/container-interop": "^1.1.0", + "laminas/laminas-coding-standard": "~1.0.0", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" + }, + "suggest": { + "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev", + "dev-develop": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Laminas\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://laminas.dev", + "keywords": [ + "event", + "eventmanager", + "events", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-eventmanager/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-eventmanager/issues", + "rss": "https://github.com/laminas/laminas-eventmanager/releases.atom", + "source": "https://github.com/laminas/laminas-eventmanager" + }, + "time": "2019-12-31T16:44:52+00:00" + }, + { + "name": "laminas/laminas-zendframework-bridge", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-zendframework-bridge.git", + "reference": "6ede70583e101030bcace4dcddd648f760ddf642" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", + "reference": "6ede70583e101030bcace4dcddd648f760ddf642", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laminas": { + "module": "Laminas\\ZendFrameworkBridge" + } + }, + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "Laminas\\ZendFrameworkBridge\\": "src//" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Alias legacy ZF class names to Laminas Project equivalents.", + "keywords": [ + "ZendFramework", + "autoloading", + "laminas", + "zf" + ], + "support": { + "forum": "https://discourse.laminas.dev/", + "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", + "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", + "source": "https://github.com/laminas/laminas-zendframework-bridge" + }, + "funding": [ { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" } ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/jdorn/sql-formatter/", - "keywords": [ - "highlight", - "sql" - ], - "time": "2014-01-12T16:20:24+00:00" + "time": "2020-09-14T14:23:00+00:00" }, { "name": "microsoft/azure-storage-blob", @@ -1945,6 +2594,10 @@ "sdk", "storage" ], + "support": { + "issues": "https://github.com/Azure/azure-storage-blob-php/issues", + "source": "https://github.com/Azure/azure-storage-blob-php/tree/v1.5.2" + }, "time": "2020-12-29T02:22:11+00:00" }, { @@ -1989,20 +2642,120 @@ "sdk", "storage" ], + "support": { + "issues": "https://github.com/Azure/azure-storage-common-php/issues", + "source": "https://github.com/Azure/azure-storage-common-php/tree/v1.5.1" + }, "time": "2020-12-28T07:59:51+00:00" }, { - "name": "nikic/php-parser", - "version": "v4.3.0", + "name": "monolog/monolog", + "version": "2.2.0", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc" + "url": "https://github.com/Seldaek/monolog.git", + "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9a9981c347c5c49d6dfe5cf826bb882b824080dc", - "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1cb1cde8e8dd0f70cc0fe51354a59acad9302084", + "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7", + "graylog2/gelf-php": "^1.4.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpspec/prophecy": "^1.6.1", + "phpstan/phpstan": "^0.12.59", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90 <7.0.1", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.2.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-12-14T13:15:25+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.10.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", "shasum": "" }, "require": { @@ -2010,8 +2763,8 @@ "php": ">=7.0" }, "require-dev": { - "ircmaxell/php-yacc": "0.0.5", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -2019,7 +2772,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.3-dev" + "dev-master": "4.9-dev" } }, "autoload": { @@ -2041,140 +2794,24 @@ "parser", "php" ], - "time": "2019-11-08T13:50:10+00:00" - }, - { - "name": "ocramius/package-versions", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/PackageVersions.git", - "reference": "44af6f3a2e2e04f2af46bcb302ad9600cba41c7d" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/44af6f3a2e2e04f2af46bcb302ad9600cba41c7d", - "reference": "44af6f3a2e2e04f2af46bcb302ad9600cba41c7d", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0.0", - "php": "^7.1.0" - }, - "require-dev": { - "composer/composer": "^1.6.3", - "doctrine/coding-standard": "^5.0.1", - "ext-zip": "*", - "infection/infection": "^0.7.1", - "phpunit/phpunit": "^7.5.17" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "time": "2019-11-15T16:17:10+00:00" - }, - { - "name": "ocramius/proxy-manager", - "version": "2.2.3", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "4d154742e31c35137d5374c998e8f86b54db2e2f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/4d154742e31c35137d5374c998e8f86b54db2e2f", - "reference": "4d154742e31c35137d5374c998e8f86b54db2e2f", - "shasum": "" - }, - "require": { - "ocramius/package-versions": "^1.1.3", - "php": "^7.2.0", - "zendframework/zend-code": "^3.3.0" - }, - "require-dev": { - "couscous/couscous": "^1.6.1", - "ext-phar": "*", - "humbug/humbug": "1.0.0-RC.0@RC", - "nikic/php-parser": "^3.1.1", - "padraic/phpunit-accelerator": "dev-master@DEV", - "phpbench/phpbench": "^0.12.2", - "phpstan/phpstan": "dev-master#856eb10a81c1d27c701a83f167dc870fd8f4236a as 0.9.999", - "phpstan/phpstan-phpunit": "dev-master#5629c0a1f4a9c417cb1077cf6693ad9753895761", - "phpunit/phpunit": "^6.4.3", - "squizlabs/php_codesniffer": "^2.9.1" - }, - "suggest": { - "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects", - "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)", - "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)", - "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "ProxyManager\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.io/" - } - ], - "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", - "homepage": "https://github.com/Ocramius/ProxyManager", - "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" - ], - "time": "2019-08-10T08:37:15+00:00" + "time": "2020-12-20T10:01:03+00:00" }, { "name": "predis/predis", - "version": "v1.1.1", + "version": "v1.1.7", "source": { "type": "git", "url": "https://github.com/predis/predis.git", - "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1" + "reference": "b240daa106d4e02f0c5b7079b41e31ddf66fddf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1", - "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1", + "url": "https://api.github.com/repos/predis/predis/zipball/b240daa106d4e02f0c5b7079b41e31ddf66fddf8", + "reference": "b240daa106d4e02f0c5b7079b41e31ddf66fddf8", "shasum": "" }, "require": { @@ -2201,17 +2838,33 @@ { "name": "Daniele Alessandri", "email": "suppakilla@gmail.com", - "homepage": "http://clorophilla.net" + "homepage": "http://clorophilla.net", + "role": "Creator & Maintainer" + }, + { + "name": "Till Krüss", + "homepage": "https://till.im", + "role": "Maintainer" } ], "description": "Flexible and feature-complete Redis client for PHP and HHVM", - "homepage": "http://github.com/nrk/predis", + "homepage": "http://github.com/predis/predis", "keywords": [ "nosql", "predis", "redis" ], - "time": "2016-06-16T16:22:20+00:00" + "support": { + "issues": "https://github.com/predis/predis/issues", + "source": "https://github.com/predis/predis/tree/v1.1.7" + }, + "funding": [ + { + "url": "https://github.com/sponsors/tillkruss", + "type": "github" + } + ], + "time": "2021-04-04T19:34:46+00:00" }, { "name": "psr/cache", @@ -2257,31 +2910,29 @@ "psr", "psr-6" ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, "time": "2016-08-06T20:24:11+00:00" }, { "name": "psr/container", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -2294,7 +2945,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common Container Interface (PHP FIG PSR-11)", @@ -2306,7 +2957,11 @@ "container-interop", "psr" ], - "time": "2017-02-14T16:28:37+00:00" + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, + "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/http-message", @@ -2356,6 +3011,9 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, "time": "2016-08-06T14:39:51+00:00" }, { @@ -2403,6 +3061,9 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, "time": "2020-03-23T09:12:05+00:00" }, { @@ -2443,59 +3104,61 @@ } ], "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, "time": "2019-03-08T08:55:37+00:00" }, { "name": "sensio/framework-extra-bundle", - "version": "v5.5.3", + "version": "v5.6.1", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "98f0807137b13d0acfdf3c255a731516e97015de" + "reference": "430d14c01836b77c28092883d195a43ce413ee32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/98f0807137b13d0acfdf3c255a731516e97015de", - "reference": "98f0807137b13d0acfdf3c255a731516e97015de", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/430d14c01836b77c28092883d195a43ce413ee32", + "reference": "430d14c01836b77c28092883d195a43ce413ee32", "shasum": "" }, "require": { "doctrine/annotations": "^1.0", - "php": ">=7.1.3", - "symfony/config": "^4.3|^5.0", - "symfony/dependency-injection": "^4.3|^5.0", - "symfony/framework-bundle": "^4.3|^5.0", - "symfony/http-kernel": "^4.3|^5.0" + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" }, "conflict": { - "doctrine/doctrine-cache-bundle": "<1.3.1" + "doctrine/doctrine-cache-bundle": "<1.3.1", + "doctrine/persistence": "<1.3" }, "require-dev": { + "doctrine/dbal": "^2.10|^3.0", "doctrine/doctrine-bundle": "^1.11|^2.0", "doctrine/orm": "^2.5", "nyholm/psr7": "^1.1", - "symfony/browser-kit": "^4.3|^5.0", - "symfony/dom-crawler": "^4.3|^5.0", - "symfony/expression-language": "^4.3|^5.0", - "symfony/finder": "^4.3|^5.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/doctrine-bridge": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", "symfony/monolog-bridge": "^4.0|^5.0", "symfony/monolog-bundle": "^3.2", - "symfony/phpunit-bridge": "^4.3.5|^5.0", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9", "symfony/psr-http-message-bridge": "^1.1", - "symfony/security-bundle": "^4.3|^5.0", - "symfony/twig-bundle": "^4.3|^5.0", - "symfony/yaml": "^4.3|^5.0", + "symfony/security-bundle": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", "twig/twig": "^1.34|^2.4|^3.0" }, - "suggest": { - "symfony/expression-language": "", - "symfony/psr-http-message-bridge": "To use the PSR-7 converters", - "symfony/security-bundle": "" - }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.5.x-dev" + "dev-master": "5.6.x-dev" } }, "autoload": { @@ -2521,22 +3184,30 @@ "annotations", "controllers" ], - "time": "2019-12-27T08:57:19+00:00" + "support": { + "issues": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/issues", + "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v5.6.1" + }, + "time": "2020-08-25T19:10:18+00:00" }, { "name": "setasign/fpdf", - "version": "1.8.2", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/Setasign/FPDF.git", - "reference": "d77904018090c17dc9f3ab6e944679a7a47e710a" + "reference": "6a83253ece0df1c5b6c05fe7a900c660ae38afc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDF/zipball/d77904018090c17dc9f3ab6e944679a7a47e710a", - "reference": "d77904018090c17dc9f3ab6e944679a7a47e710a", + "url": "https://api.github.com/repos/Setasign/FPDF/zipball/6a83253ece0df1c5b6c05fe7a900c660ae38afc3", + "reference": "6a83253ece0df1c5b6c05fe7a900c660ae38afc3", "shasum": "" }, + "require": { + "ext-gd": "*", + "ext-zlib": "*" + }, "type": "library", "autoload": { "classmap": [ @@ -2560,24 +3231,27 @@ "fpdf", "pdf" ], - "time": "2019-12-08T10:32:10+00:00" + "support": { + "source": "https://github.com/Setasign/FPDF/tree/1.8.3" + }, + "time": "2021-04-20T09:49:57+00:00" }, { "name": "symfony/asset", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "2c67c89d064bfb689ea6bc41217c87100bb94c17" + "reference": "aeedecee0bce60320521083efaf6c359ad710e20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/2c67c89d064bfb689ea6bc41217c87100bb94c17", - "reference": "2c67c89d064bfb689ea6bc41217c87100bb94c17", + "url": "https://api.github.com/repos/symfony/asset/zipball/aeedecee0bce60320521083efaf6c359ad710e20", + "reference": "aeedecee0bce60320521083efaf6c359ad710e20", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "require-dev": { "symfony/http-foundation": "^3.4|^4.0|^5.0", @@ -2587,11 +3261,6 @@ "symfony/http-foundation": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Asset\\": "" @@ -2614,59 +3283,75 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Asset Component", + "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "support": { + "source": "https://github.com/symfony/asset/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-07T15:47:03+00:00" }, { "name": "symfony/cache", - "version": "v5.0.8", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "0c5f5b1882dc82b255a4bdead4ed3c7738cddc04" + "reference": "1d801d1dc5e3840e832568db6b35a954cfb435a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/0c5f5b1882dc82b255a4bdead4ed3c7738cddc04", - "reference": "0c5f5b1882dc82b255a4bdead4ed3c7738cddc04", + "url": "https://api.github.com/repos/symfony/cache/zipball/1d801d1dc5e3840e832568db6b35a954cfb435a8", + "reference": "1d801d1dc5e3840e832568db6b35a954cfb435a8", "shasum": "" }, "require": { - "php": "^7.2.5", - "psr/cache": "~1.0", - "psr/log": "~1.0", + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", + "psr/log": "^1.1", "symfony/cache-contracts": "^1.1.7|^2", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" }, "conflict": { - "doctrine/dbal": "<2.5", + "doctrine/dbal": "<2.10", "symfony/dependency-injection": "<4.4", "symfony/http-kernel": "<4.4", "symfony/var-dumper": "<4.4" }, "provide": { - "psr/cache-implementation": "1.0", + "psr/cache-implementation": "1.0|2.0", "psr/simple-cache-implementation": "1.0", - "symfony/cache-implementation": "1.0" + "symfony/cache-implementation": "1.0|2.0" }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/cache": "~1.6", - "doctrine/dbal": "~2.5", - "predis/predis": "~1.1", + "doctrine/cache": "^1.6", + "doctrine/dbal": "^2.10|^3.0", + "predis/predis": "^1.1", "psr/simple-cache": "^1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", "symfony/var-dumper": "^4.4|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" @@ -2689,31 +3374,48 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation", "homepage": "https://symfony.com", "keywords": [ "caching", "psr6" ], - "time": "2020-04-28T17:58:55+00:00" + "support": { + "source": "https://github.com/symfony/cache/tree/v5.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-23T16:56:33+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.0.1", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "23ed8bfc1a4115feca942cb5f1aacdf3dcdf3c16" + "reference": "c0446463729b89dd4fa62e9aeecc80287323615d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/23ed8bfc1a4115feca942cb5f1aacdf3dcdf3c16", - "reference": "23ed8bfc1a4115feca942cb5f1aacdf3dcdf3c16", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/c0446463729b89dd4fa62e9aeecc80287323615d", + "reference": "c0446463729b89dd4fa62e9aeecc80287323615d", "shasum": "" }, "require": { - "php": "^7.2.5", - "psr/cache": "^1.0" + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" }, "suggest": { "symfony/cache-implementation": "" @@ -2721,7 +3423,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -2753,26 +3459,45 @@ "interoperability", "standards" ], - "time": "2019-11-18T17:27:11+00:00" + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/config", - "version": "v5.0.8", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "db1674e1a261148429f123871f30d211992294e7" + "reference": "3817662ada105c8c4d1afdb4ec003003efd1d8d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/db1674e1a261148429f123871f30d211992294e7", - "reference": "db1674e1a261148429f123871f30d211992294e7", + "url": "https://api.github.com/repos/symfony/config/zipball/3817662ada105c8c4d1afdb4ec003003efd1d8d8", + "reference": "3817662ada105c8c4d1afdb4ec003003efd1d8d8", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/finder": "<4.4" @@ -2788,11 +3513,6 @@ "symfony/yaml": "To use the yaml reference dumper" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Config\\": "" @@ -2815,28 +3535,46 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Config Component", + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", - "time": "2020-04-15T15:59:10+00:00" + "support": { + "source": "https://github.com/symfony/config/tree/v5.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-07T16:07:52+00:00" }, { "name": "symfony/console", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f512001679f37e6a042b51897ed24a2f05eba656" + "reference": "36bbd079b69b94bcc9c9c9e1e37ca3b1e7971625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f512001679f37e6a042b51897ed24a2f05eba656", - "reference": "f512001679f37e6a042b51897ed24a2f05eba656", + "url": "https://api.github.com/repos/symfony/console/zipball/36bbd079b69b94bcc9c9c9e1e37ca3b1e7971625", + "reference": "36bbd079b69b94bcc9c9c9e1e37ca3b1e7971625", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2" }, "conflict": { @@ -2864,11 +3602,6 @@ "symfony/process": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" @@ -2891,27 +3624,45 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "time": "2020-01-25T12:44:29+00:00" + "support": { + "source": "https://github.com/symfony/console/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-16T17:32:19+00:00" }, { "name": "symfony/debug", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "20236471058bbaa9907382500fc14005c84601f0" + "reference": "45b2136377cca5f10af858968d6079a482bca473" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/20236471058bbaa9907382500fc14005c84601f0", - "reference": "20236471058bbaa9907382500fc14005c84601f0", + "url": "https://api.github.com/repos/symfony/debug/zipball/45b2136377cca5f10af858968d6079a482bca473", + "reference": "45b2136377cca5f10af858968d6079a482bca473", "shasum": "" }, "require": { - "php": "^7.1.3", - "psr/log": "~1.0" + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/http-kernel": "<3.4" @@ -2920,11 +3671,6 @@ "symfony/http-kernel": "^3.4|^4.0|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Debug\\": "" @@ -2947,41 +3693,60 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Debug Component", + "description": "Provides tools to ease debugging PHP code", "homepage": "https://symfony.com", - "time": "2020-01-25T12:44:29+00:00" + "support": { + "source": "https://github.com/symfony/debug/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-02T07:50:12+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.0.8", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "92d8b3bd896a87cdd8aba0a3dd041bc072e8cfba" + "reference": "6ca378b99e3c9ba6127eb43b68389fb2b7348577" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/92d8b3bd896a87cdd8aba0a3dd041bc072e8cfba", - "reference": "92d8b3bd896a87cdd8aba0a3dd041bc072e8cfba", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6ca378b99e3c9ba6127eb43b68389fb2b7348577", + "reference": "6ca378b99e3c9ba6127eb43b68389fb2b7348577", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/container": "^1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<5.0", + "symfony/config": "<5.1", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", "symfony/yaml": "<4.4" }, "provide": { "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0" + "symfony/service-implementation": "1.0|2.0" }, "require-dev": { - "symfony/config": "^5.0", + "symfony/config": "^5.1", "symfony/expression-language": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, @@ -2993,11 +3758,6 @@ "symfony/yaml": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" @@ -3020,28 +3780,112 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DependencyInjection Component", + "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", - "time": "2020-04-28T17:58:55+00:00" + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v5.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-24T14:32:26+00:00" }, { - "name": "symfony/doctrine-bridge", - "version": "v4.4.8", + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "642cb1000331b8dc5568587f60aeb299070f9a55" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/642cb1000331b8dc5568587f60aeb299070f9a55", - "reference": "642cb1000331b8dc5568587f60aeb299070f9a55", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v4.4.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "9d42bb12f287bf2378500f745174aae519a2c922" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9d42bb12f287bf2378500f745174aae519a2c922", + "reference": "9d42bb12f287bf2378500f745174aae519a2c922", "shasum": "" }, "require": { "doctrine/event-manager": "~1.0", - "doctrine/persistence": "^1.3", - "php": "^7.1.3", + "doctrine/persistence": "^1.3|^2", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^1.1|^2" @@ -3056,17 +3900,17 @@ "symfony/validator": "<4.4.2|<5.0.2,>=5.0" }, "require-dev": { - "doctrine/annotations": "~1.7", + "composer/package-versions-deprecated": "^1.8", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", - "doctrine/data-fixtures": "1.0.*", - "doctrine/dbal": "~2.4", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "^2.6|^3.0", "doctrine/orm": "^2.6.3", - "doctrine/reflection": "~1.0", "symfony/config": "^4.2|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/form": "^4.4|^5.0", + "symfony/form": "^4.4.11|^5.0.11", "symfony/http-kernel": "^4.3.7", "symfony/messenger": "^4.4|^5.0", "symfony/property-access": "^3.4|^4.0|^5.0", @@ -3087,11 +3931,6 @@ "symfony/validator": "" }, "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bridge\\Doctrine\\": "" @@ -3114,28 +3953,46 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Doctrine Bridge", + "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", - "time": "2020-04-12T16:45:36+00:00" + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-16T13:04:32+00:00" }, { "name": "symfony/error-handler", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "d2721499ffcaf246a743e01cdf6696d3d5dd74c1" + "reference": "76603a8df8e001436df80758eb03a8baa5324175" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/d2721499ffcaf246a743e01cdf6696d3d5dd74c1", - "reference": "d2721499ffcaf246a743e01cdf6696d3d5dd74c1", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/76603a8df8e001436df80758eb03a8baa5324175", + "reference": "76603a8df8e001436df80758eb03a8baa5324175", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "psr/log": "~1.0", - "symfony/debug": "^4.4", + "symfony/debug": "^4.4.5", + "symfony/polyfill-php80": "^1.15", "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { @@ -3143,11 +4000,6 @@ "symfony/serializer": "^4.4|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\ErrorHandler\\": "" @@ -3170,26 +4022,43 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony ErrorHandler Component", + "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", - "time": "2020-01-27T09:48:47+00:00" + "support": { + "source": "https://github.com/symfony/error-handler/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-02T07:50:12+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.4", + "version": "v4.4.20", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9e3de195e5bc301704dd6915df55892f6dfc208b" + "reference": "c352647244bd376bf7d31efbd5401f13f50dad0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9e3de195e5bc301704dd6915df55892f6dfc208b", - "reference": "9e3de195e5bc301704dd6915df55892f6dfc208b", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c352647244bd376bf7d31efbd5401f13f50dad0c", + "reference": "c352647244bd376bf7d31efbd5401f13f50dad0c", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/event-dispatcher-contracts": "^1.1" }, "conflict": { @@ -3203,6 +4072,7 @@ "psr/log": "~1.0", "symfony/config": "^3.4|^4.0|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "~3.4|~4.4", "symfony/expression-language": "^3.4|^4.0|^5.0", "symfony/http-foundation": "^3.4|^4.0|^5.0", "symfony/service-contracts": "^1.1|^2", @@ -3213,11 +4083,6 @@ "symfony/http-kernel": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" @@ -3240,26 +4105,43 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony EventDispatcher Component", + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", - "time": "2020-01-10T21:54:01+00:00" + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.20" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.7", + "version": "v1.1.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18" + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c43ab685673fb6c8d84220c77897b1d6cdbe1d18", - "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "suggest": { "psr/event-dispatcher": "", @@ -3269,6 +4151,10 @@ "extra": { "branch-alias": { "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -3300,32 +4186,44 @@ "interoperability", "standards" ], - "time": "2019-09-17T09:54:03+00:00" + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:19:58+00:00" }, { "name": "symfony/filesystem", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "266c9540b475f26122b61ef8b23dd9198f5d1cfd" + "reference": "f0f06656a18304cdeacb2c4c0113a2b78a2b4c2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/266c9540b475f26122b61ef8b23dd9198f5d1cfd", - "reference": "266c9540b475f26122b61ef8b23dd9198f5d1cfd", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/f0f06656a18304cdeacb2c4c0113a2b78a2b4c2a", + "reference": "f0f06656a18304cdeacb2c4c0113a2b78a2b4c2a", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" @@ -3348,33 +4246,45 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Filesystem Component", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", - "time": "2020-01-21T08:20:44+00:00" + "support": { + "source": "https://github.com/symfony/filesystem/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:24:12+00:00" }, { "name": "symfony/finder", - "version": "v5.0.4", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb" + "reference": "0d639a0943822626290d169965804f79400e6a04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", - "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", + "url": "https://api.github.com/repos/symfony/finder/zipball/0d639a0943822626290d169965804f79400e6a04", + "reference": "0d639a0943822626290d169965804f79400e6a04", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" @@ -3397,38 +4307,56 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Finder Component", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/finder/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-15T18:55:04+00:00" }, { "name": "symfony/flex", - "version": "v1.6.2", + "version": "v1.12.2", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "e4f5a2653ca503782a31486198bd1dd1c9a47f83" + "reference": "e472606b4b3173564f0edbca8f5d32b52fc4f2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/e4f5a2653ca503782a31486198bd1dd1c9a47f83", - "reference": "e4f5a2653ca503782a31486198bd1dd1c9a47f83", + "url": "https://api.github.com/repos/symfony/flex/zipball/e472606b4b3173564f0edbca8f5d32b52fc4f2c9", + "reference": "e472606b4b3173564f0edbca8f5d32b52fc4f2c9", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0", - "php": "^7.0" + "composer-plugin-api": "^1.0|^2.0", + "php": ">=7.1" }, "require-dev": { - "composer/composer": "^1.0.2", - "symfony/dotenv": "^3.4|^4.0|^5.0", - "symfony/phpunit-bridge": "^3.4.19|^4.1.8|^5.0", - "symfony/process": "^2.7|^3.0|^4.0|^5.0" + "composer/composer": "^1.0.2|^2.0", + "symfony/dotenv": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", + "symfony/phpunit-bridge": "^4.4|^5.0", + "symfony/process": "^3.4|^4.4|^5.0" }, "type": "composer-plugin", "extra": { "branch-alias": { - "dev-master": "1.5-dev" + "dev-main": "1.12-dev" }, "class": "Symfony\\Flex\\Flex" }, @@ -3448,25 +4376,43 @@ } ], "description": "Composer plugin for Symfony", - "time": "2020-01-30T12:06:45+00:00" + "support": { + "issues": "https://github.com/symfony/flex/issues", + "source": "https://github.com/symfony/flex/tree/v1.12.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-16T14:05:05+00:00" }, { "name": "symfony/framework-bundle", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "afc96daad6049cbed34312b34005d33fc670d022" + "reference": "98e855fd35dd2c4614f61d349b1fd7dd3622b9b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/afc96daad6049cbed34312b34005d33fc670d022", - "reference": "afc96daad6049cbed34312b34005d33fc670d022", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/98e855fd35dd2c4614f61d349b1fd7dd3622b9b9", + "reference": "98e855fd35dd2c4614f61d349b1fd7dd3622b9b9", "shasum": "" }, "require": { "ext-xml": "*", - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/cache": "^4.4|^5.0", "symfony/config": "^4.3.4|^5.0", "symfony/dependency-injection": "^4.4.1|^5.0.1", @@ -3476,16 +4422,16 @@ "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^4.4|^5.0" + "symfony/routing": "^4.4.12|^5.1.4" }, "conflict": { "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.0", - "phpdocumentor/type-resolver": "<0.2.1", + "phpdocumentor/reflection-docblock": "<3.0|>=3.2.0,<3.2.2", + "phpdocumentor/type-resolver": "<0.3.0|1.3.*", "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", "symfony/asset": "<3.4", "symfony/browser-kit": "<4.3", - "symfony/console": "<4.3", + "symfony/console": "<4.4.21", "symfony/dom-crawler": "<4.3", "symfony/dotenv": "<4.3.6", "symfony/form": "<4.3.5", @@ -3506,13 +4452,14 @@ "symfony/workflow": "<4.3.6" }, "require-dev": { - "doctrine/annotations": "~1.7", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.0", + "doctrine/persistence": "^1.3|^2.0", "paragonie/sodium_compat": "^1.8", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/asset": "^3.4|^4.0|^5.0", "symfony/browser-kit": "^4.3|^5.0", - "symfony/console": "^4.3.4|^5.0", + "symfony/console": "^4.4.21|^5.0", "symfony/css-selector": "^3.4|^4.0|^5.0", "symfony/dom-crawler": "^4.3|^5.0", "symfony/dotenv": "^4.3.6|^5.0", @@ -3526,6 +4473,7 @@ "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^3.4|^4.0|^5.0", "symfony/property-info": "^3.4|^4.0|^5.0", + "symfony/security-core": "^3.4|^4.4|^5.2", "symfony/security-csrf": "^3.4|^4.0|^5.0", "symfony/security-http": "^3.4|^4.0|^5.0", "symfony/serializer": "^4.4|^5.0", @@ -3537,7 +4485,7 @@ "symfony/web-link": "^4.4|^5.0", "symfony/workflow": "^4.3.6|^5.0", "symfony/yaml": "^3.4|^4.0|^5.0", - "twig/twig": "^1.41|^2.10|^3.0" + "twig/twig": "^1.43|^2.13|^3.0.4" }, "suggest": { "ext-apcu": "For best performance of the system caches", @@ -3550,11 +4498,6 @@ "symfony/yaml": "For using the debug:config and lint:yaml commands" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bundle\\FrameworkBundle\\": "" @@ -3577,39 +4520,135 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony FrameworkBundle", + "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", - "time": "2020-01-30T16:24:07+00:00" + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-14T13:03:08+00:00" }, { - "name": "symfony/http-foundation", - "version": "v5.0.4", + "name": "symfony/http-client-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "2832d8cffc3a91df550ac42bcdce602f8c08be3e" + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2832d8cffc3a91df550ac42bcdce602f8c08be3e", - "reference": "2832d8cffc3a91df550ac42bcdce602f8c08be3e", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-mbstring": "~1.1" + "php": ">=7.2.5" }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/expression-language": "^4.4|^5.0" + "suggest": { + "symfony/http-client-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-11T23:07:08+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "a416487a73bb9c9d120e9ba3a60547f4a3fb7a1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a416487a73bb9c9d120e9ba3a60547f4a3fb7a1f", + "reference": "a416487a73bb9c9d120e9ba3a60547f4a3fb7a1f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" @@ -3632,32 +4671,51 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpFoundation Component", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", - "time": "2020-01-31T09:13:47+00:00" + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-01T13:46:24+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "62116a9c8fb15faabb158ad9cb785c353c2572e5" + "reference": "cd2e325fc34a4a5bbec91eecf69dda8ee8c5ea4f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/62116a9c8fb15faabb158ad9cb785c353c2572e5", - "reference": "62116a9c8fb15faabb158ad9cb785c353c2572e5", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cd2e325fc34a4a5bbec91eecf69dda8ee8c5ea4f", + "reference": "cd2e325fc34a4a5bbec91eecf69dda8ee8c5ea4f", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "psr/log": "~1.0", "symfony/error-handler": "^4.4", "symfony/event-dispatcher": "^4.4", + "symfony/http-client-contracts": "^1.1|^2", "symfony/http-foundation": "^4.4|^5.0", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9" + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/browser-kit": "<4.3", @@ -3665,13 +4723,13 @@ "symfony/console": ">=5", "symfony/dependency-injection": "<4.3", "symfony/translation": "<4.2", - "twig/twig": "<1.34|<2.4,>=2" + "twig/twig": "<1.43|<2.13,>=2" }, "provide": { "psr/log-implementation": "1.0" }, "require-dev": { - "psr/cache": "~1.0", + "psr/cache": "^1.0|^2.0|^3.0", "symfony/browser-kit": "^4.3|^5.0", "symfony/config": "^3.4|^4.0|^5.0", "symfony/console": "^3.4|^4.0", @@ -3686,7 +4744,7 @@ "symfony/templating": "^3.4|^4.0|^5.0", "symfony/translation": "^4.2|^5.0", "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^1.34|^2.4|^3.0" + "twig/twig": "^1.43|^2.13|^3.0.4" }, "suggest": { "symfony/browser-kit": "", @@ -3695,11 +4753,6 @@ "symfony/dependency-injection": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\HttpKernel\\": "" @@ -3722,109 +4775,70 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpKernel Component", + "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", - "time": "2020-01-31T12:45:06+00:00" - }, - { - "name": "symfony/inflector", - "version": "v5.0.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/inflector.git", - "reference": "e375603b6bd12e8e3aec3fc1b640ac18a4ef4cb2" + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v4.4.22" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/inflector/zipball/e375603b6bd12e8e3aec3fc1b640ac18a4ef4cb2", - "reference": "e375603b6bd12e8e3aec3fc1b640ac18a4ef4cb2", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/polyfill-ctype": "~1.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Inflector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony Inflector Component", - "homepage": "https://symfony.com", - "keywords": [ - "inflection", - "pluralize", - "singularize", - "string", - "symfony", - "words" - ], - "time": "2020-01-04T14:08:26+00:00" + "time": "2021-05-01T14:38:48+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.14.3", + "version": "v1.30.2", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "c864e7f9b8d1e1f5f60acc3beda11299f637aded" + "reference": "a395a85aa4ded6c1fa3da118d60329b64b6c2acd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c864e7f9b8d1e1f5f60acc3beda11299f637aded", - "reference": "c864e7f9b8d1e1f5f60acc3beda11299f637aded", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a395a85aa4ded6c1fa3da118d60329b64b6c2acd", + "reference": "a395a85aa4ded6c1fa3da118d60329b64b6c2acd", "shasum": "" }, "require": { - "doctrine/inflector": "^1.2", + "doctrine/inflector": "^1.2|^2.0", "nikic/php-parser": "^4.0", - "php": "^7.0.8", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/filesystem": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/framework-bundle": "^3.4|^4.0|^5.0", - "symfony/http-kernel": "^3.4|^4.0|^5.0" + "php": ">=7.1.3", + "symfony/config": "^4.0|^5.0", + "symfony/console": "^4.0|^5.0", + "symfony/dependency-injection": "^4.0|^5.0", + "symfony/deprecation-contracts": "^2.2", + "symfony/filesystem": "^4.0|^5.0", + "symfony/finder": "^4.0|^5.0", + "symfony/framework-bundle": "^4.0|^5.0", + "symfony/http-kernel": "^4.0|^5.0" }, "require-dev": { + "composer/semver": "^3.0@dev", "doctrine/doctrine-bundle": "^1.8|^2.0", "doctrine/orm": "^2.3", "friendsofphp/php-cs-fixer": "^2.8", - "friendsoftwig/twigcs": "^3.1.2", + "friendsoftwig/twigcs": "^4.1.0|^5.0.0", "symfony/http-client": "^4.3|^5.0", "symfony/phpunit-bridge": "^4.3|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/security-core": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/process": "^4.0|^5.0", + "symfony/security-core": "^4.0|^5.0", + "symfony/yaml": "^4.0|^5.0" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "1.0-dev" } }, "autoload": { @@ -3850,43 +4864,68 @@ "scaffold", "scaffolding" ], - "time": "2019-11-07T00:56:03+00:00" + "support": { + "issues": "https://github.com/symfony/maker-bundle/issues", + "source": "https://github.com/symfony/maker-bundle/tree/v1.30.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T13:53:38+00:00" }, { - "name": "symfony/mime", - "version": "v5.0.4", + "name": "symfony/monolog-bridge", + "version": "v5.2.7", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59" + "url": "https://github.com/symfony/monolog-bridge.git", + "reference": "ddb9c33dfa1bd89c956892c3d1ba35f324e3ccd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2a3c7fee1f1a0961fa9cf360d5da553d05095e59", - "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/ddb9c33dfa1bd89c956892c3d1ba35f324e3ccd8", + "reference": "ddb9c33dfa1bd89c956892c3d1ba35f324e3ccd8", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" + "monolog/monolog": "^1.25.1|^2", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2" }, "conflict": { - "symfony/mailer": "<4.4" + "symfony/console": "<4.4", + "symfony/http-foundation": "<4.4" }, "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^4.4|^5.0" + "symfony/console": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/mailer": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } + "suggest": { + "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", + "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", + "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." }, + "type": "symfony-bridge", "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" + "Symfony\\Bridge\\Monolog\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3906,32 +4945,128 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A library to manipulate MIME messages", + "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" + "support": { + "source": "https://github.com/symfony/monolog-bridge/tree/v5.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2020-01-04T14:08:26+00:00" + "time": "2021-04-07T16:07:52+00:00" }, { - "name": "symfony/orm-pack", - "version": "v1.0.8", + "name": "symfony/monolog-bundle", + "version": "v3.7.0", "source": { "type": "git", - "url": "https://github.com/symfony/orm-pack.git", - "reference": "c9bcc08102061f406dc908192c0f33524a675666" + "url": "https://github.com/symfony/monolog-bundle.git", + "reference": "4054b2e940a25195ae15f0a49ab0c51718922eb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/c9bcc08102061f406dc908192c0f33524a675666", - "reference": "c9bcc08102061f406dc908192c0f33524a675666", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/4054b2e940a25195ae15f0a49ab0c51718922eb4", + "reference": "4054b2e940a25195ae15f0a49ab0c51718922eb4", "shasum": "" }, "require": { - "doctrine/doctrine-bundle": "*", - "doctrine/doctrine-migrations-bundle": "*", - "doctrine/orm": "*" + "monolog/monolog": "~1.22 || ~2.0", + "php": ">=7.1.3", + "symfony/config": "~4.4 || ^5.0", + "symfony/dependency-injection": "^4.4 || ^5.0", + "symfony/http-kernel": "~4.4 || ^5.0", + "symfony/monolog-bridge": "~4.4 || ^5.0" + }, + "require-dev": { + "symfony/console": "~4.4 || ^5.0", + "symfony/phpunit-bridge": "^5.1", + "symfony/yaml": "~4.4 || ^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MonologBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony MonologBundle", + "homepage": "https://symfony.com", + "keywords": [ + "log", + "logging" + ], + "support": { + "issues": "https://github.com/symfony/monolog-bundle/issues", + "source": "https://github.com/symfony/monolog-bundle/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-31T07:20:47+00:00" + }, + { + "name": "symfony/orm-pack", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/orm-pack.git", + "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/21ac491414b5815e5ebb7425908c1d1568d2e775", + "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "*", + "doctrine/common": "^2", + "doctrine/doctrine-bundle": "^2", + "doctrine/doctrine-migrations-bundle": "^2", + "doctrine/orm": "^2" }, "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", @@ -3939,24 +5074,42 @@ "MIT" ], "description": "A pack for the Doctrine ORM", - "time": "2020-02-10T18:03:48+00:00" + "support": { + "issues": "https://github.com/symfony/orm-pack/issues", + "source": "https://github.com/symfony/orm-pack/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-31T10:20:18+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.17.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9" + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9", - "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-ctype": "For best performance" @@ -3964,7 +5117,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -3997,26 +5154,41 @@ "polyfill", "portable" ], - "time": "2020-05-12T16:14:59+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-07T16:49:33+00:00" }, { - "name": "symfony/polyfill-intl-idn", - "version": "v1.13.1", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.22.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170", + "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.9" + "php": ">=7.1" }, "suggest": { "ext-intl": "For best performance" @@ -4024,7 +5196,94 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "2d63434d922daf7da8dd863e7907e67ee3031483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483", + "reference": "2d63434d922daf7da8dd863e7907e67ee3031483", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4044,6 +5303,10 @@ "name": "Laurent Bassin", "email": "laurent@bassin.info" }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" @@ -4059,24 +5322,125 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.17.0", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.22.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fa79b11539418b02fc5e1897267673ba2c19419c" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c", - "reference": "fa79b11539418b02fc5e1897267673ba2c19419c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248", + "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", + "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", + "shasum": "" + }, + "require": { + "php": ">=7.1" }, "suggest": { "ext-mbstring": "For best performance" @@ -4084,7 +5448,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4118,29 +5486,50 @@ "portable", "shim" ], - "time": "2020-05-12T16:47:27+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.13.1", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" + "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", + "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4173,29 +5562,50 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.13.1", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f" + "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/4b0e2222c55a25b4541305a053013d5647d3a25f", - "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4231,31 +5641,126 @@ "portable", "shim" ], - "time": "2019-11-27T16:25:15+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-07T16:49:33+00:00" }, { - "name": "symfony/process", - "version": "v4.4.9", + "name": "symfony/polyfill-php80", + "version": "v1.22.1", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "c714958428a85c86ab97e3a0c96db4c4f381b7f5" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c714958428a85c86ab97e3a0c96db4c4f381b7f5", - "reference": "c714958428a85c86ab97e3a0c96db4c4f381b7f5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-07T16:49:33+00:00" + }, + { + "name": "symfony/process", + "version": "v4.4.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "f5481b22729d465acb1cea3455fc04ce84b0148b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/f5481b22729d465acb1cea3455fc04ce84b0148b", + "reference": "f5481b22729d465acb1cea3455fc04ce84b0148b", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Process\\": "" @@ -4278,26 +5783,42 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Process Component", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "time": "2020-05-30T20:06:45+00:00" + "support": { + "source": "https://github.com/symfony/process/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-07T16:22:29+00:00" }, { "name": "symfony/profiler-pack", - "version": "v1.0.4", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/symfony/profiler-pack.git", - "reference": "99c4370632c2a59bb0444852f92140074ef02209" + "reference": "29ec66471082b4eb068db11eb4f0a48c277653f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209", - "reference": "99c4370632c2a59bb0444852f92140074ef02209", + "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/29ec66471082b4eb068db11eb4f0a48c277653f7", + "reference": "29ec66471082b4eb068db11eb4f0a48c277653f7", "shasum": "" }, "require": { - "php": "^7.0", "symfony/stopwatch": "*", "symfony/twig-bundle": "*", "symfony/web-profiler-bundle": "*" @@ -4308,25 +5829,45 @@ "MIT" ], "description": "A pack for the Symfony web profiler", - "time": "2018-12-10T12:11:44+00:00" + "support": { + "issues": "https://github.com/symfony/profiler-pack/issues", + "source": "https://github.com/symfony/profiler-pack/tree/v1.0.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-12T06:50:46+00:00" }, { "name": "symfony/property-access", - "version": "v5.0.4", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "18617a8c26b97a262f816c78765eb3cd91630e19" + "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/18617a8c26b97a262f816c78765eb3cd91630e19", - "reference": "18617a8c26b97a262f816c78765eb3cd91630e19", + "url": "https://api.github.com/repos/symfony/property-access/zipball/3af8ed262bd3217512a13b023981fe68f36ad5f3", + "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/inflector": "^4.4|^5.0" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/property-info": "^5.2" }, "require-dev": { "symfony/cache": "^4.4|^5.0" @@ -4335,11 +5876,6 @@ "psr/cache-implementation": "To cache access methods." }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\PropertyAccess\\": "" @@ -4362,7 +5898,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony PropertyAccess Component", + "description": "Provides functions to read and write from/to an object or array using a simple string notation", "homepage": "https://symfony.com", "keywords": [ "access", @@ -4375,24 +5911,133 @@ "property path", "reflection" ], - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/property-access/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T10:15:41+00:00" }, { - "name": "symfony/routing", - "version": "v5.0.4", + "name": "symfony/property-info", + "version": "v5.2.7", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "7da33371d8ecfed6c9d93d87c73749661606f803" + "url": "https://github.com/symfony/property-info.git", + "reference": "f5850c8d4d987fd1990e2cbdf29f48c663c433e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7da33371d8ecfed6c9d93d87c73749661606f803", - "reference": "7da33371d8ecfed6c9d93d87c73749661606f803", + "url": "https://api.github.com/repos/symfony/property-info/zipball/f5850c8d4d987fd1990e2cbdf29f48c663c433e7", + "reference": "f5850c8d4d987fd1990e2cbdf29f48c663c433e7", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/string": "^5.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/cache": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v5.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-16T17:25:34+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "3f0cab2e95b5e92226f34c2c1aa969d3fc41f48c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/3f0cab2e95b5e92226f34c2c1aa969d3fc41f48c", + "reference": "3f0cab2e95b5e92226f34c2c1aa969d3fc41f48c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/config": "<5.0", @@ -4400,7 +6045,7 @@ "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "~1.2", + "doctrine/annotations": "^1.10.4", "psr/log": "~1.0", "symfony/config": "^5.0", "symfony/dependency-injection": "^4.4|^5.0", @@ -4409,18 +6054,12 @@ "symfony/yaml": "^4.4|^5.0" }, "suggest": { - "doctrine/annotations": "For using the annotation loader", "symfony/config": "For using the all-in-one router or any loader", "symfony/expression-language": "For using expression matching", "symfony/http-foundation": "For using a Symfony Request object", "symfony/yaml": "For using the YAML loader" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Routing\\": "" @@ -4443,7 +6082,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Routing Component", + "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ "router", @@ -4451,32 +6090,49 @@ "uri", "url" ], - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/routing/tree/v5.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-11T22:55:21+00:00" }, { "name": "symfony/security-bundle", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "7829cc34b8231cb8d10621cdf27d04bfdc600334" + "reference": "e9cf8e6bd48d1dab8dc223ce4d30ff0d9340e1cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/7829cc34b8231cb8d10621cdf27d04bfdc600334", - "reference": "7829cc34b8231cb8d10621cdf27d04bfdc600334", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/e9cf8e6bd48d1dab8dc223ce4d30ff0d9340e1cd", + "reference": "e9cf8e6bd48d1dab8dc223ce4d30ff0d9340e1cd", "shasum": "" }, "require": { "ext-xml": "*", - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/config": "^4.2|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/http-kernel": "^4.4", "symfony/security-core": "^4.4", "symfony/security-csrf": "^4.2|^5.0", "symfony/security-guard": "^4.2|^5.0", - "symfony/security-http": "^4.4.3" + "symfony/security-http": "^4.4.5" }, "conflict": { "symfony/browser-kit": "<4.2", @@ -4502,14 +6158,9 @@ "symfony/twig-bundle": "^4.4|^5.0", "symfony/validator": "^3.4|^4.0|^5.0", "symfony/yaml": "^3.4|^4.0|^5.0", - "twig/twig": "^1.41|^2.10|^3.0" + "twig/twig": "^1.43|^2.13|^3.0.4" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bundle\\SecurityBundle\\": "" @@ -4532,26 +6183,43 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony SecurityBundle", + "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", - "time": "2020-01-27T10:02:23+00:00" + "support": { + "source": "https://github.com/symfony/security-bundle/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-12T14:25:43+00:00" }, { "name": "symfony/security-core", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "d2550b4ecd63f612763e0af2cbcb1a69a700fe99" + "reference": "e06e67aa97b7bba1d381e3fda1ca7706fef86bff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/d2550b4ecd63f612763e0af2cbcb1a69a700fe99", - "reference": "d2550b4ecd63f612763e0af2cbcb1a69a700fe99", + "url": "https://api.github.com/repos/symfony/security-core/zipball/e06e67aa97b7bba1d381e3fda1ca7706fef86bff", + "reference": "e06e67aa97b7bba1d381e3fda1ca7706fef86bff", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/event-dispatcher-contracts": "^1.1|^2", "symfony/service-contracts": "^1.1.6|^2" }, @@ -4561,12 +6229,13 @@ "symfony/security-guard": "<4.3" }, "require-dev": { - "psr/container": "^1.0", + "psr/container": "^1.0|^2.0", "psr/log": "~1.0", "symfony/event-dispatcher": "^4.3", "symfony/expression-language": "^3.4|^4.0|^5.0", "symfony/http-foundation": "^3.4|^4.0|^5.0", "symfony/ldap": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", "symfony/validator": "^3.4.31|^4.3.4|^5.0" }, "suggest": { @@ -4578,11 +6247,6 @@ "symfony/validator": "For using the user password constraint" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Security\\Core\\": "" @@ -4607,24 +6271,41 @@ ], "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", - "time": "2020-01-31T09:11:17+00:00" + "support": { + "source": "https://github.com/symfony/security-core/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-30T14:11:22+00:00" }, { "name": "symfony/security-csrf", - "version": "v5.0.4", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "65066f7e0f6e38a8c5507c706e86e7a52fd7ff3e" + "reference": "0ed3353e3c053711a1d86a74395f25736fc333de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/65066f7e0f6e38a8c5507c706e86e7a52fd7ff3e", - "reference": "65066f7e0f6e38a8c5507c706e86e7a52fd7ff3e", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/0ed3353e3c053711a1d86a74395f25736fc333de", + "reference": "0ed3353e3c053711a1d86a74395f25736fc333de", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/security-core": "^4.4|^5.0" }, "conflict": { @@ -4637,11 +6318,6 @@ "symfony/http-foundation": "For using the class SessionTokenStorage." }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Security\\Csrf\\": "" @@ -4666,24 +6342,41 @@ ], "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/security-csrf/tree/v5.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-07T16:07:52+00:00" }, { "name": "symfony/security-guard", - "version": "v4.4.4", + "version": "v4.4.20", "source": { "type": "git", "url": "https://github.com/symfony/security-guard.git", - "reference": "f457f2d6d7392259b1ede1d036a26b6c1fa20202" + "reference": "20f522ada1eefb7c2f90cb83dcc76abb160c782f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-guard/zipball/f457f2d6d7392259b1ede1d036a26b6c1fa20202", - "reference": "f457f2d6d7392259b1ede1d036a26b6c1fa20202", + "url": "https://api.github.com/repos/symfony/security-guard/zipball/20f522ada1eefb7c2f90cb83dcc76abb160c782f", + "reference": "20f522ada1eefb7c2f90cb83dcc76abb160c782f", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/security-core": "^3.4.22|^4.2.3|^5.0", "symfony/security-http": "^4.4.1" }, @@ -4691,11 +6384,6 @@ "psr/log": "~1.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Security\\Guard\\": "" @@ -4720,28 +6408,45 @@ ], "description": "Symfony Security Component - Guard", "homepage": "https://symfony.com", - "time": "2020-01-08T17:29:02+00:00" + "support": { + "source": "https://github.com/symfony/security-guard/tree/v4.4.20" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/security-http", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "736d09554f78f3444f5aeed3d18a928c7a8a53fb" + "reference": "2b2e821d414cc5ef6569a006292e0cfe8bd04d3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/736d09554f78f3444f5aeed3d18a928c7a8a53fb", - "reference": "736d09554f78f3444f5aeed3d18a928c7a8a53fb", + "url": "https://api.github.com/repos/symfony/security-http/zipball/2b2e821d414cc5ef6569a006292e0cfe8bd04d3f", + "reference": "2b2e821d414cc5ef6569a006292e0cfe8bd04d3f", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/http-foundation": "^3.4|^4.0|^5.0", + "php": ">=7.1.3", + "symfony/http-foundation": "^3.4.40|^4.4.7|^5.0.7", "symfony/http-kernel": "^4.4", "symfony/property-access": "^3.4|^4.0|^5.0", - "symfony/security-core": "^4.4" + "symfony/security-core": "^4.4.8" }, "conflict": { "symfony/event-dispatcher": ">=5", @@ -4757,11 +6462,6 @@ "symfony/security-csrf": "For using tokens to protect authentication/logout attempts" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Security\\Http\\": "" @@ -4786,25 +6486,42 @@ ], "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", - "time": "2020-01-31T09:11:17+00:00" + "support": { + "source": "https://github.com/symfony/security-http/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-07T15:47:03+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.0.1", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "144c5e51266b281231e947b51223ba14acf1a749" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/144c5e51266b281231e947b51223ba14acf1a749", - "reference": "144c5e51266b281231e947b51223ba14acf1a749", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { - "php": "^7.2.5", - "psr/container": "^1.0" + "php": ">=7.2.5", + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -4812,7 +6529,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -4844,32 +6565,44 @@ "interoperability", "standards" ], - "time": "2019-11-18T17:27:11+00:00" + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.0.4", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4" + "reference": "d99310c33e833def36419c284f60e8027d359678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5d9add8034135b9a5f7b101d1e42c797e7f053e4", - "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/d99310c33e833def36419c284f60e8027d359678", + "reference": "d99310c33e833def36419c284f60e8027d359678", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/service-contracts": "^1.0|^2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Stopwatch\\": "" @@ -4892,26 +6625,126 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Stopwatch Component", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.3.0-BETA1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-29T15:28:41+00:00" }, { - "name": "symfony/translation", - "version": "v4.4.4", + "name": "symfony/string", + "version": "v5.2.6", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c" + "url": "https://github.com/symfony/string.git", + "reference": "ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/f5d2ac46930238b30a9c2f1b17c905f3697d808c", - "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c", + "url": "https://api.github.com/repos/symfony/string/zipball/ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572", + "reference": "ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.2.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-17T17:12:15+00:00" + }, + { + "name": "symfony/translation", + "version": "v4.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "eb8f5428cc3b40d6dffe303b195b084f1c5fbd14" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/eb8f5428cc3b40d6dffe303b195b084f1c5fbd14", + "reference": "eb8f5428cc3b40d6dffe303b195b084f1c5fbd14", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^1.1.6|^2" }, @@ -4922,7 +6755,7 @@ "symfony/yaml": "<3.4" }, "provide": { - "symfony/translation-implementation": "1.0" + "symfony/translation-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "~1.0", @@ -4941,11 +6774,6 @@ "symfony/yaml": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Translation\\": "" @@ -4968,26 +6796,43 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Translation Component", + "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", - "time": "2020-01-15T13:29:06+00:00" + "support": { + "source": "https://github.com/symfony/translation/tree/v4.4.21" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T16:25:01+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.0.1", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed" + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/8cc682ac458d75557203b2f2f14b0b92e1c744ed", - "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5" }, "suggest": { "symfony/translation-implementation": "" @@ -4995,7 +6840,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5027,26 +6876,43 @@ "interoperability", "standards" ], - "time": "2019-11-18T17:27:11+00:00" + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/twig-bridge", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "d5f3e83e2cc2fcdd60c351b5be1beb9533cf698c" + "reference": "48b4ae9cf1b42d37710ea5857770c13f0b9d5579" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d5f3e83e2cc2fcdd60c351b5be1beb9533cf698c", - "reference": "d5f3e83e2cc2fcdd60c351b5be1beb9533cf698c", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/48b4ae9cf1b42d37710ea5857770c13f0b9d5579", + "reference": "48b4ae9cf1b42d37710ea5857770c13f0b9d5579", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^1.41|^2.10|^3.0" + "twig/twig": "^1.43|^2.13|^3.0.4" }, "conflict": { "symfony/console": "<3.4", @@ -5056,16 +6922,17 @@ "symfony/workflow": "<4.3" }, "require-dev": { - "egulias/email-validator": "^2.1.10", + "egulias/email-validator": "^2.1.10|^3", "symfony/asset": "^3.4|^4.0|^5.0", "symfony/console": "^3.4|^4.0|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", "symfony/error-handler": "^4.4|^5.0", "symfony/expression-language": "^3.4|^4.0|^5.0", "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/form": "^4.3.5", + "symfony/form": "^4.4.17", "symfony/http-foundation": "^4.3|^5.0", "symfony/http-kernel": "^4.4", + "symfony/intl": "^4.4|^5.0", "symfony/mime": "^4.3|^5.0", "symfony/polyfill-intl-icu": "~1.0", "symfony/routing": "^3.4|^4.0|^5.0", @@ -5079,9 +6946,9 @@ "symfony/web-link": "^4.4|^5.0", "symfony/workflow": "^4.3|^5.0", "symfony/yaml": "^3.4|^4.0|^5.0", - "twig/cssinliner-extra": "^2.12", - "twig/inky-extra": "^2.12", - "twig/markdown-extra": "^2.12" + "twig/cssinliner-extra": "^2.12|^3", + "twig/inky-extra": "^2.12|^3", + "twig/markdown-extra": "^2.12|^3" }, "suggest": { "symfony/asset": "For using the AssetExtension", @@ -5101,11 +6968,6 @@ "symfony/yaml": "For using the YamlExtension" }, "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bridge\\Twig\\": "" @@ -5128,31 +6990,48 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Twig Bridge", + "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", - "time": "2020-01-08T17:29:02+00:00" + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-07T15:47:03+00:00" }, { "name": "symfony/twig-bundle", - "version": "v4.4.4", + "version": "v4.4.20", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "d3e3e46e9e683e946746219570299ba07506260a" + "reference": "7cee73b45e3bd963a0ab4184f1041dcdc85b6e86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/d3e3e46e9e683e946746219570299ba07506260a", - "reference": "d3e3e46e9e683e946746219570299ba07506260a", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/7cee73b45e3bd963a0ab4184f1041dcdc85b6e86", + "reference": "7cee73b45e3bd963a0ab4184f1041dcdc85b6e86", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/http-foundation": "^4.3|^5.0", "symfony/http-kernel": "^4.4", "symfony/polyfill-ctype": "~1.8", "symfony/twig-bridge": "^4.4|^5.0", - "twig/twig": "^1.41|^2.10|^3.0" + "twig/twig": "^1.43|^2.13|^3.0.4" }, "conflict": { "symfony/dependency-injection": "<4.1", @@ -5160,7 +7039,7 @@ "symfony/translation": "<4.2" }, "require-dev": { - "doctrine/annotations": "~1.7", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.0", "symfony/asset": "^3.4|^4.0|^5.0", "symfony/dependency-injection": "^4.2.5|^5.0", @@ -5176,11 +7055,6 @@ "symfony/yaml": "^3.4|^4.0|^5.0" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bundle\\TwigBundle\\": "" @@ -5203,26 +7077,43 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony TwigBundle", + "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v4.4.20" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/validator", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "eb3e15de5c63873ca6e2a88b56a029f7be4c5953" + "reference": "65525b93ebc48c2992271f435e1391bbb049367a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/eb3e15de5c63873ca6e2a88b56a029f7be4c5953", - "reference": "eb3e15de5c63873ca6e2a88b56a029f7be4c5953", + "url": "https://api.github.com/repos/symfony/validator/zipball/65525b93ebc48c2992271f435e1391bbb049367a", + "reference": "65525b93ebc48c2992271f435e1391bbb049367a", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^1.1|^2" @@ -5237,9 +7128,9 @@ "symfony/yaml": "<3.4" }, "require-dev": { - "doctrine/annotations": "~1.7", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.0", - "egulias/email-validator": "^2.1.10", + "egulias/email-validator": "^2.1.10|^3", "symfony/cache": "^3.4|^4.0|^5.0", "symfony/config": "^3.4|^4.0|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", @@ -5248,6 +7139,7 @@ "symfony/http-foundation": "^4.1|^5.0", "symfony/http-kernel": "^4.4", "symfony/intl": "^4.3|^5.0", + "symfony/mime": "^4.4|^5.0", "symfony/property-access": "^3.4|^4.0|^5.0", "symfony/property-info": "^3.4|^4.0|^5.0", "symfony/translation": "^4.2", @@ -5268,11 +7160,6 @@ "symfony/yaml": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Validator\\": "" @@ -5295,27 +7182,45 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Validator Component", + "description": "Provides tools to validate values", "homepage": "https://symfony.com", - "time": "2020-01-31T09:11:17+00:00" + "support": { + "source": "https://github.com/symfony/validator/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-14T09:41:13+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.0.4", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "923591cfb78a935f0c98968fedfad05bfda9d01f" + "reference": "27cb9f7cfa3853c736425c7233a8f68814b19636" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/923591cfb78a935f0c98968fedfad05bfda9d01f", - "reference": "923591cfb78a935f0c98968fedfad05bfda9d01f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/27cb9f7cfa3853c736425c7233a8f68814b19636", + "reference": "27cb9f7cfa3853c736425c7233a8f68814b19636", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "phpunit/phpunit": "<5.4.3", @@ -5325,7 +7230,7 @@ "ext-iconv": "*", "symfony/console": "^4.4|^5.0", "symfony/process": "^4.4|^5.0", - "twig/twig": "^2.4|^3.0" + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", @@ -5336,11 +7241,6 @@ "Resources/bin/var-dump-server" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "files": [ "Resources/functions/dump.php" @@ -5366,40 +7266,53 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony mechanism for exploring and dumping PHP variables", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", "keywords": [ "debug", "dump" ], - "time": "2020-01-25T15:56:29+00:00" + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-19T14:07:32+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.0.8", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "5d18811da9e1ae2bb86b0a97fb2d784e27ffd59f" + "reference": "01184a5ab95eb9500b9b0ef3e525979e003d9c81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5d18811da9e1ae2bb86b0a97fb2d784e27ffd59f", - "reference": "5d18811da9e1ae2bb86b0a97fb2d784e27ffd59f", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/01184a5ab95eb9500b9b0ef3e525979e003d9c81", + "reference": "01184a5ab95eb9500b9b0ef3e525979e003d9c81", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { - "symfony/var-dumper": "^4.4|^5.0" + "symfony/var-dumper": "^4.4.9|^5.0.9" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\VarExporter\\": "" @@ -5422,7 +7335,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", + "description": "Allows exporting any serializable PHP data structure to plain PHP code", "homepage": "https://symfony.com", "keywords": [ "clone", @@ -5432,24 +7345,41 @@ "instantiate", "serialize" ], - "time": "2020-04-15T15:59:10+00:00" + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v5.3.0-BETA1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:42:13+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v5.0.4", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "8f4831567fc39bbe42af415a14a6039621349787" + "reference": "3b6dbd2cc76275e117d5c55923c7f511ead22bae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/8f4831567fc39bbe42af415a14a6039621349787", - "reference": "8f4831567fc39bbe42af415a14a6039621349787", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3b6dbd2cc76275e117d5c55923c7f511ead22bae", + "reference": "3b6dbd2cc76275e117d5c55923c7f511ead22bae", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/config": "^4.4|^5.0", "symfony/framework-bundle": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0", @@ -5498,24 +7428,41 @@ ], "description": "Symfony WebProfilerBundle", "homepage": "https://symfony.com", - "time": "2020-01-23T11:07:12+00:00" + "support": { + "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.0.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/yaml", - "version": "v4.4.4", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "cd014e425b3668220adb865f53bff64b3ad21767" + "reference": "1c2fd24147961525eaefb65b11987cab75adab59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/cd014e425b3668220adb865f53bff64b3ad21767", - "reference": "cd014e425b3668220adb865f53bff64b3ad21767", + "url": "https://api.github.com/repos/symfony/yaml/zipball/1c2fd24147961525eaefb65b11987cab75adab59", + "reference": "1c2fd24147961525eaefb65b11987cab75adab59", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -5528,11 +7475,6 @@ "symfony/console": "For validating YAML files using the lint command" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Yaml\\": "" @@ -5555,37 +7497,54 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Yaml Component", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "time": "2020-01-21T11:12:16+00:00" + "support": { + "source": "https://github.com/symfony/yaml/tree/v4.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-23T12:09:37+00:00" }, { "name": "twig/twig", - "version": "v3.0.2", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "5e6df0763a83dab0b73c1e803342fc0315f63ff5" + "reference": "1f3b7e2c06cc05d42936a8ad508ff1db7975cdc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/5e6df0763a83dab0b73c1e803342fc0315f63ff5", - "reference": "5e6df0763a83dab0b73c1e803342fc0315f63ff5", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/1f3b7e2c06cc05d42936a8ad508ff1db7975cdc5", + "reference": "1f3b7e2c06cc05d42936a8ad508ff1db7975cdc5", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4|^5.0" + "symfony/phpunit-bridge": "^4.4.9|^5.0.9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -5619,165 +7578,61 @@ "keywords": [ "templating" ], - "time": "2020-02-11T06:03:57+00:00" - }, - { - "name": "zendframework/zend-code", - "version": "3.4.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-code.git", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa" + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.3.0" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-code/zipball/268040548f92c2bfcba164421c1add2ba43abaaa", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa", - "shasum": "" - }, - "require": { - "php": "^7.1", - "zendframework/zend-eventmanager": "^2.6 || ^3.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0" - }, - "require-dev": { - "doctrine/annotations": "^1.7", - "ext-phar": "*", - "phpunit/phpunit": "^7.5.16 || ^8.4", - "zendframework/zend-coding-standard": "^1.0", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "zendframework/zend-stdlib": "Zend\\Stdlib component" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4.x-dev", - "dev-develop": "3.5.x-dev", - "dev-dev-4.0": "4.0.x-dev" + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" } - }, - "autoload": { - "psr-4": { - "Zend\\Code\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "keywords": [ - "ZendFramework", - "code", - "zf" - ], - "abandoned": "laminas/laminas-code", - "time": "2019-12-10T19:21:15+00:00" - }, - { - "name": "zendframework/zend-eventmanager", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "a5e2583a211f73604691586b8406ff7296a946dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd", - "reference": "a5e2583a211f73604691586b8406ff7296a946dd", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "athletic/athletic": "^0.1", - "container-interop/container-interop": "^1.1.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0" - }, - "suggest": { - "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev", - "dev-develop": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\EventManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Trigger and listen to events within a PHP application", - "homepage": "https://github.com/zendframework/zend-eventmanager", - "keywords": [ - "event", - "eventmanager", - "events", - "zf2" - ], - "abandoned": "laminas/laminas-eventmanager", - "time": "2018-04-25T15:33:34+00:00" + "time": "2021-02-08T09:54:36+00:00" } ], "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "1.4.2", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "39e9777c9089351a468f780b01cffa3cb0a42907" + "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/39e9777c9089351a468f780b01cffa3cb0a42907", - "reference": "39e9777c9089351a468f780b01cffa3cb0a42907", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/51d3d4880d28951fff42a635a2389f8c63baddc5", + "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5", "shasum": "" }, "require": { - "doctrine/common": "^2.11", - "doctrine/persistence": "^1.3.3", - "php": "^7.2" + "doctrine/common": "^2.13|^3.0", + "doctrine/persistence": "^1.3.3|^2.0", + "php": "^7.2 || ^8.0" }, "conflict": { "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.2", "doctrine/dbal": "^2.5.4", - "doctrine/mongodb-odm": "^1.3.0", + "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.7.0", - "phpunit/phpunit": "^7.0" + "ext-sqlite3": "*", + "phpunit/phpunit": "^8.0" }, "suggest": { - "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7", + "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", "doctrine/orm": "For loading ORM fixtures", "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" @@ -5798,27 +7653,46 @@ "keywords": [ "database" ], - "time": "2020-01-17T11:11:28+00:00" + "support": { + "issues": "https://github.com/doctrine/data-fixtures/issues", + "source": "https://github.com/doctrine/data-fixtures/tree/1.5.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdata-fixtures", + "type": "tidelift" + } + ], + "time": "2021-01-23T10:20:43+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.3.0", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70" + "reference": "870189619a7770f468ffb0b80925302e065a3b34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70", - "reference": "8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/870189619a7770f468ffb0b80925302e065a3b34", + "reference": "870189619a7770f468ffb0b80925302e065a3b34", "shasum": "" }, "require": { "doctrine/data-fixtures": "^1.3", "doctrine/doctrine-bundle": "^1.11|^2.0", "doctrine/orm": "^2.6.0", - "php": "^7.1", + "doctrine/persistence": "^1.3.7|^2.0", + "php": "^7.1 || ^8.0", "symfony/config": "^3.4|^4.3|^5.0", "symfony/console": "^3.4|^4.3|^5.0", "symfony/dependency-injection": "^3.4|^4.3|^5.0", @@ -5827,15 +7701,10 @@ }, "require-dev": { "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.4", + "phpunit/phpunit": "^7.4 || ^8.0 || ^9.2", "symfony/phpunit-bridge": "^4.1|^5.0" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Bundle\\FixturesBundle\\": "" @@ -5865,34 +7734,47 @@ "Fixture", "persistence" ], - "time": "2019-11-13T15:46:58+00:00" + "support": { + "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.4.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-fixtures-bundle", + "type": "tidelift" + } + ], + "time": "2020-11-14T09:36:49+00:00" }, { "name": "symfony/dotenv", - "version": "v4.4.4", + "version": "v4.4.20", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "b74a1638f53e3c65e4bbfc2a03c23fdc400fd243" + "reference": "4952e5ce9e6df3d737b9e9c337bddf781180a213" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/b74a1638f53e3c65e4bbfc2a03c23fdc400fd243", - "reference": "b74a1638f53e3c65e4bbfc2a03c23fdc400fd243", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/4952e5ce9e6df3d737b9e9c337bddf781180a213", + "reference": "4952e5ce9e6df3d737b9e9c337bddf781180a213", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "require-dev": { "symfony/process": "^3.4.2|^4.0|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Dotenv\\": "" @@ -5922,30 +7804,47 @@ "env", "environment" ], - "time": "2020-01-08T17:29:02+00:00" + "support": { + "source": "https://github.com/symfony/dotenv/tree/v4.4.20" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/thanks", - "version": "v1.2.5", + "version": "v1.2.10", "source": { "type": "git", "url": "https://github.com/symfony/thanks.git", - "reference": "a8a5fbe3907a52cb7e2bb704d3b0231782b4193c" + "reference": "e9c4709560296acbd4fe9e12b8d57a925aa7eae8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/thanks/zipball/a8a5fbe3907a52cb7e2bb704d3b0231782b4193c", - "reference": "a8a5fbe3907a52cb7e2bb704d3b0231782b4193c", + "url": "https://api.github.com/repos/symfony/thanks/zipball/e9c4709560296acbd4fe9e12b8d57a925aa7eae8", + "reference": "e9c4709560296acbd4fe9e12b8d57a925aa7eae8", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0", - "php": "^5.5.9|^7.0.0" + "composer-plugin-api": "^1.0|^2.0", + "php": ">=5.5.9" }, "type": "composer-plugin", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-main": "1.2-dev" }, "class": "Symfony\\Thanks\\Thanks" }, @@ -5965,7 +7864,25 @@ } ], "description": "Encourages sending ⭐ and 💵 to fellow PHP package maintainers (not limited to Symfony components)!", - "time": "2020-01-15T17:39:29+00:00" + "support": { + "issues": "https://github.com/symfony/thanks/issues", + "source": "https://github.com/symfony/thanks/tree/v1.2.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-14T17:47:37+00:00" } ], "aliases": [], @@ -5980,5 +7897,6 @@ "php": "^7.1.3", "ext-iconv": "*" }, - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "2.0.0" } diff --git a/config/acl.yaml b/config/acl.yaml index e694340c..0f858fa9 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -488,3 +488,17 @@ access_keys: label: Update - id: sap_csize.delete label: Delete + + - id: customer_tag + label: Customer Tags Access + acls: + - id: customer_tag.menu + label: Menu + - id: customer_tag.list + label: List + - id: customer_tag.add + label: Add + - id: customer_tag.update + label: Update + - id: customer_tag.delete + label: Delete diff --git a/config/bundles.php b/config/bundles.php index fba2661f..79841817 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -14,4 +14,5 @@ return [ Catalyst\APIBundle\CatalystAPIBundle::class => ['all' => true], Catalyst\AuthBundle\CatalystAuthBundle::class => ['all' => true], Catalyst\MenuBundle\CatalystMenuBundle::class => ['all' => true], + Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], ]; diff --git a/config/menu.yaml b/config/menu.yaml index d90ba3da..35709ee0 100644 --- a/config/menu.yaml +++ b/config/menu.yaml @@ -185,6 +185,10 @@ main_menu: acl: static_content.list label: Static Content parent: support + - id: customertag_list + acl: customer_tag.list + label: Customer Tags + parent: support - id: service acl: service.menu diff --git a/config/packages/dev/monolog.yaml b/config/packages/dev/monolog.yaml new file mode 100644 index 00000000..b1998da1 --- /dev/null +++ b/config/packages/dev/monolog.yaml @@ -0,0 +1,19 @@ +monolog: + handlers: + main: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + channels: ["!event"] + # uncomment to get logging in your browser + # you may have to allow bigger header sizes in your Web server configuration + #firephp: + # type: firephp + # level: info + #chromephp: + # type: chromephp + # level: info + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine", "!console"] diff --git a/config/packages/prod/deprecations.yaml b/config/packages/prod/deprecations.yaml new file mode 100644 index 00000000..60026a1b --- /dev/null +++ b/config/packages/prod/deprecations.yaml @@ -0,0 +1,8 @@ +# As of Symfony 5.1, deprecations are logged in the dedicated "deprecation" channel when it exists +#monolog: +# channels: [deprecation] +# handlers: +# deprecation: +# type: stream +# channels: [deprecation] +# path: php://stderr diff --git a/config/packages/prod/monolog.yaml b/config/packages/prod/monolog.yaml new file mode 100644 index 00000000..2c02ad8e --- /dev/null +++ b/config/packages/prod/monolog.yaml @@ -0,0 +1,17 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + buffer_size: 50 # How many messages should be saved? Prevent memory leaks + nested: + type: stream + path: php://stderr + level: debug + formatter: monolog.formatter.json + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine"] diff --git a/config/packages/test/monolog.yaml b/config/packages/test/monolog.yaml new file mode 100644 index 00000000..fc40641d --- /dev/null +++ b/config/packages/test/monolog.yaml @@ -0,0 +1,12 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + channels: ["!event"] + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug diff --git a/config/routes/customer_tag.yaml b/config/routes/customer_tag.yaml new file mode 100644 index 00000000..9fd98906 --- /dev/null +++ b/config/routes/customer_tag.yaml @@ -0,0 +1,34 @@ +customertag_list: + path: /customer_tags + controller: App\Controller\CustomerTagController::index + +customertag_rows: + path: /customer_tags/rows + controller: App\Controller\CustomerTagController::rows + methods: [POST] + +customertag_create: + path: /customer_tags/create + controller: App\Controller\CustomerTagController::addForm + methods: [GET] + +customertag_create_submit: + path: /customer_tags/create + controller: App\Controller\CustomerTagController::addSubmit + methods: [POST] + +customertag_update: + path: /customer_tags/{id} + controller: App\Controller\CustomerTagController::updateForm + methods: [GET] + +customertag_update_submit: + path: /customer_tags/{id} + controller: App\Controller\CustomerTagController::updateSubmit + methods: [POST] + +customertag_delete: + path: /customer_tags/{id} + controller: App\Controller\CustomerTagController::destroy + methods: [DELETE] + diff --git a/config/services.yaml b/config/services.yaml index 75c83d1d..0a176fd9 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -266,3 +266,31 @@ services: event: 'postPersist' entity: 'App\Entity\CustomerVehicle' + # hub service + App\Service\HubSelector: + arguments: + $em: "@doctrine.orm.entity_manager" + $im: "@App\\Service\\InventoryManager" + $hub_distributor: "@App\\Service\\HubDistributor" + $hub_filter_logger: "@App\\Service\\HubFilterLogger" + + # hub distributor + App\Service\HubDistributor: + arguments: + $redis: "@App\\Service\\RedisClientProvider" + $hub_jo_key: "%env(HUB_JO_KEY)%" + + # hub filter logger + App\Service\HubFilterLogger: + arguments: + $em: "@doctrine.orm.entity_manager" + + # warranty api logger + App\Service\WarrantyAPILogger: + arguments: + $em: "@doctrine.orm.entity_manager" + + # promo logger + App\Service\PromoLogger: + arguments: + $em: "@doctrine.orm.entity_manager" diff --git a/src/Command/GenerateWarrantyFromJobOrderCommand.php b/src/Command/GenerateWarrantyFromJobOrderCommand.php index a5c64488..fa2990a0 100644 --- a/src/Command/GenerateWarrantyFromJobOrderCommand.php +++ b/src/Command/GenerateWarrantyFromJobOrderCommand.php @@ -16,20 +16,25 @@ use App\Entity\JobOrder; use App\Entity\Warranty; use App\Entity\SAPBattery; +use App\Service\WarrantyAPILogger; + use App\Ramcar\ServiceType; use App\Ramcar\WarrantyStatus; +use App\Ramcar\WarrantySource; use DoctrineExtensions\Query\Mysql\DateFormat; class GenerateWarrantyFromJobOrderCommand extends Command { protected $em; + protected $logger; protected $sapbatt_hash; protected $warranties_hash; - public function __construct(EntityManagerInterface $em) + public function __construct(EntityManagerInterface $em, WarrantyAPILogger $logger) { $this->em = $em; + $this->logger = $logger; $this->loadSAPBatteries(); @@ -209,7 +214,27 @@ class GenerateWarrantyFromJobOrderCommand extends Command $sql_statement = 'INSERT INTO `warranty` (bty_model_id,bty_size_id,serial,warranty_class,plate_number,status,date_create,date_purchase,date_expire,date_claim,sap_bty_id,claim_id,first_name,last_name,mobile_number,flag_activated,warranty_privacy_policy) VALUES ' . $values . "\n"; - echo $sql_statement; + echo $sql_statement; + + $db = $this->em->getConnection(); + $stmt = $db->prepare($sql_statement); + $stmt->execute(); + + // log warranty creation + $log_data = [ + 'battery_model_id' => $bty_model_id, + 'battery_size_id' => $bty_size_id, + 'warranty_class' => $warranty_class, + 'plate_number' => $cleaned_plate_number, + 'date_create' => $date_create, + 'date_purchase' => $date_purchase, + 'date_expire' => $date_expire, + 'sap_code' => $sap_code, + 'first_name' => $first_name, + 'last_name' => $last_name, + 'mobile_number' => $mobile_number, + ]; + $this->logger->logWarrantyInfo($log_data, '', 'internal', 'create', WarrantySource::COMMAND); } else diff --git a/src/Command/ResetHubJoCountCommand.php b/src/Command/ResetHubJoCountCommand.php new file mode 100644 index 00000000..ea2314f3 --- /dev/null +++ b/src/Command/ResetHubJoCountCommand.php @@ -0,0 +1,39 @@ +redis = $redis->getRedisClient(); + + parent::__construct(); + } + + protected function configure() + { + $this->setName('hub:jo:reset') + ->setDescription('Reset hub\'s job order count') + ->setHelp('Reset hub\'s job order count'); + } + + + protected function execute(InputInterface $input, OutputInterface $output) + { + $key = 'hub_jo_count'; + + $this->redis->del($key); + + return 0; + } +} diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index b03f057e..4c6d8932 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -28,6 +28,9 @@ use App\Ramcar\TradeInType; use App\Ramcar\JOEventType; use App\Ramcar\AdvanceOrderSlot; use App\Ramcar\AutoAssignStatus; +use App\Ramcar\HubCriteria; +use App\Ramcar\WillingToWaitContent; +use App\Ramcar\WarrantySource; use App\Service\InvoiceGeneratorInterface; use App\Service\RisingTideGateway; @@ -37,6 +40,11 @@ use App\Service\RiderTracker; use App\Service\MapTools; use App\Service\InventoryManager; use App\Service\RiderAssignmentHandlerInterface; +use App\Service\HubSelector; +use App\Service\HubDistributor; +use App\Service\HubFilterLogger; +use App\Service\WarrantyAPILogger; +use App\Service\PromoLogger; use App\Entity\MobileSession; use App\Entity\Customer; @@ -844,7 +852,9 @@ class APIController extends Controller implements LoggedController public function requestJobOrder(Request $req, InvoiceGeneratorInterface $ic, GeofenceTracker $geo, MapTools $map_tools, InventoryManager $im, MQTTClient $mclient, - RiderAssignmentHandlerInterface $rah) + RiderAssignmentHandlerInterface $rah, HubSelector $hub_select, + HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger, + PromoLogger $promo_logger) { // check required parameters and api key $required_params = [ @@ -917,6 +927,14 @@ class APIController extends Controller implements LoggedController } $jo->setServiceType($stype); + // check if willing to wait is true or not + $will_wait = $req->request->get('willing_to_wait'); + // check for 'false' text + if ($will_wait === false || $will_wait === 0 || $will_wait === '0' || $will_wait == 'false') + $jo->setWillWait(WillingToWaitContent::NOT_WILLING_TO_WAIT); + else + $jo->setWillWait(WillingToWaitContent::WILLING_TO_WAIT); + // validate warranty $warr = $req->request->get('warranty'); if (!WarrantyClass::validate($warr)) @@ -1009,49 +1027,73 @@ class APIController extends Controller implements LoggedController $invoice = $ic->generateInvoice($icrit); $jo->setInvoice($invoice); - // assign hub and rider - if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) || - ($jo->getServicetype() == ServiceType::BATTERY_REPLACEMENT_WARRANTY)) + + // TODO: set this properly, since the other flags + // are on default values + $hub_criteria = new HubCriteria(); + $hub_criteria->setPoint($jo->getCoordinates()) + ->setJoType($jo->getServiceType()); + + // add battery to items + $sku = $batt->getSAPCode(); + if (!empty($sku)) + $hub_criteria->addItem($batt->getSAPCode(), 1); + + // add payment method to criteria + if (!empty($jo->getModeOfPayment())) + $hub_criteria->setPaymentMethod($jo->getModeOfPayment()); + + // check if willing to wait is true or not + if ($jo->getWillWait() == WillingToWaitContent::NOT_WILLING_TO_WAIT) { - // get nearest hub - // $nearest_hub = $this->findNearestHubWithInventory($jo, $batt, $em, $map_tools, $im); - $nearest_hub = $this->findNearestHub($jo, $em, $map_tools); - } - else - { - $nearest_hub = $this->findNearestHub($jo, $em, $map_tools); + $hub_criteria->setEmergency(true); } - if (!empty($nearest_hub)) + // find nearest hubs + $nearest_hubs = $hub_select->find($hub_criteria); + + if (!empty($nearest_hubs)) { + // go through the hub list, find the nearest hub + // with an available rider //error_log('found nearest hub ' . $nearest_hub->getID()); - // assign rider - $available_riders = $nearest_hub->getAvailableRiders(); - if (count($available_riders) > 0) + foreach ($nearest_hubs as $nearest_hub) { - $assigned_rider = null; - if (count($available_riders) > 1) + $available_riders = $nearest_hub['hub']->getAvailableRiders(); + if (count($available_riders) >= 1) { - // TODO: the setting of riders into an array - // will no longer be necessary when the contents - // of randomizeRider changes - $riders = []; - foreach ($available_riders as $rider) + $assigned_rider = null; + if (count($available_riders) == 1) { - $riders[] = $rider; + $assigned_rider = $available_riders[0]; + } + else + { + // TODO: the setting of riders into an array + // will no longer be necessary when the contents + // of randomizeRider changes + $riders = []; + foreach ($available_riders as $rider) + { + $riders[] = $rider; + } + + $assigned_rider = $this->randomizeRider($riders); } - $assigned_rider = $this->randomizeRider($riders); - } - else - $assigned_rider = $available_riders[0]; - - //error_log('found rider ' . $assigned_rider->getID()); - $jo->setHub($nearest_hub); - $jo->setRider($assigned_rider); - $jo->setStatus(JOStatus::ASSIGNED); + $jo->setHub($nearest_hub['hub']); + $jo->setRider($assigned_rider); + $jo->setStatus(JOStatus::ASSIGNED); + $jo->setStatusAutoAssign(AutoAssignStatus::HUB_AND_RIDER_ASSIGNED); - $assigned_rider->setAvailable(false); + $assigned_rider->setAvailable(false); + + // update redis hub_jo_count for hub + $hub_dist->incrementJoCountForHub($nearest_hub['hub']); + + // break out of loop + break; + } } } @@ -1120,6 +1162,37 @@ class APIController extends Controller implements LoggedController 'invoice' => $invoice_data ]; + // check service type + if ($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) + { + $customer = $cv->getCustomer(); + $customer_tags = $customer->getCustomerTagObjects(); + if (!empty($customer_tags)) + { + foreach ($customer_tags as $customer_tag) + { + // TODO: not too comfy with this being hardcoded + if ($customer_tag->getID() == 'CAR_CLUB_PROMO') + { + // remove associated entity + $customer->removeCustomerTag($customer_tag); + + // log the availment of promo from customer + $created_by = $req->query->get('api_key');; + $cust_id = $jo->getCustomer()->getID(); + $cust_fname = $jo->getCustomer()->getFirstName(); + $cust_lname = $jo->getCustomer()->getLastName(); + $jo_id = $jo->getID(); + $invoice_id = $jo->getInvoice()->getID(); + // TODO: check if we store total price of invoice or just the discounted amount + $amount = $jo->getInvoice()->getTotalPrice(); + $this->promo_logger->logPromoInfo($created_by, $cust_id, $cust_fname, $cust_lname, $jo_id, + $invoice_id, $amount); + } + } + } + } + // set data $res->setData($data); @@ -2330,7 +2403,9 @@ class APIController extends Controller implements LoggedController public function newRequestJobOrder(Request $req, InvoiceGeneratorInterface $ic, GeofenceTracker $geo, MapTools $map_tools, InventoryManager $im, MQTTClient $mclient, - RiderAssignmentHandlerInterface $rah) + RiderAssignmentHandlerInterface $rah, HubSelector $hub_select, + HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger, + PromoLogger $promo_logger) { // check required parameters and api key $required_params = [ @@ -2419,6 +2494,14 @@ class APIController extends Controller implements LoggedController } $jo->setServiceType($stype); + // check if willing to wait is true or not + $will_wait = $req->request->get('willing_to_wait'); + // check for 'false' text + if ($will_wait === false || $will_wait === 0 || $will_wait === '0' || $will_wait == 'false') + $jo->setWillWait(WillingToWaitContent::NOT_WILLING_TO_WAIT); + else + $jo->setWillWait(WillingToWaitContent::WILLING_TO_WAIT); + // validate warranty $warr = $req->request->get('warranty'); if (!WarrantyClass::validate($warr)) @@ -2515,50 +2598,72 @@ class APIController extends Controller implements LoggedController // check if hub is null if ($hub == null) { - // find nearest hub - if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) || - ($jo->getServicetype() == ServiceType::BATTERY_REPLACEMENT_WARRANTY)) + // TODO: set this properly, since the other flags + // are on default values + $hub_criteria = new HubCriteria(); + $hub_criteria->setPoint($jo->getCoordinates()) + ->setJoType($jo->getServiceType()); + + // add battery to items + $sku = $batt->getSAPCode(); + if (!empty($sku)) + $hub_criteria->addItem($batt->getSAPCode(), 1); + + // add payment method to criteria + if (!empty($jo->getModeOfPayment())) + $hub_criteria->setPaymentMethod($jo->getModeOfPayment()); + + // check if willing to wait is true or not + if ($jo->getWillWait() == WillingToWaitContent::NOT_WILLING_TO_WAIT) { - // get nearest hub - // $nearest_hub = $this->findNearestHubWithInventory($jo, $batt, $em, $map_tools, $im); - $nearest_hub = $this->findNearestHub($jo, $em, $map_tools); - } - else - { - $nearest_hub = $this->findNearestHub($jo, $em, $map_tools); + $hub_criteria->setEmergency(true); } - if (!empty($nearest_hub)) + // find nearest hubs + $nearest_hubs = $hub_select->find($hub_criteria); + + if (!empty($nearest_hubs)) { + // go through the hub list, find the nearest hub + // with an available rider //error_log('found nearest hub ' . $nearest_hub->getID()); - // assign rider - $available_riders = $nearest_hub->getAvailableRiders(); - if (count($available_riders) > 0) + foreach ($nearest_hubs as $nearest_hub) { - $assigned_rider = null; - if (count($available_riders) > 1) + $available_riders = $nearest_hub['hub']->getAvailableRiders(); + if (count($available_riders) >= 1) { - // TODO: the setting of riders into an array - // will no longer be necessary when the contents - // of randomizeRider changes - $riders = []; - foreach ($available_riders as $rider) + $assigned_rider = null; + if (count($available_riders) == 1) { - $riders[] = $rider; + $assigned_rider = $available_riders[0]; + } + else + { + // TODO: the setting of riders into an array + // will no longer be necessary when the contents + // of randomizeRider changes + $riders = []; + foreach ($available_riders as $rider) + { + $riders[] = $rider; + } + + $assigned_rider = $this->randomizeRider($riders); } - $assigned_rider = $this->randomizeRider($riders); + $jo->setHub($nearest_hub['hub']); + $jo->setRider($assigned_rider); + $jo->setStatus(JOStatus::ASSIGNED); + $jo->setStatusAutoAssign(AutoAssignStatus::HUB_AND_RIDER_ASSIGNED); + + $assigned_rider->setAvailable(false); + + // update redis hub_jo_count for hub + $hub_dist->incrementJoCountForHub($nearest_hub['hub']); + + // break out of loop + break; } - else - $assigned_rider = $available_riders[0]; - - //error_log('found rider ' . $assigned_rider->getID()); - $jo->setHub($nearest_hub); - $jo->setRider($assigned_rider); - $jo->setStatus(JOStatus::ASSIGNED); - $jo->setStatusAutoAssign(AutoAssignStatus::HUB_AND_RIDER_ASSIGNED); - - $assigned_rider->setAvailable(false); } } } @@ -2581,7 +2686,10 @@ class APIController extends Controller implements LoggedController $jo->setStatusAutoAssign(AutoAssignStatus::HUB_ASSIGNED); if ($date_schedule != null) - $jo->setDateSchedule($date_schedule); + $jo->setDateSchedule($date_schedule); + + // update redis hub_jo_count for hub + $hub_dist->incrementJoCountForHub($hub); } $em->persist($jo); @@ -2666,6 +2774,38 @@ class APIController extends Controller implements LoggedController 'invoice' => $invoice_data ]; + // need to check for customer tag/promo + // check service type + if ($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) + { + $customer = $cv->getCustomer(); + $customer_tags = $customer->getCustomerTagObjects(); + if (!empty($customer_tags)) + { + foreach ($customer_tags as $customer_tag) + { + // TODO: not too comfy with this being hardcoded + if ($customer_tag->getID() == 'CAR_CLUB_PROMO') + { + // remove associated entity + $customer->removeCustomerTag($customer_tag); + + // log the availment of promo from customer + $created_by = $req->query->get('api_key');; + $cust_id = $jo->getCustomer()->getID(); + $cust_fname = $jo->getCustomer()->getFirstName(); + $cust_lname = $jo->getCustomer()->getLastName(); + $jo_id = $jo->getID(); + $invoice_id = $jo->getInvoice()->getID(); + // TODO: check if we store total price of invoice or just the discounted amount + $amount = $jo->getInvoice()->getTotalPrice(); + $promo_logger->logPromoInfo($created_by, $cust_id, $cust_fname, $cust_lname, $jo_id, + $invoice_id, $amount); + } + } + } + } + // set data $res->setData($data); @@ -2856,8 +2996,8 @@ class APIController extends Controller implements LoggedController 'date_purchase' => $date_purchase_cust, 'invoice' => $invoice_url, 'warr_card' => $warr_card_url, - 'dealer_name' => $warr->getDealerName() ?? '', - 'dealer_address' => $warr->getDealerAddress() ?? '', + 'dealer_name' => $warr->getDealerName() ?? '', + 'dealer_address' => $warr->getDealerAddress() ?? '', ]; } else @@ -2877,8 +3017,8 @@ class APIController extends Controller implements LoggedController 'date_purchase' => $today->format('Y-m-d'), 'invoice' => '', 'warr_card' => '', - 'dealer_name' => '', - 'dealer_address' => '', + 'dealer_name' => '', + 'dealer_address' => '', ]; } } @@ -2905,7 +3045,17 @@ class APIController extends Controller implements LoggedController } $sku = $warr_serial->getSKU(); - $batt = $em->getRepository(SAPBattery::class)->find($sku); + $batt = null; + $cat_name = ''; + if ($sku != null) + $batt = $em->getRepository(SAPBattery::class)->find($sku); + else + { + // get the category name of the serial + $cat_name = $warr_serial->getMetaInfo('category_name'); + error_log($cat_name); + } + // TODO: put this in a config file $image_url = $req->getSchemeAndHttpHost() . '/battery/generic.png'; if ($batt != null) @@ -2919,7 +3069,7 @@ class APIController extends Controller implements LoggedController else { $battery = [ - 'brand' => '', + 'brand' => $cat_name, 'size' => '', 'image_url' => '', ]; @@ -2979,7 +3129,8 @@ class APIController extends Controller implements LoggedController return $serial . '/' . $filename; } - public function warrantyRegister($serial, EntityManagerInterface $em, Request $req, KernelInterface $kernel, RisingTideGateway $rt, TranslatorInterface $trans) + public function warrantyRegister($serial, EntityManagerInterface $em, Request $req, KernelInterface $kernel, RisingTideGateway $rt, + TranslatorInterface $trans, WarrantyAPILogger $logger) { // check required parameters and api key $required_params = [ @@ -3001,22 +3152,37 @@ class APIController extends Controller implements LoggedController $inv_filename = $this->handlePictureUpload($invoice, $upload_dir, $serial, 'invoice'); $wcard_filename = $this->handlePictureUpload($warr_card, $upload_dir, $serial, 'wcard'); + $user_id = $req->query->get('api_key'); + $log_data = [ + 'plate_number' => $req->request->get('plate_num'), + 'first_name' => $req->request->get('first_name'), + 'last_name' => $req->request->get('last_name'), + 'date_purchase' => $req->request->get('date_purchase'), + ]; + $action = 'create'; + $source = WarrantySource::MOBILE; + $res = $this->checkParamsAndKey($req, $em, $required_params); if ($res->isError()) + { + $logger->logWarrantyInfo($log_data, $res->getErrorMessage(), $user_id, $action, $source); return $res->getReturnResponse(); + } // update customer information // $cust = $this->updateCustomerInfo($req, $em); // update warranty - $res = $this->updateWarranty($res, $em, $trans, $req, $serial, $inv_filename, $wcard_filename); + $res = $this->updateWarranty($res, $em, $rt, $trans, $req, $serial, $inv_filename, $wcard_filename, + $logger, $log_data, $user_id, $action, $source); $em->flush(); return $res->getReturnResponse(); } - protected function updateWarranty($res, $em, $trans, $req, $serial, $inv_filename = null, $wcard_filename = null) + protected function updateWarranty($res, $em, $rt, $trans, $req, $serial, $inv_filename = null, $wcard_filename = null, + $logger, $log_data, $user_id, $action, $source) { // get serial $warr_serial = $em->getRepository(WarrantySerial::class)->find($serial); @@ -3024,6 +3190,7 @@ class APIController extends Controller implements LoggedController { $res->setError(true) ->setErrorMessage('Invalid warranty serial code.'); + $logger->logWarrantyInfo($log_data, $res->getErrorMessage(), $user_id, $action, $source); return $res; } @@ -3048,7 +3215,8 @@ class APIController extends Controller implements LoggedController if (!$is_customer_warranty) { $res->setError(true) - ->setErrorMessage('Warranty registred to a vehicle not in your list of vehicles.'); + ->setErrorMessage('Warranty registered to a vehicle not in your list of vehicles.'); + $logger->logWarrantyInfo($log_data, $res->getErrorMessage(), $user_id, $action, $source); return $res; } @@ -3060,14 +3228,20 @@ class APIController extends Controller implements LoggedController $sms_msg = $trans->trans('warranty_register_confirm'); } + // check if sku is null // get sap battery $sku = $warr_serial->getSKU(); - $sap_bty = $em->getRepository(SAPBattery::class)->find($sku); - if ($sap_bty == null) + $sap_bty = null; + if ($sku != null) { - $res->setError(true) - ->setErrorMessage('Could not find battery entry for warranty.'); - return $res; + $sap_bty = $em->getRepository(SAPBattery::class)->find($sku); + if ($sap_bty == null) + { + $res->setError(true) + ->setErrorMessage('Could not find battery entry for warranty.'); + $logger->logWarrantyInfo($log_data, $res->getErrorMessage(), $user_id, $action, $source); + return $res; + } } // default date purchase to today @@ -3080,6 +3254,7 @@ class APIController extends Controller implements LoggedController { $res->setError(true) ->setErrorMessage('Invalid date format for date of purchase.'); + $logger->logWarrantyInfo($log_data, $res->getErrorMessage(), $user_id, $action, $source); return $res; } @@ -3124,6 +3299,8 @@ class APIController extends Controller implements LoggedController // set data to retrun to user $res->setData($data); + $logger->logWarrantyInfo($log_data, '', $user_id, $action, $source); + // send sms error_log('sending sms to - ' . $this->session->getPhoneNumber()); $rt->sendSMS($this->session->getPhoneNumber(), 'MOTOLITE', $sms_msg); diff --git a/src/Controller/CAPI/CustomerWarrantyController.php b/src/Controller/CAPI/CustomerWarrantyController.php index 0ebc2c60..6ec8f88d 100644 --- a/src/Controller/CAPI/CustomerWarrantyController.php +++ b/src/Controller/CAPI/CustomerWarrantyController.php @@ -14,6 +14,7 @@ use Catalyst\APIBundle\Controller\APIController; use Catalyst\APIBundle\Response\APIResponse; use App\Service\RisingTideGateway; +use App\Service\WarrantyAPILogger; use App\Entity\WarrantySerial; use App\Entity\Warranty; @@ -32,6 +33,7 @@ use App\Ramcar\WarrantyClass; use App\Ramcar\WarrantyStatus; use App\Ramcar\FuelType; use App\Ramcar\VehicleStatusCondition; +use App\Ramcar\WarrantySource; use DateTime; @@ -73,13 +75,14 @@ class CustomerWarrantyController extends APIController return $missing; } - protected function checkRequiredParams(Request $req, $params) + protected function checkRequiredParams(Request $req, $params, $logger, $log_data, $user_id, $action, $source) { // check required parameters $missing = $this->checkMissingParameters($req, $params); if (count($missing) > 0) { $miss_string = implode(', ', $missing); + $logger->logWarrantyInfo($log_data, 'Missing parameter(s): ' . $miss_string, $user_id, $action, $source); return new APIResponse(false, 'Missing parameter(s): ' . $miss_string); } @@ -96,16 +99,32 @@ class CustomerWarrantyController extends APIController return preg_replace('/\s+/', '', strtoupper($plate_num)); } - public function check($serial, EntityManagerInterface $em, Request $req) + public function check($serial, EntityManagerInterface $em, Request $req, WarrantyAPILogger $logger) { + $user_id = $_SERVER['HTTP_X_CATA_API_KEY']; + $log_data = [ + 'serial' => $serial, + ]; + $action = 'check'; + $source = WarrantySource::CAPI; + // check required parameters $required_params = []; - $res = $this->checkRequiredParams($req, $required_params); - if (!$res) - return $res; + $res = $this->checkRequiredParams($req, $required_params, $logger, $log_data, $user_id, $action, $source); + if (!$res) + return $res; error_log('check warranty serial'); + //$keys = array_keys($_SERVER); + //foreach ($keys as $key) + //{ + // error_log($key); + //} + + //error_log($_SERVER['HTTP_X_CATA_API_KEY']); + + // TODO: add logging for the other scenarios // check if warranty serial is there $warr_serial = $em->getRepository(WarrantySerial::class)->find($serial); $warr = $em->getRepository(Warranty::class)->findOneBy(['serial' => $serial]); @@ -232,7 +251,18 @@ class CustomerWarrantyController extends APIController } $sku = $warr_serial->getSKU(); - $batt = $em->getRepository(SAPBattery::class)->find($sku); + // check if sku is null + $batt = null; + $cat_name = ''; + if ($sku != null) + $batt = $em->getRepository(SAPBattery::class)->find($sku); + else + { + // get the category name of the serial + $cat_name = $warr_serial->getMetaInfo('category_name'); + } + + // TODO: put this in a config file $image_url = $req->getSchemeAndHttpHost() . '/battery/generic.png'; if ($batt != null) @@ -246,7 +276,7 @@ class CustomerWarrantyController extends APIController else { $battery = [ - 'brand' => '', + 'brand' => $cat_name, 'size' => '', 'image_url' => '', ]; @@ -275,18 +305,40 @@ class CustomerWarrantyController extends APIController } - public function register($serial, EntityManagerInterface $em, Request $req, KernelInterface $kernel, RisingTideGateway $rt, TranslatorInterface $trans) + public function register($serial, EntityManagerInterface $em, Request $req, KernelInterface $kernel, RisingTideGateway $rt, TranslatorInterface $trans, + WarrantyAPILogger $logger) { error_log('HERE - register'); // check required parameters + // TODO: maybe add vmake_id? since warranty cannot be created with no vmake + // TODO: maye also add mobile and email since customer creation won't let mobile and email be null + // set up information for logging + // get user from header + $user_id = $_SERVER['HTTP_X_CATA_API_KEY']; + $log_data = [ + 'serial' => $serial, + 'plate_number' => $req->request->get('plate_num'), + 'first_name' => $req->request->get('first_name'), + 'last_name' => $req->request->get('last_name'), + 'vmake_id' => $req->request->get('vmake_id'), + 'contact_number' => $req->request->get('contact_num'), + 'email' => $req->request->get('email'), + 'invoice' => $req->request->get('invoice'), + ]; + $action = 'create/update'; + $source = WarrantySource::CAPI; + + error_log('SOURCE: ' . $source); + $required_params = [ 'first_name', 'last_name', 'plate_num' ]; - $res = $this->checkRequiredParams($req, $required_params); - if (!$res) - return $res; + $res = $this->checkRequiredParams($req, $required_params, $logger, $log_data, $user_id, $action, $source); + + if (!$res) + return $res; // file uploads $invoice = $req->files->get('invoice'); @@ -299,12 +351,13 @@ class CustomerWarrantyController extends APIController $wcard_filename = $this->handlePictureUpload($warr_card, $upload_dir, $serial, 'wcard'); // do actual registering - $res = $this->updateWarranty($em, $rt, $trans, $req, $serial, $inv_filename, $wcard_filename); + $res = $this->updateWarranty($em, $rt, $trans, $req, $serial, $inv_filename, $wcard_filename, + $logger, $log_data, $user_id, $action, $source); // flush to db $em->flush(); - return $res; + return $res; return new APIResponse(true, 'Warranty registered.'); } @@ -340,7 +393,8 @@ class CustomerWarrantyController extends APIController return $serial . '/' . $filename; } - protected function updateWarranty($em, $rt, $trans, $req, $serial, $inv_filename = null, $wcard_filename = null) + protected function updateWarranty($em, $rt, $trans, $req, $serial, $inv_filename = null, $wcard_filename = null, + $logger, $log_data, $user_id, $action, $source) { $plate_num = $this->cleanPlateNumber($req->request->get('plate_num')); @@ -349,6 +403,7 @@ class CustomerWarrantyController extends APIController $warr_serial = $em->getRepository(WarrantySerial::class)->find($serial); if ($warr_serial == null) { + $logger->logWarrantyInfo($log_data, 'Invalid warranty serial code..', $user_id, $action, $source); return new APIResponse(false, 'Invalid warranty serial code.'); } @@ -364,6 +419,7 @@ class CustomerWarrantyController extends APIController if ($plate_num != $warr_plate_num) { + $logger->logWarrantyInfo($log_data, 'Plate number does not match vehicle registered to warranty.', $user_id, $action, $source); return new APIResponse(false, 'Plate number does not match vehicle registered to warranty.'); } @@ -381,10 +437,17 @@ class CustomerWarrantyController extends APIController error_log('sap battery check'); // get sap battery $sku = $warr_serial->getSKU(); - $sap_bty = $em->getRepository(SAPBattery::class)->find($sku); - if ($sap_bty == null) + $sap_bty = null; + + // check if sku is null + if ($sku != null) { - return new APIResponse(false, 'Could not find battery entry for warranty.'); + $sap_bty = $em->getRepository(SAPBattery::class)->find($sku); + if ($sap_bty == null) + { + $logger->logWarrantyInfo($log_data, 'Cound not find battery entry for warranty.', $user_id, $action, $source); + return new APIResponse(false, 'Could not find battery entry for warranty.'); + } } // vehicle fetch @@ -395,6 +458,7 @@ class CustomerWarrantyController extends APIController $vehicle = $em->getRepository(Vehicle::class)->find($vmake_id); if ($vehicle == null) { + $logger->logWarrantyInfo($log_data, 'Could not find vehicle specified for warranty.', $user_id, $action, $source); return new APIResponse(false, 'Could not find vehicle specified for warranty.'); } } @@ -403,15 +467,20 @@ class CustomerWarrantyController extends APIController // default date purchase to today // NOTE: might need to change this later $date_pur = new DateTime(); + $date_pur_cust = new DateTime(); // get date purchase specified by customer - $date_pur_cust = DateTime::createFromFormat('Y-m-d', $req->request->get('date_purchase')); - if (!$date_pur_cust) + if (!empty($req->request->get('date_purchase'))) { - return new APIResponse(false, 'Invalid date format for date of purchase.'); + $date_pur_cust = DateTime::createFromFormat('Y-m-d', $req->request->get('date_purchase')); + if (!$date_pur_cust) + { + $logger->logWarrantyInfo($log_data, 'Invalid date format for date of purchase.', $user_id, $action, $source); + return new APIResponse(false, 'Invalid date format for date of purchase.'); + } } - // chstomer check + // customer check $priv_promo = $req->request->get('priv_promo', false); if ($cust == null) { @@ -483,14 +552,15 @@ class CustomerWarrantyController extends APIController $em->persist($warr); + $logger->logWarrantyInfo($log_data, '', $user_id, $action, $source); + // TODO: check if we need to do anyting else $data = []; - // send sms confirmation $this->sendSMSConfirmation($rt, $req->request->get('contact_num'), $sms_message); - return new APIResponse(true, 'Warranty registered.', $data); + return new APIResponse(true, 'Warranty registered.', $data); } protected function sendSMSConfirmation($rt, $num, $message) diff --git a/src/Controller/CAPI/WarrantyController.php b/src/Controller/CAPI/WarrantyController.php index c444370c..6e179c09 100644 --- a/src/Controller/CAPI/WarrantyController.php +++ b/src/Controller/CAPI/WarrantyController.php @@ -20,12 +20,16 @@ use App\Entity\PrivacyPolicy; use App\Entity\Customer; use App\Entity\CustomerVehicle; use App\Entity\Vehicle; +use App\Entity\WarrantyAPILog; + +use App\Service\WarrantyAPILogger; use App\Ramcar\NameValue; use App\Ramcar\WarrantyClass; use App\Ramcar\WarrantyStatus; use App\Ramcar\FuelType; use App\Ramcar\VehicleStatusCondition; +use App\Ramcar\WarrantySource; use DateTime; @@ -142,7 +146,7 @@ class WarrantyController extends APIController return new APIResponse(true, 'Warranties found.', $data); } - public function register(Request $req, EntityManagerInterface $em) + public function register(Request $req, EntityManagerInterface $em, WarrantyAPILogger $logger) { $this->denyAccessUnlessGranted('warranty.register.battery', null, 'No access.'); @@ -159,10 +163,6 @@ class WarrantyController extends APIController 'battery_size_id', */ ]; - $msg = $this->checkRequiredParameters($req, $params); - error_log('msg - ' . $msg); - if ($msg) - return new APIResponse(false, $msg); $serial = $req->request->get('serial'); $date_expire_string = $req->request->get('date_expire'); @@ -175,6 +175,31 @@ class WarrantyController extends APIController $lname = $req->request->get('last_name', null); $mnum = $req->request->get('mobile_number', null); + // set up information for logging + // get user from header + $user_id = $_SERVER['HTTP_X_CATA_API_KEY']; + $log_data = [ + 'serial' => $serial, + 'date_expire' => $date_expire_string, + 'date_pur_string' => $date_pur_string, + 'warranty_class' => $warr_class, + 'plate_number' => $plate, + 'sku' => $sku, + 'first_name' => $fname, + 'last_name' => $lname, + 'mobile_number' => $mnum, + ]; + $action = 'create'; + $source = WarrantySource::CAPI; + + $msg = $this->checkRequiredParameters($req, $params); + error_log('msg - ' . $msg); + if ($msg) + { + $logger->logWarrantyInfo($log_data, $msg, $user_id, $action, $source); + return new APIResponse(false, $msg); + } + /* $bmodel_id = $req->request->get('battery_model_id'); $bsize_id = $req->request->get('battery_size_id'); @@ -183,26 +208,47 @@ class WarrantyController extends APIController // wrong date expire format $date_expire = DateTime::createFromFormat('Ymd', $date_expire_string); if ($date_expire === false) + { + $logger->logWarrantyInfo($log_data, 'Wrong date format: date_expire.', $user_id, $action, $source); return new APIResponse(false, 'Wrong date format: date_expire.'); + } // wrong date purchase format $date_pur = DateTime::createFromFormat('Ymd', $date_pur_string); if ($date_pur === false) + { + $logger->logWarrantyInfo($log_data, 'Wrong date format: date_purchase', $user_id, $action, $source); return new APIResponse(false, 'Wrong date format: date_purchase.'); + } // valid warranty class if (!WarrantyClass::validate($warr_class)) + { + $logger->logWarrantyInfo($log_data, 'Invalid warranty class.', $user_id, $action, $source); return new APIResponse(false, 'Invalid warranty class.'); + } // plate number $plate = Warranty::cleanPlateNumber($plate); if (!$plate) + { + $logger->logWarrantyInfo($log_data, 'Invalid plate number.', $user_id, $action, $source); return new APIResponse(false, 'Invalid plate number.'); + } - // battery - $batt = $em->getRepository(SAPBattery::class)->find($sku); - if ($batt == null) - return new APIResponse(false, 'Invalid battery SKU.'); + // check if sku is blank + if ((empty($sku)) || ($sku == null)) + $batt = null; + else + { + // battery + $batt = $em->getRepository(SAPBattery::class)->find($sku); + if ($batt == null) + { + $logger->logWarrantyInfo($log_data, 'Invalid battery SKU.', $user_id, $action, $source); + return new APIResponse(false, 'Invalid battery SKU.'); + } + } /* // battery model @@ -239,6 +285,7 @@ class WarrantyController extends APIController } catch (UniqueConstraintViolationException $e) { + $logger->logWarrantyInfo($log_data, 'Duplicate serial encountered.', $user_id, $action, $source); return new APIResponse(false, 'Duplicate serial encountered.'); } @@ -247,10 +294,13 @@ class WarrantyController extends APIController 'warranty' => $this->generateWarrantyData($warr), ]; + // log creation of warranty data + $logger->logWarrantyInfo($log_data, '', $user_id, $action, $source); + return new APIResponse(true, 'Warranty registered.', $data); } - public function claim(Request $req, EntityManagerInterface $em, $id) + public function claim(Request $req, EntityManagerInterface $em, $id, WarrantyAPILogger $logger) { $this->denyAccessUnlessGranted('warranty.claim', null, 'No access.'); @@ -258,26 +308,50 @@ class WarrantyController extends APIController $params = [ 'serial', ]; + + $serial = $req->request->get('serial'); + + // set up information for logging + // get user from header + $user_id = $_SERVER['HTTP_X_CATA_API_KEY']; + $log_data = [ + 'serial' => $serial, + 'id' => $id, + ]; + $action = 'claim'; + $source = WarrantySource::CAPI; + $msg = $this->checkRequiredParameters($req, $params); if ($msg) + { + $logger->logWarrantyInfo($log_data, $msg, $user_id, $action, $source); return new APIResponse(false, $msg); + } // no warranty $warr = $em->getRepository(Warranty::class)->find($id); if ($warr == null) + { + $logger->logWarrantyInfo($log_data, 'No warranty found with that id.', $user_id, $action, $source); return new APIResponse(false, 'No warranty found with that id.', null, 404); + } // warranty is not active if (!$warr->canClaim()) + { + $logger->logWarrantyInfo($log_data, 'Warranty is not active.', $user_id, $action, $source); return new APIResponse(false, 'Warranty is not active.'); + } // check if new serial has been used - $serial = $req->request->get('serial'); $clean_serial = $this->cleanSerial($serial); $check_warr = $em->getRepository(Warranty::class)->findOneBy(['serial' => $clean_serial]); if ($check_warr != null) + { + $logger->logWarrantyInfo($log_data, 'Serial for replacement has already been used.', $user_id, $action, $source); return new APIResponse(false, 'Serial for replacement has already been used.'); + } // set status to claim $warr->setStatus(WarrantyStatus::CLAIMED) @@ -303,6 +377,7 @@ class WarrantyController extends APIController $em->flush(); // TODO: claim log + $logger->logWarrantyInfo($log_data, '', $user_id, $action, $source); return new APIResponse(true, 'Warranty claimed successfully.'); } @@ -382,10 +457,16 @@ class WarrantyController extends APIController if (!$plate) return new APIResponse(false, 'Invalid plate number.'); - // battery - $batt = $em->getRepository(SAPBattery::class)->find($sku); - if ($batt == null) - return new APIResponse(false, 'Invalid battery SKU.'); + // check if sku is blank + if ((empty($sku)) || ($sku == null)) + $batt = null; + else + { + // battery + $batt = $em->getRepository(SAPBattery::class)->find($sku); + if ($batt == null) + return new APIResponse(false, 'Invalid battery SKU.'); + } $warr->setSerial($serial) ->setWarrantyClass($warr_class) @@ -634,6 +715,7 @@ class WarrantyController extends APIController $w_last_name = $warranty->getLastName(); $new_cust = new Customer(); + // TODO: add customer source $new_cust->setFirstName($w_first_name) ->setLastName($w_last_name) ->setPhoneMobile($w_mobile_num); @@ -691,5 +773,4 @@ class WarrantyController extends APIController $customers = $em->getRepository(Customer::class)->findBy(['phone_mobile' => $number]); return $customers; } - } diff --git a/src/Controller/CustomerTagController.php b/src/Controller/CustomerTagController.php new file mode 100644 index 00000000..219e828d --- /dev/null +++ b/src/Controller/CustomerTagController.php @@ -0,0 +1,266 @@ +denyAccessUnlessGranted('customer_tag.list', null, 'No access.'); + + return $this->render('customer-tag/list.html.twig'); + } + + public function rows(Request $req) + { + $this->denyAccessUnlessGranted('customer_tag.list', null, 'No access.'); + + // get query builder + $qb = $this->getDoctrine() + ->getRepository(CustomerTag::class) + ->createQueryBuilder('q'); + + // get datatable params + $datatable = $req->request->get('datatable'); + + // count total records + $tquery = $qb->select('COUNT(q)'); + $this->setQueryFilters($datatable, $tquery); + $total = $tquery->getQuery() + ->getSingleScalarResult(); + + // get current page number + $page = $datatable['pagination']['page'] ?? 1; + + $perpage = $datatable['pagination']['perpage']; + $offset = ($page - 1) * $perpage; + + // add metadata + $meta = [ + 'page' => $page, + 'perpage' => $perpage, + 'pages' => ceil($total / $perpage), + 'total' => $total, + 'sort' => 'asc', + 'field' => 'id' + ]; + + // build query + $query = $qb->select('q'); + $this->setQueryFilters($datatable, $query); + + // check if sorting is present, otherwise use default + if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) { + $order = $datatable['sort']['sort'] ?? 'asc'; + $query->orderBy('q.' . $datatable['sort']['field'], $order); + } else { + $query->orderBy('q.id', 'asc'); + } + + // get rows for this page + $obj_rows = $query->setFirstResult($offset) + ->setMaxResults($perpage) + ->getQuery() + ->getResult(); + + // process rows + $rows = []; + foreach ($obj_rows as $orow) { + // add row data + $row['id'] = $orow->getID(); + $row['name'] = $orow->getName(); + + // add row metadata + $row['meta'] = [ + 'update_url' => '', + 'delete_url' => '' + ]; + + // add crud urls + if ($this->isGranted('customer_tag.update')) + $row['meta']['update_url'] = $this->generateUrl('customertag_update', ['id' => $row['id']]); + if ($this->isGranted('customer_tag.delete')) + $row['meta']['delete_url'] = $this->generateUrl('customertag_delete', ['id' => $row['id']]); + + $rows[] = $row; + } + + // response + return $this->json([ + 'meta' => $meta, + 'data' => $rows + ]); + } + + protected function setQueryFilters($datatable, QueryBuilder $query) + { + if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { + $query->where('q.name LIKE :filter') + ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); + } + } + + /** + * @Menu(selected="customer_tag_list") + */ + public function addForm() + { + $this->denyAccessUnlessGranted('customer_tag.add', null, 'No access.'); + + $params['obj'] = new CustomerTag(); + $params['mode'] = 'create'; + + // response + return $this->render('customer-tag/form.html.twig', $params); + } + + public function addSubmit(Request $req, ValidatorInterface $validator) + { + $this->denyAccessUnlessGranted('customer_tag.add', null, 'No access.'); + + // create new object + $em = $this->getDoctrine()->getManager(); + $obj = new CustomerTag(); + + $tag_details = $req->request->get('tag_details'); + $tag_details_json = json_decode($tag_details, true); + $obj->setID($req->request->get('id')) + ->setName($req->request->get('name')) + ->setTagDetails($tag_details_json); + + // validate + $errors = $validator->validate($obj); + + // initialize error list + $error_array = []; + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // check if any errors were found + if (!empty($error_array)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } else { + // validated! save the entity + $em->persist($obj); + $em->flush(); + + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!' + ]); + } + } + + /** + * @Menu(selected="customer_tag_list") + */ + public function updateForm($id) + { + $this->denyAccessUnlessGranted('customer_tag.update', null, 'No access.'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $obj = $em->getRepository(CustomerTag::class)->find($id); + + // make sure this row exists + if (empty($obj)) + throw $this->createNotFoundException('The item does not exist'); + + $params['obj'] = $obj; + $params['mode'] = 'update'; + + // response + return $this->render('customer-tag/form.html.twig', $params); + } + + public function updateSubmit(Request $req, ValidatorInterface $validator, $id) + { + $this->denyAccessUnlessGranted('customer_tag.update', null, 'No access.'); + + // get object data + $em = $this->getDoctrine()->getManager(); + $obj = $em->getRepository(CustomerTag::class)->find($id); + + // make sure this object exists + if (empty($obj)) + throw $this->createNotFoundException('The item does not exist'); + + $tag_details = $req->request->get('tag_details'); + $tag_details_json = json_decode($tag_details, true); + $obj->setID($req->request->get('id')) + ->setName($req->request->get('name')) + ->setTagDetails($tag_details_json); + + // validate + $errors = $validator->validate($obj); + + // initialize error list + $error_array = []; + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // check if any errors were found + if (!empty($error_array)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } + + // validated! save the entity + $em->flush(); + + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!' + ]); + } + + public function destroy($id) + { + $this->denyAccessUnlessGranted('customer_tag.delete', null, 'No access.'); + + // get object data + $em = $this->getDoctrine()->getManager(); + $obj = $em->getRepository(CustomerTag::class)->find($id); + + if (empty($obj)) + throw $this->createNotFoundException('The item does not exist'); + + // delete this object + $em->remove($obj); + $em->flush(); + + // response + $response = new Response(); + $response->setStatusCode(Response::HTTP_OK); + $response->send(); + } +} diff --git a/src/Controller/HubController.php b/src/Controller/HubController.php index edc6e599..3becdf97 100644 --- a/src/Controller/HubController.php +++ b/src/Controller/HubController.php @@ -17,8 +17,12 @@ use DateTime; use Catalyst\MenuBundle\Annotation\Menu; -use App\Service\MapTools; use App\Service\RiderTracker; +use App\Service\RisingTideGateway; +use App\Service\HubSelector; + +use App\Ramcar\HubCriteria; +use App\Ramcar\ModeOfPayment; class HubController extends Controller { @@ -128,6 +132,7 @@ class HubController extends Controller $params = []; $params['obj'] = new Hub(); $params['mode'] = 'create'; + $params['payment_methods'] = ModeOfPayment::getCollection(); // response return $this->render('hub/form.html.twig', $params); @@ -154,7 +159,17 @@ class HubController extends Controller ->setBranchCode($req->request->get('branch_code', '')) ->setStatusOpen($req->request->get('status_open', false)) ->setRiderSlots($req->request->get('rider_slots', 0)) - ->setHubViewFlag($req->request->get('flag_hub_view', false)); + ->setHubViewFlag($req->request->get('flag_hub_view', false)) + ->setNotifNumber($req->request->get('notif_number')) + ->clearPaymentMethods(); + + // set payment methods + $payment_methods = $req->request->get('payment_methods'); + + if (!empty($payment_methods)) + { + $obj->setPaymentMethods($payment_methods); + } } protected function setQueryFilters($datatable, QueryBuilder $query) @@ -166,7 +181,7 @@ class HubController extends Controller } } - public function addSubmit(Request $req, EncoderFactoryInterface $ef, ValidatorInterface $validator) + public function addSubmit(Request $req, EncoderFactoryInterface $ef, ValidatorInterface $validator, RisingTideGateway $rt) { $this->denyAccessUnlessGranted('hub.add', null, 'No access.'); @@ -176,14 +191,23 @@ class HubController extends Controller $em = $this->getDoctrine()->getManager(); $obj = new Hub(); + // initialize error list + $error_array = []; + + // validate the notification number + $mobile = $req->request->get('notif_number'); + if (!empty($mobile)) + { + $is_valid = $rt->validatePhoneNumber($mobile); + if (!$is_valid) + $error_array['notif_number'] = 'Invalid notification number'; + } + $this->setObject($obj, $req); // validate $errors = $validator->validate($obj); - // initialize error list - $error_array = []; - // add errors to list foreach ($errors as $error) { $error_array[$error->getPropertyPath()] = $error->getMessage(); @@ -226,12 +250,13 @@ class HubController extends Controller $params = []; $params['obj'] = $obj; $params['mode'] = 'update'; + $params['payment_methods'] = ModeOfPayment::getCollection(); // response return $this->render('hub/form.html.twig', $params); } - public function updateSubmit(Request $req, EncoderFactoryInterface $ef, ValidatorInterface $validator, $id) + public function updateSubmit(Request $req, EncoderFactoryInterface $ef, ValidatorInterface $validator, $id, RisingTideGateway $rt) { $this->denyAccessUnlessGranted('hub.update', null, 'No access.'); @@ -243,14 +268,23 @@ class HubController extends Controller if (empty($obj)) throw $this->createNotFoundException('The item does not exist'); + // initialize error list + $error_array = []; + + // validate the notification number + $mobile = $req->request->get('notif_number'); + if (!empty($mobile)) + { + $is_valid = $rt->validatePhoneNumber($mobile); + if (!$is_valid) + $error_array['notif_number'] = 'Invalid notification number'; + } + $this->setObject($obj, $req); // validate $errors = $validator->validate($obj); - // initialize error list - $error_array = []; - // add errors to list foreach ($errors as $error) { $error_array[$error->getPropertyPath()] = $error->getMessage(); @@ -295,7 +329,7 @@ class HubController extends Controller $response->send(); } - public function nearest(MapTools $map_tools, Request $req) + public function nearest(HubSelector $hub_selector, Request $req) { // get lat / long $lat = $req->query->get('lat'); @@ -303,7 +337,12 @@ class HubController extends Controller // get nearest hubs according to position $point = new Point($long, $lat); - $result = $map_tools->getClosestHubs($point, 10, date("H:i:s")); + + // set up hub criteria + $hub_criteria = new HubCriteria(); + $hub_criteria->setPoint($point); + $hub_selector->find($hub_criteria); + //$result = $map_tools->getClosestHubs($point, 10, date("H:i:s")); $hubs = []; foreach ($result as $hub_res) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index 11c7edf0..15f524d6 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -23,6 +23,7 @@ use App\Service\MapTools; use App\Service\MQTTClient; use App\Service\APNSClient; use App\Service\InventoryManager; +use App\Service\HubSelector; use App\Service\RiderTracker; use App\Service\MotivConnector; @@ -315,13 +316,13 @@ class JobOrderController extends Controller /** * @Menu(selected="jo_proc") */ - public function processingForm(MapTools $map_tools, $id, JobOrderHandlerInterface $jo_handler, GISManagerInterface $gis, MotivConnector $motiv) + public function processingForm(HubSelector $hub_selector, $id, JobOrderHandlerInterface $jo_handler, GISManagerInterface $gis, MotivConnector $motiv) { $this->denyAccessUnlessGranted('jo_proc.list', null, 'No access.'); try { - $params = $jo_handler->initializeProcessingForm($id, $map_tools, $motiv); + $params = $jo_handler->initializeProcessingForm($id, $hub_selector, $motiv); } catch (AccessDeniedHttpException $e) { @@ -504,14 +505,14 @@ class JobOrderController extends Controller /** * @Menu(selected="jo_open") */ - public function openHubForm(MapTools $map_tools, $id, JobOrderHandlerInterface $jo_handler, + public function openHubForm(HubSelector $hub_selector, $id, JobOrderHandlerInterface $jo_handler, GISManagerInterface $gis) { $this->denyAccessUnlessGranted('jo_open.list', null, 'No access.'); try { - $params = $jo_handler->initializeHubForm($id, $map_tools); + $params = $jo_handler->initializeHubForm($id, $hub_selector); } catch (NotFoundHttpException $e) { @@ -1204,6 +1205,7 @@ class JobOrderController extends Controller ]); } + // this is uncalled or does not display in admin panel /** * @Menu(selected="jo_autoassign") */ @@ -1223,6 +1225,7 @@ class JobOrderController extends Controller return $this->render($template, $params); } + // this is uncalled or does not display in admin panel public function autoAssignSubmit(Request $req, JobOrderHandlerInterface $jo_handler, EntityManagerInterface $em, MapTools $map_tools, InventoryManager $im) diff --git a/src/Controller/WarrantyController.php b/src/Controller/WarrantyController.php index b1f2442e..c078ac18 100644 --- a/src/Controller/WarrantyController.php +++ b/src/Controller/WarrantyController.php @@ -12,8 +12,10 @@ use App\Entity\CustomerVehicle; use App\Ramcar\WarrantyClass; use App\Ramcar\WarrantyStatus; +use App\Ramcar\WarrantySource; use App\Service\WarrantyHandler; +use App\Service\WarrantyAPILogger; use Doctrine\ORM\Query; use Doctrine\ORM\EntityManagerInterface; @@ -149,7 +151,7 @@ class WarrantyController extends Controller return $this->render('warranty/form.html.twig', $params); } - public function addSubmit(Request $req, ValidatorInterface $validator) + public function addSubmit(Request $req, ValidatorInterface $validator, WarrantyAPILogger $logger) { $this->denyAccessUnlessGranted('warranty.add', null, 'No access.'); @@ -181,31 +183,52 @@ class WarrantyController extends Controller } // custom validation for battery model - $model = $em->getRepository(BatteryModel::class) - ->find($req->request->get('battery_model')); + // check if battery model is blank + $bmodel = $req->request->get('battery_model'); + if (!empty($bmodel)) + { + $model = $em->getRepository(BatteryModel::class) + ->find($req->request->get('battery_model')); - if (empty($model)) - $error_array['battery_model'] = 'Invalid model selected.'; + if (empty($model)) + $error_array['battery_model'] = 'Invalid model selected.'; + else + $obj->setBatteryModel($model); + } else - $obj->setBatteryModel($model); + $obj->setBatteryModel(NULL); // custom validation for battery size - $size = $em->getRepository(BatterySize::class) - ->find($req->request->get('battery_size')); + // check if battery size is blank + $bsize = $req->request->get('battery_size'); + if (!empty($bsize)) + { + $size = $em->getRepository(BatterySize::class) + ->find($req->request->get('battery_size')); - if (empty($size)) - $error_array['battery_size'] = 'Invalid size selected.'; + if (empty($size)) + $error_array['battery_size'] = 'Invalid size selected.'; + else + $obj->setBatterySize($size); + } else - $obj->setBatterySize($size); + $obj->setBatterySize(NULL); // custom validation for SAP battery - $sap = $em->getRepository(SAPBattery::class) - ->find($req->request->get('sap_battery')); + // check if sap battery is blank + $sap_battery = $req->request->get('sap_battery'); + if (!empty($sap_battery)) + { + $sap = $em->getRepository(SAPBattery::class) + ->find($req->request->get('sap_battery')); - if (empty($sap)) - $error_array['sap_battery'] = 'Invalid SAP battery selected.'; + if (empty($sap)) + $error_array['sap_battery'] = 'Invalid SAP battery selected.'; + else + $obj->setSAPBattery($sap); + } else - $obj->setSAPBattery($sap); + $obj->setSAPBattery(NULL); // validate $errors = $validator->validate($obj); @@ -234,6 +257,28 @@ class WarrantyController extends Controller $em->persist($obj); $em->flush(); + // log warranty creation + $action = 'create'; + $user_id = $this->getUser()->getUsername(); + $source = WarrantySource::ADMIN_PANEL; + $log_data = [ + 'serial' => $req->request->get('serial'), + 'warranty_class' => $req->request->get('warranty_class'), + 'first_name' => $req->request->get('first_name'), + 'last_name' => $req->request->get('last_name'), + 'mobile_number' => $req->request->get('mobile_number'), + 'date_purchase' => $req->request->get('date_purchase'), + 'claim_from' => $req->request->get('claim_from'), + 'status' => $req->request->get('status'), + 'date_claim' => $req->request->get('date_claim'), + 'date_expire' => $req->request->get('date_expire'), + 'battery_model' => $req->request->get('battery_model'), + 'battery_size' => $req->request->get('battery_size'), + 'sap_battery' => $req->request->get('sap_battery'), + 'plate_number' => $req->request->get('plate_number'), + ]; + $logger->logWarrantyInfo($log_data, '', $user_id, $action, $source); + // return successful response return $this->json([ 'success' => 'Changes have been saved!' @@ -303,31 +348,52 @@ class WarrantyController extends Controller } // custom validation for battery model - $model = $em->getRepository(BatteryModel::class) - ->find($req->request->get('battery_model')); + // check if battery model is blank + $bmodel = $req->request->get('battery_model'); + if (!empty($bmodel)) + { + $model = $em->getRepository(BatteryModel::class) + ->find($req->request->get('battery_model')); - if (empty($model)) - $error_array['battery_model'] = 'Invalid model selected.'; + if (empty($model)) + $error_array['battery_model'] = 'Invalid model selected.'; + else + $obj->setBatteryModel($model); + } else - $obj->setBatteryModel($model); + $obj->setBatteryModel(null); // custom validation for battery size - $size = $em->getRepository(BatterySize::class) - ->find($req->request->get('battery_size')); + // check if battery size is blank + $bsize = $req->request->get('battery_size'); + if (!empty($bsize)) + { + $size = $em->getRepository(BatterySize::class) + ->find($req->request->get('battery_size')); - if (empty($size)) - $error_array['battery_size'] = 'Invalid size selected.'; + if (empty($size)) + $error_array['battery_size'] = 'Invalid size selected.'; + else + $obj->setBatterySize($size); + } else - $obj->setBatterySize($size); + $obj->setBatterySize(null); // custom validation for SAP battery - $sap = $em->getRepository(SAPBattery::class) - ->find($req->request->get('sap_battery')); + // check if sap battery is blank + $sap_battery = $req->request->get('sap_battery'); + if (!empty($sap_battery)) + { + $sap = $em->getRepository(SAPBattery::class) + ->find($req->request->get('sap_battery')); - if (empty($sap)) - $error_array['sap_battery'] = 'Invalid SAP battery selected.'; + if (empty($sap)) + $error_array['sap_battery'] = 'Invalid SAP battery selected.'; + else + $obj->setSAPBattery($sap); + } else - $obj->setSAPBattery($sap); + $obj->setSAPBattery(null); // validate $errors = $validator->validate($obj); @@ -598,8 +664,12 @@ class WarrantyController extends Controller } // error_log('Creating warranty for serial ' . $serial . ' and plate number ' . $plate_number); + $user_id = $this->getUser()->getUsername(); + $source = WarrantySource::BULK_UPLOAD; + + $wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class, + $user_id, $source); - $wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class); } } @@ -635,4 +705,5 @@ class WarrantyController extends Controller // remove spaces and make upper case return strtoupper(str_replace(' ', '', $plate)); } + } diff --git a/src/Entity/Customer.php b/src/Entity/Customer.php index f5e8e4e9..2f593e00 100644 --- a/src/Entity/Customer.php +++ b/src/Entity/Customer.php @@ -208,12 +208,20 @@ class Customer */ protected $create_source; + // customer tags + /** + * @ORM\ManyToMany(targetEntity="CustomerTag", inversedBy="customers") + * @ORM\JoinTable(name="customer_customer_tags") + */ + protected $customer_tags; + public function __construct() { $this->numbers = new ArrayCollection(); $this->sessions = new ArrayCollection(); $this->vehicles = new ArrayCollection(); $this->job_orders = new ArrayCollection(); + $this->customer_tags = new ArrayCollection(); $this->customer_classification = CustomerClassification::REGULAR; $this->customer_notes = ''; @@ -608,4 +616,36 @@ class Customer { return $this->create_source; } + + public function addCustomerTag(CustomerTag $customer_tag) + { + $this->customer_tags[$customer_tag->getID()] = $customer_tag; + return $this; + } + + public function clearCustomerTags() + { + $this->customer_tags->clear(); + return $this; + } + + public function getCustomerTags() + { + $str_cust_tags = []; + foreach ($this->customer_tags as $cust_tag) + $str_cust_tags[] = $cust_tag->getID(); + + return $str_cust_tags; + } + + public function getCustomerTagObjects() + { + return $this->customer_tags; + } + + public function removeCustomerTag(CustomerTag $customer_tag) + { + $this->customer_tags->removeElement($customer_tag); + $customer_tag->removeCustomer($this); + } } diff --git a/src/Entity/CustomerTag.php b/src/Entity/CustomerTag.php new file mode 100644 index 00000000..28d41fd0 --- /dev/null +++ b/src/Entity/CustomerTag.php @@ -0,0 +1,124 @@ +date_create = new DateTime(); + $this->customers = new ArrayCollection(); + $this->tag_details = []; + } + + public function getID() + { + return $this->id; + } + + public function setID($id) + { + $this->id = $id; + return $this; + } + + public function setName($name) + { + $this->name = $name; + return $this; + } + + public function getName() + { + return $this->name; + } + + public function getDateCreate() + { + return $this->date_create; + } + + public function addCustomer(Customer $customer) + { + $this->customers[$customer->getID()] = $customer; + + return $this; + } + + public function clearCustomers() + { + $this->customers->clear(); + return $this; + } + + public function getCustomers() + { + return $this->customers; + } + + public function removeCustomer(Customer $customer) + { + $this->customers->removeElement($customer); + } + + public function addTagDetails($id, $value) + { + $this->tag_details[$id] = $value; + return $this; + } + + public function setTagDetails($tag_details) + { + $this->tag_details = $tag_details; + return $this; + } + + public function getTagDetails($id) + { + // return null if we don't have it + if (!isset($this->tag_details[$id])) + return null; + + return $this->tag_details[$id]; + } + + public function getAllTagDetails() + { + return json_encode($this->tag_details); + } +} diff --git a/src/Entity/Hub.php b/src/Entity/Hub.php index 0b1769b2..b40bc395 100644 --- a/src/Entity/Hub.php +++ b/src/Entity/Hub.php @@ -68,6 +68,18 @@ class Hub */ protected $flag_hub_view; + // notification number to send SMS to if hub doesn't have item + /** + * @ORM\Column(type="string", length=30) + */ + protected $notif_number; + + // payment methods + /** + * @ORM\Column(type="array", nullable=true) + */ + protected $payment_methods; + public function __construct() { $this->time_open = new DateTime(); @@ -76,6 +88,8 @@ class Hub $this->outlets = new ArrayCollection(); $this->status_open = true; $this->flag_hub_view = false; + $this->notif_number = ''; + $this->payment_methods = new ArrayCollection(); } public function getRiders() @@ -185,5 +199,38 @@ class Hub return $this->flag_hub_view; } + public function setNotifNumber($notif_number) + { + $this->notif_number = $notif_number; + return $this; + } + + public function getNotifNumber() + { + return $this->notif_number; + } + + public function getPaymentMethods() + { + return $this->payment_methods; + } + + public function setPaymentMethods(array $payment_methods) + { + $this->payment_methods = new ArrayCollection(); + + foreach ($payment_methods as $payment_method) + { + $this->payment_methods->add($payment_method); + } + + return $this; + } + + public function clearPaymentMethods() + { + $this->payment_methods = new ArrayCollection(); + return $this; + } } diff --git a/src/Entity/HubFilterLog.php b/src/Entity/HubFilterLog.php new file mode 100644 index 00000000..00f8394d --- /dev/null +++ b/src/Entity/HubFilterLog.php @@ -0,0 +1,83 @@ +date_create = new DateTime(); + } + + public function getID() + { + return $this->id; + } + + public function getDateCreate() + { + return $this->date_create; + } + + public function setHub(Hub $hub) + { + $this->hub = $hub; + return $this; + } + + public function getHub() + { + return $this->hub; + } + + public function setFilterTypeId($filter_type_id) + { + $this->filter_type_id = $filter_type_id; + return $this; + } + + public function getFilterTypeId() + { + return $this->filter_type_id; + } +} diff --git a/src/Entity/PromoLog.php b/src/Entity/PromoLog.php new file mode 100644 index 00000000..0decf2a7 --- /dev/null +++ b/src/Entity/PromoLog.php @@ -0,0 +1,168 @@ +date_create = new DateTime(); + } + + public function getID() + { + return $this->id; + } + + public function setDateCreate(DateTime $date_create) + { + $this->date_create = $date_create; + return $this; + } + + public function getDateCreate() + { + return $this->date_create; + } + + public function setCreatedBy($created_by) + { + $this->created_by = $created_by; + return $this; + } + + public function getCreatedBy() + { + return $this->created_by; + } + + public function setCustId($cust_id) + { + $this->cust_id = $cust_id; + return $this; + } + + public function getCustId() + { + return $this->cust_id; + } + + public function setCustFirstName($cust_first_name) + { + $this->cust_first_name = $cust_first_name; + return $this; + } + + public function getCustFirstName() + { + return $this->cust_first_name; + } + + public function setCustLastName($cust_last_name) + { + $this->cust_last_name = $cust_last_name; + return $this; + } + + public function getCustLastName() + { + return $this->cust_last_name; + } + + public function setJoId($jo_id) + { + $this->jo_id = $jo_id; + return $this; + } + + public function getJoId() + { + return $this->jo_id; + } + + public function setInvoiceId($invoice_id) + { + $this->invoice_id = $invoice_id; + return $this; + } + + public function getInvoiceId() + { + return $this->invoice_id; + } + + public function setAmount($amount) + { + $this->amount = $amount; + return $this; + } + + public function getAmount() + { + return $this->amount; + } +} diff --git a/src/Entity/Warranty.php b/src/Entity/Warranty.php index 9af986d3..36c4a781 100644 --- a/src/Entity/Warranty.php +++ b/src/Entity/Warranty.php @@ -73,14 +73,14 @@ class Warranty // battery model /** * @ORM\ManyToOne(targetEntity="BatteryModel", inversedBy="warranties") - * @ORM\JoinColumn(name="bty_model_id", referencedColumnName="id") + * @ORM\JoinColumn(name="bty_model_id", referencedColumnName="id", nullable=true) */ protected $bty_model; // battery size /** * @ORM\ManyToOne(targetEntity="BatterySize", inversedBy="warranties") - * @ORM\JoinColumn(name="bty_size_id", referencedColumnName="id") + * @ORM\JoinColumn(name="bty_size_id", referencedColumnName="id", nullable=true) */ protected $bty_size; @@ -371,7 +371,7 @@ class Warranty return $this->mobile_number; } - public function setBatteryModel(BatteryModel $model) + public function setBatteryModel(BatteryModel $model = null) { $this->bty_model = $model; return $this; @@ -382,7 +382,7 @@ class Warranty return $this->bty_model; } - public function setBatterySize(BatterySize $size) + public function setBatterySize(BatterySize $size = null) { $this->bty_size = $size; return $this; @@ -393,7 +393,7 @@ class Warranty return $this->bty_size; } - public function setSAPBattery(SAPBattery $sap_bty) + public function setSAPBattery(SAPBattery $sap_bty = null) { $this->sap_bty = $sap_bty; return $this; diff --git a/src/Entity/WarrantyAPILog.php b/src/Entity/WarrantyAPILog.php new file mode 100644 index 00000000..595ce3c3 --- /dev/null +++ b/src/Entity/WarrantyAPILog.php @@ -0,0 +1,163 @@ +date_create = new DateTime(); + $this->errors = new ArrayCollection(); + $this->all_data = []; + $this->action = ''; + $this->source = ''; + } + + public function getID() + { + return $this->id; + } + + public function setDateCreate(DateTime $date_create) + { + $this->date_create = $date_create; + return $this; + } + + public function getDateCreate() + { + return $this->date_create; + } + + public function setApiUser($api_user) + { + $this->api_user = $api_user; + return $this; + } + + public function getApiUser() + { + return $this->api_user; + } + + public function addAllData($id, $value) + { + $this->all_data[$id] = $value; + return $this; + } + + public function setAllData($all_data) + { + $this->all_data = $all_data; + return $this; + } + + public function getAllData($id) + { + // return null if we don't have it + if (!isset($this->all_data[$id])) + return null; + + return $this->all_data[$id]; + } + + public function getErrors() + { + return $this->errors; + } + + public function setErrors(array $errors) + { + $this->errors = new ArrayCollection(); + + foreach ($errors as $error) + { + $this->errors->add($error); + } + + return $this; + } + + public function clearErrors() + { + $this->errors = new ArrayCollection(); + return $this; + } + + public function setAction($action) + { + $this->action = $action; + return $this; + } + + public function getAction() + { + return $this->action; + } + + public function setSource($source) + { + $this->source = $source; + return $this; + } + + public function getSource() + { + return $this->source; + } +} diff --git a/src/Entity/WarrantySerial.php b/src/Entity/WarrantySerial.php index 812e4106..ee55dd56 100644 --- a/src/Entity/WarrantySerial.php +++ b/src/Entity/WarrantySerial.php @@ -46,9 +46,16 @@ class WarrantySerial */ protected $source; + // other information + /** + * @ORM\Column(type="json") + */ + protected $meta_info; + public function __construct() { $this->date_create = new DateTime(); + $this->meta_info = []; } public function setID($id) @@ -99,4 +106,19 @@ class WarrantySerial { return $this->source; } + + public function addMetaInfo($id, $value) + { + $this->meta_info[$id] = $value; + return $this; + } + + public function getMetaInfo($id) + { + // return null if we don't have it + if (!isset($this->meta_info[$id])) + return null; + + return $this->meta_info[$id]; + } } diff --git a/src/Ramcar/HubCriteria.php b/src/Ramcar/HubCriteria.php new file mode 100644 index 00000000..f00c1281 --- /dev/null +++ b/src/Ramcar/HubCriteria.php @@ -0,0 +1,140 @@ +limit_results = 10; + $this->limit_distance = 500; + $this->jo_type = ''; + $this->date_time = null; + $this->flag_inventory_check = false; + $this->items = []; + $this->payment_method = ''; + $flag_emergency = false; + } + + public function setPoint(Point $point) + { + $this->point = $point; + return $this; + } + + public function getPoint() + { + return $this->point; + } + + public function setLimitResults($limit_results) + { + $this->limit_results = $limit_results; + return $this; + } + + public function getLimitResults() + { + return $this->limit_results; + } + + public function setLimitDistance($limit_distance) + { + $this->limit_distance = $limit_distance; + return $this; + } + + public function getLimitDistance() + { + return $this->limit_distance; + } + + public function setInventoryCheck($flag_inventory_check = true) + { + $this->flag_inventory_check = $flag_inventory_check; + return $this; + } + + public function hasInventoryCheck() + { + return $this->flag_inventory_check; + } + + public function setJoType($jo_type) + { + // TODO: validate the jo type + $this->jo_type = $jo_type; + return $this; + } + + public function getJoType() + { + return $this->jo_type; + } + + public function setDateTime(DateTime $date_time) + { + $this->date_time = $date_time; + return $this; + } + + public function getDateTime() + { + return $this->date_time; + } + + public function addItem($sku, $quantity) + { + // at this point, sku is assumed to be a valid item + $this->items[$sku] = $quantity; + return $this; + } + + public function getItems() + { + return $this->items; + } + + public function setItems($items) + { + $this->items = $items; + return $this; + } + + public function setPaymentMethod($payment_method) + { + $this->payment_method = $payment_method; + return $this; + } + + public function getPaymentMethod() + { + return $this->payment_method; + } + + public function setEmergency($flag_emergency = true) + { + $this->flag_emergency = $flag_emergency; + return $this; + } + + public function isEmergency() + { + return $this->flag_emergency; + } +} diff --git a/src/Ramcar/WarrantySource.php b/src/Ramcar/WarrantySource.php new file mode 100644 index 00000000..1697d9f6 --- /dev/null +++ b/src/Ramcar/WarrantySource.php @@ -0,0 +1,22 @@ + 'Third Party API', + 'rapi' => 'Rider API', + 'admin_panel' => 'Admin Panel', + 'bulk_upload' => 'Bulk Upload', + 'mobile' => 'Mobile API', + 'command' => 'Command', + ]; +} diff --git a/src/Service/CustomerHandler/ResqCustomerHandler.php b/src/Service/CustomerHandler/ResqCustomerHandler.php index 76d20054..2ef79b07 100644 --- a/src/Service/CustomerHandler/ResqCustomerHandler.php +++ b/src/Service/CustomerHandler/ResqCustomerHandler.php @@ -22,6 +22,7 @@ use App\Entity\Vehicle; use App\Entity\Battery; use App\Entity\VehicleManufacturer; use App\Entity\BatteryManufacturer; +use App\Entity\CustomerTag; use DateTime; @@ -151,6 +152,9 @@ class ResqCustomerHandler implements CustomerHandlerInterface $params['obj'] = new Customer(); $params['mode'] = 'create'; + // get customer tags + $params['customer_tags'] = $this->em->getRepository(CustomerTag::class)->findAll(); + // get dropdown parameters $this->fillDropdownParameters($params); @@ -307,6 +311,9 @@ class ResqCustomerHandler implements CustomerHandlerInterface if (empty($row)) throw new NotFoundHttpException('The item does not exist'); + // get customer tags + $params['customer_tags'] = $em->getRepository(CustomerTag::class)->findAll(); + // get dropdown parameters $this->fillDropdownParameters($params); @@ -541,6 +548,7 @@ class ResqCustomerHandler implements CustomerHandlerInterface 'flag_promo_email' => $customer->isPromoEmail(), 'flag_research_sms' => $customer->isResearchSms(), 'flag_research_email' => $customer->isResearchEmail(), + 'customer_tags' => $customer->getCustomerTags(), ], 'vehicle' => [ 'id' => $vehicle->getID(), @@ -603,13 +611,26 @@ class ResqCustomerHandler implements CustomerHandlerInterface ->setPromoEmail($req->request->get('flag_promo_email', false)) ->setDpaConsent($is_dpa_checked) ->setResearchSms($req->request->get('flag_research_sms', false)) - ->setResearchEmail($req->request->get('flag_research_email', false)); + ->setResearchEmail($req->request->get('flag_research_email', false)) + ->clearCustomerTags(); // phone numbers $obj->setPhoneMobile($req->request->get('phone_mobile')) ->setPhoneLandline($req->request->get('phone_landline')) ->setPhoneOffice($req->request->get('phone_office')) ->setPhoneFax($req->request->get('phone_fax')); + + // set car club flags + $customer_tags = $req->request->get('customer_tags'); + if (!empty($customer_tags)) + { + foreach($customer_tags as $customer_tag_id) + { + $customer_tag = $this->em->getRepository(CustomerTag::class)->find($customer_tag_id); + if (!empty($customer_tag)) + $obj->addCustomerTag($customer_tag); + } + } } protected function fillDropdownParameters(&$params) diff --git a/src/Service/HubDistributor.php b/src/Service/HubDistributor.php new file mode 100644 index 00000000..e401a4a1 --- /dev/null +++ b/src/Service/HubDistributor.php @@ -0,0 +1,109 @@ +redis = $redis->getRedisClient(); + $this->hub_jo_key = $hub_jo_key; + } + + public function incrementJoCountForHub(Hub $hub) + { + $key = $hub->getID(); + + // get current count + $jo_count = $this->redis->hget($this->hub_jo_key, $key); + if ($jo_count == false) + { + // hub not in hash + // add hub to hash + // set to 1 since this is first jo for hub + $this->redis->hset($this->hub_jo_key, $key, 1); + } + else + { + // hub exist in hash + // add to count + $this->redis->hset($this->hub_jo_key, $key, $jo_count + 1); + } + } + + public function decrementJoCountForHub(Hub $hub) + { + $key = $hub->getID(); + + // get current count + $jo_count = $this->redis->hget($this->hub_jo_key, $key); + if ($jo_count) + { + // hub exist in hash + // decrement count + $this->redis->hset($this->hub_jo_key, $key, $jo_count - 1); + } + } + + public function arrangeHubs($hubs) + { + if (count($hubs) == 1) + return $hubs; + + $arranged_hubs = []; + + foreach ($hubs as $hub_data) + { + $hub = $hub_data['hub']; + + // need the id of hub + $key = $hub->getID(); + + // get jo count of hub + $hub_jo_count = $this->redis->hget($this->hub_jo_key, $key); + + // check if hub is in hash. if not, hub has no jobs + // but should still be added to results + if ($hub_jo_count != null) + { + $arranged_hubs[] = [ + 'hub' => $hub, + 'db_distance' => $hub_data['db_distance'], + 'distance' => $hub_data['distance'], + 'duration' => $hub_data['duration'], + 'jo_count' => $hub_jo_count, + ]; + } + else + { + $arranged_hubs[] = [ + 'hub' => $hub, + 'db_distance' => $hub_data['db_distance'], + 'distance' => $hub_data['distance'], + 'duration' => $hub_data['duration'], + 'jo_count' => 0, + ]; + } + } + + usort($arranged_hubs, function($a, $b) { + if ($a['jo_count'] == $b['jo_count']) + return 0; + if ($a['jo_count'] < $b['jo_count']) + return -1; + else + return 1; + }); + + //error_log('arranged hubs ' . json_encode($arranged_hubs)); + + return $arranged_hubs; + } +} diff --git a/src/Service/HubFilterLogger.php b/src/Service/HubFilterLogger.php new file mode 100644 index 00000000..71cc1929 --- /dev/null +++ b/src/Service/HubFilterLogger.php @@ -0,0 +1,29 @@ +em = $em; + } + + public function logFilteredHub(Hub $hub, $filter_type) + { + $hub_filter_log = new HubFilterLog(); + + $hub_filter_log->setHub($hub) + ->setFilterTypeId($filter_type); + + $this->em->persist($hub_filter_log); + $this->em->flush(); + } +} diff --git a/src/Service/HubSelector.php b/src/Service/HubSelector.php new file mode 100644 index 00000000..046fe757 --- /dev/null +++ b/src/Service/HubSelector.php @@ -0,0 +1,479 @@ +em = $em; + $this->im = $im; + $this->hub_distributor = $hub_distributor; + $this->hub_filter_logger = $hub_filter_logger; + $this->trans = $trans; + $this->rt = $rt; + } + + public function find(HubCriteria $criteria) + { + $point = $criteria->getPoint(); + $limit_results = $criteria->getLimitResults(); + $limit_distance = $criteria->getLimitDistance(); + $jo_type = $criteria->getJoType(); + $flag_inventory_check = $criteria->hasInventoryCheck(); + $items = $criteria->getItems(); + $date_time = $criteria->getDateTime(); + $payment_method = $criteria->getPaymentMethod(); + $flag_emergency = $criteria->isEmergency(); + + $results = []; + + // get all the hubs within distance + $filtered_hubs = $this->getClosestHubs($point, $limit_distance); + + //error_log('closest hubs ' . json_encode($filtered_hubs)); + + if (!$flag_emergency) + { + // filter the first hub results for date and opening times + $hubs_date_time = $this->filterHubsByDateAndTime($filtered_hubs, $date_time); + $filtered_hubs = $hubs_date_time; + + // filter jo types + $hubs_jo_type = $this->filterHubsByJoType($filtered_hubs, $jo_type); + $filtered_hubs = $hubs_jo_type; + + // filter hubs by payment methods + $hubs_payment_method = $this->filterHubsByPaymentMethod($filtered_hubs, $payment_method); + $filtered_hubs = $hubs_payment_method; + + // filter hubs by rider availability + $hubs_rider_availability = $this->filterHubsByRiderAvailability($filtered_hubs); + $filtered_hubs = $hubs_rider_availability; + + // inventory filter + $hubs_inventory = $this->filterHubsByInventory($filtered_hubs, $flag_inventory_check, + $jo_type, $items); + $filtered_hubs = $hubs_inventory; + + // round robin filter + $hubs_round_robin = $this->filterHubsByRoundRobin($filtered_hubs); + $filtered_hubs = $hubs_round_robin; + + //error_log(json_encode($filtered_hubs)); + + // max results filter + $hubs_max_result = $this->filterHubsByMaxResults($filtered_hubs, $limit_results); + $filtered_hubs = $hubs_max_result; + } + + $results = $filtered_hubs; + + error_log(json_encode($results)); + + return $results; + } + + protected function filterHubsByRoundRobin($hubs) + { + if (empty($hubs)) + return $hubs; + + $results = []; + // call hub distributor service + $arranged_hubs = $this->hub_distributor->arrangeHubs($hubs); + $results = $arranged_hubs; + + return $results; + + } + + protected function filterHubsByMaxResults($hubs, $limit_result) + { + if (empty($hubs)) + return $hubs; + if (empty($limit_result)) + return $hubs; + + $results = []; + for ($i = 0; $i < count($hubs); $i++) + { + if ($i < $limit_result) + $results[] = $hubs[$i]; + else + $this->hub_filter_logger->logFilteredHub($hubs[$i]['hub'], 'max_results'); + } + + return $results; + } + + protected function filterHubsByJoType($hubs, $jo_type) + { + if (empty($hubs)) + return $hubs; + if (empty($jo_type)) + return $hubs; + + $results = []; + foreach ($hubs as $hub_data) + { + $hub = $hub_data['hub']; + + // TODO: for now, have this return true + $has_jo_type = true; + // check if hub offers the jo_type + // TODO: add service to hub + if ($has_jo_type) + $results[] = [ + 'hub' => $hub, + 'db_distance' => $hub_data['db_distance'], + 'distance' => $hub_data['distance'], + 'duration' => $hub_data['duration'], + ]; + else + $this->hub_filter_logger->logFilteredHub($hub, 'job_order_type'); + } + + return $results; + } + + protected function filterHubsByPaymentMethod($hubs, $payment_method) + { + if (empty($hubs)) + return $hubs; + if (empty($payment_method)) + return $hubs; + + $results = []; + foreach ($hubs as $hub_data) + { + $hub = $hub_data['hub']; + + // name of payment method is what is saved + $payment_methods = $hub->getPaymentMethods(); + if ($payment_methods != null) + { + $flag_found_pmethod = false; + foreach ($payment_methods as $pmethod) + { + if ($pmethod == $payment_method) + { + $results[] = [ + 'hub' => $hub, + 'db_distance' => $hub_data['db_distance'], + 'distance' => $hub_data['distance'], + 'duration' => $hub_data['duration'], + ]; + } + $flag_found_pmethod = true; + } + + if (!$flag_found_pmethod) + $this->hub_filter_logger->logFilteredHub($hub, 'no_payment_method'); + } + else + $this->hub_filter_logger->logFilteredHub($hub, 'no_payment_method'); + } + + return $results; + } + + protected function filterHubsByRiderAvailability($hubs) + { + if (empty($hubs)) + return $hubs; + + $results = []; + foreach ($hubs as $hub_data) + { + $hub = $hub_data['hub']; + + // get hub's riders + $riders = $hub->getRiders(); + $avail_rider_count = 0; + foreach ($riders as $rider) + { + if ($rider->isAvailable()) + $avail_rider_count = $avail_rider_count + 1; + } + + error_log('HUB ' . $hub->getID() . ' RIDER COUNT' . $avail_rider_count); + + if ($avail_rider_count > 0) + $results[] = [ + 'hub' => $hub, + 'db_distance' => $hub_data['db_distance'], + 'distance' => $hub_data['distance'], + 'duration' => $hub_data['duration'], + ]; + else + $this->hub_filter_logger->logFilteredHub($hub, 'no_available_rider'); + } + + return $results; + } + + protected function filterHubsByDateAndTime($hubs, $date_time) + { + if (empty($hubs)) + return $hubs; + + if ($date_time == null) + return $hubs; + + $results = []; + + foreach ($hubs as $hub_data) + { + // go through each hub's opening times to check if hub is open + // for the specified time + // get hub opening and closing times + // TODO: maybe in the future, might also have to check if hub + // is open/available on date/day + $hub = $hub_data['hub']; + + $time_open = $hub->getTimeOpen()->format("H:i:s"); + $time_close = $hub->getTimeClose()->format("H:i:s"); + + $filter_time = $date_time->format("H:i:s"); + + if (($filter_time >= $time_open) && + ($filter_time <= $time_close)) + { + $results[] = [ + 'hub' => $hub, + 'db_distance' => $hub_data['db_distance'], + 'distance' => $hub_data['distance'], + 'duration' => $hub_data['duration'], + ]; + } + else + $this->hub_filter_logger->logFilteredHub($hub, 'date_and_time'); + } + + return $results; + } + + protected function filterHubsByInventory($hubs, $flag_inventory_check, $jo_type, $items) + { + if (empty($hubs)) + return $hubs; + + if (!$flag_inventory_check) + return $hubs; + + $results = []; + if ($flag_inventory_check) + { + foreach ($hubs as $hub_data) + { + $hub = $hub_data['hub']; + + if ($jo_type == ServiceType::BATTERY_REPLACEMENT_NEW) + { + // call inventory + $has_items = $this->checkInventory($items, $hub); + if ($has_items) + $results[] = [ + 'hub' => $hub, + 'db_distance' => $hub_data['db_distance'], + 'distance' => $hub_data['distance'], + 'duration' => $hub_data['duration'], + ]; + else + { + // get the skus for the message + $sku_text = ''; + foreach ($items as $key => $value) + { + $sku_text .= ' ' . $key; + } + // send SMS to hub + $message = str_replace('item_display', trim($sku_text), $this->trans->trans('no_inventory_message')); + error_log($message); + $this->sendSMSMessage($hub, $items); + $this->hub_filter_logger->logFilteredHub($hub, 'no_inventory'); + } + } + if ($jo_type == ServiceType::BATTERY_REPLACEMENT_WARRANTY) + { + // call inventory + $has_items = $this->checkInventory($items, $hub); + if ($has_items) + $results[] = [ + 'hub' => $hub, + 'db_distance' => $hub_data['db_distance'], + 'distance' => $hub_data['distance'], + 'duration' => $hub_data['duration'], + ]; + else + { + // get the skus for the message + $sku_text = ''; + foreach ($items as $key => $value) + { + $sku_text .= ' ' . $key; + } + // send SMS to hub + $message = str_replace('item_display', trim($sku_text), $this->trans->trans('no_inventory_message')); + error_log($message); + $this->sendSMSMessage($hub, $items); + $this->hub_filter_logger->logFilteredHub($hub, 'no_inventory'); + } + } + } + } + + return $results; + } + + protected function sendSMSMessage($hub, $items) + { + // compose message + // get the skus for the message + $sku_text = ''; + foreach ($items as $key => $value) + { + $sku_text .= ' ' . $key; + } + $message = str_replace('item_display', trim($sku_text), $this->trans->trans('no_inventory_message')); + + // get hub notification number + $number = $hub->getNotifNumber(); + + if (!empty($number)) + { + // send SMS message + $mobile_number = '63' . $number; + error_log('sending sms to - ' . $mobile_number); + $this->rt->sendSMS($mobile_number, 'MOTOLITE', $message); + } + } + + protected function getClosestHubs(Point $point, $limit_distance) + { + // get closest hubs based on st_distance function from db + $query_string = 'SELECT h, st_distance(h.coordinates, point(:lng, :lat)) as dist FROM App\Entity\Hub h WHERE h.status_open = true ORDER BY dist'; + + $query = $this->em->createQuery($query_string) + ->setParameter('lat', $point->getLatitude()) + ->setParameter('lng', $point->getLongitude()); + + // error_log($query->getSql()); + $result = $query->getResult(); + + $hubs = []; + $hubs_data = []; + foreach ($result as $row) + { + $hubs[] = $row[0]; + + // get coordinates of hub + $hub_coordinates = $row[0]->getCoordinates(); + + $cust_lat = $point->getLatitude(); + $cust_lng = $point->getLongitude(); + + $hub_lat = $hub_coordinates->getLatitude(); + $hub_lng = $hub_coordinates->getLongitude(); + + // get distance in kilometers from customer point to hub point + $dist = $this->distance($cust_lat, $cust_lng, $hub_lat, $hub_lng); + + if ($dist < $limit_distance) + { + $hubs_data[] = [ + 'hub' => $row[0], + 'db_distance' => $row['dist'], + 'distance' => $dist, + 'duration' => 0, + ]; + } + else + { + $this->hub_filter_logger->logFilteredHub($row[0], 'distance'); + } + } + + return $hubs_data; + } + + protected function checkInventory($items, $hub) + { + // check if hub has all items + $skus = []; + $branch_codes[] = $hub->getBranchCode(); + $result = false; + + foreach ($items as $key=> $value) + { + // add sap code of item/battery into array since + // getBranchesInventory takes in an array of hubs/branches + // and an array of skus + // $items as format: $items[sku] = quantity + $skus[] = $key; + } + + // call InventoryManager's getBranchesInventory to check if hub has all items + $branches_with_items = $this->im->getBranchesInventory($branch_codes, $skus); + + if (!empty($branches_with_items)) + { + // check if branch has enough quantity for item + foreach ($branches_with_items as $branch) + { + // get quantity from call + $qty_available = $branch['Quantity']; + + // get the quantity request + $sku_requested = $branch['SapCode']; + $qty_requested = $items[$sku_requested]; + if ($qty_available >= $qty_requested) + $result = true; + } + } + + // return true or false + return $result; + } + + // convert db distance to kilometers + protected function distance($lat1, $lon1, $lat2, $lon2) + { + if (($lat1 == $lat2) && ($lon1 == $lon2)) + return 0; + + $theta = $lon1 - $lon2; + $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); + $dist = acos($dist); + $dist = rad2deg($dist); + $miles = $dist * 60 * 1.1515; + + return round(($miles * 1.609344), 1); + } +} diff --git a/src/Service/InventoryManager.php b/src/Service/InventoryManager.php index 4dc5a8b1..f0669559 100644 --- a/src/Service/InventoryManager.php +++ b/src/Service/InventoryManager.php @@ -71,6 +71,7 @@ class InventoryManager // check if the response is empty $results = []; + //error_log($response); if (!empty($response)) $results = json_decode($response, true); diff --git a/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php b/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php index 2999d622..aa0340b1 100644 --- a/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php +++ b/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php @@ -19,6 +19,7 @@ use App\Entity\InvoiceItem; use App\Entity\User; use App\Entity\Battery; use App\Entity\Promo; +use App\Entity\Customer; use App\Service\InvoiceGeneratorInterface; @@ -66,6 +67,15 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface $stype = $criteria->getServiceType(); $cv = $criteria->getCustomerVehicle(); $has_coolant = $criteria->hasCoolant(); + + $cust_tag_info = []; + if ($stype == ServiceType::BATTERY_REPLACEMENT_NEW) + { + // check if criteria has entries + $entries = $criteria->getEntries(); + if (!empty($entries)) + $cust_tag_info = $this->getCustomerTagInfo($cv); + } // error_log($stype); switch ($stype) { @@ -81,7 +91,7 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface $this->processBatteries($total, $criteria, $invoice); $this->processTradeIns($total, $criteria, $invoice); */ - $this->processDiscount($total, $criteria, $invoice); + $this->processDiscount($total, $criteria, $invoice, $cust_tag_info); break; case ServiceType::BATTERY_REPLACEMENT_WARRANTY: @@ -404,45 +414,95 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface } } - protected function processDiscount(&$total, InvoiceCriteria $criteria, Invoice $invoice) + protected function processDiscount(&$total, InvoiceCriteria $criteria, Invoice $invoice, $cust_tag_info) { - $promos = $criteria->getPromos(); - if (count($promos) < 1) - return; - - // NOTE: only get first promo because only one is applicable anyway - $promo = $promos[0]; - - $rate = $promo->getDiscountRate(); - $apply_to = $promo->getDiscountApply(); - - switch ($apply_to) + if (empty($cust_tag_info)) { - case DiscountApply::SRP: - $discount = round($total['sell_price'] * $rate, 2); - break; - case DiscountApply::OPL: - // $discount = round($total['sell_price'] * 0.6 / 0.7 * $rate, 2); - $discount = round($total['sell_price'] * (1 - 1.5 / 0.7 * $rate), 2); - break; - } + error_log('empty cust tag'); + $promos = $criteria->getPromos(); + if (count($promos) < 1) + return; - // if discount is higher than 0, display in invoice - if ($discount > 0) + // NOTE: only get first promo because only one is applicable anyway + $promo = $promos[0]; + + $rate = $promo->getDiscountRate(); + $apply_to = $promo->getDiscountApply(); + + switch ($apply_to) + { + case DiscountApply::SRP: + $discount = round($total['sell_price'] * $rate, 2); + break; + case DiscountApply::OPL: + // $discount = round($total['sell_price'] * 0.6 / 0.7 * $rate, 2); + $discount = round($total['sell_price'] * (1 - 1.5 / 0.7 * $rate), 2); + break; + } + + // if discount is higher than 0, display in invoice + if ($discount > 0) + { + $item = new InvoiceItem(); + $item->setInvoice($invoice) + ->setTitle('Promo discount') + ->setQuantity(1) + ->setPrice(-1 * $discount); + $invoice->addItem($item); + } + + $total['discount'] = $discount; + $total['total_price'] -= $discount; + + // process + $invoice->setPromo($promo); + } + else { - $item = new InvoiceItem(); - $item->setInvoice($invoice) - ->setTitle('Promo discount') - ->setQuantity(1) - ->setPrice(-1 * $discount); - $invoice->addItem($item); + // since only one promo can only be used, we prioritize the tag promos + // TODO: need to test this for multiple tags + $total_discount_amount = 0; + $total_amount = $total['total_price']; + foreach ($cust_tag_info as $ct_info) + { + // check discount type + $discount_type = ''; + $discount_value = 0; + $discount_amount = 0; + $discounted_total = 0; + if (isset($ct_info['discount_type'])) + $discount_type = $ct_info['discount_type']; + if (isset($ct_info['discount_value'])) + { + $discount_value = $ct_info['discount_value']; + } + + if ($discount_type == 'percent') + { + $discount = round(($discount_value / 100), 2); + $discount_amount = $total_amount * $discount; + $discounted_total = $total_amount - $discount_amount; + } + else + { + // assume fixed amount for this + $discount = $discount_value; + $discounted_total = $total_amount - $discount; + } + + $total_discount_amount += $discounted_total; + + $item = new InvoiceItem(); + $item->setInvoice($invoice) + ->setTitle($ct_info['invoice_display']) + ->setQuantity(1) + ->setPrice(-1 * $total_discount_amount); + $invoice->addItem($item); + } + + $total['discount'] = $total_discount_amount; + $total['total_price'] -= $total_discount_amount; } - - $total['discount'] = $discount; - $total['total_price'] -= $discount; - - // process - $invoice->setPromo($promo); } protected function processJumpstart(&$total, $invoice) @@ -663,6 +723,7 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface $cv = $criteria->getCustomerVehicle(); $has_coolant = $criteria->hasCoolant(); // error_log($stype); + $cust_tag_info = []; switch ($stype) { case ServiceType::JUMPSTART_TROUBLESHOOT: @@ -677,7 +738,7 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface $this->processBatteries($total, $criteria, $invoice); $this->processTradeIns($total, $criteria, $invoice); */ - $this->processDiscount($total, $criteria, $invoice); + $this->processDiscount($total, $criteria, $invoice, $cust_tag_info); break; case ServiceType::BATTERY_REPLACEMENT_WARRANTY: @@ -719,4 +780,33 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface return $invoice; } + + protected function getCustomerTagInfo($cv) + { + $cust_tag_info = []; + // get customer and customer tags using customer vehicle + $customer = $cv->getCustomer(); + $customer_tags = $customer->getCustomerTagObjects(); + if (!empty($customer_tags)) + { + foreach ($customer_tags as $customer_tag) + { + // TODO: can we keep the tag ids hardcoded? + // check tag details + $cust_tag_type = $customer_tag->getTagDetails('type'); + // TODO: might have to make this statement be more generic? + if (($cust_tag_type != null) && ($cust_tag_type == 'one-time-discount')) + { + $cust_tag_info[] = [ + 'type' => $cust_tag_type, + 'discount_type' => $customer_tag->getTagDetails('discount_type'), + 'discount_amount' => $customer_tag->getTagDetails('discount_amount'), + 'discount_value' => $customer_tag->getTagDetails('discount_value'), + 'invoice_display' => $customer_tag->getTagDetails('invoice_display'), + ]; + } + } + } + return $cust_tag_info; + } } diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 10d5b2f8..e0bf09a5 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -25,6 +25,7 @@ use App\Entity\Rider; use App\Entity\JORejection; use App\Entity\Warranty; use App\Entity\Customer; +use App\Entity\CustomerTag; use App\Ramcar\InvoiceCriteria; use App\Ramcar\ServiceType; @@ -40,6 +41,8 @@ use App\Ramcar\JORejectionReason; use App\Ramcar\CustomerNotWaitReason; use App\Ramcar\NoTradeInReason; use App\Ramcar\WillingToWaitContent; +use App\Ramcar\HubCriteria; +use App\Ramcar\WarrantySource; use App\Service\InvoiceGeneratorInterface; use App\Service\JobOrderHandlerInterface; @@ -49,6 +52,9 @@ use App\Service\MQTTClient; use App\Service\APNSClient; use App\Service\MapTools; use App\Service\RisingTideGateway; +use App\Service\HubSelector; +use App\Service\HubDistributor; +use App\Service\PromoLogger; use CrEOF\Spatial\PHP\Types\Geometry\Point; @@ -70,13 +76,16 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface protected $country_code; protected $wh; protected $rt; + protected $hub_dist; + protected $promo_logger; protected $template_hash; public function __construct(Security $security, EntityManagerInterface $em, InvoiceGeneratorInterface $ic, ValidatorInterface $validator, TranslatorInterface $translator, RiderAssignmentHandlerInterface $rah, - string $country_code, WarrantyHandler $wh, RisingTideGateway $rt) + string $country_code, WarrantyHandler $wh, RisingTideGateway $rt, + HubDistributor $hub_dist, PromoLogger $promo_logger) { $this->em = $em; $this->ic = $ic; @@ -87,6 +96,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $this->country_code = $country_code; $this->wh = $wh; $this->rt = $rt; + $this->hub_dist = $hub_dist; + $this->promo_logger = $promo_logger; $this->loadTemplates(); } @@ -287,10 +298,13 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $em = $this->em; $jo = $em->getRepository(JobOrder::class)->find($id); + // flag for new job order for the customer tags + $flag_new_jo = false; if (empty($jo)) { // new job order $jo = new JobOrder(); + $flag_new_jo = true; } // find customer @@ -463,6 +477,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $em->persist($event); $em->flush(); + } } @@ -471,6 +486,41 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface if ($jo != null) { $data['job_order'] = $jo; + + // need to get the customer tags but only if new JO + if ($flag_new_jo) + { + // check service type + if ($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) + { + $customer = $cust_vehicle->getCustomer(); + $customer_tags = $customer->getCustomerTagObjects(); + if (!empty($customer_tags)) + { + foreach ($customer_tags as $customer_tag) + { + // TODO: not too comfy with this being hardcoded + if ($customer_tag->getID() == 'CAR_CLUB_PROMO') + { + // remove associated entity + $customer->removeCustomerTag($customer_tag); + + // log the availment of promo from customer + $created_by = $jo->getCreatedBy()->getUsername(); + $cust_id = $jo->getCustomer()->getID(); + $cust_fname = $jo->getCustomer()->getFirstName(); + $cust_lname = $jo->getCustomer()->getLastName(); + $jo_id = $jo->getID(); + $invoice_id = $jo->getInvoice()->getID(); + // TODO: check if we store total price of invoice or just the discounted amount + $amount = $jo->getInvoice()->getTotalPrice(); + $this->promo_logger->logPromoInfo($created_by, $cust_id, $cust_fname, $cust_lname, $jo_id, + $invoice_id, $amount); + } + } + } + } + } } return $data; @@ -755,6 +805,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface 'event' => 'outlet_assign' ]; $mclient->sendEvent($obj, $payload); + + // update redis hub jo count + $this->hub_dist->incrementJoCountForHub($hub); } return $error_array; @@ -1016,7 +1069,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } } - $this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class); + $user_id = $user->getUsername(); + $source = WarrantySource::ADMIN_PANEL; + $this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class, $user_id, $source); } else error_log('Invalid plate number for warranty. Plate number = ' . $obj->getCustomerVehicle()->getPlateNumber()); @@ -1124,6 +1179,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $more_reason = $req->request->get('not_wait_notes'); } + // get previously assigned hub, if any + $old_hub = $obj->getHub(); + if (empty($error_array)) { // rider mqtt event @@ -1197,6 +1255,13 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface 'event' => 'outlet_assign' ]; $mclient->sendEvent($obj, $payload); + + // update redis hub_jo_count for hub + // decrement old hub's count and increment new hub's count + if ($old_hub != null) + $this->hub_dist->decrementJoCountForHub($old_hub); + if ($hub != null) + $this->hub_dist->incrementJoCountForHub($hub); } return $error_array; @@ -1632,6 +1697,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface return $params; } + // CMB code public function initializeOneStepEditForm($id, $map_tools) { $em = $this->em; @@ -1812,7 +1878,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } // initialize dispatch/processing job order form - public function initializeProcessingForm($id, $map_tools, $motiv) + public function initializeProcessingForm($id, HubSelector $hub_selector, $motiv) { $em = $this->em; @@ -1878,8 +1944,44 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface // get rejection reasons $params['rejection_reasons'] = JORejectionReason::getCollection(); + // get battery (if any) + $skus = []; + $items = []; + $invoice = $obj->getInvoice(); + $inv_items = $invoice->getItems(); + foreach ($inv_items as $inv_item) + { + $batt = $inv_item->getBattery(); + if ($batt == null) + continue; + + $skus[] = $batt->getSapCode(); + $item_count = 1; + if (!empty($batt->getSapCode())) + { + $sap_code = $batt->getSapCode(); + if (isset($items[$sap_code])) + $items[$sap_code] = $item_count + 1; + else + $items[$sap_code] = $item_count; + } + } + // get closest hubs - $hubs = $map_tools->getClosestHubs($obj->getCoordinates(), 50, date("H:i:s")); + // set hub criteria + $hub_criteria = new HubCriteria(); + $hub_criteria->setPoint($obj->getCoordinates()) + ->setLimitResults(50) + ->setPaymentMethod($obj->getModeOfPayment()) + ->setJoType($obj->getServiceType()); + + // check if emergency or not + $willing_to_wait = $obj->getWillWait(); + if ($willing_to_wait == WillingToWaitContent::NOT_WILLING_TO_WAIT) + $hub_criteria->setEmergency(true); + + $hubs = $hub_selector->find($hub_criteria); + //$hubs = $map_tools->getClosestHubs($obj->getCoordinates(), 50, date("H:i:s")); $params['hubs'] = []; @@ -1946,19 +2048,6 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface // get template to display $params['template'] = $this->getTwigTemplate('jo_processing_form'); - // get battery (if any) - $skus = []; - $invoice = $obj->getInvoice(); - $inv_items = $invoice->getItems(); - foreach ($inv_items as $inv_item) - { - $batt = $inv_item->getBattery(); - if ($batt == null) - continue; - - $skus[] = $batt->getSapCode(); - } - // get inventory $mres = $motiv->getInventory($branch_codes, $skus); foreach ($mres as $mres_item) @@ -2103,7 +2192,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } // initialize hub form - public function initializeHubForm($id, $map_tools) + public function initializeHubForm($id, HubSelector $hub_selector) { $em = $this->em; @@ -2128,7 +2217,11 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $params['rejection_reasons'] = JORejectionReason::getCollection(); // get closest hubs - $hubs = $map_tools->getClosestHubs($obj->getCoordinates(), 50, date("H:i:s")); + $hub_criteria = new HubCriteria(); + $hub_criteria->setPoint($obj->getCoordinates()) + ->setLimitResults(50); + $hubs = $hub_selector->find($hub_criteria); + //$hubs = $map_tools->getClosestHubs($obj->getCoordinates(), 50, date("H:i:s")); $params['status_cancelled'] = JOStatus::CANCELLED; $params['hubs'] = []; @@ -2681,6 +2774,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $fac_hubs[$hub->getID()] = $hub->getName() . ' - ' . $hub->getBranch(); } + // list of customer tags + $params['customer_tags'] = $em->getRepository(CustomerTag::class)->findAll(); + // name values $params['service_types'] = ServiceType::getCollection(); $params['warranty_classes'] = WarrantyClass::getCollection(); diff --git a/src/Service/JobOrderHandlerInterface.php b/src/Service/JobOrderHandlerInterface.php index 59aea943..cff06242 100644 --- a/src/Service/JobOrderHandlerInterface.php +++ b/src/Service/JobOrderHandlerInterface.php @@ -7,6 +7,7 @@ use Symfony\Component\HttpFoundation\Request; use App\Service\MQTTClient; use App\Service\APNSClient; use App\Service\MapTools; +use App\Service\HubSelector; use App\Entity\JobOrder; @@ -67,7 +68,7 @@ interface JobOrderHandlerInterface public function initializeAllForm(int $id); // initialize dispatch/processing job order form - public function initializeProcessingForm(int $id, MapTools $map_tools, $motiv); + public function initializeProcessingForm(int $id, HubSelector $hub_selector, $motiv); // initialize assign job order form public function initializeAssignForm(int $id); @@ -76,7 +77,7 @@ interface JobOrderHandlerInterface public function initializeFulfillmentForm(int $id); // initialize hub form - public function initializeHubForm(int $id, MapTools $map_tools); + public function initializeHubForm(int $id, HubSelector $hub_selector); // initialize rider form public function initializeRiderForm(int $id); diff --git a/src/Service/PromoLogger.php b/src/Service/PromoLogger.php new file mode 100644 index 00000000..ac4eb081 --- /dev/null +++ b/src/Service/PromoLogger.php @@ -0,0 +1,34 @@ +em = $em; + } + + public function logPromoInfo($created_by, $cust_id, $cust_fname, $cust_lname, $jo_id, + $invoice_id, $amount) + { + $log_entry = new PromoLog(); + + $log_entry->setCreatedBy($created_by) + ->setCustId($cust_id) + ->setCustFirstName($cust_fname) + ->setCustLastName($cust_lname) + ->setJoId($jo_id) + ->setInvoiceId($invoice_id) + ->setAmount($amount); + + $this->em->persist($log_entry); + $this->em->flush(); + } +} diff --git a/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php b/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php index ae6d2199..6f1711c3 100644 --- a/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php @@ -13,6 +13,7 @@ use App\Ramcar\JOEventType; use App\Ramcar\InvoiceStatus; use App\Ramcar\ModeOfPayment; use App\Ramcar\InvoiceCriteria; +use App\Ramcar\WarrantySource; use App\Service\RiderAPIHandlerInterface; use App\Service\RedisClientProvider; @@ -598,7 +599,10 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface } } - $this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class); + // for riders, use rider session id + $user_id = $this->session->getID(); + $source = WarrantySource::RAPI; + $this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class, $user_id, $source); } // send mqtt event (fulfilled) diff --git a/src/Service/RisingTideGateway.php b/src/Service/RisingTideGateway.php index 38276619..acd7d4d5 100644 --- a/src/Service/RisingTideGateway.php +++ b/src/Service/RisingTideGateway.php @@ -83,4 +83,28 @@ class RisingTideGateway error_log($result); } + + public function validatePhoneNumber($mobile) + { + // check valid number + $num = trim($mobile); + + // should be 10 digits + if (strlen($num) != 10) + return false; + + // should start with '9' + if ($num[0] != '9') + return false; + + // should be numeric + if (!is_numeric($num)) + return false; + + // should not be 9900000000 + if ($num == '9900000000') + return false; + + return true; + } } diff --git a/src/Service/WarrantyAPILogger.php b/src/Service/WarrantyAPILogger.php new file mode 100644 index 00000000..dbfe5940 --- /dev/null +++ b/src/Service/WarrantyAPILogger.php @@ -0,0 +1,35 @@ +em = $em; + } + + public function logWarrantyInfo($log_data, $error, $user_id, $action, $source) + { + $log_entry = new WarrantyAPILog(); + + $err_aray = []; + $err_array[] = $error; + + $log_entry->setApiUser($user_id) + ->setErrors($err_array) + ->setAllData($log_data) + ->setAction($action) + ->setSource($source); + + $this->em->persist($log_entry); + $this->em->flush(); + + } +} diff --git a/src/Service/WarrantyHandler.php b/src/Service/WarrantyHandler.php index 6d01eb10..6b86849f 100644 --- a/src/Service/WarrantyHandler.php +++ b/src/Service/WarrantyHandler.php @@ -11,6 +11,8 @@ use App\Entity\SAPBattery; use App\Entity\BatteryModel; use App\Entity\CustomerVehicle; +use App\Service\WarrantyAPILogger; + use App\Ramcar\WarrantyClass; use DateTime; @@ -19,18 +21,23 @@ use DateInterval; class WarrantyHandler { protected $em; + protected $logger; - public function __construct(EntityManagerInterface $em) + public function __construct(EntityManagerInterface $em, WarrantyAPILogger $logger) { $this->em = $em; + $this->logger = $logger; } public function createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, - $batt_list, DateTime $date_purchase, $warranty_class) + $batt_list, DateTime $date_purchase, $warranty_class, $user_id, $source) { // new warranty $warranty = new Warranty(); + $bmodel_name = ''; + $bsize_name =''; + $sap_batt_id = ''; foreach ($batt_list as $battery) { // get the battery model and battery size @@ -43,10 +50,12 @@ class WarrantyHandler if ($bty_model != null) { $warranty->setBatteryModel($bty_model); + $bmodel_name = $bty_model->getName(); } if ($bty_size != null) { $warranty->setBatterySize($bty_size); + $bsize_name = $bty_size->getName(); } $sap_code = $battery->getSAPCode(); @@ -57,6 +66,7 @@ class WarrantyHandler if ($sap_battery != null) { $warranty->setSAPBattery($sap_battery); + $sap_batt_id = $sap_battery->getID(); } } } @@ -87,6 +97,22 @@ class WarrantyHandler $this->em->persist($warranty); $this->em->flush(); + // log warranty creation + $action = 'create'; + $log_data = [ + 'serial' => $serial, + 'warranty_class' => $warranty_class, + 'first_name' => $first_name, + 'last_name' => $last_name, + 'mobile_number' => $mobile_number, + 'date_purchase' => $date_purchase->format('d-M-y'), + 'date_expire' => $date_expire->format('d-M-y'), + 'battery_model' => $bmodel_name, + 'battery_size' => $bsize_name, + 'sap_battery' => $sap_batt_id, + 'plate_number' => $plate_number, + ]; + $this->logger->logWarrantyInfo($log_data, '', $user_id, $action, $source); // update customer vehicle with warranty info $this->updateCustomerVehicle($serial, $batt_list, $plate_number, $date_expire); diff --git a/symfony.lock b/symfony.lock index c699229c..51cef542 100644 --- a/symfony.lock +++ b/symfony.lock @@ -119,6 +119,9 @@ "microsoft/azure-storage-common": { "version": "1.5.1" }, + "monolog/monolog": { + "version": "2.2.0" + }, "nikic/php-parser": { "version": "v4.1.0" }, @@ -188,6 +191,9 @@ "symfony/dependency-injection": { "version": "v4.0.2" }, + "symfony/deprecation-contracts": { + "version": "v2.4.0" + }, "symfony/doctrine-bridge": { "version": "v4.0.2" }, @@ -248,6 +254,24 @@ "symfony/mime": { "version": "v4.3.0" }, + "symfony/monolog-bridge": { + "version": "v5.2.5" + }, + "symfony/monolog-bundle": { + "version": "3.7", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.7", + "ref": "329f6a5ef2e7aa033f802be833ef8d1268dd0848" + }, + "files": [ + "config/packages/dev/monolog.yaml", + "config/packages/prod/deprecations.yaml", + "config/packages/prod/monolog.yaml", + "config/packages/test/monolog.yaml" + ] + }, "symfony/orm-pack": { "version": "v1.0.5" }, diff --git a/templates/customer-tag/form.html.twig b/templates/customer-tag/form.html.twig new file mode 100644 index 00000000..e5e54544 --- /dev/null +++ b/templates/customer-tag/form.html.twig @@ -0,0 +1,155 @@ +{% extends 'base.html.twig' %} + +{% block body %} + +
+
+
+

Customer Tags

+
+
+
+ +
+ +
+
+
+
+
+
+ + + +

+ {% if mode == 'update' %} + Edit Customer Tag + {{ obj.getName }} + {% else %} + New Customer Tag + {% endif %} +

+
+
+
+
+ +
+
+
+ + + + Unique identifier for this customer tag +
+
+
+
+ + + +
+
+
+
+ + + + JSON format e.g. {"type":"discount", "discount_type":"percent", ...} +
+
+
+
+
+
+
+ + Back +
+
+
+
+
+
+
+
+
+{% endblock %} + + +{% block scripts %} + +{% endblock %} diff --git a/templates/customer-tag/list.html.twig b/templates/customer-tag/list.html.twig new file mode 100644 index 00000000..6f895465 --- /dev/null +++ b/templates/customer-tag/list.html.twig @@ -0,0 +1,143 @@ +{% extends 'base.html.twig' %} + +{% block body %} + +
+
+
+

+ Customer Tags +

+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+ +
+
+ +
+ +
+
+
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} diff --git a/templates/customer/form.html.twig b/templates/customer/form.html.twig index eeae4bbe..5afa777f 100644 --- a/templates/customer/form.html.twig +++ b/templates/customer/form.html.twig @@ -160,6 +160,19 @@
+
+
+
+ {% for customer_tag in customer_tags %} + + {% endfor %} +
+
+
diff --git a/templates/hub/form.html.twig b/templates/hub/form.html.twig index d7101260..3c8947c1 100644 --- a/templates/hub/form.html.twig +++ b/templates/hub/form.html.twig @@ -90,6 +90,18 @@
+
+ +
+ {% trans %}country_code_prefix{% endtrans %} + + +
+
+ +
+
+
+ +
+ {% for key, value in payment_methods %} + + {% endfor %} +
+ + Check all payment methods that apply +
+
{% if is_granted('customer.dpa') %} - + {% endif %}
+
+
+
+ {% for customer_tag in customer_tags %} + + {% endfor %} +
+
+
@@ -1370,6 +1388,18 @@ $(function() { if (vdata.customer.flag_research_email === true) { $("#flag-research-email").prop("checked", true); } + if (vdata.customer.customer_tags.length > 0) { + var checkboxes = document.getElementsByName("customer_tags[]"); + for (var x = 0; checkboxes.length > x; x++) + { + if (vdata.customer.customer_tags.indexOf(checkboxes[x].value) !== -1) { + checkboxes[x].checked = true; + } + else { + checkboxes[x].checked = false; + } + } + } // set hidden customer id $("#cid").val(vdata.customer.id); @@ -1417,6 +1447,12 @@ $(function() { $("#flag-promo-email").prop("checked", false); $("#flag-research-sms").prop("checked", false); $("#flag-research-email").prop("checked", false); + + var checkboxes = document.getElementsByName("customer_tags[]"); + for (var x = 0; checkboxes.length > x; x++) + { + checkboxes[x].checked = false; + } } // datepicker diff --git a/templates/rider/popup.html.twig b/templates/rider/popup.html.twig index 15cdc26a..71265e81 100644 --- a/templates/rider/popup.html.twig +++ b/templates/rider/popup.html.twig @@ -4,7 +4,7 @@ {% set cust = jo.getCustomer %} {% set cv = jo.getCustomerVehicle %}
-Job Order #{{ jo.getID }}
+Job Order #{{ jo.getID }}
{{ jo.getServiceTypeName }}
{{ jo.getStatusText }}

{{ cust.getNameDisplay }}
@@ -17,7 +17,7 @@ {% set customer = job_order.getCustomer %} {% set cust_vehicle = job_order.getCustomerVehicle %}
- Job Order #{{ job_order.getID }}
+ Job Order #{{ job_order.getID }}
{{ customer.getNameDisplay }}
{{ cust_vehicle.getPlateNumber }} {% endfor %} diff --git a/templates/warranty/form.html.twig b/templates/warranty/form.html.twig index 4af98004..a1210ca9 100644 --- a/templates/warranty/form.html.twig +++ b/templates/warranty/form.html.twig @@ -98,6 +98,7 @@ SAP Battery + {% for model in batt_models %} {% endfor %} diff --git a/translations/messages.en.yaml b/translations/messages.en.yaml index 70fe10ca..48265ab4 100644 --- a/translations/messages.en.yaml +++ b/translations/messages.en.yaml @@ -13,6 +13,7 @@ add_cust_vehicle_battery_info: This vehicle is using a Motolite battery jo_title_pdf: Motolite Res-Q Job Order country_code_prefix: '+63' delivery_instructions_label: Delivery Instructions +no_inventory_message: No stock for [item_display] # images image_logo_login: /assets/images/logo-resq.png diff --git a/utils/bulk_get_warranty_serial/download_warranty_serial_bulk.php b/utils/bulk_get_warranty_serial/download_warranty_serial_bulk.php new file mode 100644 index 00000000..a720af21 --- /dev/null +++ b/utils/bulk_get_warranty_serial/download_warranty_serial_bulk.php @@ -0,0 +1,57 @@ +format('m-d-y'); + +$flag_done_processing = false; +$proc_date = $start_date; + +while (!$flag_done_processing) { + $filename = 'warrantylogs' . $proc_date . '.csv'; + echo $filename, PHP_EOL; + + try { + // NOTE: via download blob + $res = $blob_client->getBlob('warranty', $filename); + // print_r($res); + + file_put_contents("/tmp/output.txt", $res->getContentStream(), FILE_APPEND); + } catch (Exception $e) + { + echo 'Caught exception: ', $e->getMessage(), "\n"; + } + + // change proc_date to next day + $next_date = DateTime::createFromFormat('m-d-y', $proc_date); + $next_date->modify('+1 day'); + $proc_date = $next_date->format('m-d-y'); + + if ($end_date == $proc_date) { + $flag_done_processing = true; + } +} + diff --git a/utils/get_warranty_serial/get_serials.php b/utils/get_warranty_serial/get_serials.php new file mode 100644 index 00000000..dc92b565 --- /dev/null +++ b/utils/get_warranty_serial/get_serials.php @@ -0,0 +1,52 @@ +modify("-1 day"); + +$date = $current_date->format('m-d-y'); + +$filename = 'warrantylogs' . $date . '.csv'; +//print_r($filename); + +try { + // NOTE: via download blob + $res = $blob_client->getBlob('warranty', $filename); + // print_r($res); + + file_put_contents("/tmp/output.txt", $res->getContentStream()); +} catch (Exception $e) { + file_put_contents("/tmp/serial_download_error.txt", $filename . "\n" . $e->getMessage() . "\n" . "\n", FILE_APPEND); +} + + +/* +// NOTE: getting via url +echo $blob_client->getPsrPrimaryUri() . "\n"; + +$url = $blob_client->getPsrPrimaryUri() . '?' . $sas_token; +$url = $blob_url . '?' . $sas_token; +file_put_contents('output.txt', fopen($url, 'r')); +*/ + + + diff --git a/utils/load_warranty_serial/load_serials.php b/utils/load_warranty_serial/load_serials.php index 9013a309..285c4a41 100644 --- a/utils/load_warranty_serial/load_serials.php +++ b/utils/load_warranty_serial/load_serials.php @@ -10,7 +10,7 @@ $pass = $argv[4]; $db = new PDO($dsn, $user, $pass); // prepared statement -$sth = $db->prepare('insert into warranty_serial (id, sku, date_create, source) values (:serial, :sku, :date_create, :source)'); +$sth = $db->prepare('insert into warranty_serial (id, sku, date_create, source, meta_info) values (:serial, :sku, :date_create, :source, :meta_info)'); // go through rows @@ -25,16 +25,41 @@ while (($row = fgetcsv($csv)) !== false) continue; } + /* $serial = trim(strtoupper($row[0])); $sku = trim($row[1]); $date_create = $row[2]; - $ref_id = $row[3]; + $ref_id = $row[3]; */ + + // sample of line in output file: + // serial number, sku, dispatch status, created date, inventory status, category id, category name + // CH2000012071,WCHD23BL-CPN00-LX,0,2020-08-11 04:05:27.090,0,4,CHAMPION MF + $serial = trim(strtoupper($row[0])); + $sku = trim($row[1]); + $dispatch_status = trim($row[2]); + $date_create = $row[3]; + $inventory_status = trim($row[4]); + $cat_id = trim($row[5]); + $cat_name = trim($row[6]); + + $meta_info = [ + 'dispatch_status' => $dispatch_status, + 'inventory_status' => $inventory_status, + 'category_id' => $cat_id, + 'category_name' => $cat_name, + ]; + + $info = json_encode($meta_info); + + if ($sku == 'N/A') + $sku = null; $res = $sth->execute([ ':serial' => $serial, ':sku' => $sku, ':date_create' => $date_create, - ':source' => $source + ':source' => $source, + ':meta_info' => $info, ]); if (!$res) diff --git a/utils/test_azure/output.txt b/utils/test_azure/output.txt index d4e17cec..0b4ef9b9 100644 --- a/utils/test_azure/output.txt +++ b/utils/test_azure/output.txt @@ -1,11 +1,204 @@ -DispatcheDate,Sku,SerialNumber -2020-08-07 05:32:04.537,WMGL23DL-CPNMB-L,MGS706202004 -2020-08-07 05:32:04.537,WMGL23DL-CPNMB-L,MGS706202005 -2020-08-07 05:32:04.537,WMGL23DL-CPNMB-L,MGS706202006 -2020-08-08 09:27:14.480,WMXX26EL-CPN00-LX,MXS808202001 -2020-08-08 09:31:48.737,WMXX26EL-CPN00-LX,MXS808202002 -2020-08-08 10:27:08.117,WMXX26EL-CPN00-LX,MXS808202003 -2020-08-08 10:41:10.060,WMXX26EL-CPN00-LX,MXS808202004 -2020-08-08 10:41:10.060,WMXX26EL-CPN00-LX,MXS808202005 -2020-08-08 10:41:10.060,WMXX26EL-CPN00-LX,MXS808202006 -2020-10-05 13:53:57.000,ECHD26AL-SPN00-LX,CH2000012625 +PV1000240341,N/A,Dispatch,In,2021-04-12T01:12:16.5930000+08:00 +PV1000240344,N/A,Dispatch,In,2021-04-12T01:12:16.6100000+08:00 +PV1000240335,N/A,Dispatch,In,2021-04-12T01:12:16.5630000+08:00 +PV1000240345,N/A,Dispatch,In,2021-04-12T01:12:16.5930000+08:00 +PV1000240338,N/A,Dispatch,In,2021-04-12T01:12:16.5930000+08:00 +PV1000240340,N/A,Dispatch,In,2021-04-12T01:12:16.5930000+08:00 +PV1000240337,N/A,Dispatch,In,2021-04-12T01:12:16.5770000+08:00 +PV1000240334,N/A,Dispatch,In,2021-04-12T01:12:16.6100000+08:00 +PV1000240330,N/A,Dispatch,In,2021-04-12T01:12:16.5630000+08:00 +PV1000240342,N/A,Dispatch,In,2021-04-12T01:12:16.6100000+08:00 +PV1000240343,N/A,Dispatch,In,2021-04-12T01:12:16.6100000+08:00 +PV1000240336,N/A,Dispatch,In,2021-04-12T01:12:16.5630000+08:00 +PV1000240339,N/A,Dispatch,In,2021-04-12T01:12:16.5470000+08:00 +PV1000240332,N/A,Dispatch,In,2021-04-12T01:12:16.5770000+08:00 +PV1000240333,N/A,Dispatch,In,2021-04-12T01:12:16.6100000+08:00 +PV1000240324,N/A,Dispatch,In,2021-04-12T01:12:16.5770000+08:00 +PV1000240326,N/A,Dispatch,In,2021-04-12T01:12:16.5770000+08:00 +MX2000056889,N/A,Dispatch,In,2021-04-12T02:58:37.8900000+08:00 +MX2000056874,N/A,Dispatch,In,2021-04-12T02:58:37.9070000+08:00 +MX2000056888,N/A,Dispatch,In,2021-04-12T02:58:37.9070000+08:00 +MX2000056887,N/A,Dispatch,In,2021-04-12T02:58:37.9070000+08:00 +MX2000056881,N/A,Dispatch,In,2021-04-12T02:58:37.9070000+08:00 +MX2000056880,N/A,Dispatch,In,2021-04-12T02:58:37.9230000+08:00 +MX2000056879,N/A,Dispatch,In,2021-04-12T02:58:37.9370000+08:00 +MX2000056886,N/A,Dispatch,In,2021-04-12T02:58:37.9370000+08:00 +MX2000056890,N/A,Dispatch,In,2021-04-12T02:58:37.9370000+08:00 +MX2000056885,N/A,Dispatch,In,2021-04-12T02:58:37.9370000+08:00 +MG3102419196,N/A,Dispatch,In,2021-04-12T02:58:38.2200000+08:00 +MG3102419202,N/A,Dispatch,In,2021-04-12T02:58:38.2330000+08:00 +MG3102419197,N/A,Dispatch,In,2021-04-12T02:58:38.2330000+08:00 +MG3102419203,N/A,Dispatch,In,2021-04-12T02:58:38.2200000+08:00 +MG3102419198,N/A,Dispatch,In,2021-04-12T02:58:38.2200000+08:00 +PV1000225903,N/A,Dispatch,In,2021-04-11T23:45:21.0630000+08:00 +PV1000225928,N/A,Dispatch,In,2021-04-11T23:45:21.0500000+08:00 +PV1000225905,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00 +PV1000225909,N/A,Dispatch,In,2021-04-11T23:45:21.0330000+08:00 +PV1000225918,N/A,Dispatch,In,2021-04-11T23:45:21.1900000+08:00 +PV1000225911,N/A,Dispatch,In,2021-04-11T23:45:21.1100000+08:00 +PV1000225933,N/A,Dispatch,In,2021-04-11T23:45:21.0170000+08:00 +PV1000225939,N/A,Dispatch,In,2021-04-11T23:45:21.0500000+08:00 +PV1000225940,N/A,Dispatch,In,2021-04-11T23:45:21.2030000+08:00 +PV1000225934,N/A,Dispatch,In,2021-04-11T23:45:21.0500000+08:00 +PV1000225916,N/A,Dispatch,In,2021-04-11T23:45:21.0630000+08:00 +PV1000225915,N/A,Dispatch,In,2021-04-11T23:45:21+08:00 +PV1000225937,N/A,Dispatch,In,2021-04-11T23:45:21+08:00 +PV1000225929,N/A,Dispatch,In,2021-04-11T23:45:21.0170000+08:00 +PV1000225906,N/A,Dispatch,In,2021-04-11T23:45:21.1100000+08:00 +PV1000225938,N/A,Dispatch,In,2021-04-11T23:45:21.0970000+08:00 +PV1000225902,N/A,Dispatch,In,2021-04-11T23:45:21.0800000+08:00 +PV1000225914,N/A,Dispatch,In,2021-04-11T23:45:21+08:00 +PV1000225932,N/A,Dispatch,In,2021-04-11T23:45:21+08:00 +PV1000225908,N/A,Dispatch,In,2021-04-11T23:45:21.0630000+08:00 +PV1000225907,N/A,Dispatch,In,2021-04-11T23:45:21.0800000+08:00 +PV1000225910,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00 +PV1000225917,N/A,Dispatch,In,2021-04-11T23:45:21.0330000+08:00 +PV1000225921,N/A,Dispatch,In,2021-04-11T23:45:21.0330000+08:00 +PV1000225913,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00 +PV1000225919,N/A,Dispatch,In,2021-04-11T23:45:21.0800000+08:00 +PV1000225935,N/A,Dispatch,In,2021-04-11T23:45:21.0970000+08:00 +PV1000225900,N/A,Dispatch,In,2021-04-11T23:45:21.0330000+08:00 +PV1000225904,N/A,Dispatch,In,2021-04-11T23:45:21.1100000+08:00 +PV1000225931,N/A,Dispatch,In,2021-04-11T23:45:21.0970000+08:00 +PV1000225897,N/A,Dispatch,In,2021-04-11T23:45:21.0800000+08:00 +PV1000225901,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00 +PV1000225930,N/A,Dispatch,In,2021-04-11T23:45:21.2030000+08:00 +PV1000225926,N/A,Dispatch,In,2021-04-11T23:45:21.1900000+08:00 +PV1000225898,N/A,Dispatch,In,2021-04-11T23:45:21.0630000+08:00 +PV1000225927,N/A,Dispatch,In,2021-04-11T23:45:21.0970000+08:00 +PV1000225896,N/A,Dispatch,In,2021-04-11T23:45:21.0330000+08:00 +PV1000225924,N/A,Dispatch,In,2021-04-11T23:45:21.0500000+08:00 +PV1000225983,N/A,Dispatch,In,2021-04-11T23:45:20.9700000+08:00 +PV1000225925,N/A,Dispatch,In,2021-04-11T23:45:21.0170000+08:00 +PV1000225985,N/A,Dispatch,In,2021-04-11T23:45:20.9700000+08:00 +PV1000225912,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00 +PV1000225980,N/A,Dispatch,In,2021-04-11T23:45:20.9700000+08:00 +PV1000225982,N/A,Dispatch,In,2021-04-11T23:45:20.9700000+08:00 +PV1000225922,N/A,Dispatch,In,2021-04-11T23:45:21.1900000+08:00 +PV1000225923,N/A,Dispatch,In,2021-04-11T23:45:21.0800000+08:00 +PV1000225984,N/A,Dispatch,In,2021-04-11T23:45:20.9700000+08:00 +PV1000225899,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00 +PV1000225920,N/A,Dispatch,In,2021-04-11T23:45:21.0500000+08:00 +MES215591711,N/A,Dispatch,In,2021-04-11T22:36:43.9830000+08:00 +MES215591707,N/A,Dispatch,In,2021-04-11T22:36:43.9670000+08:00 +MES215591708,N/A,Dispatch,In,2021-04-11T22:36:43.9830000+08:00 +MES215591699,N/A,Dispatch,In,2021-04-11T22:36:43.8600000+08:00 +MES215591700,N/A,Dispatch,In,2021-04-11T22:36:43.8430000+08:00 +MES215591718,N/A,Dispatch,In,2021-04-11T22:36:44.0770000+08:00 +MES215591733,N/A,Dispatch,In,2021-04-11T22:36:44.0770000+08:00 +MES215591725,N/A,Dispatch,In,2021-04-11T22:36:44.0600000+08:00 +MES215591723,N/A,Dispatch,In,2021-04-11T22:36:44.0930000+08:00 +MES215591724,N/A,Dispatch,In,2021-04-11T22:36:44.0930000+08:00 +MES215591712,N/A,Dispatch,In,2021-04-11T22:36:44.0130000+08:00 +MES215591716,N/A,Dispatch,In,2021-04-11T22:36:44.0300000+08:00 +MES215591713,N/A,Dispatch,In,2021-04-11T22:36:44.0130000+08:00 +MES215591714,N/A,Dispatch,In,2021-04-11T22:36:44.0300000+08:00 +MES215591719,N/A,Dispatch,In,2021-04-11T22:36:44.0130000+08:00 +MES215591721,N/A,Dispatch,In,2021-04-11T22:36:44.0300000+08:00 +MES215591720,N/A,Dispatch,In,2021-04-11T22:36:44.0300000+08:00 +MES215591722,N/A,Dispatch,In,2021-04-11T22:36:44.0470000+08:00 +MES215591715,N/A,Dispatch,In,2021-04-11T22:36:44.0470000+08:00 +MES215591709,N/A,Dispatch,In,2021-04-11T22:36:44+08:00 +MES215591710,N/A,Dispatch,In,2021-04-11T22:36:44+08:00 +MES215591704,N/A,Dispatch,In,2021-04-11T22:36:43.9670000+08:00 +MES215591706,N/A,Dispatch,In,2021-04-11T22:36:43.9830000+08:00 +MES215591698,N/A,Dispatch,In,2021-04-11T22:36:43.8430000+08:00 +MES215591705,N/A,Dispatch,In,2021-04-11T22:36:43.8600000+08:00 +MES215591732,N/A,Dispatch,In,2021-04-11T22:36:44.0770000+08:00 +MES215591731,N/A,Dispatch,In,2021-04-11T22:36:44.0770000+08:00 +MES215591717,N/A,Dispatch,In,2021-04-11T22:36:44.0470000+08:00 +MES215591727,N/A,Dispatch,In,2021-04-11T22:36:44.0470000+08:00 +MES215591695,N/A,Dispatch,In,2021-04-11T22:36:43.9530000+08:00 +MES215591701,N/A,Dispatch,In,2021-04-11T22:36:44+08:00 +MES215591702,N/A,Dispatch,In,2021-04-11T22:36:44+08:00 +MES215591689,N/A,Dispatch,In,2021-04-11T22:36:43.8430000+08:00 +MES215591692,N/A,Dispatch,In,2021-04-11T22:36:43.8600000+08:00 +MES215591696,N/A,Dispatch,In,2021-04-11T22:36:43.9670000+08:00 +MES215591697,N/A,Dispatch,In,2021-04-11T22:36:43.9670000+08:00 +MES215591703,N/A,Dispatch,In,2021-04-11T22:36:44+08:00 +MES215591690,N/A,Dispatch,In,2021-04-11T22:36:43.8430000+08:00 +MES215591693,N/A,Dispatch,In,2021-04-11T22:36:43.8600000+08:00 +MES215591681,N/A,Dispatch,In,2021-04-11T22:36:43.8270000+08:00 +MES215591683,N/A,Dispatch,In,2021-04-11T22:36:43.9530000+08:00 +MES215591687,N/A,Dispatch,In,2021-04-11T22:36:43.9530000+08:00 +MES215591686,N/A,Dispatch,In,2021-04-11T22:36:43.9530000+08:00 +MES215591688,N/A,Dispatch,In,2021-04-11T22:36:44.0130000+08:00 +MES215591685,N/A,Dispatch,In,2021-04-11T22:36:43.8730000+08:00 +MES215591682,N/A,Dispatch,In,2021-04-11T22:36:43.8270000+08:00 +MES215591684,N/A,Dispatch,In,2021-04-11T22:36:43.8430000+08:00 +MES215591691,N/A,Dispatch,In,2021-04-11T22:36:43.8600000+08:00 +MES215591694,N/A,Dispatch,In,2021-04-11T22:36:43.9670000+08:00 +MG3101407704,N/A,Dispatch,In,2021-04-12T00:39:47.1870000+08:00 +MG3101407702,N/A,Dispatch,In,2021-04-12T00:39:47.1870000+08:00 +MG3101407703,N/A,Dispatch,In,2021-04-12T00:39:47.1870000+08:00 +MG3101407701,N/A,Dispatch,In,2021-04-12T00:39:47.1870000+08:00 +MG3101407705,N/A,Dispatch,In,2021-04-12T00:39:47.1700000+08:00 +MG2000112754,N/A,Dispatch,In,2021-04-12T00:40:11.3670000+08:00 +MX2000067982,N/A,Dispatch,In,2021-04-12T00:33:42.1830000+08:00 +MX2000067975,N/A,Dispatch,In,2021-04-12T00:33:42.4670000+08:00 +MX2000067983,N/A,Dispatch,In,2021-04-12T00:33:42.1830000+08:00 +MX2000067979,N/A,Dispatch,In,2021-04-12T00:33:42.4500000+08:00 +MX2000067984,N/A,Dispatch,In,2021-04-12T00:33:42.1700000+08:00 +MX2000067972,N/A,Dispatch,In,2021-04-12T00:33:42.3730000+08:00 +MX2000067971,N/A,Dispatch,In,2021-04-12T00:33:42.4330000+08:00 +MX2000067977,N/A,Dispatch,In,2021-04-12T00:33:42.4500000+08:00 +MX2000067981,N/A,Dispatch,In,2021-04-12T00:33:42.4670000+08:00 +MX2000067974,N/A,Dispatch,In,2021-04-12T00:33:42.4500000+08:00 +MX2000067978,N/A,Dispatch,In,2021-04-12T00:33:42.4670000+08:00 +MX2000067989,N/A,Dispatch,In,2021-04-12T00:33:42.1700000+08:00 +MX2000067980,N/A,Dispatch,In,2021-04-12T00:33:42.1830000+08:00 +MX2000067976,N/A,Dispatch,In,2021-04-12T00:33:42.1830000+08:00 +MX2000067973,N/A,Dispatch,In,2021-04-12T00:33:42.2170000+08:00 +MX2000067985,N/A,Dispatch,In,2021-04-12T00:33:42.1530000+08:00 +MX2000067990,N/A,Dispatch,In,2021-04-12T00:33:42.1700000+08:00 +MX2000067987,N/A,Dispatch,In,2021-04-12T00:33:42.1700000+08:00 +MX2000067992,N/A,Dispatch,In,2021-04-12T00:33:42.5270000+08:00 +MX2000067988,N/A,Dispatch,In,2021-04-12T00:33:41.9330000+08:00 +MX2000067986,N/A,Dispatch,In,2021-04-12T00:33:42.1700000+08:00 +MX2000068005,N/A,Dispatch,In,2021-04-12T00:33:42.4800000+08:00 +MX2000068006,N/A,Dispatch,In,2021-04-12T00:33:42.4800000+08:00 +MX2000068010,N/A,Dispatch,In,2021-04-12T00:33:42.4970000+08:00 +MX2000067994,N/A,Dispatch,In,2021-04-12T00:33:42.8570000+08:00 +MX2000067991,N/A,Dispatch,In,2021-04-12T00:33:42.5270000+08:00 +MX2000067995,N/A,Dispatch,In,2021-04-12T00:33:42.5130000+08:00 +MX2000067997,N/A,Dispatch,In,2021-04-12T00:33:42.5270000+08:00 +MX2000067999,N/A,Dispatch,In,2021-04-12T00:33:42.5730000+08:00 +MX2000068003,N/A,Dispatch,In,2021-04-12T00:33:42.5130000+08:00 +MX2000068015,N/A,Dispatch,In,2021-04-12T00:33:42.9500000+08:00 +MX2000068020,N/A,Dispatch,In,2021-04-12T00:33:42.9500000+08:00 +MX2000068028,N/A,Dispatch,In,2021-04-12T00:33:42.9030000+08:00 +MX2000068024,N/A,Dispatch,In,2021-04-12T00:33:42.9330000+08:00 +MX2000068029,N/A,Dispatch,In,2021-04-12T00:33:42.9200000+08:00 +MX2000068026,N/A,Dispatch,In,2021-04-12T00:33:42.9200000+08:00 +MX2000068023,N/A,Dispatch,In,2021-04-12T00:33:42.9330000+08:00 +MX2000068019,N/A,Dispatch,In,2021-04-12T00:33:42.9800000+08:00 +MX2000068018,N/A,Dispatch,In,2021-04-12T00:33:42.9800000+08:00 +MX2000068014,N/A,Dispatch,In,2021-04-12T00:33:42.9800000+08:00 +MX2000068022,N/A,Dispatch,In,2021-04-12T00:33:42.9330000+08:00 +MX2000068017,N/A,Dispatch,In,2021-04-12T00:33:42.9670000+08:00 +MX2000068011,N/A,Dispatch,In,2021-04-12T00:33:42.9500000+08:00 +MX2000068012,N/A,Dispatch,In,2021-04-12T00:33:42.9670000+08:00 +MX2000068008,N/A,Dispatch,In,2021-04-12T00:33:42.4800000+08:00 +MX2000068009,N/A,Dispatch,In,2021-04-12T00:33:42.4800000+08:00 +MX2000068004,N/A,Dispatch,In,2021-04-12T00:33:42.4970000+08:00 +MX2000067993,N/A,Dispatch,In,2021-04-12T00:33:42.5430000+08:00 +MX2000068016,N/A,Dispatch,In,2021-04-12T00:33:42.9670000+08:00 +MX2000068013,N/A,Dispatch,In,2021-04-12T00:33:42.9670000+08:00 +MX2000068025,N/A,Dispatch,In,2021-04-12T00:33:42.9030000+08:00 +MX2000068021,N/A,Dispatch,In,2021-04-12T00:33:42.9500000+08:00 +MX2000068007,N/A,Dispatch,In,2021-04-12T00:33:42.4970000+08:00 +MX2000068002,N/A,Dispatch,In,2021-04-12T00:33:42.5130000+08:00 +MX2000068000,N/A,Dispatch,In,2021-04-12T00:33:42.5600000+08:00 +MX2000067998,N/A,Dispatch,In,2021-04-12T00:33:42.5270000+08:00 +MX2000068001,N/A,Dispatch,In,2021-04-12T00:33:42.5130000+08:00 +MX2000067996,N/A,Dispatch,In,2021-04-12T00:33:42.5130000+08:00 +MX2000067967,N/A,Dispatch,In,2021-04-12T00:33:42.9030000+08:00 +MX2000067969,N/A,Dispatch,In,2021-04-12T00:33:42.8870000+08:00 +MX2000067968,N/A,Dispatch,In,2021-04-12T00:33:42.8570000+08:00 +MX2000067970,N/A,Dispatch,In,2021-04-12T00:33:42.8870000+08:00 +MX2000067965,N/A,Dispatch,In,2021-04-12T00:33:42.8730000+08:00 +MX2000067966,N/A,Dispatch,In,2021-04-12T00:33:42.8870000+08:00 +MX2000067964,N/A,Dispatch,In,2021-04-12T00:33:42.8870000+08:00 +MX2000067963,N/A,Dispatch,In,2021-04-12T00:33:42.9030000+08:00 +MX2000068030,N/A,Dispatch,In,2021-04-12T00:33:42.9200000+08:00 +MX2000068027,N/A,Dispatch,In,2021-04-12T00:33:42.9200000+08:00 diff --git a/utils/test_azure/test.php b/utils/test_azure/test.php index e03c6f1f..cb4294c1 100644 --- a/utils/test_azure/test.php +++ b/utils/test_azure/test.php @@ -7,20 +7,29 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use MicrosoftAzure\Storage\Blob\BlobRestProxy; use MicrosoftAzure\Storage\Common\ServiceException; -$blob_url = 'https://popappshopprodstorage.blob.core.windows.net/warranty'; -$sas_token = 'sp=r&st=2021-03-18T08:26:36Z&se=2021-04-29T16:26:36Z&spr=https&sv=2020-02-10&sr=c&sig=Rwl3aCNThXEzuPjNB9sTvZzsx84ULDylyS1WtPwgyzg%3D'; +//$blob_url = 'https://popappshopprodstorage.blob.core.windows.net/warranty'; +//$sas_token = 'sp=r&st=2021-03-18T08:26:36Z&se=2021-04-29T16:26:36Z&spr=https&sv=2020-02-10&sr=c&sig=Rwl3aCNThXEzuPjNB9sTvZzsx84ULDylyS1WtPwgyzg%3D'; $blob_url = 'https://popappshopprodstorage.blob.core.windows.net'; -$sas_token = 'sp=r&st=2021-03-20T17:09:13Z&se=2021-04-01T01:09:13Z&spr=https&sv=2020-02-10&sr=c&sig=pU2fxj6eXALfGTTrsmaJ7W0QtdstyR88Xs5lvMJ35xQ%3D'; +//$sas_token = 'sp=r&st=2021-03-20T17:09:13Z&se=2021-04-01T01:09:13Z&spr=https&sv=2020-02-10&sr=c&sig=pU2fxj6eXALfGTTrsmaJ7W0QtdstyR88Xs5lvMJ35xQ%3D'; + +$sas_token = 'sp=r&st=2021-04-13T03:48:30Z&se=2022-04-01T11:48:30Z&spr=https&sv=2020-02-10&sr=c&sig=L6VDl40qRXhQb7w8JVkj3r7x2Xkt72pQaQ8AH2M5CRk%3D'; $conn_string = "BlobEndpoint=$blob_url;\nSharedAccessSignature=$sas_token"; $blob_client = BlobRestProxy::createBlobService($conn_string); +$current_date = new DateTime(); +$current_date->modify("-1 day"); + +$date = $current_date->format('m-d-Y'); + +$filename = 'warrantylogs' . $date . '.csv'; +//print_r($filename); // NOTE: via download blob -$res = $blob_client->getBlob('warranty', 'Sample Result.csv'); +$res = $blob_client->getBlob('warranty', $filename); // print_r($res); file_put_contents("output.txt", $res->getContentStream());