diff --git a/documents/2021-07-07_MPP_V16.xlsm b/documents/2021-07-07_MPP_V16.xlsm new file mode 100644 index 0000000..c1fbec8 Binary files /dev/null and b/documents/2021-07-07_MPP_V16.xlsm differ diff --git a/httpdocs/.env b/httpdocs/.env new file mode 100644 index 0000000..1551e25 --- /dev/null +++ b/httpdocs/.env @@ -0,0 +1,44 @@ +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=c43f71c8004192e443ea2e428431cbe8 +###< symfony/framework-bundle ### + +###> symfony/mailer ### +###MAILER_DSN=smtp://localhost +###< symfony/mailer ### + +###> doctrine/doctrine-bundle ### +# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml +# +# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db" +# DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=5.7" +DATABASE_URL="postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=13&charset=utf8" +###< doctrine/doctrine-bundle ### + +###> custom vars ### +ADMIN_EMAIL="bim.admin@spawntree.de" +SYS_EMAIL="re@spawntree.de" +DEV_EMAIL="bim.test@spawntree.de" + +###> symfony/swiftmailer-bundle ### +# For Gmail as a transport, use: "gmail://username:password@localhost" +# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode=" +# Delivery is disabled by default via "null://localhost" +MAILER_URL=null://localhost +###< symfony/swiftmailer-bundle ### diff --git a/httpdocs/.env.test b/httpdocs/.env.test new file mode 100644 index 0000000..9e7162f --- /dev/null +++ b/httpdocs/.env.test @@ -0,0 +1,6 @@ +# define your env variables for the test env here +KERNEL_CLASS='App\Kernel' +APP_SECRET='$ecretf0rt3st' +SYMFONY_DEPRECATIONS_HELPER=999999 +PANTHER_APP_ENV=panther +PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots diff --git a/httpdocs/.gitignore b/httpdocs/.gitignore new file mode 100644 index 0000000..3a933c7 --- /dev/null +++ b/httpdocs/.gitignore @@ -0,0 +1,18 @@ + +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### + +###> symfony/phpunit-bridge ### +.phpunit +.phpunit.result.cache +/phpunit.xml +###< symfony/phpunit-bridge ### + +/public/assets/scss/.sass-cache \ No newline at end of file diff --git a/httpdocs/bin/console b/httpdocs/bin/console new file mode 100755 index 0000000..8fe9d49 --- /dev/null +++ b/httpdocs/bin/console @@ -0,0 +1,43 @@ +#!/usr/bin/env php +getParameterOption(['--env', '-e'], null, true)) { + putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); +} + +if ($input->hasParameterOption('--no-debug', true)) { + putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); +} + +(new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); + +if ($_SERVER['APP_DEBUG']) { + umask(0000); + + if (class_exists(Debug::class)) { + Debug::enable(); + } +} + +$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); +$application = new Application($kernel); +$application->run($input); diff --git a/httpdocs/bin/phpunit b/httpdocs/bin/phpunit new file mode 100755 index 0000000..4d1ed05 --- /dev/null +++ b/httpdocs/bin/phpunit @@ -0,0 +1,13 @@ +#!/usr/bin/env php +=7.2.5", + "ext-ctype": "*", + "ext-iconv": "*", + "composer/package-versions-deprecated": "1.11.99.1", + "doctrine/annotations": "^1.0", + "doctrine/doctrine-bundle": "^2.3", + "doctrine/doctrine-migrations-bundle": "^3.1", + "doctrine/orm": "^2.8", + "dompdf/dompdf": "^1.0", + "phpdocumentor/reflection-docblock": "^5.2", + "phpoffice/phpspreadsheet": "^1.29", + "sensio/framework-extra-bundle": "^5.1", + "symfony/asset": "5.2.*", + "symfony/console": "5.2.*", + "symfony/dotenv": "5.2.*", + "symfony/expression-language": "5.2.*", + "symfony/flex": "^1.3.1", + "symfony/form": "5.2.*", + "symfony/framework-bundle": "5.2.*", + "symfony/http-client": "5.2.*", + "symfony/intl": "5.2.*", + "symfony/mailer": "5.2.*", + "symfony/mime": "5.2.*", + "symfony/monolog-bundle": "^3.7", + "symfony/notifier": "5.2.*", + "symfony/process": "5.2.*", + "symfony/property-access": "5.2.*", + "symfony/property-info": "5.2.*", + "symfony/proxy-manager-bridge": "5.2.*", + "symfony/security-bundle": "5.2.*", + "symfony/serializer": "5.2.*", + "symfony/string": "5.2.*", + "symfony/swiftmailer-bundle": "^3.5", + "symfony/translation": "5.2.*", + "symfony/twig-bundle": "^5.2", + "symfony/validator": "5.2.*", + "symfony/web-link": "5.2.*", + "symfony/yaml": "5.2.*", + "twig/extra-bundle": "^2.12|^3.0", + "twig/twig": "^2.12|^3.0" + }, + "require-dev": { + "doctrine/doctrine-fixtures-bundle": "^3.4", + "symfony/browser-kit": "^5.2", + "symfony/css-selector": "^5.2", + "symfony/debug-bundle": "^5.2", + "symfony/maker-bundle": "^1.0", + "symfony/phpunit-bridge": "^5.2", + "symfony/stopwatch": "^5.2", + "symfony/var-dumper": "^5.2", + "symfony/web-profiler-bundle": "^5.2" + }, + "config": { + "optimize-autoloader": true, + "preferred-install": { + "*": "dist" + }, + "sort-packages": true, + "allow-plugins": { + "symfony/flex": true + } + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php72": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ] + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "allow-contrib": false, + "require": "5.2.*" + } + } +} diff --git a/httpdocs/composer.lock b/httpdocs/composer.lock new file mode 100644 index 0000000..abdcfc5 --- /dev/null +++ b/httpdocs/composer.lock @@ -0,0 +1,9240 @@ +{ + "_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#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "11ca8917ee233c35def1ef75d84a8deb", + "packages": [ + { + "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": "doctrine/annotations", + "version": "1.13.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.13.2" + }, + "time": "2021-08-05T19:00:23+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/331b4d5dbaeab3827976273e9356b3b453c300ce", + "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev", + "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.1.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%2Fcache", + "type": "tidelift" + } + ], + "time": "2021-07-17T14:49:29+00:00" + }, + { + "name": "doctrine/collections", + "version": "1.6.8", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/1958a744696c6bb3bb0d28db2611dc11610e78af", + "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af", + "shasum": "" + }, + "require": { + "php": "^7.1.3 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", + "vimeo/psalm": "^4.2.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/1.6.8" + }, + "time": "2021-08-10T18:51:53+00:00" + }, + { + "name": "doctrine/common", + "version": "3.2.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "295082d3750987065912816a9d536c2df735f637" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/295082d3750987065912816a9d536c2df735f637", + "reference": "295082d3750987065912816a9d536c2df735f637", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^2.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^4.0.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/3.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%2Fcommon", + "type": "tidelift" + } + ], + "time": "2022-02-02T09:15:57+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "5b6eb6c8ce65ebdc60b0c0960a676cf76758dbf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/5b6eb6c8ce65ebdc60b0c0960a676cf76758dbf2", + "reference": "5b6eb6c8ce65ebdc60b0c0960a676cf76758dbf2", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.0", + "php": "^7.3 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2021.1", + "phpstan/phpstan": "1.4.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "9.5.11", + "psalm/plugin-phpunit": "0.16.1", + "squizlabs/php_codesniffer": "3.6.2", + "symfony/cache": "^5.2|^6.0", + "symfony/console": "^2.7|^3.0|^4.0|^5.0|^6.0", + "vimeo/psalm": "4.16.1" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.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%2Fdbal", + "type": "tidelift" + } + ], + "time": "2022-01-30T17:50:59+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v0.5.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", + "shasum": "" + }, + "require": { + "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.5.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "5c086cbbe5327937dd6f90da075f7d421b0f28bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5c086cbbe5327937dd6f90da075f7d421b0f28bc", + "reference": "5c086cbbe5327937dd6f90da075f7d421b0f28bc", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1", + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/dbal": "^2.13.1|^3.1", + "doctrine/persistence": "^2.2", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.1 || ^8.0", + "symfony/cache": "^4.3.3|^5.0|^6.0", + "symfony/config": "^4.4.3|^5.0|^6.0", + "symfony/console": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/dependency-injection": "^4.4.18|^5.0|^6.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/doctrine-bridge": "^4.4.22|^5.2.7|^6.0", + "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/service-contracts": "^1.1.1|^2.0|^3" + }, + "conflict": { + "doctrine/orm": "<2.9", + "twig/twig": "<1.34|>=2.0,<2.4" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "doctrine/orm": "^2.9 || ^3.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3 || ^10.0", + "psalm/plugin-phpunit": "^0.16.1", + "psalm/plugin-symfony": "^3", + "symfony/phpunit-bridge": "^5.2|^6.0", + "symfony/property-info": "^4.3.3|^5.0|^6.0", + "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0|^6.0", + "symfony/security-bundle": "^4.4|^5.0|^6.0", + "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/validator": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/yaml": "^3.4.30|^4.3.3|^5.0|^6.0", + "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", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.5.5" + }, + "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": "2022-01-06T08:56:31+00:00" + }, + { + "name": "doctrine/doctrine-migrations-bundle", + "version": "3.2.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", + "reference": "3393f411ba25ade21969c33f2053220044854d01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/3393f411ba25ade21969c33f2053220044854d01", + "reference": "3393f411ba25ade21969c33f2053220044854d01", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "~1.0|~2.0", + "doctrine/migrations": "^3.2", + "php": "^7.2|^8.0", + "symfony/framework-bundle": "~3.4|~4.0|~5.0|~6.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "doctrine/orm": "^2.6", + "doctrine/persistence": "^1.3||^2.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^8.0|^9.0", + "vimeo/psalm": "^4.11" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\MigrationsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineMigrationsBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "dbal", + "migrations", + "schema" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.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": "2022-02-01T18:08:07+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "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": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.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-10-22T20:16:43+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "ext-pdo": "*", + "ext-phar": "*", + "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", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "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.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c", + "reference": "9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.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%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-01-12T08:27:12+00:00" + }, + { + "name": "doctrine/migrations", + "version": "3.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "e7df670aa9565b435ffec636cebdb4d0a1987f10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/e7df670aa9565b435ffec636cebdb4d0a1987f10", + "reference": "e7df670aa9565b435ffec636cebdb4d0a1987f10", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/dbal": "^2.11 || ^3.0", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "php": "^7.2 || ^8.0", + "psr/log": "^1.1.3 || ^2 || ^3", + "symfony/console": "^3.4 || ^4.4.16 || ^5.0 || ^6.0", + "symfony/stopwatch": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "doctrine/orm": "^2.6", + "doctrine/persistence": "^1.3 || ^2.0", + "doctrine/sql-formatter": "^1.0", + "ergebnis/composer-normalize": "^2.9", + "ext-pdo_sqlite": "*", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpstan/phpstan-symfony": "^0.12", + "phpunit/phpunit": "^8.5 || ^9.4", + "symfony/cache": "^3.4.26 || ^4.2.12 || ^5.0 || ^6.0", + "symfony/process": "^3.4 || ^4.0 || ^5.0 || ^6.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "suggest": { + "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." + }, + "bin": [ + "bin/doctrine-migrations" + ], + "type": "library", + "extra": { + "composer-normalize": { + "indent-size": 4, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" + } + ], + "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "dbal", + "migrations" + ], + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/3.4.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%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2022-01-28T21:58:35+00:00" + }, + { + "name": "doctrine/orm", + "version": "2.11.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "4b88ce787d3916c8366abf52f6c658a7a27ed3a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/4b88ce787d3916c8366abf52f6c658a7a27ed3a6", + "reference": "4b88ce787d3916c8366abf52f6c658a7a27ed3a6", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.12.1 || ^2.1.1", + "doctrine/collections": "^1.5", + "doctrine/common": "^3.0.3", + "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.1", + "doctrine/inflector": "^1.4 || ^2.0", + "doctrine/instantiator": "^1.3", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^2.2", + "ext-ctype": "*", + "ext-pdo": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/polyfill-php72": "^1.23", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "doctrine/annotations": "<1.13 || >= 2.0" + }, + "require-dev": { + "doctrine/annotations": "^1.13", + "doctrine/coding-standard": "^9.0", + "phpbench/phpbench": "^0.16.10 || ^1.0", + "phpstan/phpstan": "1.4.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "squizlabs/php_codesniffer": "3.6.2", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0", + "vimeo/psalm": "4.19.0" + }, + "suggest": { + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "lib/Doctrine/ORM" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/2.11.1" + }, + "time": "2022-01-30T21:47:06+00:00" + }, + { + "name": "doctrine/persistence", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "f8af155c1e7963f3d2b4415097d55757bbaa53d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/f8af155c1e7963f3d2b4415097d55757bbaa53d8", + "reference": "f8af155c1e7963f3d2b4415097d55757bbaa53d8", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/collections": "^1.0", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.0", + "php": "^7.1 || ^8.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "doctrine/annotations": "<1.0 || >=2.0", + "doctrine/common": "<2.10@dev" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11", + "doctrine/annotations": "^1.0", + "doctrine/coding-standard": "^6.0 || ^9.0", + "doctrine/common": "^3.0", + "phpstan/phpstan": "1.2.0", + "phpunit/phpunit": "^7.5.20 || ^8.0 || ^9.0", + "symfony/cache": "^4.4 || ^5.0 || ^6.0", + "vimeo/psalm": "4.13.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common", + "Doctrine\\Persistence\\": "lib/Doctrine/Persistence" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/2.3.0" + }, + "time": "2022-01-09T19:58:46+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "20c39c2de286a9d3262cc8ed282a4ae60e265894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/20c39c2de286a9d3262cc8ed282a4ae60e265894", + "reference": "20c39c2de286a9d3262cc8ed282a4ae60e265894", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "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.2" + }, + "time": "2021-11-05T11:11:14+00:00" + }, + { + "name": "dompdf/dompdf", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "de4aad040737a89fae2129cdeb0f79c45513128d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/de4aad040737a89fae2129cdeb0f79c45513128d", + "reference": "de4aad040737a89fae2129cdeb0f79c45513128d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "phenx/php-font-lib": "^0.5.2", + "phenx/php-svg-lib": "^0.3.3", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "type": "library", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + }, + { + "name": "Brian Sweeney", + "email": "eclecticgeek@gmail.com" + }, + { + "name": "Gabriel Bull", + "email": "me@gabrielbull.com" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "issues": "https://github.com/dompdf/dompdf/issues", + "source": "https://github.com/dompdf/dompdf/tree/v1.1.1" + }, + "time": "2021-11-24T00:45:04+00:00" + }, + { + "name": "egulias/email-validator", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ee0db30118f661fb166bcffbf5d82032df484697" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ee0db30118f661fb166bcffbf5d82032df484697", + "reference": "ee0db30118f661fb166bcffbf5d82032df484697", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/3.1.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2021-10-11T09:18:27+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.16.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8", + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0" + }, + "time": "2022-09-18T07:06:19+00:00" + }, + { + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "006aa5d32f887a4db4353b13b5b5095613e0611f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/006aa5d32f887a4db4353b13b5b5095613e0611f", + "reference": "006aa5d32f887a4db4353b13b5b5095613e0611f", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0|^6.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|^6.0" + }, + "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.5" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2021-05-22T16:11:15+00:00" + }, + { + "name": "laminas/laminas-code", + "version": "4.5.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "6fd96d4d913571a2cd056a27b123fa28cb90ac4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/6fd96d4d913571a2cd056a27b123fa28cb90ac4e", + "reference": "6fd96d4d913571a2cd056a27b123fa28cb90ac4e", + "shasum": "" + }, + "require": { + "php": ">=7.4, <8.2" + }, + "require-dev": { + "doctrine/annotations": "^1.13.2", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^2.3.0", + "laminas/laminas-stdlib": "^3.6.1", + "phpunit/phpunit": "^9.5.10", + "psalm/plugin-phpunit": "^0.16.1", + "vimeo/psalm": "^4.13.1" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Code\\": "src/" + }, + "files": [ + "polyfill/ReflectionEnumPolyfill.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas", + "laminasframework" + ], + "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" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2021-12-19T18:06:55+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "2.2.6", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", + "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", + "shasum": "" + }, + "require": { + "myclabs/php-enum": "^1.5", + "php": "^7.4 || ^8.0", + "psr/http-message": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.9", + "guzzlehttp/guzzle": "^6.5.3 || ^7.2.0", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.4", + "phpunit/phpunit": "^8.5.8 || ^9.4.2", + "vimeo/psalm": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/2.2.6" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + }, + { + "url": "https://opencollective.com/zipstream", + "type": "open_collective" + } + ], + "time": "2022-11-25T18:57:19+00:00" + }, + { + "name": "markbaker/complex", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" + }, + "time": "2022-12-06T16:21:08+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" + }, + "time": "2022-12-02T22:17:43+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.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 || ^3", + "php-console/php-console": "^3.1.3", + "phpspec/prophecy": "^1.6.1", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90@dev", + "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-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP 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.3.5" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2021-10-01T21:08:31+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.4" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2022-08-04T09:53:51+00:00" + }, + { + "name": "phenx/php-font-lib", + "version": "0.5.4", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/dd448ad1ce34c63d09baccd05415e361300c35b4", + "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4", + "shasum": "" + }, + "require": { + "ext-mbstring": "*" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3 || ^4 || ^5" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/PhenX/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/0.5.4" + }, + "time": "2021-12-17T19:44:54+00:00" + }, + { + "name": "phenx/php-svg-lib", + "version": "0.3.4", + "source": { + "type": "git", + "url": "https://github.com/PhenX/php-svg-lib.git", + "reference": "f627771eb854aa7f45f80add0f23c6c4d67ea0f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/f627771eb854aa7f45f80add0f23c6c4d67ea0f2", + "reference": "f627771eb854aa7f45f80add0f23c6c4d67ea0f2", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "sabberworm/php-css-parser": "^8.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/PhenX/php-svg-lib", + "support": { + "issues": "https://github.com/PhenX/php-svg-lib/issues", + "source": "https://github.com/PhenX/php-svg-lib/tree/0.3.4" + }, + "time": "2021-10-18T02:13:32+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706", + "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0" + }, + "time": "2022-01-04T19:58:01+00:00" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.29.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "fde2ccf55eaef7e86021ff1acce26479160a0fa0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/fde2ccf55eaef7e86021ff1acce26479160a0fa0", + "reference": "fde2ccf55eaef7e86021ff1acce26479160a0fa0", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": "^7.4 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "dompdf/dompdf": "^1.0 || ^2.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0 || ^10.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.0" + }, + "time": "2023-06-14T22:48:31+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "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.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/1.0.2" + }, + "time": "2023-04-10T20:12:12+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, + "time": "2023-04-04T09:50:52+00:00" + }, + { + "name": "psr/link", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/link.git", + "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562", + "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Link\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for HTTP links", + "keywords": [ + "http", + "http-link", + "link", + "psr", + "psr-13", + "rest" + ], + "support": { + "source": "https://github.com/php-fig/link/tree/master" + }, + "time": "2016-10-28T16:06:13+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "sabberworm/php-css-parser", + "version": "8.4.0", + "source": { + "type": "git", + "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/e41d2140031d533348b2192a83f02d8dd8a71d30", + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=5.6.20" + }, + "require-dev": { + "codacy/coverage": "^1.4", + "phpunit/phpunit": "^4.8.36" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues", + "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.4.0" + }, + "time": "2021-12-11T13:40:54+00:00" + }, + { + "name": "sensio/framework-extra-bundle", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "430d14c01836b77c28092883d195a43ce413ee32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/430d14c01836b77c28092883d195a43ce413ee32", + "reference": "430d14c01836b77c28092883d195a43ce413ee32", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.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/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.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.4.9|^5.0.9", + "symfony/psr-http-message-bridge": "^1.1", + "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" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" + }, + "exclude-from-classmap": [ + "/tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], + "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": "swiftmailer/swiftmailer", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.4" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "abandoned": "symfony/mailer", + "time": "2021-10-18T15:26:12+00:00" + }, + { + "name": "symfony/asset", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/asset.git", + "reference": "abe64fee9fa2978c730c84d0d6df760f2d9ddba0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/asset/zipball/abe64fee9fa2978c730c84d0d6df760f2d9ddba0", + "reference": "abe64fee9fa2978c730c84d0d6df760f2d9ddba0", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/http-client": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" + }, + "suggest": { + "symfony/http-foundation": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Asset\\": "" + }, + "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": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/asset/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/cache", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "b59303192fb99c8b3d3abc0b5975c7512fe6d1f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/b59303192fb99c8b3d3abc0b5975c7512fe6d1f4", + "reference": "b59303192fb99c8b3d3abc0b5975c7512fe6d1f4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "conflict": { + "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|2.0", + "psr/simple-cache-implementation": "1.0", + "symfony/cache-implementation": "1.0|2.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6|^2.0", + "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", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "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 extended PSR-6, PSR-16 (and tags) implementation", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/ac2e168102a2e06a2624f0379bde94cd5854ced2", + "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "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 caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.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-08-17T14:20:01+00:00" + }, + { + "name": "symfony/config", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "32f6be0d0c2e204ff35759f9ee81d4f5e83b7acb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/32f6be0d0c2e204ff35759f9ee81d4f5e83b7acb", + "reference": "32f6be0d0c2e204ff35759f9ee81d4f5e83b7acb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/filesystem": "^4.4|^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22" + }, + "conflict": { + "symfony/finder": "<4.4" + }, + "require-dev": { + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "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": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/console", + "version": "v5.2.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "ffc2722adb0983451855c794c4bc7818d3c65fa2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/ffc2722adb0983451855c794c4bc7818d3c65fa2", + "reference": "ffc2722adb0983451855c794c4bc7818d3c65fa2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "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": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.2.14" + }, + "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-07-29T06:18:06+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "2f0326ab0e142a3600b1b435cb3e852bc96264b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2f0326ab0e142a3600b1b435cb3e852bc96264b6", + "reference": "2f0326ab0e142a3600b1b435cb3e852bc96264b6", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "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|2.0" + }, + "require-dev": { + "symfony/config": "^5.1", + "symfony/expression-language": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "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": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-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.5.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-07-12T14:48:14+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "0212d2d1e17a3e7403475b76e26fc1f0f1add04b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/0212d2d1e17a3e7403475b76e26fc1f0f1add04b", + "reference": "0212d2d1e17a3e7403475b76e26fc1f0f1add04b", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "~1.0", + "doctrine/persistence": "^2", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "doctrine/dbal": "<2.10", + "phpunit/phpunit": "<5.4.3", + "symfony/dependency-injection": "<4.4", + "symfony/form": "<5.1", + "symfony/http-kernel": "<5", + "symfony/messenger": "<4.4", + "symfony/property-info": "<5", + "symfony/security-bundle": "<5", + "symfony/security-core": "<5", + "symfony/validator": "<5.2" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.8", + "doctrine/annotations": "^1.10.4", + "doctrine/collections": "~1.0", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "^2.10|^3.0", + "doctrine/orm": "^2.7.3", + "symfony/cache": "^5.1", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/doctrine-messenger": "^5.1", + "symfony/expression-language": "^4.4|^5.0", + "symfony/form": "^5.1.3", + "symfony/http-kernel": "^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.0", + "symfony/property-info": "^5.0", + "symfony/proxy-manager-bridge": "^4.4|^5.0", + "symfony/security-core": "^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/uid": "^5.1", + "symfony/validator": "^5.2", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "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": "Provides integration for Doctrine with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.12" + }, + "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-07-21T13:17:02+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v5.2.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "12888c9c46ac750ec5c1381db5bf3d534e7d70cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/12888c9c46ac750ec5c1381db5bf3d534e7d70cb", + "reference": "12888c9c46ac750ec5c1381db5bf3d534e7d70cb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1" + }, + "require-dev": { + "symfony/process": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "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": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "source": "https://github.com/symfony/dotenv/tree/v5.2.14" + }, + "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-07-29T06:18:06+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "7ca5fa510345f6b8def43b18c900852defaee362" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/7ca5fa510345f6b8def43b18c900852defaee362", + "reference": "7ca5fa510345f6b8def43b18c900852defaee362", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "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": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "6a32cd803f8ff33d84b709de3978f44a62e42961" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/6a32cd803f8ff33d84b709de3978f44a62e42961", + "reference": "6a32cd803f8ff33d84b709de3978f44a62e42961", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "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 dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.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-07-12T14:48:14+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "d4367d36217dd395b10f61649a6bf2c1367140d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/d4367d36217dd395b10f61649a6bf2c1367140d8", + "reference": "d4367d36217dd395b10f61649a6bf2c1367140d8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/cache": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "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": "Provides an engine that can compile and evaluate expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/expression-language/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "ed397ef25365b3db9f215af4ed5b1ec8a5b10989" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/ed397ef25365b3db9f215af4ed5b1ec8a5b10989", + "reference": "ed397ef25365b3db9f215af4ed5b1ec8a5b10989", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "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": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "17f50e06018baec41551a71a15731287dbaab186" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/17f50e06018baec41551a71a15731287dbaab186", + "reference": "17f50e06018baec41551a71a15731287dbaab186", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "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": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/flex", + "version": "v1.18.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/flex.git", + "reference": "d40a6b176b70ea323af2b08507319d1c417520fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/flex/zipball/d40a6b176b70ea323af2b08507319d1c417520fd", + "reference": "d40a6b176b70ea323af2b08507319d1c417520fd", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": ">=7.1" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "symfony/dotenv": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/phpunit-bridge": "^4.4.12|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Flex\\Flex" + }, + "autoload": { + "psr-4": { + "Symfony\\Flex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "Composer plugin for Symfony", + "support": { + "issues": "https://github.com/symfony/flex/issues", + "source": "https://github.com/symfony/flex/tree/v1.18.3" + }, + "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": "2022-01-27T10:24:58+00:00" + }, + { + "name": "symfony/form", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/form.git", + "reference": "929811a7667aa5814f93a70974423870b14c05aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/form/zipball/929811a7667aa5814f93a70974423870b14c05aa", + "reference": "929811a7667aa5814f93a70974423870b14c05aa", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/options-resolver": "^5.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/property-access": "^5.0.8", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<4.4", + "symfony/doctrine-bridge": "<4.4", + "symfony/error-handler": "<4.4.5", + "symfony/framework-bundle": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/intl": "<4.4", + "symfony/translation": "<4.4", + "symfony/translation-contracts": "<1.1.7", + "symfony/twig-bridge": "<4.4" + }, + "require-dev": { + "doctrine/collections": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^4.4.17|^5.1.9", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "symfony/security-csrf": "For protecting forms against CSRF attacks.", + "symfony/twig-bridge": "For templating with Twig.", + "symfony/validator": "For form validation." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Form\\": "" + }, + "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": "Allows to easily create, process and reuse HTML forms", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/form/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "4e9ca1c60dba3b5e261eadd3b427bc115914b72b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/4e9ca1c60dba3b5e261eadd3b427bc115914b72b", + "reference": "4e9ca1c60dba3b5e261eadd3b427bc115914b72b", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/cache": "^5.2", + "symfony/config": "~5.0.11|^5.1.3", + "symfony/dependency-injection": "^5.2", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4.1|^5.0.1", + "symfony/event-dispatcher": "^5.1", + "symfony/filesystem": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-foundation": "^5.2.1", + "symfony/http-kernel": "^5.2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/routing": "^5.2" + }, + "conflict": { + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "phpunit/phpunit": "<5.4.3", + "symfony/asset": "<5.1", + "symfony/browser-kit": "<4.4", + "symfony/console": "<5.2.5", + "symfony/dom-crawler": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/form": "<5.2", + "symfony/http-client": "<4.4", + "symfony/lock": "<4.4", + "symfony/mailer": "<5.2", + "symfony/messenger": "<4.4", + "symfony/mime": "<4.4", + "symfony/property-access": "<5.2", + "symfony/property-info": "<4.4", + "symfony/serializer": "<5.2", + "symfony/stopwatch": "<4.4", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<4.4", + "symfony/twig-bundle": "<4.4", + "symfony/validator": "<5.2", + "symfony/web-profiler-bundle": "<4.4", + "symfony/workflow": "<5.2" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "doctrine/cache": "^1.0|^2.0", + "doctrine/persistence": "^1.3|^2.0", + "paragonie/sodium_compat": "^1.8", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^5.1", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/console": "^5.2", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/dotenv": "^5.1", + "symfony/expression-language": "^4.4|^5.0", + "symfony/form": "^5.2", + "symfony/http-client": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/mailer": "^5.2", + "symfony/messenger": "^5.2", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^4.4|^5.0", + "symfony/property-info": "^4.4|^5.0", + "symfony/security-bundle": "^5.1", + "symfony/security-core": "^4.4|^5.2", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-http": "^4.4|^5.0", + "symfony/serializer": "^5.2", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/string": "^5.0", + "symfony/translation": "^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/validator": "^5.2", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^5.2", + "symfony/yaml": "^4.4|^5.0", + "twig/twig": "^2.10|^3.0" + }, + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "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": "Provides a tight integration between Symfony components and the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v5.2.12" + }, + "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-07-21T13:17:02+00:00" + }, + { + "name": "symfony/http-client", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "1895ede860a198803395a67738104211508b5ddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/1895ede860a198803395a67738104211508b5ddc", + "reference": "1895ede860a198803395a67738104211508b5ddc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/http-client-contracts": "^2.2", + "symfony/polyfill-php73": "^1.11", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.0|^2" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "2.2" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-kernel": "^4.4.13|^5.1.5", + "symfony/process": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "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 powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-client/tree/v5.2.12" + }, + "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-07-23T15:55:19+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "ec82e57b5b714dbb69300d348bd840b345e24166" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ec82e57b5b714dbb69300d348bd840b345e24166", + "reference": "ec82e57b5b714dbb69300d348bd840b345e24166", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-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.5.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-11-03T09:24:47+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.2.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "2a247de56fc8f5efdf1e098192128e8e509d370c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2a247de56fc8f5efdf1e098192128e8e509d370c", + "reference": "2a247de56fc8f5efdf1e098192128e8e509d370c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "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\\": "" + }, + "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": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.2.14" + }, + "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-07-29T06:18:06+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.2.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "2c3b9af1047c477c527504a3509ab59e4fae0689" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2c3b9af1047c477c527504a3509ab59e4fae0689", + "reference": "2c3b9af1047c477c527504a3509ab59e4fae0689", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "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-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.1.8", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^5.1.8", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "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": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.2.14" + }, + "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-07-29T06:52:15+00:00" + }, + { + "name": "symfony/intl", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "23ae12a613eb77725c6ef6a15d37b0e9956c6a2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/23ae12a613eb77725c6ef6a15d37b0e9956c6a2a", + "reference": "23ae12a613eb77725c6ef6a15d37b0e9956c6a2a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/filesystem": "^4.4|^5.0" + }, + "suggest": { + "ext-intl": "to use the component with locales other than \"en\"" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a PHP replacement layer for the C intl extension that includes additional data from the ICU library", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "support": { + "source": "https://github.com/symfony/intl/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/mailer", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "75ea7f9e54c1bc49b6d7e3d6b20422f85b7ea3e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/75ea7f9e54c1bc49b6d7e3d6b20422f85b7ea3e4", + "reference": "75ea7f9e54c1bc49b6d7e3d6b20422f85b7ea3e4", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3", + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/mime": "^5.2.6", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/http-kernel": "<4.4" + }, + "require-dev": { + "symfony/amazon-mailer": "^4.4|^5.0", + "symfony/google-mailer": "^4.4|^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/mailchimp-mailer": "^4.4|^5.0", + "symfony/mailgun-mailer": "^4.4|^5.0", + "symfony/mailjet-mailer": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/postmark-mailer": "^4.4|^5.0", + "symfony/sendgrid-mailer": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "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": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "6ad63acd694b30e75fb2426b037e92859df73d6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/6ad63acd694b30e75fb2426b037e92859df73d6b", + "reference": "6ad63acd694b30e75fb2426b037e92859df73d6b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "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": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/monolog-bridge", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bridge.git", + "reference": "2c3943d7c0100983f9c0a82807555273353e3539" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/2c3943d7c0100983f9c0a82807555273353e3539", + "reference": "2c3943d7c0100983f9c0a82807555273353e3539", + "shasum": "" + }, + "require": { + "monolog/monolog": "^1.25.1|^2", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/http-foundation": "<4.4" + }, + "require-dev": { + "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" + }, + "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\\Bridge\\Monolog\\": "" + }, + "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": "Provides integration for Monolog with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/monolog-bridge/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/monolog-bundle", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bundle.git", + "reference": "fde12fc628162787a4e53877abadc30047fd868b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/fde12fc628162787a4e53877abadc30047fd868b", + "reference": "fde12fc628162787a4e53877abadc30047fd868b", + "shasum": "" + }, + "require": { + "monolog/monolog": "~1.22 || ~2.0", + "php": ">=7.1.3", + "symfony/config": "~4.4 || ^5.0 || ^6.0", + "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0", + "symfony/http-kernel": "~4.4 || ^5.0 || ^6.0", + "symfony/monolog-bridge": "~4.4 || ^5.0 || ^6.0" + }, + "require-dev": { + "symfony/console": "~4.4 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.2 || ^6.0", + "symfony/yaml": "~4.4 || ^5.0 || ^6.0" + }, + "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.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-11-05T10:34:29+00:00" + }, + { + "name": "symfony/notifier", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/notifier.git", + "reference": "08f557f018e080ea36d51b43a6552bf5396e9c83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/notifier/zipball/08f557f018e080ea36d51b43a6552bf5396e9c83", + "reference": "08f557f018e080ea36d51b43a6552bf5396e9c83", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/firebase-notifier": "<5.2", + "symfony/free-mobile-notifier": "<5.2", + "symfony/http-kernel": "<4.4", + "symfony/mattermost-notifier": "<5.2", + "symfony/nexmo-notifier": "<5.2", + "symfony/ovh-cloud-notifier": "<5.2", + "symfony/rocket-chat-notifier": "<5.2", + "symfony/sinch-notifier": "<5.2", + "symfony/slack-notifier": "<5.2", + "symfony/telegram-notifier": "<5.2", + "symfony/twilio-notifier": "<5.2" + }, + "require-dev": { + "symfony/event-dispatcher-contracts": "^2", + "symfony/http-client-contracts": "^2", + "symfony/messenger": "^4.4 || ^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Notifier\\": "" + }, + "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": "Sends notifications via one or more channels (email, SMS, ...)", + "homepage": "https://symfony.com", + "keywords": [ + "notification", + "notifier" + ], + "support": { + "source": "https://github.com/symfony/notifier/tree/v5.2.12" + }, + "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-07-19T00:25:08+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "1935d2e5329aba28cbb9ef6cc5687d007619d96d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/1935d2e5329aba28cbb9ef6cc5687d007619d96d", + "reference": "1935d2e5329aba28cbb9ef6cc5687d007619d96d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "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": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.24.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", + "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-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.24.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-11-23T21:10:46+00:00" + }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.24.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "c023a439b8551e320cc3c8433b198e408a623af1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/c023a439b8551e320cc3c8433b198e408a623af1", + "reference": "c023a439b8551e320cc3c8433b198e408a623af1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance and support of other locales than \"en\"" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Icu\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "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": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.24.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-10-26T17:16:04+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.24.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "749045c69efb97c70d25d7463abba812e91f3a44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/749045c69efb97c70d25d7463abba812e91f3a44", + "reference": "749045c69efb97c70d25d7463abba812e91f3a44", + "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.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.24.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-09-14T14:02:44+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.24.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-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.24.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-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.24.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", + "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "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 the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.24.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-11-30T18:21:41+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.24.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "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 backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.24.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-06-05T21:20:04+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.24.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-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.24.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-09-13T13:58:33+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.24.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", + "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "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 backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.24.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-09-13T13:58:11+00:00" + }, + { + "name": "symfony/process", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "d16634ee55b895bd85ec714dadc58e4428ecf030" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/d16634ee55b895bd85ec714dadc58e4428ecf030", + "reference": "d16634ee55b895bd85ec714dadc58e4428ecf030", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "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": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/property-access", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "82c6db3e4066ebc1993c377ae71090d0c8f0552c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/82c6db3e4066ebc1993c377ae71090d0c8f0552c", + "reference": "82c6db3e4066ebc1993c377ae71090d0c8f0552c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.16", + "symfony/property-info": "^5.2" + }, + "require-dev": { + "symfony/cache": "^4.4|^5.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "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": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/property-info", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "f9dd1886f47db8ea494d97a4b8bfa494094f53f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/f9dd1886f47db8ea494d97a4b8bfa494094f53f1", + "reference": "f9dd1886f47db8ea494d97a4b8bfa494094f53f1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.16", + "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.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/proxy-manager-bridge", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/proxy-manager-bridge.git", + "reference": "76e61f33f6a34a340bf6e02211214f466e8e1dba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/76e61f33f6a34a340bf6e02211214f466e8e1dba", + "reference": "76e61f33f6a34a340bf6e02211214f466e8e1dba", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "^1.8", + "friendsofphp/proxy-manager-lts": "^1.0.2", + "php": ">=7.2.5", + "symfony/dependency-injection": "^5.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/config": "^4.4|^5.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\ProxyManager\\": "" + }, + "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": "Provides integration for ProxyManager with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "983a19067308962592755f57d97ca1d1f1edd37b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/983a19067308962592755f57d97ca1d1f1edd37b", + "reference": "983a19067308962592755f57d97ca1d1f1edd37b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/config": "<5.0", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "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", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/security-bundle", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-bundle.git", + "reference": "bc36546f36355d7c0b56b23c44786b36904f838d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/bc36546f36355d7c0b56b23c44786b36904f838d", + "reference": "bc36546f36355d7c0b56b23c44786b36904f838d", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^5.2", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher": "^5.1", + "symfony/http-kernel": "^5.0", + "symfony/polyfill-php80": "^1.16", + "symfony/security-core": "^5.2", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-guard": "^5.2", + "symfony/security-http": "^5.2" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/console": "<4.4", + "symfony/framework-bundle": "<4.4", + "symfony/ldap": "<4.4", + "symfony/security-http": "<5.2.8", + "symfony/twig-bundle": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "symfony/asset": "^4.4|^5.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/framework-bundle": "^5.2", + "symfony/process": "^4.4|^5.0", + "symfony/rate-limiter": "^5.2", + "symfony/serializer": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/twig-bridge": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "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": "Provides a tight integration of the Security component into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-bundle/tree/v5.2.12" + }, + "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-07-26T16:33:12+00:00" + }, + { + "name": "symfony/security-core", + "version": "v5.2.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "4ce2b1e532fb3bb591ad4efa8cc43afc9242a247" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/4ce2b1e532fb3bb591ad4efa8cc43afc9242a247", + "reference": "4ce2b1e532fb3bb591ad4efa8cc43afc9242a247", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^1.1|^2", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4", + "symfony/ldap": "<4.4", + "symfony/security-guard": "<4.4", + "symfony/validator": "<5.2" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/ldap": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^5.2" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "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 Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v5.2.14" + }, + "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-07-29T06:36:20+00:00" + }, + { + "name": "symfony/security-csrf", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-csrf.git", + "reference": "f0af6689451582e55f6b3439362e72e536e916e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/f0af6689451582e55f6b3439362e72e536e916e4", + "reference": "f0af6689451582e55f6b3439362e72e536e916e4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16", + "symfony/security-core": "^4.4|^5.0" + }, + "conflict": { + "symfony/http-foundation": "<4.4" + }, + "require-dev": { + "symfony/http-foundation": "^4.4|^5.0" + }, + "suggest": { + "symfony/http-foundation": "For using the class SessionTokenStorage." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "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 Security Component - CSRF Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-csrf/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/security-guard", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-guard.git", + "reference": "9edddb0b4c97eb923ba9910050be80f539933c3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-guard/zipball/9edddb0b4c97eb923ba9910050be80f539933c3b", + "reference": "9edddb0b4c97eb923ba9910050be80f539933c3b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15", + "symfony/security-core": "^5.0", + "symfony/security-http": "^4.4.1|^5.0.1" + }, + "require-dev": { + "psr/log": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Guard\\": "" + }, + "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 Security Component - Guard", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-guard/tree/v5.2.12" + }, + "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-07-18T15:21:43+00:00" + }, + { + "name": "symfony/security-http", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-http.git", + "reference": "8d6fb4fb1bb0d4a11b30de85cbf77914c71175bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-http/zipball/8d6fb4fb1bb0d4a11b30de85cbf77914c71175bc", + "reference": "8d6fb4fb1bb0d4a11b30de85cbf77914c71175bc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/http-foundation": "^5.2", + "symfony/http-kernel": "^5.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/property-access": "^4.4|^5.0", + "symfony/security-core": "^5.2" + }, + "conflict": { + "symfony/event-dispatcher": "<4.3", + "symfony/security-csrf": "<4.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/cache": "^4.4|^5.0", + "symfony/rate-limiter": "^5.2", + "symfony/routing": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0" + }, + "suggest": { + "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", + "symfony/security-csrf": "For using tokens to protect authentication/logout attempts" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Http\\": "" + }, + "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 Security Component - HTTP Integration", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-http/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/serializer", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "3c3afcc285c01c486d1c5504e7895026580495c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/3c3afcc285c01c486d1c5504e7895026580495c4", + "reference": "3c3afcc285c01c486d1c5504e7895026580495c4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4", + "symfony/property-access": "<4.4", + "symfony/property-info": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "symfony/cache": "^4.4|^5.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/property-access": "^4.4.9|^5.0.9", + "symfony/property-info": "^4.4|^5.0", + "symfony/uid": "^5.1", + "symfony/validator": "^4.4|^5.0", + "symfony/var-exporter": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/cache-implementation": "For using the metadata cache.", + "symfony/config": "For using the XML mapping loader.", + "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", + "symfony/property-access": "For using the ObjectNormalizer.", + "symfony/property-info": "To deserialize relations.", + "symfony/var-exporter": "For using the metadata compiler.", + "symfony/yaml": "For using the default YAML mapping loader." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "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": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v5.2.12" + }, + "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-07-21T13:17:02+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "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 writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.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-11-04T16:48:04+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "24744393b122b8309bbcc7965972ae51a29a602d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/24744393b122b8309bbcc7965972ae51a29a602d", + "reference": "24744393b122b8309bbcc7965972ae51a29a602d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1.0|^2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.2.12" + }, + "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-07-10T08:55:45+00:00" + }, + { + "name": "symfony/string", + "version": "v5.2.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ab6dc1c796bbceffbaf9ccbfb7a24feb641d6ee7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ab6dc1c796bbceffbaf9ccbfb7a24feb641d6ee7", + "reference": "ab6dc1c796bbceffbaf9ccbfb7a24feb641d6ee7", + "shasum": "" + }, + "require": { + "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.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": "2021-06-27T11:43:47+00:00" + }, + { + "name": "symfony/swiftmailer-bundle", + "version": "v3.5.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/swiftmailer-bundle.git", + "reference": "fa7d78cbdf0a16a4da126c465f25f6547ad69cf6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/fa7d78cbdf0a16a4da126c465f25f6547ad69cf6", + "reference": "fa7d78cbdf0a16a4da126c465f25f6547ad69cf6", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "swiftmailer/swiftmailer": "^6.1.3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" + }, + "conflict": { + "twig/twig": "<1.41|>=2.0,<2.10" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/phpunit-bridge": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SwiftmailerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony SwiftmailerBundle", + "homepage": "http://symfony.com", + "support": { + "issues": "https://github.com/symfony/swiftmailer-bundle/issues", + "source": "https://github.com/symfony/swiftmailer-bundle/tree/v3.5.3" + }, + "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-12-02T16:23:52+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "7b4ef368b25bbb758a7bd5fe20349433e84220ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/7b4ef368b25bbb758a7bd5fe20349433e84220ed", + "reference": "7b4ef368b25bbb758a7bd5fe20349433e84220ed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "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": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.2.12" + }, + "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-07-21T13:17:02+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/d28150f0f44ce854e942b671fc2620a98aae1b1e", + "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "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 translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.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-08-17T14:20:01+00:00" + }, + { + "name": "symfony/twig-bridge", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "243a7c6416fea3b91391f09831d8d04b2e42c0b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/243a7c6416fea3b91391f09831d8d04b2e42c0b1", + "reference": "243a7c6416fea3b91391f09831d8d04b2e42c0b1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/console": "<4.4", + "symfony/form": "<5.1", + "symfony/http-foundation": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.2", + "symfony/workflow": "<5.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^5.1.9", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/mime": "^5.2", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/property-info": "^4.4|^5.1", + "symfony/routing": "^4.4|^5.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-http": "^4.4|^5.0", + "symfony/serializer": "^5.2", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.2", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^5.2", + "symfony/yaml": "^4.4|^5.0", + "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", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "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": "Provides integration for Twig with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/v5.2.12" + }, + "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-07-26T16:33:12+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "6f2aa369c4b7da19b3c864c48e35b26451c92e4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/6f2aa369c4b7da19b3c864c48e35b26451c92e4e", + "reference": "6f2aa369c4b7da19b3c864c48e35b26451c92e4e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/twig-bridge": "^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "symfony/dependency-injection": "<5.2", + "symfony/framework-bundle": "<5.0", + "symfony/translation": "<5.0" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "doctrine/cache": "^1.0|^2.0", + "symfony/asset": "^4.4|^5.0", + "symfony/dependency-injection": "^5.2", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "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": "Provides a tight integration of Twig into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/validator", + "version": "v5.2.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "a46ac85624ad3418d455bb8f4ce452014c28518c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/a46ac85624ad3418d455bb8f4ce452014c28518c", + "reference": "a46ac85624ad3418d455bb8f4ce452014c28518c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^1.1|^2" + }, + "conflict": { + "doctrine/lexer": "<1.0.2", + "phpunit/phpunit": "<5.4.3", + "symfony/dependency-injection": "<4.4", + "symfony/expression-language": "<5.1", + "symfony/http-kernel": "<4.4", + "symfony/intl": "<4.4", + "symfony/translation": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "doctrine/cache": "^1.0|^2.0", + "egulias/email-validator": "^2.1.10|^3", + "symfony/cache": "^4.4|^5.0", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^5.1", + "symfony/finder": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.0", + "symfony/property-info": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "egulias/email-validator": "Strict (RFC compliant) email validation", + "psr/cache-implementation": "For using the mapping cache.", + "symfony/config": "", + "symfony/expression-language": "For using the Expression validator and the ExpressionLanguageSyntax constraints", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For accessing properties within comparison constraints", + "symfony/property-info": "To automatically add NotNull and Type constraints", + "symfony/translation": "For translating validation errors.", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "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": "Provides tools to validate values", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/validator/tree/v5.2.14" + }, + "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-07-29T06:36:20+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "d5f42c357a6672d4e5960bba85e437850e9a7abb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d5f42c357a6672d4e5960bba85e437850e9a7abb", + "reference": "d5f42c357a6672d4e5960bba85e437850e9a7abb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.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).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "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 mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "b7898a65fc91e7c41de7a88c7db9aee9c0d432f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b7898a65fc91e7c41de7a88c7db9aee9c0d432f0", + "reference": "b7898a65fc91e7c41de7a88c7db9aee9c0d432f0", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/var-dumper": "^4.4.9|^5.0.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "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": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/web-link", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-link.git", + "reference": "3d1f4a0318314c63c363f5d49de15d54780b2079" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-link/zipball/3d1f4a0318314c63c363f5d49de15d54780b2079", + "reference": "3d1f4a0318314c63c363f5d49de15d54780b2079", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/link": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/http-kernel": "<4.4" + }, + "provide": { + "psr/link-implementation": "1.0" + }, + "require-dev": { + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" + }, + "suggest": { + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\WebLink\\": "" + }, + "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": "Manages links between resources", + "homepage": "https://symfony.com", + "keywords": [ + "dns-prefetch", + "http", + "http2", + "link", + "performance", + "prefetch", + "preload", + "prerender", + "psr13", + "push" + ], + "support": { + "source": "https://github.com/symfony/web-link/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.2.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "ffe9c92e1a6c77c3ad5fc3a2ac16f0b8549dae10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ffe9c92e1a6c77c3ad5fc3a2ac16f0b8549dae10", + "reference": "ffe9c92e1a6c77c3ad5fc3a2ac16f0b8549dae10", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.2.14" + }, + "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-07-29T06:18:06+00:00" + }, + { + "name": "twig/extra-bundle", + "version": "v3.3.7", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "e0cc9c35a0650006b0da232a3f749cc060c65d3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/e0cc9c35a0650006b0da232a3f749cc060c65d3b", + "reference": "e0cc9c35a0650006b0da232a3f749cc060c65d3b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/framework-bundle": "^4.4|^5.0|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "twig/twig": "^2.7|^3.0" + }, + "require-dev": { + "league/commonmark": "^1.0|^2.0", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", + "twig/cache-extra": "^3.0", + "twig/cssinliner-extra": "^2.12|^3.0", + "twig/html-extra": "^2.12|^3.0", + "twig/inky-extra": "^2.12|^3.0", + "twig/intl-extra": "^2.12|^3.0", + "twig/markdown-extra": "^2.12|^3.0", + "twig/string-extra": "^2.12|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.3.7" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2022-01-03T21:04:59+00:00" + }, + { + "name": "twig/twig", + "version": "v3.3.7", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "8f168c6ffa3ce76d1786b3cd52275424a3fc675b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/8f168c6ffa3ce76d1786b3cd52275424a3fc675b", + "reference": "8f168c6ffa3ce76d1786b3cd52275424a3fc675b", + "shasum": "" + }, + "require": { + "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.9|^5.0.9|^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.3.7" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2022-01-03T21:15:37+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/data-fixtures", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "51c1890e8c5467c421c7cab4579f059ebf720278" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/51c1890e8c5467c421c7cab4579f059ebf720278", + "reference": "51c1890e8c5467c421c7cab4579f059ebf720278", + "shasum": "" + }, + "require": { + "doctrine/common": "^2.13|^3.0", + "doctrine/persistence": "^1.3.3|^2.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<2.13", + "doctrine/phpcr-odm": "<1.3.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "doctrine/dbal": "^2.13 || ^3.0", + "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", + "doctrine/orm": "^2.7.0", + "ext-sqlite3": "*", + "jangregor/phpstan-prophecy": "^0.8.1", + "phpstan/phpstan": "^0.12.99", + "phpunit/phpunit": "^8.0", + "symfony/cache": "^5.0 || ^6.0", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "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", + "autoload": { + "psr-4": { + "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database" + ], + "support": { + "issues": "https://github.com/doctrine/data-fixtures/issues", + "source": "https://github.com/doctrine/data-fixtures/tree/1.5.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%2Fdata-fixtures", + "type": "tidelift" + } + ], + "time": "2022-01-20T17:10:56+00:00" + }, + { + "name": "doctrine/doctrine-fixtures-bundle", + "version": "3.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", + "reference": "31ba202bebce0b66fe830f49f96228dcdc1503e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/31ba202bebce0b66fe830f49f96228dcdc1503e7", + "reference": "31ba202bebce0b66fe830f49f96228dcdc1503e7", + "shasum": "" + }, + "require": { + "doctrine/data-fixtures": "^1.3", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.6.0", + "doctrine/persistence": "^1.3.7|^2.0", + "php": "^7.1 || ^8.0", + "symfony/config": "^3.4|^4.3|^5.0|^6.0", + "symfony/console": "^3.4|^4.3|^5.0|^6.0", + "symfony/dependency-injection": "^3.4.47|^4.3|^5.0|^6.0", + "symfony/doctrine-bridge": "^3.4|^4.1|^5.0|^6.0", + "symfony/http-kernel": "^3.4|^4.3|^5.0|^6.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "phpstan/phpstan": "^0.12.99", + "phpunit/phpunit": "^7.4 || ^8.0 || ^9.2", + "symfony/phpunit-bridge": "^4.1|^5.0|^6.0", + "vimeo/psalm": "^4.10" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\FixturesBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineFixturesBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "Fixture", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.4.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-fixtures-bundle", + "type": "tidelift" + } + ], + "time": "2021-10-28T05:46:28+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.13.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "210577fe3cf7badcc5814d99455df46564f3c077" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", + "reference": "210577fe3cf7badcc5814d99455df46564f3c077", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" + }, + "time": "2021-11-30T19:35:32+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "ed7ebe262cef150742f5b61d48a94d37513c5758" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/ed7ebe262cef150742f5b61d48a94d37513c5758", + "reference": "ed7ebe262cef150742f5b61d48a94d37513c5758", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/css-selector": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "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": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/browser-kit/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/debug-bundle", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug-bundle.git", + "reference": "2cb76e25ca75afb0d52c1ba83d77cd4190ed5552" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/2cb76e25ca75afb0d52c1ba83d77cd4190ed5552", + "reference": "2cb76e25ca75afb0d52c1ba83d77cd4190ed5552", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.16", + "symfony/twig-bridge": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.2" + }, + "require-dev": { + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/web-profiler-bundle": "^4.4|^5.0" + }, + "suggest": { + "symfony/config": "For service container configuration", + "symfony/dependency-injection": "For using as a service from the container" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\DebugBundle\\": "" + }, + "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": "Provides a tight integration of the Symfony Debug component into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug-bundle/tree/v5.2.12" + }, + "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-07-21T12:38:00+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v5.2.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "c983279c00f723eef8da2a4b1522296c82dc75da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/c983279c00f723eef8da2a4b1522296c82dc75da", + "reference": "c983279c00f723eef8da2a4b1522296c82dc75da", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "masterminds/html5": "<2.6" + }, + "require-dev": { + "masterminds/html5": "^2.6", + "symfony/css-selector": "^4.4|^5.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "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": "Eases DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v5.2.12" + }, + "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-07-23T15:54:19+00:00" + }, + { + "name": "symfony/maker-bundle", + "version": "v1.36.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/maker-bundle.git", + "reference": "716eee9c8b10b33e682df1b7d80b9061887e9691" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/716eee9c8b10b33e682df1b7d80b9061887e9691", + "reference": "716eee9c8b10b33e682df1b7d80b9061887e9691", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.2|^2.0", + "nikic/php-parser": "^4.11", + "php": ">=7.1.3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/deprecation-contracts": "^2.2|^3", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0" + }, + "require-dev": { + "composer/semver": "^3.0", + "doctrine/doctrine-bundle": "^1.12.3|^2.0", + "doctrine/orm": "^2.3", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/phpunit-bridge": "^4.4|^5.0|^6.0", + "symfony/polyfill-php80": "^1.16.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/security-core": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^2.0|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MakerBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", + "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", + "keywords": [ + "code generator", + "generator", + "scaffold", + "scaffolding" + ], + "support": { + "issues": "https://github.com/symfony/maker-bundle/issues", + "source": "https://github.com/symfony/maker-bundle/tree/v1.36.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-12-01T00:27:38+00:00" + }, + { + "name": "symfony/phpunit-bridge", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "216b07b05644607c81afd89a208e52641c1ce6b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/216b07b05644607c81afd89a208e52641c1ce6b8", + "reference": "216b07b05644607c81afd89a208e52641c1ce6b8", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", + "extra": { + "thanks": { + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "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 utilities for PHPUnit, especially user deprecation notices management", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.4.3" + }, + "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": "2022-01-26T16:28:35+00:00" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v5.2.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "380038080e46eb92b3a392de646fd32b632f1c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/380038080e46eb92b3a392de646fd32b632f1c77", + "reference": "380038080e46eb92b3a392de646fd32b632f1c77", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/framework-bundle": "^5.1", + "symfony/http-kernel": "^5.2", + "symfony/polyfill-php80": "^1.16", + "symfony/routing": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "symfony/dependency-injection": "<5.2", + "symfony/form": "<4.4", + "symfony/messenger": "<4.4" + }, + "require-dev": { + "symfony/browser-kit": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "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": "Provides a development tool that gives detailed information about the execution of any request", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.2.13" + }, + "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-07-27T04:28:16+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=7.2.5", + "ext-ctype": "*", + "ext-iconv": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/httpdocs/config/bundles.php b/httpdocs/config/bundles.php new file mode 100644 index 0000000..e6881e3 --- /dev/null +++ b/httpdocs/config/bundles.php @@ -0,0 +1,17 @@ + ['all' => true], + Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], + Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], + Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], + Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], + Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], + Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true], +]; diff --git a/httpdocs/config/packages/cache.yaml b/httpdocs/config/packages/cache.yaml new file mode 100644 index 0000000..6899b72 --- /dev/null +++ b/httpdocs/config/packages/cache.yaml @@ -0,0 +1,19 @@ +framework: + cache: + # Unique name of your app: used to compute stable namespaces for cache keys. + #prefix_seed: your_vendor_name/app_name + + # The "app" cache stores to the filesystem by default. + # The data in this cache should persist between deploys. + # Other options include: + + # Redis + #app: cache.adapter.redis + #default_redis_provider: redis://localhost + + # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) + #app: cache.adapter.apcu + + # Namespaced pools use the above "app" backend by default + #pools: + #my.dedicated.cache: null diff --git a/httpdocs/config/packages/dev/debug.yaml b/httpdocs/config/packages/dev/debug.yaml new file mode 100644 index 0000000..26d4e53 --- /dev/null +++ b/httpdocs/config/packages/dev/debug.yaml @@ -0,0 +1,4 @@ +debug: + # Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser. + # See the "server:dump" command to start a new server. + dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%" diff --git a/httpdocs/config/packages/dev/monolog.yaml b/httpdocs/config/packages/dev/monolog.yaml new file mode 100644 index 0000000..32039e9 --- /dev/null +++ b/httpdocs/config/packages/dev/monolog.yaml @@ -0,0 +1,19 @@ +monolog: + handlers: + main: + type: stream + path: php://stderr + 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/httpdocs/config/packages/dev/swiftmailer.yaml b/httpdocs/config/packages/dev/swiftmailer.yaml new file mode 100644 index 0000000..b98158e --- /dev/null +++ b/httpdocs/config/packages/dev/swiftmailer.yaml @@ -0,0 +1,4 @@ +# See https://symfony.com/doc/current/email/dev_environment.html +swiftmailer: + # send all emails to a specific address + #delivery_addresses: ['me@example.com'] diff --git a/httpdocs/config/packages/dev/web_profiler.yaml b/httpdocs/config/packages/dev/web_profiler.yaml new file mode 100644 index 0000000..e92166a --- /dev/null +++ b/httpdocs/config/packages/dev/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: true + intercept_redirects: false + +framework: + profiler: { only_exceptions: false } diff --git a/httpdocs/config/packages/doctrine.yaml b/httpdocs/config/packages/doctrine.yaml new file mode 100644 index 0000000..fe0efb5 --- /dev/null +++ b/httpdocs/config/packages/doctrine.yaml @@ -0,0 +1,21 @@ +doctrine: + dbal: + override_url: true + url: '%env(resolve:DATABASE_URL)%' + + # IMPORTANT: You MUST configure your server version, + # either here or in the DATABASE_URL env var (see .env file) + #server_version: '13' + mapping_types: + enum: string + orm: + auto_generate_proxy_classes: true + naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware + auto_mapping: true + mappings: + App: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/src/Entity' + prefix: 'App\Entity' + alias: App diff --git a/httpdocs/config/packages/doctrine_migrations.yaml b/httpdocs/config/packages/doctrine_migrations.yaml new file mode 100644 index 0000000..a0a17a0 --- /dev/null +++ b/httpdocs/config/packages/doctrine_migrations.yaml @@ -0,0 +1,6 @@ +doctrine_migrations: + migrations_paths: + # namespace is arbitrary but should be different from App\Migrations + # as migrations classes should NOT be autoloaded + 'DoctrineMigrations': '%kernel.project_dir%/migrations' + enable_profiler: '%kernel.debug%' diff --git a/httpdocs/config/packages/framework.yaml b/httpdocs/config/packages/framework.yaml new file mode 100644 index 0000000..cad7f78 --- /dev/null +++ b/httpdocs/config/packages/framework.yaml @@ -0,0 +1,17 @@ +# see https://symfony.com/doc/current/reference/configuration/framework.html +framework: + secret: '%env(APP_SECRET)%' + #csrf_protection: true + #http_method_override: true + + # Enables session support. Note that the session will ONLY be started if you read or write from it. + # Remove or comment this section to explicitly disable session support. + session: + handler_id: null + cookie_secure: auto + cookie_samesite: lax + + #esi: true + #fragments: true + php_errors: + log: true diff --git a/httpdocs/config/packages/mailer.yaml b/httpdocs/config/packages/mailer.yaml new file mode 100644 index 0000000..56a650d --- /dev/null +++ b/httpdocs/config/packages/mailer.yaml @@ -0,0 +1,3 @@ +framework: + mailer: + dsn: '%env(MAILER_DSN)%' diff --git a/httpdocs/config/packages/notifier.yaml b/httpdocs/config/packages/notifier.yaml new file mode 100644 index 0000000..3984a48 --- /dev/null +++ b/httpdocs/config/packages/notifier.yaml @@ -0,0 +1,16 @@ +framework: + notifier: + #chatter_transports: + # slack: '%env(SLACK_DSN)%' + # telegram: '%env(TELEGRAM_DSN)%' + #texter_transports: + # twilio: '%env(TWILIO_DSN)%' + # nexmo: '%env(NEXMO_DSN)%' + channel_policy: + # use chat/slack, chat/telegram, sms/twilio or sms/nexmo + urgent: ['email'] + high: ['email'] + medium: ['email'] + low: ['email'] + admin_recipients: + - { email: admin@example.com } diff --git a/httpdocs/config/packages/prod/deprecations.yaml b/httpdocs/config/packages/prod/deprecations.yaml new file mode 100644 index 0000000..60026a1 --- /dev/null +++ b/httpdocs/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/httpdocs/config/packages/prod/doctrine.yaml b/httpdocs/config/packages/prod/doctrine.yaml new file mode 100644 index 0000000..084f59a --- /dev/null +++ b/httpdocs/config/packages/prod/doctrine.yaml @@ -0,0 +1,20 @@ +doctrine: + orm: + auto_generate_proxy_classes: false + metadata_cache_driver: + type: pool + pool: doctrine.system_cache_pool + query_cache_driver: + type: pool + pool: doctrine.system_cache_pool + result_cache_driver: + type: pool + pool: doctrine.result_cache_pool + +framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/httpdocs/config/packages/prod/monolog.yaml b/httpdocs/config/packages/prod/monolog.yaml new file mode 100644 index 0000000..4112963 --- /dev/null +++ b/httpdocs/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: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + formatter: monolog.formatter.json + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine"] diff --git a/httpdocs/config/packages/prod/routing.yaml b/httpdocs/config/packages/prod/routing.yaml new file mode 100644 index 0000000..b3e6a0a --- /dev/null +++ b/httpdocs/config/packages/prod/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: null diff --git a/httpdocs/config/packages/routing.yaml b/httpdocs/config/packages/routing.yaml new file mode 100644 index 0000000..b45c1ce --- /dev/null +++ b/httpdocs/config/packages/routing.yaml @@ -0,0 +1,7 @@ +framework: + router: + utf8: true + + # Configure how to generate URLs in non-HTTP contexts, such as CLI commands. + # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands + #default_uri: http://localhost diff --git a/httpdocs/config/packages/security.yaml b/httpdocs/config/packages/security.yaml new file mode 100644 index 0000000..c11b2d0 --- /dev/null +++ b/httpdocs/config/packages/security.yaml @@ -0,0 +1,34 @@ +security: + # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers + providers: + users_in_memory: { memory: null } + my_entity_users: + entity: + class: App\Entity\User + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + main: + anonymous: true + lazy: true + provider: users_in_memory + guard: + authenticators: + - App\Security\LoginFormAuthenticator + logout: + path: app_logout + # where to redirect after logout + # target: app_any_route + + # activate different ways to authenticate + # https://symfony.com/doc/current/security.html#firewalls-authentication + + # https://symfony.com/doc/current/security/impersonating_user.html + # switch_user: true + + # Easy way to control access for large sections of your site + # Note: Only the *first* access control that matches will be used + access_control: + # - { path: ^/admin, roles: ROLE_ADMIN } + # - { path: ^/profile, roles: ROLE_USER } diff --git a/httpdocs/config/packages/sensio_framework_extra.yaml b/httpdocs/config/packages/sensio_framework_extra.yaml new file mode 100644 index 0000000..1821ccc --- /dev/null +++ b/httpdocs/config/packages/sensio_framework_extra.yaml @@ -0,0 +1,3 @@ +sensio_framework_extra: + router: + annotations: false diff --git a/httpdocs/config/packages/swiftmailer.yaml b/httpdocs/config/packages/swiftmailer.yaml new file mode 100644 index 0000000..18978c1 --- /dev/null +++ b/httpdocs/config/packages/swiftmailer.yaml @@ -0,0 +1,19 @@ +swiftmailer: + #url: '%env(MAILER_URL)%' + transport: smtp + username: mybimscore + #password: hmp2RXucprekA7LSVeTsKZ7b# + password: "hmp2RXucprekA7LSVeTsKZ7b%23" + host: realfm.de + #host: mail.realfm.de + #port: 465 + port: 587 + #encryption: ssl + encryption: tls + auth-mode: login + spool: { type: 'memory' } + stream_options: + ssl: + allow_self_signed: true + verify_peer: false + verify_peer_name: false \ No newline at end of file diff --git a/httpdocs/config/packages/test/doctrine.yaml b/httpdocs/config/packages/test/doctrine.yaml new file mode 100644 index 0000000..a19e8d9 --- /dev/null +++ b/httpdocs/config/packages/test/doctrine.yaml @@ -0,0 +1,7 @@ +#doctrine: +# dbal: +# # Overrides the database name in the test environment only +# # "host", "port", "username", & "password" can also be set to override their respective url parts +# # +# # If you're using ParaTest, "TEST_TOKEN" is set by ParaTest otherwise nothing is appended to the database name. +# dbname: main_test%env(default::TEST_TOKEN)% diff --git a/httpdocs/config/packages/test/framework.yaml b/httpdocs/config/packages/test/framework.yaml new file mode 100644 index 0000000..d051c84 --- /dev/null +++ b/httpdocs/config/packages/test/framework.yaml @@ -0,0 +1,4 @@ +framework: + test: true + session: + storage_id: session.storage.mock_file diff --git a/httpdocs/config/packages/test/monolog.yaml b/httpdocs/config/packages/test/monolog.yaml new file mode 100644 index 0000000..fc40641 --- /dev/null +++ b/httpdocs/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/httpdocs/config/packages/test/swiftmailer.yaml b/httpdocs/config/packages/test/swiftmailer.yaml new file mode 100644 index 0000000..f438078 --- /dev/null +++ b/httpdocs/config/packages/test/swiftmailer.yaml @@ -0,0 +1,2 @@ +swiftmailer: + disable_delivery: true diff --git a/httpdocs/config/packages/test/twig.yaml b/httpdocs/config/packages/test/twig.yaml new file mode 100644 index 0000000..8c6e0b4 --- /dev/null +++ b/httpdocs/config/packages/test/twig.yaml @@ -0,0 +1,2 @@ +twig: + strict_variables: true diff --git a/httpdocs/config/packages/test/validator.yaml b/httpdocs/config/packages/test/validator.yaml new file mode 100644 index 0000000..1e5ab78 --- /dev/null +++ b/httpdocs/config/packages/test/validator.yaml @@ -0,0 +1,3 @@ +framework: + validation: + not_compromised_password: false diff --git a/httpdocs/config/packages/test/web_profiler.yaml b/httpdocs/config/packages/test/web_profiler.yaml new file mode 100644 index 0000000..03752de --- /dev/null +++ b/httpdocs/config/packages/test/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: false + intercept_redirects: false + +framework: + profiler: { collect: false } diff --git a/httpdocs/config/packages/translation.yaml b/httpdocs/config/packages/translation.yaml new file mode 100644 index 0000000..d966013 --- /dev/null +++ b/httpdocs/config/packages/translation.yaml @@ -0,0 +1,6 @@ +framework: + default_locale: de + translator: + default_path: '%kernel.project_dir%/translations' + fallbacks: + - en diff --git a/httpdocs/config/packages/twig.yaml b/httpdocs/config/packages/twig.yaml new file mode 100644 index 0000000..b3cdf30 --- /dev/null +++ b/httpdocs/config/packages/twig.yaml @@ -0,0 +1,2 @@ +twig: + default_path: '%kernel.project_dir%/templates' diff --git a/httpdocs/config/packages/validator.yaml b/httpdocs/config/packages/validator.yaml new file mode 100644 index 0000000..350786a --- /dev/null +++ b/httpdocs/config/packages/validator.yaml @@ -0,0 +1,8 @@ +framework: + validation: + email_validation_mode: html5 + + # Enables validator auto-mapping support. + # For instance, basic validation constraints will be inferred from Doctrine's metadata. + #auto_mapping: + # App\Entity\: [] diff --git a/httpdocs/config/preload.php b/httpdocs/config/preload.php new file mode 100644 index 0000000..5ebcdb2 --- /dev/null +++ b/httpdocs/config/preload.php @@ -0,0 +1,5 @@ + + + + + + + + + + + + + + + tests + + + + + + src + + + + + + + + + + diff --git a/httpdocs/public/assets/fonts/roboto-v27-latin-700.eot b/httpdocs/public/assets/fonts/roboto-v27-latin-700.eot new file mode 100644 index 0000000..3e2d316 Binary files /dev/null and b/httpdocs/public/assets/fonts/roboto-v27-latin-700.eot differ diff --git a/httpdocs/public/assets/fonts/roboto-v27-latin-700.svg b/httpdocs/public/assets/fonts/roboto-v27-latin-700.svg new file mode 100644 index 0000000..11db87d --- /dev/null +++ b/httpdocs/public/assets/fonts/roboto-v27-latin-700.svg @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/httpdocs/public/assets/fonts/roboto-v27-latin-700.ttf b/httpdocs/public/assets/fonts/roboto-v27-latin-700.ttf new file mode 100644 index 0000000..489236c Binary files /dev/null and b/httpdocs/public/assets/fonts/roboto-v27-latin-700.ttf differ diff --git a/httpdocs/public/assets/fonts/roboto-v27-latin-700.woff b/httpdocs/public/assets/fonts/roboto-v27-latin-700.woff new file mode 100644 index 0000000..a5d98fc Binary files /dev/null and b/httpdocs/public/assets/fonts/roboto-v27-latin-700.woff differ diff --git a/httpdocs/public/assets/fonts/roboto-v27-latin-700.woff2 b/httpdocs/public/assets/fonts/roboto-v27-latin-700.woff2 new file mode 100644 index 0000000..01d05fa Binary files /dev/null and b/httpdocs/public/assets/fonts/roboto-v27-latin-700.woff2 differ diff --git a/httpdocs/public/assets/fonts/roboto-v27-latin-regular.eot b/httpdocs/public/assets/fonts/roboto-v27-latin-regular.eot new file mode 100644 index 0000000..6dd5e3a Binary files /dev/null and b/httpdocs/public/assets/fonts/roboto-v27-latin-regular.eot differ diff --git a/httpdocs/public/assets/fonts/roboto-v27-latin-regular.svg b/httpdocs/public/assets/fonts/roboto-v27-latin-regular.svg new file mode 100644 index 0000000..627f5a3 --- /dev/null +++ b/httpdocs/public/assets/fonts/roboto-v27-latin-regular.svg @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/httpdocs/public/assets/fonts/roboto-v27-latin-regular.ttf b/httpdocs/public/assets/fonts/roboto-v27-latin-regular.ttf new file mode 100644 index 0000000..637971a Binary files /dev/null and b/httpdocs/public/assets/fonts/roboto-v27-latin-regular.ttf differ diff --git a/httpdocs/public/assets/fonts/roboto-v27-latin-regular.woff b/httpdocs/public/assets/fonts/roboto-v27-latin-regular.woff new file mode 100644 index 0000000..86b3863 Binary files /dev/null and b/httpdocs/public/assets/fonts/roboto-v27-latin-regular.woff differ diff --git a/httpdocs/public/assets/fonts/roboto-v27-latin-regular.woff2 b/httpdocs/public/assets/fonts/roboto-v27-latin-regular.woff2 new file mode 100644 index 0000000..ebe1795 Binary files /dev/null and b/httpdocs/public/assets/fonts/roboto-v27-latin-regular.woff2 differ diff --git a/httpdocs/public/assets/images/elements/512px-Cross_red_circle.svg.png b/httpdocs/public/assets/images/elements/512px-Cross_red_circle.svg.png new file mode 100644 index 0000000..9d710a4 Binary files /dev/null and b/httpdocs/public/assets/images/elements/512px-Cross_red_circle.svg.png differ diff --git a/httpdocs/public/assets/images/elements/512px-Eo_circle_green_white_checkmark.svg.png b/httpdocs/public/assets/images/elements/512px-Eo_circle_green_white_checkmark.svg.png new file mode 100644 index 0000000..b8e14c8 Binary files /dev/null and b/httpdocs/public/assets/images/elements/512px-Eo_circle_green_white_checkmark.svg.png differ diff --git a/httpdocs/public/assets/images/elements/BIM2FM-Leitfaden-zur-Anwendung-der-BIM-Methodik-2021.jpg b/httpdocs/public/assets/images/elements/BIM2FM-Leitfaden-zur-Anwendung-der-BIM-Methodik-2021.jpg new file mode 100644 index 0000000..57577ad Binary files /dev/null and b/httpdocs/public/assets/images/elements/BIM2FM-Leitfaden-zur-Anwendung-der-BIM-Methodik-2021.jpg differ diff --git a/httpdocs/public/assets/images/elements/pdf.svg b/httpdocs/public/assets/images/elements/pdf.svg new file mode 100644 index 0000000..4dae3fc --- /dev/null +++ b/httpdocs/public/assets/images/elements/pdf.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/httpdocs/public/assets/images/elements/real_fm.png b/httpdocs/public/assets/images/elements/real_fm.png new file mode 100644 index 0000000..577bce1 Binary files /dev/null and b/httpdocs/public/assets/images/elements/real_fm.png differ diff --git a/httpdocs/public/assets/images/elements/yellow_circle.png b/httpdocs/public/assets/images/elements/yellow_circle.png new file mode 100644 index 0000000..d14cba7 Binary files /dev/null and b/httpdocs/public/assets/images/elements/yellow_circle.png differ diff --git a/httpdocs/public/assets/images/logos/logo-canzler.png b/httpdocs/public/assets/images/logos/logo-canzler.png new file mode 100644 index 0000000..738b515 Binary files /dev/null and b/httpdocs/public/assets/images/logos/logo-canzler.png differ diff --git a/httpdocs/public/assets/images/logos/logo-drodin.png b/httpdocs/public/assets/images/logos/logo-drodin.png new file mode 100644 index 0000000..3e2d0c1 Binary files /dev/null and b/httpdocs/public/assets/images/logos/logo-drodin.png differ diff --git a/httpdocs/public/assets/images/logos/logo-tuev.png b/httpdocs/public/assets/images/logos/logo-tuev.png new file mode 100644 index 0000000..6d871c0 Binary files /dev/null and b/httpdocs/public/assets/images/logos/logo-tuev.png differ diff --git a/httpdocs/public/assets/images/logos/real-fm.png b/httpdocs/public/assets/images/logos/real-fm.png new file mode 100644 index 0000000..af7d51f Binary files /dev/null and b/httpdocs/public/assets/images/logos/real-fm.png differ diff --git a/httpdocs/public/assets/js/jquery-3.6.0.min.js b/httpdocs/public/assets/js/jquery-3.6.0.min.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/httpdocs/public/assets/js/jquery-3.6.0.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0" + message + "

"); + msg.slideDown(300, function() { + window.setTimeout(function() { + msg.slideUp(300); + }, 1400); + }) +} + +// Add new user +function addUser() { + // Add new user + $(".add-user [data-js='listing--details']").on("click", function(e) { + let form = $(this).parents(".form"), + form_data = form.serializeObject(); + if (form[0].checkValidity()) { + e.preventDefault(); + form_data["active"] = $("#inputActive").is(":checked") ? 1 : 0; + $.ajax({ + url: "/admin/user", + method: "post", + data: form_data, + success: function (data) { + messageBox(true, "User erfolgreich angelegt. Sie werden nun zur Übersicht weitergeleitet."); + window.setTimeout(function() { + window.location.href = "/admin/dashboard"; + }, 2000); + }, + error: function (xhr, status, statusmsg) { + console.log(xhr); + messageBox(false, xhr.responseJSON); + }, + dataType: "json" + }); + } + }); +} + +// List users and edit them +function listing() { + // Open user details + $("[data-js='listing--opener']").on("click", function() { + let that = $(this).parents("li"); + if (that.hasClass("open")) { + that.find(".listing--details").slideUp(500); + that.removeClass("open"); + } else { + $("[data-js='listing--opener']").parents("li").removeClass("open"); + $(".listing--details").slideUp(500); + that.find(".listing--details").slideDown(500); + that.addClass("open"); + } + }); + + // Send AJAX request for user edit + $(".listing [data-js='listing--details']").on("click", function(e) { + let form = $(this).parents(".form"), + form_data = form.serializeObject(), + userId = form_data["id"]; + if (form[0].checkValidity()) { + e.preventDefault(); + form_data["active"] = $("#inputActive" + userId).is(":checked") ? 1 : 0; + $.ajax({ + url: "/admin/user", + method: "patch", + data: form_data, + success: function (data) { + messageBox(true, "User erfolgreich aktualisiert."); + }, + error: function (xhr, status, statusmsg) { + console.log(xhr); + messageBox(false, xhr.responseJSON); + }, + dataType: "json" + }); + } + }); + + // Send new password to user + $("[data-js='listing--password']").on("click", function(e) { + let userId = $(this).parents("li").data("userid"), + userName = $(this).parents("li").data("username"), + confirmAction = confirm("Möchten Sie dem User " + userName + " ein neues Passwort zuweisen?"); + if (confirmAction === true) { + $.ajax({ + url: "/admin/new-password", + method: "post", + data: { + id: userId + }, + success: function (data) { + messageBox(true, "Passwort erfolgreich geändert. E-Mail ist an User " + userName + " versendet worden."); + }, + error: function (xhr, msg, three) { + messageBox(false, "Fehler beim Erstellen eines neuen Passworts."); + }, + dataType: "json" + }); + } + }); +} + +let savedCatalogueAnswer, + savedCatalogueNote; +$(document).ready(function() { + savedCatalogueAnswer = $(".form--catalogue input[name='answer']:checked").val(); + savedCatalogueNote = $("#inputNote").val(); +}); +function catalogueAjaxForm(form_data, isOpenQuestion) { + let ajaxRoute = isOpenQuestion ? "/catalogue-detail-unanswered" : "/catalogue-detail"; + $.ajax({ + url: ajaxRoute, + method: "get", + data: form_data, + success: function (data) { + $("#instruction").hide(); + catalogueAnswer = data.catalogueDetail['answer']; + catalogueNote = data.catalogueDetail['note']; + $("[data-js='progressbar'] div").css("width", "calc(" + data.catalogue['numAnswers'] / data.catalogue['numDetails'] * 100% + ")"); + $("[data-js='order-no']").text(data.catalogueDetail['orderNo']); + $("[data-js='question-type'] span").text(data.question['questionType']); + $("[data-js='question-text']").text(data.question['questionText']); + $("input[name='answer']").prop('checked', false); + if (catalogueAnswer != null) { + $("input[value='" + catalogueAnswer + "']").prop('checked', true); + savedCatalogueAnswer = catalogueAnswer; + } else { + savedCatalogueAnswer = (function () { return; })(); + } + $("#inputNote").val(""); + if (catalogueNote !== null) { + $("#inputNote").val(catalogueNote); + savedCatalogueNote = catalogueNote; + } else { + savedCatalogueNote = ""; + } + }, + error: function (xhr, msg, three) { + messageBox(false, "Fehler bei der Anfrage."); + }, + dataType: "json" + }); +} +function catalogue() { + $("[data-js='last-question'], [data-js='next-question']").on("click", function(e){ + let form = $(this).parents(".form"), + form_data = form.serializeObject(), + isOpenQuestion = $(this).data("openquestion") === "yes"; + form_data["direction"] = $(this).data("js") === "last-question" ? 'prev' : 'next'; + if (savedCatalogueAnswer === form_data["answer"] && savedCatalogueNote === form_data["note"]) { + catalogueAjaxForm(form_data, isOpenQuestion); + } else { + confirmAction = confirm("Sie haben ungespeicherte Eingaben. Möchten Sie fortfahren?"); + if (confirmAction === true) { + catalogueAjaxForm(form_data, isOpenQuestion); + } + } + }); + $("[data-js='save-question']").on("click", function(e){ + let form = $(this).parents(".form"), + form_data = form.serializeObject(); + if ($("input[name='answer']:checked").val()) { + $.ajax({ + url: "/catalogue-detail", + method: "patch", + data: form_data, + success: function (data) { + messageBox(true, "Ihre Antwort wurde gespeichert."); + $("[data-js='progressbar'] div").css("width", "calc(" + data.catalogue['numAnswers'] / data.catalogue['numDetails'] * 100 + "%)"); + savedCatalogueAnswer = form_data["answer"]; + savedCatalogueNote = form_data["note"]; + if (data.catalogue['numAnswers'] === data.catalogue['numDetails']) { + $("[data-js='finish-catalogue']").prop("disabled", false); + } + }, + error: function (xhr, msg, three) { + messageBox(false, "Fehler bei der Anfrage."); + }, + dataType: "json" + }); + } else { + messageBox(false, "Bitte wählen Sie eine Antwort."); + } + }); + + $("[data-js='finish-catalogue']").on("click", function(e){ + e.preventDefault(); + let form = $(this).parents(".form"), + form_data = form.serializeObject(); + if (confirm("Möchten Sie den Fragenkatalog abschließen? Änderungen sind danach nicht mehr möglich!") === true) { + $.ajax({ + url: "/catalogue-finish", + method: "patch", + data: form_data, + success: function (data) { + window.location.href = "/catalogue-finished"; + }, + error: function (xhr, msg, three) { + messageBox(false, "Fehler bei der Anfrage."); + }, + dataType: "json" + }); + } + }); + +} diff --git a/httpdocs/public/assets/scss/_mixins.scss b/httpdocs/public/assets/scss/_mixins.scss new file mode 100644 index 0000000..9352c5b --- /dev/null +++ b/httpdocs/public/assets/scss/_mixins.scss @@ -0,0 +1,3 @@ +@mixin transition { + transition: all 0.3s ease-out; +} diff --git a/httpdocs/public/assets/scss/_variables.scss b/httpdocs/public/assets/scss/_variables.scss new file mode 100644 index 0000000..42ee6ed --- /dev/null +++ b/httpdocs/public/assets/scss/_variables.scss @@ -0,0 +1,15 @@ +$color-white: #ffffff; +$color-black: #191919; +$color-light-grey: #cccccc; +$color-light-grey-2: #bbbbbb; +$color-bim-100: #e2003c; +$color-bim-90: #e51a50; +$color-bim-80: #e83363; +$color-bim-70: #eb4d77; +$color-bim-60: #ee668a; +$color-bim-50: #f1809e; +$color-bim-40: #f399b1; +$color-bim-30: #f6b3c5; +$color-bim-20: #f9ccd8; +$color-bim-10: #fce6ec; +$color-bim-green: #008000; diff --git a/httpdocs/public/assets/scss/components/_basic.scss b/httpdocs/public/assets/scss/components/_basic.scss new file mode 100644 index 0000000..b24e748 --- /dev/null +++ b/httpdocs/public/assets/scss/components/_basic.scss @@ -0,0 +1,399 @@ +body { + padding-top: 6.5rem; + @media (max-width: 500px) { + padding-top: 11rem; + } + @media (max-width: 412px) { + padding-top: 12rem; + } +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: $color-light-grey-2; + opacity: 1; +} + +input::-moz-placeholder, +textarea::-moz-placeholder { + color: $color-light-grey-2; + opacity: 1; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: $color-light-grey-2; + opacity: 1; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: $color-light-grey-2; + opacity: 1; +} + +#main { + .inside { + margin: 0 auto; + width: 80vw; + max-width: 1280px; + padding: 3rem 0; + min-height: 600px; + } + h1 { + font-size: 2rem; + line-height: 2.5rem; + padding: 0 0 2rem 0; + @media (max-width: 767px) { + font-size: 1.25rem; + line-height: 1.5rem; + } + } + h2, h3 { + font-size: 1.5rem; + line-height: 2rem; + padding: 0 0 1.5rem 0; + @media (max-width: 767px) { + font-size: 1rem; + line-height: 1.25rem; + } + } + h3 { + font-weight: bold; + text-transform: uppercase; + } + h4, h5, h6 { + font-size: 1rem; + line-height: 1.25rem; + padding: 0 0 0.5rem 0; + @media (max-width: 767px) { + font-size: 0.875rem; + line-height: 1rem; + } + } + p, ul, ol, table { + margin: 0 0 1.5rem 0; + } + p { + &.img { + img { + float: left; + margin: 0 20px 20px 0; + width: 200px; + height: auto; + } + } + } + .mini-nav { + padding: 0 0 1.5rem 0; + a { + color: $color-bim-100; + &:before { + content: "<< "; + } + &:hover { + text-decoration: none; + } + } + } + .container { + padding: 0 0 1.5rem 0; + } + .logo-bar { + li { + overflow: hidden; + padding: 0 0 10px 0; + display: flex; + align-items: center; + img { + //width: 120px; + float: left; + margin-right: 40px; + height: 100px; + @media (max-width: 767px) { + float: none; + margin-bottom: 20px; + } + } + p { + //margin-left: 150px; + @media (max-width: 767px) { + margin-left: 0; + } + } + } + } +} + +.btn { + border: 1px solid $color-bim-100; + background: $color-bim-100; + color: $color-white; + padding: 0.5rem 1rem; + font-size: 0.75rem; + line-height: 1rem; + text-transform: uppercase; + cursor: pointer; + text-decoration: none; + display: inline-block; + @include transition; + &:hover { + background: $color-bim-80; + border-color: $color-bim-80; + color: $color-white; + } + &[disabled] { + opacity: 0.5; + background: $color-black; + border-color: $color-black; + cursor: default; + } + &--inverse { + background: $color-white; + color: $color-bim-100; + } + &--correct { + border-color: $color-bim-green; + background: $color-bim-green; + color: $color-white; + &:hover { + background: $color-white; + border-color: $color-bim-green; + color: $color-bim-green; + } + } +} + +.form { + &--row { + display: flex; + justify-content: flex-start; + flex-wrap: wrap; + #header & { + @media (max-width: 500px) { + padding-top: 20px; + } + } + &.form--row-right { + justify-content: flex-end; + margin-right: 5%; + } + } + &--wrapper { + width: 270px; + padding: 0 0 1.5rem 0; + display: flex; + flex-wrap: wrap; + align-items: flex-end; + #header & { + padding-bottom: 0; + width: 200px; + &.fw--no-width { + width: auto; + @media (max-width: 412px) { + margin-top: 10px; + } + } + @media (max-width: 768px) { + width: 120px; + } + @media (max-width: 412px) { + width: 110px; + } + } + &.mandatory { + label { + font-weight: 700; + } + } + label { + display: block; + padding: 0 0 0.25rem 0; + font-size: 0.875rem; + line-height: 1.5rem; + width: 100%; + } + input { + display: block; + font-size: 1rem; + line-height: 1.5rem; + width: 90%; + &[type='checkbox'] { + width: auto; + } + } + textarea { + display: block; + font-size: 1rem; + line-height: 1.5rem; + padding: 1rem; + width: 100%; + height: 10rem; + @media (max-width: 1048px) { + width: 60%; + } + @media (max-width: 768px) { + width: 100%; + } + } + } + &--legal { + padding: 0 0 1.5rem 0; + .form--wrapper { + width: auto; + max-width: 80%; + @media (max-width: 1048px) { + max-width: none; + } + } + .form-wrapper--container { + display: flex; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: start; + @media (max-width: 1048px) { + display: block; + } + } + .form--checkbox { + input { + float: left; + margin: 5px 8px 0 0; + } + } + } + &--catalogue { + border-top: 2px solid $color-black; + padding: 0 0 1.5rem 0; + .form-wrapper--container { + display: flex; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: start; + @media (max-width: 1048px) { + display: block; + } + } + h3 { + text-align: center; + width: 100%; + } + .question-count { + padding: 1.5rem 0; + position: relative; + p { + padding: 0; + } + .progressbar { + position: absolute; + left: 0; + bottom: 0; + height: 12px; + width: 100%; + background: #ddd; + div { + position: absolute; + left: 0; + bottom: 0; + height: 12px; + width: 0; + background: green; + } + } + } + .catalogue-nav { + display: flex; + justify-content: space-between; + padding: 0 0 1.5rem 0; + @media (max-width: 1024px) { + flex-wrap: wrap; + justify-content: center; + .save { + width: 100%; + text-align: center; + } + span:not(.btn) { + order: 3; + justify-content: center; + display: flex; + flex-wrap: wrap; + &:first-of-type { + order: 2; + } + } + .btn { + order: 1; + margin: 10px 10px 0 10px; + } + } + } + .form--wrapper { + width: auto; + justify-content: center; + .btn { + float: right; + } + &.left { + justify-content: flex-start; + } + } + h2 { + font-size: 2rem; + line-height: 3rem; + } + label { + font-size: 1.5rem; + line-height: 2rem; + @media (max-width: 767px) { + font-size: 1rem; + line-height: 1.25rem; + } + } + .form--checkbox { + label { + display: flex; + input { + display: inline; + width: auto; + margin: 9px 10px 0 0; + @-moz-document url-prefix() { + margin-top: 0; + } + } + } + } + } + &--question { + border-top: 2px solid $color-black; + padding-top: 1.5rem; + } + .alert { + font-size: 0.75rem; + line-height: 1rem; + } +} + +.alert { + color: $color-bim-100 !important; +} + +#message { + position: fixed; + left: 0; + top: 0; + right: 0; + width: 100%; + z-index: 3000; + display: none; + color: $color-white; + font-size: 1.5rem; + &.success { + background: green; + } + &.failure { + background: $color-bim-100; + } + p { + padding: 1.5rem; + } +} diff --git a/httpdocs/public/assets/scss/components/_footer.scss b/httpdocs/public/assets/scss/components/_footer.scss new file mode 100644 index 0000000..db81b7b --- /dev/null +++ b/httpdocs/public/assets/scss/components/_footer.scss @@ -0,0 +1,20 @@ +footer { + background: $color-black; + color: $color-white; + .inside { + padding: 1.5rem 3rem; + } + ul { + display: flex; + justify-content: flex-start; + } + li { + padding: 0 0 0 1.5rem; + &:first-child { + padding-left: 0; + } + a { + display: block; + } + } +} \ No newline at end of file diff --git a/httpdocs/public/assets/scss/components/_header.scss b/httpdocs/public/assets/scss/components/_header.scss new file mode 100644 index 0000000..a597e9c --- /dev/null +++ b/httpdocs/public/assets/scss/components/_header.scss @@ -0,0 +1,72 @@ +header { + box-shadow: 0 1px 10px -6px rgba(0,0,0,.42),0 1px 10px 0 rgba(0,0,0,.12),0 4px 5px -2px rgba(0,0,0,.1); + position: fixed; + left: 0; + top: 0; + width: 100%; + z-index: 2000; + background: $color-white; + .inside { + padding: 1.5rem 3rem 0 3rem; + height: 6.5rem; + display: flex; + justify-content: space-between; + @media (max-width: 412px) { + padding-left: 2rem; + padding-right: 2rem; + } + @media (max-width: 500px) { + height: 11rem; + display: block; + } + @media (max-width: 412px) { + height: 12rem; + } + .logo { + display: flex; + @media (min-width: 501px) and (max-width: 768px) { + display: block; + } + a.home { + font-weight: bold; + color: #3c4952; + margin-top: -5px; + padding: 0 0 0 30px; + text-decoration: none; + @media (min-width: 501px) and (max-width: 768px) { + display: block; + padding: 10px 0 0 12px; + } + &:before { + color: #3c4952 !important; + content: "|"; + padding: 0 20px 0 0; + @media (min-width: 501px) and (max-width: 768px) { + content: ""; + display: none; + } + } + &:hover { + color: #788187; + } + } + } + .status { + @media (max-width: 500px) { + padding-top: 20px; + } + } + } + img { + height: 3rem; + @media (max-width: 800px) { + height: 2rem; + } + } + form { + margin-top: -0.375rem; + } + .status { + + } +} diff --git a/httpdocs/public/assets/scss/components/_listing.scss b/httpdocs/public/assets/scss/components/_listing.scss new file mode 100644 index 0000000..5d22b0b --- /dev/null +++ b/httpdocs/public/assets/scss/components/_listing.scss @@ -0,0 +1,82 @@ +.new-user { + padding: 0 0 3rem 0; +} + +.listing { + ul { + + } + li { + background: $color-bim-10; + padding: 0.75rem 1.5rem; + margin-bottom: 2px; + &:nth-child(even) { + background: $color-bim-20; + } + &.inactive { + opacity: .3; + } + } + &--header { + padding: 0.5rem 0; + display: flex; + justify-content: space-between; + align-items: center; + @media (max-width: 1024px) { + display: block; + } + h3 { + padding: 0 !important; + } + .buttons { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + * { + margin-left: 1.5rem; + @media (max-width: 1024px) { + margin-top: 10px; + margin-left: 0; + margin-right: 1.5rem; + } + } + .pdfs { + display: flex; + @media (max-width: 1024px) { + order: 2; + } + a { + display: block; + width: 2rem; + height: 2rem; + background: transparent url("../images/elements/pdf.svg") no-repeat left top; + background-size: 100% auto; + position: relative; + &.latest { + &:after { + content: ""; + display: block; + position: absolute; + right: -0.25rem; + top: -0.25rem; + width: 1rem; + height: 1rem; + background: green; + border-radius: 50%; + } + } + } + } + } + } + &--details { + display: none; + li.open & { + + } + } + &--details-inside { + padding: 0.5rem 0; + } +} \ No newline at end of file diff --git a/httpdocs/public/assets/scss/components/_reset.scss b/httpdocs/public/assets/scss/components/_reset.scss new file mode 100644 index 0000000..28d1221 --- /dev/null +++ b/httpdocs/public/assets/scss/components/_reset.scss @@ -0,0 +1,205 @@ +/* roboto-regular - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url('../fonts/roboto-v27-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-v27-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v27-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v27-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v27-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v27-latin-regular.svg#Roboto') format('svg'); /* Legacy iOS */ +} + +/* roboto-700 - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url('../fonts/roboto-v27-latin-700.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-v27-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v27-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v27-latin-700.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v27-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v27-latin-700.svg#Roboto') format('svg'); /* Legacy iOS */ +} + + +* { + box-sizing: border-box; +} + +html { + font-size: 100%; + scroll-behavior: smooth; +} + +body { + width: 100%; + margin: 0; +} + +html, +body, +table, +td, +th, +textarea { + font-family: 'Roboto', Arial, Verdana, sans-serif; + font-weight: 400; + font-size: 16px; + line-height: 20px; + text-align: left; +} + +input:focus, +select:focus, +textarea:focus, +button:focus { + outline: none; +} + + +/* clears the 'X' from Internet Explorer */ + +input[type=search]::-ms-clear { + display: none; + width: 0; + height: 0; +} + +input[type=search]::-ms-reveal { + display: none; + width: 0; + height: 0; +} + +/* clears the 'X' from Chrome */ + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button, +input[type="search"]::-webkit-search-results-decoration { + display: none; +} + +fieldset { + border: none; +} + +section, +aside, +ul, +ol, +li, +p, +h1, +h2, +h3, +h4, +h5, +h6, +figure, +div, +dl, +dd, +dt, +table, +td, +th, +fieldset, +button, +label, +input, +textarea { + padding: 0; + margin: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 400; +} + +ol, +ul { + list-style: none; +} + +.table { + table, + td, + th, + thead th { + padding: 0; + border: none; + } +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: inherit; + opacity: 1; +} + +input::-moz-placeholder, +textarea::-moz-placeholder { + color: inherit; + opacity: 1; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: inherit; + opacity: 1; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: inherit; + opacity: 1; +} + +input { + background: $color-white; + border: 1px solid $color-light-grey; + padding: 0.5rem 0.5rem; + #header & { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + } +} + +img { + width: auto; + height: auto; +} + +a, +a:hover { + color: inherit; + outline: 0; +} + +a:not(footer a), +a:not(footer a):hover { + overflow-wrap: break-word; + word-wrap: break-word; + -ms-word-break: break-all; + word-break: break-all; + word-break: break-word; + -ms-hyphens: auto; + -moz-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +strong { + font-weight: 700; +} diff --git a/httpdocs/public/assets/scss/styles.css b/httpdocs/public/assets/scss/styles.css new file mode 100644 index 0000000..0cbd23e --- /dev/null +++ b/httpdocs/public/assets/scss/styles.css @@ -0,0 +1,616 @@ +/* roboto-regular - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url("../fonts/roboto-v27-latin-regular.eot"); + /* IE9 Compat Modes */ + src: local(""), url("../fonts/roboto-v27-latin-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/roboto-v27-latin-regular.woff2") format("woff2"), url("../fonts/roboto-v27-latin-regular.woff") format("woff"), url("../fonts/roboto-v27-latin-regular.ttf") format("truetype"), url("../fonts/roboto-v27-latin-regular.svg#Roboto") format("svg"); + /* Legacy iOS */ } +/* roboto-700 - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url("../fonts/roboto-v27-latin-700.eot"); + /* IE9 Compat Modes */ + src: local(""), url("../fonts/roboto-v27-latin-700.eot?#iefix") format("embedded-opentype"), url("../fonts/roboto-v27-latin-700.woff2") format("woff2"), url("../fonts/roboto-v27-latin-700.woff") format("woff"), url("../fonts/roboto-v27-latin-700.ttf") format("truetype"), url("../fonts/roboto-v27-latin-700.svg#Roboto") format("svg"); + /* Legacy iOS */ } +* { + box-sizing: border-box; } + +html { + font-size: 100%; + scroll-behavior: smooth; } + +body { + width: 100%; + margin: 0; } + +html, +body, +table, +td, +th, +textarea { + font-family: 'Roboto', Arial, Verdana, sans-serif; + font-weight: 400; + font-size: 16px; + line-height: 20px; + text-align: left; } + +input:focus, +select:focus, +textarea:focus, +button:focus { + outline: none; } + +/* clears the 'X' from Internet Explorer */ +input[type=search]::-ms-clear { + display: none; + width: 0; + height: 0; } + +input[type=search]::-ms-reveal { + display: none; + width: 0; + height: 0; } + +/* clears the 'X' from Chrome */ +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button, +input[type="search"]::-webkit-search-results-decoration { + display: none; } + +fieldset { + border: none; } + +section, +aside, +ul, +ol, +li, +p, +h1, +h2, +h3, +h4, +h5, +h6, +figure, +div, +dl, +dd, +dt, +table, +td, +th, +fieldset, +button, +label, +input, +textarea { + padding: 0; + margin: 0; } + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 400; } + +ol, +ul { + list-style: none; } + +.table table, +.table td, +.table th, +.table thead th { + padding: 0; + border: none; } + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: inherit; + opacity: 1; } + +input::-moz-placeholder, +textarea::-moz-placeholder { + color: inherit; + opacity: 1; } + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: inherit; + opacity: 1; } + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: inherit; + opacity: 1; } + +input { + background: #ffffff; + border: 1px solid #cccccc; + padding: 0.5rem 0.5rem; } + #header input { + padding-top: 0.25rem; + padding-bottom: 0.25rem; } + +img { + width: auto; + height: auto; } + +a, +a:hover { + color: inherit; + outline: 0; } + +a:not(footer a), +a:not(footer a):hover { + overflow-wrap: break-word; + word-wrap: break-word; + -ms-word-break: break-all; + word-break: break-all; + word-break: break-word; + -ms-hyphens: auto; + -moz-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; } + +strong { + font-weight: 700; } + +body { + padding-top: 6.5rem; } + @media (max-width: 500px) { + body { + padding-top: 11rem; } } + @media (max-width: 412px) { + body { + padding-top: 12rem; } } + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #bbbbbb; + opacity: 1; } + +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #bbbbbb; + opacity: 1; } + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #bbbbbb; + opacity: 1; } + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #bbbbbb; + opacity: 1; } + +#main .inside { + margin: 0 auto; + width: 80vw; + max-width: 1280px; + padding: 3rem 0; + min-height: 600px; } +#main h1 { + font-size: 2rem; + line-height: 2.5rem; + padding: 0 0 2rem 0; } + @media (max-width: 767px) { + #main h1 { + font-size: 1.25rem; + line-height: 1.5rem; } } +#main h2, #main h3 { + font-size: 1.5rem; + line-height: 2rem; + padding: 0 0 1.5rem 0; } + @media (max-width: 767px) { + #main h2, #main h3 { + font-size: 1rem; + line-height: 1.25rem; } } +#main h3 { + font-weight: bold; + text-transform: uppercase; } +#main h4, #main h5, #main h6 { + font-size: 1rem; + line-height: 1.25rem; + padding: 0 0 0.5rem 0; } + @media (max-width: 767px) { + #main h4, #main h5, #main h6 { + font-size: 0.875rem; + line-height: 1rem; } } +#main p, #main ul, #main ol, #main table { + margin: 0 0 1.5rem 0; } +#main p.img img { + float: left; + margin: 0 20px 20px 0; + width: 200px; + height: auto; } +#main .mini-nav { + padding: 0 0 1.5rem 0; } + #main .mini-nav a { + color: #e2003c; } + #main .mini-nav a:before { + content: "<< "; } + #main .mini-nav a:hover { + text-decoration: none; } +#main .container { + padding: 0 0 1.5rem 0; } +#main .logo-bar li { + overflow: hidden; + padding: 0 0 10px 0; + display: flex; + align-items: center; } + #main .logo-bar li img { + float: left; + margin-right: 40px; + height: 100px; } + @media (max-width: 767px) { + #main .logo-bar li img { + float: none; + margin-bottom: 20px; } } + @media (max-width: 767px) { + #main .logo-bar li p { + margin-left: 0; } } + +.btn { + border: 1px solid #e2003c; + background: #e2003c; + color: #ffffff; + padding: 0.5rem 1rem; + font-size: 0.75rem; + line-height: 1rem; + text-transform: uppercase; + cursor: pointer; + text-decoration: none; + display: inline-block; + transition: all 0.3s ease-out; } + .btn:hover { + background: #e83363; + border-color: #e83363; + color: #ffffff; } + .btn[disabled] { + opacity: 0.5; + background: #191919; + border-color: #191919; + cursor: default; } + .btn--inverse { + background: #ffffff; + color: #e2003c; } + .btn--correct { + border-color: #008000; + background: #008000; + color: #ffffff; } + .btn--correct:hover { + background: #ffffff; + border-color: #008000; + color: #008000; } + +.form--row { + display: flex; + justify-content: flex-start; + flex-wrap: wrap; } + @media (max-width: 500px) { + #header .form--row { + padding-top: 20px; } } + .form--row.form--row-right { + justify-content: flex-end; + margin-right: 5%; } +.form--wrapper { + width: 270px; + padding: 0 0 1.5rem 0; + display: flex; + flex-wrap: wrap; + align-items: flex-end; } + #header .form--wrapper { + padding-bottom: 0; + width: 200px; } + #header .form--wrapper.fw--no-width { + width: auto; } + @media (max-width: 412px) { + #header .form--wrapper.fw--no-width { + margin-top: 10px; } } + @media (max-width: 768px) { + #header .form--wrapper { + width: 120px; } } + @media (max-width: 412px) { + #header .form--wrapper { + width: 110px; } } + .form--wrapper.mandatory label { + font-weight: 700; } + .form--wrapper label { + display: block; + padding: 0 0 0.25rem 0; + font-size: 0.875rem; + line-height: 1.5rem; + width: 100%; } + .form--wrapper input { + display: block; + font-size: 1rem; + line-height: 1.5rem; + width: 90%; } + .form--wrapper input[type='checkbox'] { + width: auto; } + .form--wrapper textarea { + display: block; + font-size: 1rem; + line-height: 1.5rem; + padding: 1rem; + width: 100%; + height: 10rem; } + @media (max-width: 1048px) { + .form--wrapper textarea { + width: 60%; } } + @media (max-width: 768px) { + .form--wrapper textarea { + width: 100%; } } +.form--legal { + padding: 0 0 1.5rem 0; } + .form--legal .form--wrapper { + width: auto; + max-width: 80%; } + @media (max-width: 1048px) { + .form--legal .form--wrapper { + max-width: none; } } + .form--legal .form-wrapper--container { + display: flex; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: start; } + @media (max-width: 1048px) { + .form--legal .form-wrapper--container { + display: block; } } + .form--legal .form--checkbox input { + float: left; + margin: 5px 8px 0 0; } +.form--catalogue { + border-top: 2px solid #191919; + padding: 0 0 1.5rem 0; } + .form--catalogue .form-wrapper--container { + display: flex; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: start; } + @media (max-width: 1048px) { + .form--catalogue .form-wrapper--container { + display: block; } } + .form--catalogue h3 { + text-align: center; + width: 100%; } + .form--catalogue .question-count { + padding: 1.5rem 0; + position: relative; } + .form--catalogue .question-count p { + padding: 0; } + .form--catalogue .question-count .progressbar { + position: absolute; + left: 0; + bottom: 0; + height: 12px; + width: 100%; + background: #ddd; } + .form--catalogue .question-count .progressbar div { + position: absolute; + left: 0; + bottom: 0; + height: 12px; + width: 0; + background: green; } + .form--catalogue .catalogue-nav { + display: flex; + justify-content: space-between; + padding: 0 0 1.5rem 0; } + @media (max-width: 1024px) { + .form--catalogue .catalogue-nav { + flex-wrap: wrap; + justify-content: center; } + .form--catalogue .catalogue-nav .save { + width: 100%; + text-align: center; } + .form--catalogue .catalogue-nav span:not(.btn) { + order: 3; + justify-content: center; + display: flex; + flex-wrap: wrap; } + .form--catalogue .catalogue-nav span:not(.btn):first-of-type { + order: 2; } + .form--catalogue .catalogue-nav .btn { + order: 1; + margin: 10px 10px 0 10px; } } + .form--catalogue .form--wrapper { + width: auto; + justify-content: center; } + .form--catalogue .form--wrapper .btn { + float: right; } + .form--catalogue .form--wrapper.left { + justify-content: flex-start; } + .form--catalogue h2 { + font-size: 2rem; + line-height: 3rem; } + .form--catalogue label { + font-size: 1.5rem; + line-height: 2rem; } + @media (max-width: 767px) { + .form--catalogue label { + font-size: 1rem; + line-height: 1.25rem; } } + .form--catalogue .form--checkbox label { + display: flex; } + .form--catalogue .form--checkbox label input { + display: inline; + width: auto; + margin: 9px 10px 0 0; } +@-moz-document url-prefix() { + .form--catalogue .form--checkbox label input { + margin-top: 0; } } +.form--question { + border-top: 2px solid #191919; + padding-top: 1.5rem; } +.form .alert { + font-size: 0.75rem; + line-height: 1rem; } + +.alert { + color: #e2003c !important; } + +#message { + position: fixed; + left: 0; + top: 0; + right: 0; + width: 100%; + z-index: 3000; + display: none; + color: #ffffff; + font-size: 1.5rem; } + #message.success { + background: green; } + #message.failure { + background: #e2003c; } + #message p { + padding: 1.5rem; } + +header { + box-shadow: 0 1px 10px -6px rgba(0, 0, 0, 0.42), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 4px 5px -2px rgba(0, 0, 0, 0.1); + position: fixed; + left: 0; + top: 0; + width: 100%; + z-index: 2000; + background: #ffffff; } + header .inside { + padding: 1.5rem 3rem 0 3rem; + height: 6.5rem; + display: flex; + justify-content: space-between; } + @media (max-width: 412px) { + header .inside { + padding-left: 2rem; + padding-right: 2rem; } } + @media (max-width: 500px) { + header .inside { + height: 11rem; + display: block; } } + @media (max-width: 412px) { + header .inside { + height: 12rem; } } + header .inside .logo { + display: flex; } + @media (min-width: 501px) and (max-width: 768px) { + header .inside .logo { + display: block; } } + header .inside .logo a.home { + font-weight: bold; + color: #3c4952; + margin-top: -5px; + padding: 0 0 0 30px; + text-decoration: none; } + @media (min-width: 501px) and (max-width: 768px) { + header .inside .logo a.home { + display: block; + padding: 10px 0 0 12px; } } + header .inside .logo a.home:before { + color: #3c4952 !important; + content: "|"; + padding: 0 20px 0 0; } + @media (min-width: 501px) and (max-width: 768px) { + header .inside .logo a.home:before { + content: ""; + display: none; } } + header .inside .logo a.home:hover { + color: #788187; } + @media (max-width: 500px) { + header .inside .status { + padding-top: 20px; } } + header img { + height: 3rem; } + @media (max-width: 800px) { + header img { + height: 2rem; } } + header form { + margin-top: -0.375rem; } + +footer { + background: #191919; + color: #ffffff; } + footer .inside { + padding: 1.5rem 3rem; } + footer ul { + display: flex; + justify-content: flex-start; } + footer li { + padding: 0 0 0 1.5rem; } + footer li:first-child { + padding-left: 0; } + footer li a { + display: block; } + +.new-user { + padding: 0 0 3rem 0; } + +.listing li { + background: #fce6ec; + padding: 0.75rem 1.5rem; + margin-bottom: 2px; } + .listing li:nth-child(even) { + background: #f9ccd8; } + .listing li.inactive { + opacity: .3; } +.listing--header { + padding: 0.5rem 0; + display: flex; + justify-content: space-between; + align-items: center; } + @media (max-width: 1024px) { + .listing--header { + display: block; } } + .listing--header h3 { + padding: 0 !important; } + .listing--header .buttons { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; } + .listing--header .buttons * { + margin-left: 1.5rem; } + @media (max-width: 1024px) { + .listing--header .buttons * { + margin-top: 10px; + margin-left: 0; + margin-right: 1.5rem; } } + .listing--header .buttons .pdfs { + display: flex; } + @media (max-width: 1024px) { + .listing--header .buttons .pdfs { + order: 2; } } + .listing--header .buttons .pdfs a { + display: block; + width: 2rem; + height: 2rem; + background: transparent url("../images/elements/pdf.svg") no-repeat left top; + background-size: 100% auto; + position: relative; } + .listing--header .buttons .pdfs a.latest:after { + content: ""; + display: block; + position: absolute; + right: -0.25rem; + top: -0.25rem; + width: 1rem; + height: 1rem; + background: green; + border-radius: 50%; } +.listing--details { + display: none; } +.listing--details-inside { + padding: 0.5rem 0; } + +/*# sourceMappingURL=styles.css.map */ diff --git a/httpdocs/public/assets/scss/styles.css.map b/httpdocs/public/assets/scss/styles.css.map new file mode 100644 index 0000000..79b4afa --- /dev/null +++ b/httpdocs/public/assets/scss/styles.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAAA,4BAA4B;AAC5B,UAWC;EAVC,WAAW,EAAE,QAAQ;EACrB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,4CAA4C;EAAE,sBAAsB;EACzE,GAAG,EAAE,4VAK4D;EAAE,gBAAgB;AAGrF,wBAAwB;AACxB,UAWC;EAVC,WAAW,EAAE,QAAQ;EACrB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,wCAAwC;EAAE,sBAAsB;EACrE,GAAG,EAAE,wUAKwD;EAAE,gBAAgB;AAIjF,CAAE;EACA,UAAU,EAAE,UAAU;;AAGxB,IAAK;EACH,SAAS,EAAE,IAAI;EACf,eAAe,EAAE,MAAM;;AAGzB,IAAK;EACH,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,CAAC;;AAGX;;;;;QAKS;EACP,WAAW,EAAE,oCAAoC;EACjD,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,IAAI;;AAGlB;;;YAGa;EACX,OAAO,EAAE,IAAI;;AAIf,2CAA2C;AAE3C,6BAA8B;EAC5B,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;;AAGX,8BAA+B;EAC7B,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;;AAGX,gCAAgC;AAEhC;;;uDAGwD;EACtD,OAAO,EAAE,IAAI;;AAGf,QAAS;EACP,MAAM,EAAE,IAAI;;AAGd;;;;;;;;;;;;;;;;;;;;;;;;QAwBS;EACP,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;;AAGX;;;;;EAKG;EACD,WAAW,EAAE,GAAG;;AAGlB;EACG;EACD,UAAU,EAAE,IAAI;;AAIhB;;;eAGS;EACP,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,IAAI;;AAIhB;yBAC0B;EACxB,KAAK,EAAE,OAAO;EACd,OAAO,EAAE,CAAC;;AAGZ;0BAC2B;EACzB,KAAK,EAAE,OAAO;EACd,OAAO,EAAE,CAAC;;AAGZ;mCACoC;EAClC,KAAK,EAAE,OAAO;EACd,OAAO,EAAE,CAAC;;AAGZ;8BAC+B;EAC7B,KAAK,EAAE,OAAO;EACd,OAAO,EAAE,CAAC;;AAGZ,KAAM;EACJ,UAAU,ECzKE,OAAO;ED0KnB,MAAM,EAAE,iBAA2B;EACnC,OAAO,EAAE,aAAa;EACtB,aAAU;IACR,WAAW,EAAE,OAAO;IACpB,cAAc,EAAE,OAAO;;AAI3B,GAAI;EACF,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;;AAGd;OACQ;EACN,KAAK,EAAE,OAAO;EACd,OAAO,EAAE,CAAC;;AAGZ;qBACsB;EACpB,aAAa,EAAE,UAAU;EACzB,SAAS,EAAE,UAAU;EACrB,cAAc,EAAE,SAAS;EACzB,UAAU,EAAE,SAAS;EACrB,UAAU,EAAE,UAAU;EACtB,WAAW,EAAE,IAAI;EACjB,YAAY,EAAE,IAAI;EAClB,eAAe,EAAE,IAAI;EACrB,OAAO,EAAE,IAAI;;AAGf,MAAO;EACL,WAAW,EAAE,GAAG;;AE3MlB,IAAK;EACH,WAAW,EAAE,MAAM;EACnB,yBAA0B;IAF5B,IAAK;MAGD,WAAW,EAAE,KAAK;EAEpB,yBAA0B;IAL5B,IAAK;MAMD,WAAW,EAAE,KAAK;;AAItB;yBAC0B;EACxB,KAAK,EDTc,OAAO;ECU1B,OAAO,EAAE,CAAC;;AAGZ;0BAC2B;EACzB,KAAK,EDfc,OAAO;ECgB1B,OAAO,EAAE,CAAC;;AAGZ;mCACoC;EAClC,KAAK,EDrBc,OAAO;ECsB1B,OAAO,EAAE,CAAC;;AAGZ;8BAC+B;EAC7B,KAAK,ED3Bc,OAAO;EC4B1B,OAAO,EAAE,CAAC;;AAIV,aAAQ;EACN,MAAM,EAAE,MAAM;EACd,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,MAAM;EACjB,OAAO,EAAE,MAAM;EACf,UAAU,EAAE,KAAK;AAEnB,QAAG;EACD,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,UAAU;EACnB,yBAA0B;IAJ5B,QAAG;MAKC,SAAS,EAAE,OAAO;MAClB,WAAW,EAAE,MAAM;AAGvB,kBAAO;EACL,SAAS,EAAE,MAAM;EACjB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,YAAY;EACrB,yBAA0B;IAJ5B,kBAAO;MAKH,SAAS,EAAE,IAAI;MACf,WAAW,EAAE,OAAO;AAGxB,QAAG;EACD,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;AAE3B,4BAAW;EACT,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,OAAO;EACpB,OAAO,EAAE,YAAY;EACrB,yBAA0B;IAJ5B,4BAAW;MAKP,SAAS,EAAE,QAAQ;MACnB,WAAW,EAAE,IAAI;AAGrB,wCAAiB;EACf,MAAM,EAAE,YAAY;AAIlB,eAAI;EACF,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,aAAa;EACrB,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,IAAI;AAIlB,eAAU;EACR,OAAO,EAAE,YAAY;EACrB,iBAAE;IACA,KAAK,EDrFK,OAAO;ICsFjB,wBAAS;MACP,OAAO,EAAE,KAAK;IAEhB,uBAAQ;MACN,eAAe,EAAE,IAAI;AAI3B,gBAAW;EACT,OAAO,EAAE,YAAY;AAGrB,kBAAG;EACD,QAAQ,EAAE,MAAM;EAChB,OAAO,EAAE,UAAU;EACnB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,sBAAI;IAEF,KAAK,EAAE,IAAI;IACX,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,KAAK;IACb,yBAA0B;MAL5B,sBAAI;QAMA,KAAK,EAAE,IAAI;QACX,aAAa,EAAE,IAAI;EAKrB,yBAA0B;IAF5B,oBAAE;MAGE,WAAW,EAAE,CAAC;;AAOxB,IAAK;EACH,MAAM,EAAE,iBAAwB;EAChC,UAAU,ED7HI,OAAO;EC8HrB,KAAK,EDlIO,OAAO;ECmInB,OAAO,EAAE,WAAW;EACpB,SAAS,EAAE,OAAO;EAClB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,MAAM,EAAE,OAAO;EACf,eAAe,EAAE,IAAI;EACrB,OAAO,EAAE,YAAY;ECxIrB,UAAU,EAAE,iBAAiB;ED0I7B,UAAQ;IACN,UAAU,EDtIC,OAAO;ICuIlB,YAAY,EDvID,OAAO;ICwIlB,KAAK,ED9IK,OAAO;ECgJnB,cAAY;IACV,OAAO,EAAE,GAAG;IACZ,UAAU,EDjJA,OAAO;ICkJjB,YAAY,EDlJF,OAAO;ICmJjB,MAAM,EAAE,OAAO;EAEjB,aAAW;IACT,UAAU,EDvJA,OAAO;ICwJjB,KAAK,EDpJO,OAAO;ECsJrB,aAAW;IACT,YAAY,ED7IE,OAAO;IC8IrB,UAAU,ED9II,OAAO;IC+IrB,KAAK,ED7JK,OAAO;IC8JjB,mBAAQ;MACN,UAAU,ED/JF,OAAO;MCgKf,YAAY,EDlJA,OAAO;MCmJnB,KAAK,EDnJO,OAAO;;ACyJvB,UAAO;EACL,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,UAAU;EAC3B,SAAS,EAAE,IAAI;EAEb,yBAA0B;IAD5B,kBAAU;MAEN,WAAW,EAAE,IAAI;EAGrB,0BAAkB;IAChB,eAAe,EAAE,QAAQ;IACzB,YAAY,EAAE,EAAE;AAGpB,cAAW;EACT,KAAK,EAAE,KAAK;EACZ,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,IAAI;EACb,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,QAAQ;EACrB,sBAAU;IACR,cAAc,EAAE,CAAC;IACjB,KAAK,EAAE,KAAK;IACZ,mCAAe;MACb,KAAK,EAAE,IAAI;MACX,yBAA0B;QAF5B,mCAAe;UAGX,UAAU,EAAE,IAAI;IAGpB,yBAA0B;MAT5B,sBAAU;QAUN,KAAK,EAAE,KAAK;IAEd,yBAA0B;MAZ5B,sBAAU;QAaN,KAAK,EAAE,KAAK;EAId,8BAAM;IACJ,WAAW,EAAE,GAAG;EAGpB,oBAAM;IACJ,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,aAAa;IACtB,SAAS,EAAE,QAAQ;IACnB,WAAW,EAAE,MAAM;IACnB,KAAK,EAAE,IAAI;EAEb,oBAAM;IACJ,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,MAAM;IACnB,KAAK,EAAE,GAAG;IACV,qCAAmB;MACjB,KAAK,EAAE,IAAI;EAGf,uBAAS;IACP,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,MAAM;IACnB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,KAAK;IACb,0BAA2B;MAP7B,uBAAS;QAQL,KAAK,EAAE,GAAG;IAEZ,yBAA0B;MAV5B,uBAAS;QAWL,KAAK,EAAE,IAAI;AAIjB,YAAS;EACP,OAAO,EAAE,YAAY;EACrB,2BAAe;IACb,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,GAAG;IACd,0BAA2B;MAH7B,2BAAe;QAIX,SAAS,EAAE,IAAI;EAGnB,qCAAyB;IACvB,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,MAAM;IACjB,eAAe,EAAE,UAAU;IAC3B,WAAW,EAAE,KAAK;IAClB,0BAA2B;MAL7B,qCAAyB;QAMrB,OAAO,EAAE,KAAK;EAIhB,kCAAM;IACJ,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,WAAW;AAIzB,gBAAa;EACX,UAAU,EAAE,iBAAsB;EAClC,OAAO,EAAE,YAAY;EACrB,yCAAyB;IACvB,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,MAAM;IACjB,eAAe,EAAE,UAAU;IAC3B,WAAW,EAAE,KAAK;IAClB,0BAA2B;MAL7B,yCAAyB;QAMrB,OAAO,EAAE,KAAK;EAGlB,mBAAG;IACD,UAAU,EAAE,MAAM;IAClB,KAAK,EAAE,IAAI;EAEb,gCAAgB;IACd,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,QAAQ;IAClB,kCAAE;MACA,OAAO,EAAE,CAAC;IAEZ,6CAAa;MACX,QAAQ,EAAE,QAAQ;MAClB,IAAI,EAAE,CAAC;MACP,MAAM,EAAE,CAAC;MACT,MAAM,EAAE,IAAI;MACZ,KAAK,EAAE,IAAI;MACX,UAAU,EAAE,IAAI;MAChB,iDAAI;QACF,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,KAAK;EAIvB,+BAAe;IACb,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,aAAa;IAC9B,OAAO,EAAE,YAAY;IACrB,0BAA2B;MAJ7B,+BAAe;QAKX,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,MAAM;QACvB,qCAAM;UACJ,KAAK,EAAE,IAAI;UACX,UAAU,EAAE,MAAM;QAEpB,8CAAe;UACb,KAAK,EAAE,CAAC;UACR,eAAe,EAAE,MAAM;UACvB,OAAO,EAAE,IAAI;UACb,SAAS,EAAE,IAAI;UACf,4DAAgB;YACd,KAAK,EAAE,CAAC;QAGZ,oCAAK;UACH,KAAK,EAAE,CAAC;UACR,MAAM,EAAE,gBAAgB;EAI9B,+BAAe;IACb,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,MAAM;IACvB,oCAAK;MACH,KAAK,EAAE,KAAK;IAEd,oCAAO;MACL,eAAe,EAAE,UAAU;EAG/B,mBAAG;IACD,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,IAAI;EAEnB,sBAAM;IACJ,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,IAAI;IACjB,yBAA0B;MAH5B,sBAAM;QAIF,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,OAAO;EAItB,sCAAM;IACJ,OAAO,EAAE,IAAI;IACb,4CAAM;MACJ,OAAO,EAAE,MAAM;MACf,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,YAAY;AACpB,2BAEC;EANH,4CAAM;IAKF,UAAU,EAAE,CAAC;AAMvB,eAAY;EACV,UAAU,EAAE,iBAAsB;EAClC,WAAW,EAAE,MAAM;AAErB,YAAO;EACL,SAAS,EAAE,OAAO;EAClB,WAAW,EAAE,IAAI;;AAIrB,MAAO;EACL,KAAK,EAAE,kBAAyB;;AAGlC,QAAS;EACP,QAAQ,EAAE,KAAK;EACf,IAAI,EAAE,CAAC;EACP,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,CAAC;EACR,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,IAAI;EACb,OAAO,EAAE,IAAI;EACb,KAAK,EDnYO,OAAO;ECoYnB,SAAS,EAAE,MAAM;EACjB,gBAAU;IACR,UAAU,EAAE,KAAK;EAEnB,gBAAU;IACR,UAAU,EDrYE,OAAO;ECuYrB,UAAE;IACA,OAAO,EAAE,MAAM;;AE5YnB,MAAO;EACL,UAAU,EAAE,wGAA0F;EACtG,QAAQ,EAAE,KAAK;EACf,IAAI,EAAE,CAAC;EACP,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,IAAI;EACb,UAAU,EHPE,OAAO;EGQnB,cAAQ;IACN,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,aAAa;IAC9B,yBAA0B;MAL5B,cAAQ;QAMJ,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;IAErB,yBAA0B;MAT5B,cAAQ;QAUJ,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,KAAK;IAEhB,yBAA0B;MAb5B,cAAQ;QAcJ,MAAM,EAAE,KAAK;IAEf,oBAAM;MACJ,OAAO,EAAE,IAAI;MACb,gDAAiD;QAFnD,oBAAM;UAGF,OAAO,EAAE,KAAK;MAEhB,2BAAO;QACL,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,UAAU;QACnB,eAAe,EAAE,IAAI;QACrB,gDAAiD;UANnD,2BAAO;YAOH,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,aAAa;QAExB,kCAAS;UACP,KAAK,EAAE,kBAAkB;UACzB,OAAO,EAAE,GAAG;UACZ,OAAO,EAAE,UAAU;UACnB,gDAAiD;YAJnD,kCAAS;cAKL,OAAO,EAAE,EAAE;cACX,OAAO,EAAE,IAAI;QAGjB,iCAAQ;UACN,KAAK,EAAE,OAAO;IAKlB,yBAA0B;MAD5B,sBAAQ;QAEJ,WAAW,EAAE,IAAI;EAIvB,UAAI;IACF,MAAM,EAAE,IAAI;IACZ,yBAA0B;MAF5B,UAAI;QAGA,MAAM,EAAE,IAAI;EAGhB,WAAK;IACH,UAAU,EAAE,SAAS;;AClEzB,MAAO;EACL,UAAU,EJAE,OAAO;EICnB,KAAK,EJFO,OAAO;EIGnB,cAAQ;IACN,OAAO,EAAE,WAAW;EAEtB,SAAG;IACD,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,UAAU;EAE7B,SAAG;IACD,OAAO,EAAE,YAAY;IACrB,qBAAc;MACZ,YAAY,EAAE,CAAC;IAEjB,WAAE;MACA,OAAO,EAAE,KAAK;;AChBpB,SAAU;EACR,OAAO,EAAE,UAAU;;AAOnB,WAAG;EACD,UAAU,ELIC,OAAO;EKHlB,OAAO,EAAE,cAAc;EACvB,aAAa,EAAE,GAAG;EAClB,2BAAkB;IAChB,UAAU,ELDD,OAAO;EKGlB,oBAAW;IACT,OAAO,EAAE,EAAE;AAGf,gBAAU;EACR,OAAO,EAAE,QAAQ;EACjB,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,MAAM;EACnB,0BAA2B;IAL7B,gBAAU;MAMN,OAAO,EAAE,KAAK;EAEhB,mBAAG;IACD,OAAO,EAAE,YAAY;EAEvB,yBAAS;IACP,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;IACf,eAAe,EAAE,UAAU;IAC3B,WAAW,EAAE,MAAM;IACnB,2BAAE;MACA,WAAW,EAAE,MAAM;MACnB,0BAA2B;QAF7B,2BAAE;UAGE,UAAU,EAAE,IAAI;UAChB,WAAW,EAAE,CAAC;UACd,YAAY,EAAE,MAAM;IAGxB,+BAAM;MACJ,OAAO,EAAE,IAAI;MACb,0BAA2B;QAF7B,+BAAM;UAGF,KAAK,EAAE,CAAC;MAEV,iCAAE;QACA,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,gEAAgE;QAC5E,eAAe,EAAE,SAAS;QAC1B,QAAQ,EAAE,QAAQ;QAEhB,8CAAQ;UACN,OAAO,EAAE,EAAE;UACX,OAAO,EAAE,KAAK;UACd,QAAQ,EAAE,QAAQ;UAClB,KAAK,EAAE,QAAQ;UACf,GAAG,EAAE,QAAQ;UACb,KAAK,EAAE,IAAI;UACX,MAAM,EAAE,IAAI;UACZ,UAAU,EAAE,KAAK;UACjB,aAAa,EAAE,GAAG;AAO9B,iBAAW;EACT,OAAO,EAAE,IAAI;AAKf,wBAAkB;EAChB,OAAO,EAAE,QAAQ", +"sources": ["components/_reset.scss","_variables.scss","components/_basic.scss","_mixins.scss","components/_header.scss","components/_footer.scss","components/_listing.scss"], +"names": [], +"file": "styles.css" +} diff --git a/httpdocs/public/assets/scss/styles.scss b/httpdocs/public/assets/scss/styles.scss new file mode 100644 index 0000000..b717398 --- /dev/null +++ b/httpdocs/public/assets/scss/styles.scss @@ -0,0 +1,7 @@ +@import 'mixins'; +@import 'variables'; +@import 'components/reset'; +@import 'components/basic'; +@import 'components/header'; +@import 'components/footer'; +@import 'components/listing'; diff --git a/httpdocs/public/downloads/Lizenz-Nutzervereinbarung-MyBIMScore.pdf b/httpdocs/public/downloads/Lizenz-Nutzervereinbarung-MyBIMScore.pdf new file mode 100644 index 0000000..fc07159 Binary files /dev/null and b/httpdocs/public/downloads/Lizenz-Nutzervereinbarung-MyBIMScore.pdf differ diff --git a/httpdocs/public/favicon.ico b/httpdocs/public/favicon.ico new file mode 100644 index 0000000..3d81bf1 Binary files /dev/null and b/httpdocs/public/favicon.ico differ diff --git a/httpdocs/public/index.php b/httpdocs/public/index.php new file mode 100644 index 0000000..3bcee0b --- /dev/null +++ b/httpdocs/public/index.php @@ -0,0 +1,22 @@ +bootEnv(dirname(__DIR__).'/.env'); + +if ($_SERVER['APP_DEBUG']) { + umask(0000); + + Debug::enable(); +} + +$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); +$request = Request::createFromGlobals(); +$response = $kernel->handle($request); +$response->send(); +$kernel->terminate($request, $response); diff --git a/httpdocs/src/Command/CmdDeleteUser.php b/httpdocs/src/Command/CmdDeleteUser.php new file mode 100755 index 0000000..a5c388a --- /dev/null +++ b/httpdocs/src/Command/CmdDeleteUser.php @@ -0,0 +1,83 @@ +em = $em; + $this->container = $container; + $this->kernel = $kernel; + parent::__construct(); + } + + /** + * + */ + protected function configure() + { + $this + // the short description shown while running "php bin/console list" + ->setDescription('Delete user.') + + // the full command description shown when running the command with + // the "--help" option + ->setHelp('This command allows you to delete an user.') + ->addArgument('id', InputArgument::REQUIRED, 'id') + ; + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|null|void + * @throws \Exception + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $id = $input->getArgument('id'); + /** @var User $user */ + $user = $this->em->getRepository(User::class)->find($id); + if ($user === null) { + throw new \Exception('user not found'); + } + /** @var UserType $userType */ + $userType = $user->getUserType(); + if ($userType->getType() === UserTypeRepository::USER_TYPE_SYSTEM) { + throw new \Exception('can no delete system user'); + } + + $this->em->remove($user); + $this->em->flush(); + return Command::SUCCESS; + } + +} \ No newline at end of file diff --git a/httpdocs/src/Command/CmdImportBenchmark.php b/httpdocs/src/Command/CmdImportBenchmark.php new file mode 100755 index 0000000..b05edd3 --- /dev/null +++ b/httpdocs/src/Command/CmdImportBenchmark.php @@ -0,0 +1,78 @@ +em = $em; + $this->container = $container; + $this->kernel = $kernel; + parent::__construct(); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|null|void + * @throws \Exception + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + ini_set('memory_limit', '4096M'); + $projectRoot = $this->kernel->getProjectDir(); + $excelFile = $projectRoot. '/import/mpp_import_benchmark.xlsx'; + $reader = IOFactory::createReaderForFile($excelFile); + $reader->setReadDataOnly(true); + $spreadsheet = $reader->load($excelFile); + + $worksheet = $spreadsheet->getSheetByName('Preisbenchmarking Daten'); + + if (null === $worksheet) { + $output->write('No benchmark worksheet found.'); + return Command::FAILURE; + } + + $worksheetData = []; + + $highestRow = $worksheet->getHighestRow(); + $highestColumn = $worksheet->getHighestColumn(); + + $startRow = 2; + $startCol = 'A'; + + for ($row = $startRow; $row <= $highestRow; $row++) { + $rowData = []; + for ($col = $startCol; $col <= $highestColumn; $col++) { + $cell = $worksheet->getCell($col . $row); + $rowData[] = $cell->getValue(); + } + $worksheetData[] = $rowData; + } + + $a = 0; + return Command::SUCCESS; + } + +} \ No newline at end of file diff --git a/httpdocs/src/Command/CmdImportDinAssets.php b/httpdocs/src/Command/CmdImportDinAssets.php new file mode 100755 index 0000000..d010b62 --- /dev/null +++ b/httpdocs/src/Command/CmdImportDinAssets.php @@ -0,0 +1,128 @@ +em = $em; + $this->container = $container; + $this->kernel = $kernel; + parent::__construct(); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|null|void + * @throws \Exception + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + ini_set('memory_limit', '4096M'); + $projectRoot = $this->kernel->getProjectDir(); + $excelFile = $projectRoot. '/import/mpp_import_din.xlsx'; + $reader = IOFactory::createReaderForFile($excelFile); + $reader->setReadDataOnly(true); + $spreadsheet = $reader->load($excelFile); + + /** @var Connection $con */ + $this->em->getConnection()->beginTransaction(); + + try { + $this->em->createQuery('DELETE FROM App\Entity\DinAssetTask')->execute(); + $this->em->createQuery('DELETE FROM App\Entity\DinAsset')->execute(); + + $dinAssetsByDinAndName = []; + + foreach ($spreadsheet->getWorksheetIterator() as $worksheet) { + $worksheetTitle = $worksheet->getTitle(); + + $dinNumber = (int) $worksheetTitle; + $isDinWorksheet = $dinNumber >= 100 && $dinNumber < 1000; + + if ($isDinWorksheet) { + $worksheetData = []; + + $highestRow = $worksheet->getHighestRow(); + $highestColumn = $worksheet->getHighestColumn(); + + $startRow = 3; + $startCol = 'A'; + + for ($row = $startRow; $row <= $highestRow; $row++) { + $rowData = []; + for ($col = $startCol; $col <= $highestColumn; $col++) { + $cell = $worksheet->getCell($col . $row); + $rowData[] = $cell->getValue(); + } + + $dinNumber = $rowData[0]; + + if (null === $dinNumber) { + break; + } + $name = $rowData[1]; + $key = $dinNumber.$name; + if (!array_key_exists($key, $dinAssetsByDinAndName)) { + $dinAsset = new DinAsset(); + $dinAsset->setDinNumber($rowData[0]); + $dinAsset->setName($rowData[1]); + $this->em->persist($dinAsset); + $this->em->flush(); + $dinAssetsByDinAndName[$key] = $dinAsset; + } + $dinAsset = $dinAssetsByDinAndName[$key]; + $dinAssetTask = new DinAssetTask(); + $dinAssetTask->setDinAsset($dinAsset); + $dinAssetTask->setDelimitation($rowData[2]); + $dinAssetTask->setTask($rowData[3]); + $dinAssetTask->setInspection($rowData[4] !== null); + $dinAssetTask->setMaintenance($rowData[5] !== null); + $dinAssetTask->setService($rowData[6] !== null); + $dinAssetTask->setExpert($rowData[7] !== null); + $dinAssetTask->setSpecialist($rowData[8] !== null); + $dinAssetTask->setSkilledPersonnel($rowData[9] !== null); + $dinAssetTask->setNorm($rowData[10]); + $dinAssetTask->setMinMonths($rowData[11]); + $dinAssetTask->setMaxMonths($rowData[12]); + $dinAssetTask->setMonthRecommendedInspection($rowData[13]); + $dinAssetTask->setMonthRecommendedMaintenance($rowData[14]); + $this->em->persist($dinAssetTask); + $this->em->flush(); + } + } + } + $this->em->flush(); + $this->em->getConnection()->commit(); + } catch (\Exception $e) { + $this->em->getConnection()->rollBack(); + } + return Command::SUCCESS; + } + +} \ No newline at end of file diff --git a/httpdocs/src/Command/CmdImportQuestions.php b/httpdocs/src/Command/CmdImportQuestions.php new file mode 100755 index 0000000..dc93ca3 --- /dev/null +++ b/httpdocs/src/Command/CmdImportQuestions.php @@ -0,0 +1,77 @@ +em = $em; + $this->container = $container; + $this->kernel = $kernel; + parent::__construct(); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|null|void + * @throws \Exception + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $questionTypesByType = Utils::getSortedObjects('getType', $this->em->getRepository(QuestionType::class)->findAll()); + if (($handle = fopen($this->kernel->getProjectDir().'/import/questions.csv', 'r')) !== FALSE) { + /** @var Connection $connection */ + $this->em->getConnection()->beginTransaction(); + $row = 1; + try { + while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { + if ($row !== 1) { + if (!array_key_exists($data[0], $questionTypesByType)) { + throw new \Exception('question type not found'); + } + /** @var QuestionType $qType */ + $qType = $questionTypesByType[$data[0]]; + $question = new Question($qType); + $question->setQuestionText($data[1]); + $question->setWeight($data[2]); + $this->em->persist($question); + } + $row++; + } + $this->em->flush(); + $this->em->getConnection()->commit(); + fclose($handle); + } catch (\Exception $e) { + $this->em->getConnection()->rollBack(); + } + + } + return Command::SUCCESS; + } + +} \ No newline at end of file diff --git a/httpdocs/src/Controller/.gitignore b/httpdocs/src/Controller/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/httpdocs/src/Controller/AdminController.php b/httpdocs/src/Controller/AdminController.php new file mode 100644 index 0000000..fefb565 --- /dev/null +++ b/httpdocs/src/Controller/AdminController.php @@ -0,0 +1,247 @@ +getDoctrine()->getRepository(User::class)-> + findBy(['userType' => UserTypeRepository::getUserType($this->getDoctrine()->getManager(), UserTypeRepository::USER_TYPE_USER)]); + $users = array_reverse($users); + + return $this->render('pages-admin/admin_start.html.twig', + [ + 'users' => $users + ] + ); + } + + /** + * @Route("/add-user", name="admin_add_user") + */ + public function addUser(Request $request) + { + $dateInThreeYears = new \DateTime('now', new \DateTimeZone('Europe/Berlin')); + $dateInThreeYears->modify('+3 year'); + return $this->render('pages-admin/admin_create_user.html.twig', [ + 'dateInThreeYears' => $dateInThreeYears + ]); + } + + /** + * @Route("/user", name="admin_create_user", methods={"POST"}) + * + * @param Request $request + * @param MailerInterface $mailer + * @return \Symfony\Component\HttpFoundation\JsonResponse + * @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface + */ + public function createUser(Request $request, MailerInterface $mailer, LoggerInterface $logger) + { + $content = (object) $request->request->all(); + $em = $this->getDoctrine()->getManager(); + /** @var User $currentUser */ + $currentUser = $this->getUser(); + + try { + /** @var UserType $userType */ + $userType = UserTypeRepository::getUserType($em, UserTypeRepository::USER_TYPE_USER); + $password = Utils::generateStrongPassword(); + $newUser = new User($em, $userType, $content->email, $content->firstname, $content->lastname, $password, $currentUser); + $em->persist($newUser); + + $email = (new TemplatedEmail()) + ->from("MyBIMScore by RealFM <".$_ENV['SYS_EMAIL'].">") + ->to($_ENV['APP_ENV'] === 'prod' ? $content->email : $_ENV['DEV_EMAIL']) + ->cc($_ENV['SYS_EMAIL']) + ->subject('Ihre Registrierung bei MyBIMScore') + ->htmlTemplate('email/new_user_email.html.twig') + ->context( + [ + 'user' => $newUser, + 'password' => $password, + 'adminEmail' => $_ENV['ADMIN_EMAIL'], + 'url' => $_SERVER['HTTP_ORIGIN'] + ] + ); +// $email->SMTPOptions = array( +// 'ssl' => array( +// 'verify_peer' => false, +// 'verify_peer_name' => false, +// 'allow_self_signed' => true +// ) +// ); + try { + $mailer->send($email); + } catch (TransportExceptionInterface $e) { + $logger->error($e->getDebug()); + } + + $em->flush(); + + } catch (\Exception $e) { + //return $this->json($e->getMessage(), 409); + return $this->json('Email-Adresse entweder nicht valide oder bereits in Benutzung', 409); + } + return $this->json(true); + } + + /** + * @Route("/user", name="admin_edit_user", methods={"PATCH"}) + * + * @param Request $request + * @return \Symfony\Component\HttpFoundation\JsonResponse + */ + public function editUser(Request $request) + { + $content = (object) $request->request->all(); + $em = $this->getDoctrine()->getManager(); + + /** @var User $user */ + $user = $this->getDoctrine()->getRepository(User::class)->find($content->id); + if ($user === null) { + return $this->json('Benutzer nicht gefunden', 409); + } + + try { + $user->setEmail($em, $content->email); + } catch (\Exception $e) { + return $this->json('Email-Adresse entweder nicht valide oder bereits in Benutzung', 409); + } + + $user = UserRepository::setClientData($user, $content); + $em->flush(); + return $this->json(true); + } + + /** + * @Route("/new-password", name="admin_new_password", methods={"POST"}) + * + * @param Request $request + * @param MailerInterface $mailer + * @return \Symfony\Component\HttpFoundation\JsonResponse + * @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface + */ + public function newPassword(Request $request, MailerInterface $mailer, \Swift_Mailer $swiftMailer) + { + $content = (object) $request->request->all(); + $em = $this->getDoctrine()->getManager(); + + /** @var User $user */ + $user = $this->getDoctrine()->getRepository(User::class)->find($content->id); + if ($user === null) { + return $this->json('Benutzer nicht gefunden', 409); + } + + try { + $password = Utils::generateStrongPassword(); + $user->setPassword($password); + + $email = (new TemplatedEmail()) + ->from($_ENV['SYS_EMAIL']) + ->to($_ENV['APP_ENV'] === 'prod' ? $user->getEmail() : $_ENV['DEV_EMAIL']) + //->cc($_ENV['ADMIN_EMAIL']) + ->subject('Ihr Zugang bei MyBIMScore') + ->htmlTemplate('email/new_password_email.html.twig') + ->context( + [ + 'user' => $user, + 'password' => $password, + 'adminEmail' => $_ENV['ADMIN_EMAIL'], + 'url' => $_SERVER['HTTP_ORIGIN'] + ] + ); + $email->SMTPOptions = array( + 'ssl' => array( + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ) + ); + + $mailer->send($email); + +// $message = (new \Swift_Message('Ihr Zugang bei My BIM Score')) +// ->setFrom($_ENV['SYS_EMAIL']) +// ->setTo($_ENV['APP_ENV'] === 'prod' ? $user->getEmail() : $_ENV['DEV_EMAIL']) +// ->setBody( +// $this->renderView( +// // templates/emails/registration.html.twig +// 'email/new_password_email.html.twig', +// [ +// 'user' => $user, +// 'password' => $password, +// 'adminEmail' => $_ENV['ADMIN_EMAIL'] +// ] +// ), +// 'text/html' +// ); +// +// $swiftMailer->send($message); + + + + $em->flush(); + } catch (\Exception $e) { + return $this->json($e->getMessage(), 409); + //return $this->json('Emailadresse entweder nicht valide oder bereits in Benutzung', 409); + } + + return $this->json(true); + } + + /** + * @Route("/get-user-catalogue/{catalogueId}", name="admin_user_catalogue", methods={"GET"}) + * + * @param Request $request + * @param $catalogueId + * @return \Symfony\Component\HttpFoundation\JsonResponse + * @throws \Twig\Error\LoaderError + * @throws \Twig\Error\RuntimeError + * @throws \Twig\Error\SyntaxError + */ + public function getUserCatalogue(Request $request, $catalogueId) + { + /** @var Catalogue $catalogue */ + $catalogue = $this->getDoctrine()->getRepository(Catalogue::class)->find($catalogueId); + if ($catalogue === null || !$catalogue->getFinished()) { + return $this->json('Katalog exitiert nicht oder ist nicht abgeschlossen', 409); + } + $dompdf = UserRepository::renderCatalogue($this->get('twig'), $catalogue); + // Output the generated PDF to Browser (force download) + $fileName = "Fragenkatalog_".$catalogue->getUser()->getId()."_".$catalogue->getFinishDate()->format('Y-m-d_H-i'); + $dompdf->stream($fileName, [ + "Attachment" => true + ]); + // NOTE: This is required, since method need a result! + exit(0); + } +} \ No newline at end of file diff --git a/httpdocs/src/Controller/PublicController.php b/httpdocs/src/Controller/PublicController.php new file mode 100644 index 0000000..8f58c0e --- /dev/null +++ b/httpdocs/src/Controller/PublicController.php @@ -0,0 +1,40 @@ +redirectToRoute('app_login'); + //return $this->render('pages/index.html.twig', ['last_username' => $lastUsername, 'error' => $error]); + } + + /** + * @Route("/imprint", name="imprint") + */ + public function showImprintAction() + { + return $this->render('pages-static/imprint.html.twig', []); + } + + /** + * @Route("/privacy", name="privacy") + */ + public function showPrivacyAction() + { + return $this->render('pages-static/privacy.html.twig', []); + } +} \ No newline at end of file diff --git a/httpdocs/src/Controller/SecurityController.php b/httpdocs/src/Controller/SecurityController.php new file mode 100644 index 0000000..2a97982 --- /dev/null +++ b/httpdocs/src/Controller/SecurityController.php @@ -0,0 +1,43 @@ +getUser(); + if ($user !== null) { + if ($user->getUserType()->getType() === UserTypeRepository::USER_TYPE_ADMIN) { + return $this->redirectToRoute('admin_start'); + } + return $this->redirectToRoute('start'); + } + + // get the login error if there is one + $error = $authenticationUtils->getLastAuthenticationError(); + // last username entered by the user + $lastUsername = $authenticationUtils->getLastUsername(); + + return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]); + } + + /** + * @Route("/logout", name="app_logout") + */ + public function logout() + { + throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.'); + } +} diff --git a/httpdocs/src/Controller/UserController.php b/httpdocs/src/Controller/UserController.php new file mode 100644 index 0000000..54fc68c --- /dev/null +++ b/httpdocs/src/Controller/UserController.php @@ -0,0 +1,318 @@ +getUser(); + $catalogues = $user->getCatalogues(); + $userHasUnfinishedCatalogue = false; + $userHasFinishedCatalogue = false; + /** @var Catalogue $catalogue */ + foreach ($catalogues as $catalogue) { + if (!$catalogue->getFinished() && !$userHasUnfinishedCatalogue) { + $userHasUnfinishedCatalogue = true; + } + if ($catalogue->getFinished() && !$userHasFinishedCatalogue) { + $userHasFinishedCatalogue = true; + } + } + + return $this->render('pages/start.html.twig', + [ + 'userHasUnfinishedCatalogue' => $userHasUnfinishedCatalogue, + 'userHasFinishedCatalogue' => $userHasFinishedCatalogue, + 'noMoreCatalogues' => !$userHasUnfinishedCatalogue && count($catalogues) >= $user->getMaxCatalogues() + ] + ); + } + + /** + * @Route("/download", name="download") + * + * @param Environment $twig + * @return \Symfony\Component\HttpFoundation\JsonResponse + * @throws \Twig\Error\LoaderError + * @throws \Twig\Error\RuntimeError + * @throws \Twig\Error\SyntaxError + */ + public function downloadLastCataloguePdf(Environment $twig) + { + /** @var User $user */ + $user = $this->getUser(); + $catalogues = $this->getDoctrine()->getRepository(Catalogue::class)->findBy(['user' => $user]); + + /** @var Catalogue $catalogue */ + $catalogue = null; + /** @var Catalogue $cat */ + foreach ($catalogues as $cat) { + if ($cat->getFinished()) { + $catalogue = $cat; + } + } + + if ($catalogue === null) { + return $this->json('Kein abgeschlossener Katalog vorhanden', 409); + } + + $dompdf = UserRepository::renderCatalogue($this->get('twig'), $catalogue); + + // Output the generated PDF to Browser (force download) + $fileName = "Fragenkatalog_".$catalogue->getFinishDate()->format('Y-m-d_H-i'); + $dompdf->stream($fileName, [ + "Attachment" => true + ]); + // NOTE: This is required, since method need a result! + exit(0); + } + + /** + * @Route("/catalogue", name="catalogue") + * + * @return \Symfony\Component\HttpFoundation\Response + * @throws \Exception + */ + public function showCatalogue() + { + $em = $this->getDoctrine()->getManager(); + + /** @var User $user */ + $user = $this->getUser(); + + /** @var Catalogue $catalogue */ + $catalogue = $user->getActiveCatalogue(); + if ($catalogue === null) { + $catalogue = $user->addNewCatalogue($em); + $em->flush(); + } + + $catalogueDetail = $catalogue->getCurrentCatalogueDetail(); + $question = $catalogueDetail->getQuestion(); + $questionType = $question->getQuestionType(); + return $this->render('pages/catalogue.html.twig', + [ + 'catalogue' => $catalogue, + 'catalogueDetail' => $catalogueDetail, + 'question' => $question, + 'questionType' => $questionType + ] + ); + } + + /** + * @Route("/catalogue-detail", name="catalogue_detail_step", methods={"GET"}) + * + * @param Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function catalogueDetail(Request $request) + { + $content = (object) $request->query->all(); + $direction = $content->direction; + if ($direction !== 'next' && $direction !== 'prev') { + return $this->json('invalid direction', 409); + } + + /** @var User $user */ + $user = $this->getUser(); + $em = $this->getDoctrine()->getManager(); + $catalogue = $user->getActiveCatalogue(); + if ($catalogue === null) { + return $this->json('Kein aktiver Fragenkatalog vorhanden', 409); + } + + $currentCatalogueDetail = $catalogue->getCurrentCatalogueDetail(); + /** @var CatalogueDetail $resCatalogueDetail */ + $resCatalogueDetail = $direction === 'next' ? $currentCatalogueDetail->getNextCatalogueDetail() : $currentCatalogueDetail->getPrevCatalogueDetail(); + if ($resCatalogueDetail === null) { + return $this->json('Katalogeintrag existiert nicht', 409); + } + $catalogue->setCurrentCatalogueDetail($resCatalogueDetail); + $em->flush(); + return $this->json( + [ + 'catalogue' => $catalogue->clientMapper(), + 'catalogueDetail' => $resCatalogueDetail->clientMapper(), + 'question' => $resCatalogueDetail->getQuestion()->clientMapper(), + ] + ); + } + + /** + * @Route("/catalogue-detail-unanswered", name="catalogue_detail_unanswered_step", methods={"GET"}) + * + * @param Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function catalogueDetailUnanswered(Request $request) + { + $content = (object) $request->query->all(); + $direction = $content->direction; + if ($direction !== 'next' && $direction !== 'prev') { + return $this->json('invalid direction', 409); + } + + /** @var User $user */ + $user = $this->getUser(); + $em = $this->getDoctrine()->getManager(); + $catalogue = $user->getActiveCatalogue(); + if ($catalogue === null) { + return $this->json('Kein aktiver Fragenkatalog vorhanden', 409); + } + + $currentCatalogueDetail = $catalogue->getCurrentCatalogueDetail(); + /** @var CatalogueDetail $tmpCatalogueDetail */ + $tmpCatalogueDetail = $direction === 'next' ? $currentCatalogueDetail->getNextCatalogueDetail() : $currentCatalogueDetail->getPrevCatalogueDetail(); + while($tmpCatalogueDetail->getId() !== $currentCatalogueDetail->getId()) { + if ($tmpCatalogueDetail->getAnswer() === null) { + $catalogue->setCurrentCatalogueDetail($tmpCatalogueDetail); + $em->flush(); + return $this->json( + [ + 'catalogue' => $catalogue->clientMapper(), + 'catalogueDetail' => $tmpCatalogueDetail->clientMapper(), + 'question' => $tmpCatalogueDetail->getQuestion()->clientMapper(), + ] + ); + } + $tmpCatalogueDetail = $direction === 'next' ? $tmpCatalogueDetail->getNextCatalogueDetail() : $tmpCatalogueDetail->getPrevCatalogueDetail(); + } + + return $this->json('Kein Eintrag gefunden', 409); + } + + /** + * @Route("/catalogue-detail", name="catalogue_detail_save", methods={"PATCH"}) + * + * @param Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function catalogueDetailSave(Request $request) + { + $content = (object) $request->request->all(); + + /** @var User $user */ + $user = $this->getUser(); + $em = $this->getDoctrine()->getManager(); + $catalogue = $user->getActiveCatalogue(); + if ($catalogue === null) { + return $this->json('Kein aktiver Fragenkatalog vorhanden', 409); + } + + $currentCatalogueDetail = $catalogue->getCurrentCatalogueDetail(); + try { + $currentCatalogueDetail->setAnswer($content->answer); + } catch (\Exception $e) { + return $this->json('Invalide Antwort', 409); + } + + $currentCatalogueDetail->setNote($content->note); + $em->flush(); + + return $this->json( + [ + 'success' => true, + 'catalogue' => $catalogue->clientMapper(), + ] + ); + } + + /** + * @Route("/catalogue-finish", name="catalogue_finish", methods={"PATCH"}) + * + * @param Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function finishCatalog() + { + /** @var User $user */ + $user = $this->getUser(); + $em = $this->getDoctrine()->getManager(); + $catalogue = $user->getActiveCatalogue(); + if ($catalogue === null) { + return $this->json('Kein aktiver Fragenkatalog vorhanden', 409); + } + + try { + $catalogue->setFinished(); + } catch (\Exception $e) { + return $this->json('Nicht alle Fragen beantwortet', 409); + } + $em->flush(); + return $this->json(true); + } + + /** + * @Route("/catalogue-finished", name="catalogue_finished", methods={"GET"}) + * + * @param Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function finishedCatalog() + { + /** @var User $user */ + $user = $this->getUser(); + + $catalogues = $user->getCatalogues(); + $numFinishedCatalogues = 0; + /** @var Catalogue $catalogue */ + foreach ($catalogues as $catalogue) { + $numFinishedCatalogues += $catalogue->getFinished() ? 1 : 0; + } + + return $this->render('pages/catalogue_finished.html.twig', + [ + 'remainingCatalogues' => $user->getMaxCatalogues() - $numFinishedCatalogues, + 'remainingDays' => $userExpiryDays = (new \DateTime('now'))->diff($user->getValidUntilDate())->days + ] + ); + } + + /** + * @Route("/legal-page", name="legal_page", methods={"GET"}) + */ + public function legalPage() + { + return $this->render('pages/legal.html.twig', []); + } + + /** + * @Route("/accept-legal-terms", name="accept_legal_terms", methods={"GET"}) + */ + public function acceptlegalTerms() + { + /** @var User $user */ + $user = $this->getUser(); + if ($user) { + $user->setAcceptedLegal(true); + $user->setAcceptedTerms(true); + $this->getDoctrine()->getManager()->flush(); + return $this->redirectToRoute('start'); + } + return $this->redirectToRoute('index'); + } +} \ No newline at end of file diff --git a/httpdocs/src/DataFixtures/AppFixtures.php b/httpdocs/src/DataFixtures/AppFixtures.php new file mode 100644 index 0000000..49f0b83 --- /dev/null +++ b/httpdocs/src/DataFixtures/AppFixtures.php @@ -0,0 +1,56 @@ +persist($userTypeSystem); + + $userTypeAdmin = new UserType('admin'); + $manager->persist($userTypeAdmin); + + $userTypeUser = new UserType('user'); + $manager->persist($userTypeUser); + $manager->flush(); + + $system = new User($manager, $userTypeSystem, 're@spawntree.de', 'System', 'System', "uAL4EX75HW6U"); + $manager->persist($system); + $manager->flush(); + + $admin = new User($manager, $userTypeAdmin, 'd.knudsen@spawntree.de', 'Daniel', 'Knudsen', "O3lT7E2bL1JG", $system); + $manager->persist($admin); + $manager->flush(); + + $admin = new User($manager, $userTypeAdmin, 'f.eisenmenger@spawntree.de', 'Florian', 'Eisenmenger', "eS463G5LWnrN", $system); + $manager->persist($admin); + $manager->flush(); + + $admin = new User($manager, $userTypeAdmin, 'office@RealFM.de', 'Roald', 'Niederlein', "5fSBM760JIvL", $system); + $manager->persist($admin); + $manager->flush(); + + $questionType = new QuestionType('Rahmenbedingungen'); + $manager->persist($questionType); + + $questionType = new QuestionType('Prozesse inkl. Datenmanagement'); + $manager->persist($questionType); + + $questionType = new QuestionType('Mensch'); + $manager->persist($questionType); + + $questionType = new QuestionType('Technologie inkl. Datenaustausch'); + $manager->persist($questionType); + $manager->flush(); + } + +} diff --git a/httpdocs/src/Entity/.gitignore b/httpdocs/src/Entity/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/httpdocs/src/Entity/Catalogue.php b/httpdocs/src/Entity/Catalogue.php new file mode 100644 index 0000000..29c6671 --- /dev/null +++ b/httpdocs/src/Entity/Catalogue.php @@ -0,0 +1,222 @@ +user = $user; + $this->finished = false; + $this->creation_date = new \DateTime('now', new \DateTimeZone('Europe/Berlin')); + $questions = $em->getRepository(Question::class)->findBy([], ['questionType' => 'ASC', 'id' => 'ASC']); + $this->numDetails = count($questions); + + $this->catalogueDetails = new ArrayCollection(); + $newCatalogueDetails = []; + $i = 1; + /** @var Question $question */ + foreach ($questions as $question) { + $newCatalogueDetails[] = new CatalogueDetail($question, $i); + $i++; + } + + $i = 0; + $cntDetails = count($newCatalogueDetails); + /** @var CatalogueDetail $newCatalogueDetail */ + foreach ($newCatalogueDetails as $newCatalogueDetail) { + if ($i === 0) { + // First element, set last element as previous + $this->currentCatalogueDetail = $newCatalogueDetail; + $newCatalogueDetail->setPrevCatalogueDetail($newCatalogueDetails[$cntDetails-1]); + } + if ($i > 0) { + $newCatalogueDetail->setPrevCatalogueDetail($newCatalogueDetails[$i-1]); + } + if ($i < ($cntDetails - 1)) { + $newCatalogueDetail->setNextCatalogueDetail($newCatalogueDetails[$i+1]); + } + if ($i === ($cntDetails - 1)) { + // First element, set first element as next + $newCatalogueDetail->setNextCatalogueDetail($newCatalogueDetails[0]); + } + $this->catalogueDetails->add($newCatalogueDetail); + $newCatalogueDetail->setCatalogue($this); + $i++; + } + } + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } + + /** + * @return mixed + */ + public function getUser() + { + return $this->user; + } + + /** + * @return PersistentCollection + */ + public function getCatalogueDetails(): Collection + { + return $this->catalogueDetails; + } + + /** + * @param Collection $catalogueDetails + */ + public function setCatalogueDetails(Collection $catalogueDetails): void + { + $this->catalogueDetails = $catalogueDetails; + } + + /** + * @return CatalogueDetail + */ + public function getCurrentCatalogueDetail(): CatalogueDetail + { + return $this->currentCatalogueDetail; + } + + /** + * @param CatalogueDetail $currentCatalogueDetail + */ + public function setCurrentCatalogueDetail(CatalogueDetail $currentCatalogueDetail): void + { + $this->currentCatalogueDetail = $currentCatalogueDetail; + } + + /** + * @return mixed + */ + public function getNumDetails() + { + return $this->numDetails; + } + + /** + * @param mixed $numDetails + */ + public function setNumDetails($numDetails): void + { + $this->numDetails = $numDetails; + } + + /** + * @return false + */ + public function getFinished(): bool + { + return $this->finished; + } + + /** + * @throws \Exception + */ + public function setFinished(): void + { + if ($this->getNumAnswers() !== $this->numDetails) { + throw new \Exception('catalogue not finishable'); + } + $this->finish_date = new \DateTime(); + $this->finished = true; + } + + /** + * @return mixed + */ + public function getFinishDate() + { + return $this->finish_date; + } + + /** + * @return \DateTime + */ + public function getCreationDate(): \DateTime + { + return $this->creation_date; + } + + public function getNumAnswers() + { + $numAnswers = 0; + /** @var CatalogueDetail $catalogueDetail */ + foreach ($this->catalogueDetails as $catalogueDetail) { + $numAnswers += $catalogueDetail->getAnswer() !== null ? 1 : 0; + } + return $numAnswers; + } + + public function clientMapper() + { + return [ + 'numAnswers' => $this->getNumAnswers(), + 'numDetails' => $this->numDetails, + ]; + } +} diff --git a/httpdocs/src/Entity/CatalogueDetail.php b/httpdocs/src/Entity/CatalogueDetail.php new file mode 100644 index 0000000..9a3e2de --- /dev/null +++ b/httpdocs/src/Entity/CatalogueDetail.php @@ -0,0 +1,214 @@ + 1, self::ANSWER_WIDELY_FULFILLED => 0.66, self::ANSWER_PARTLY_FULFILLED => 0.33, self::ANSWER_NOT_FULFILLED => 0, self::ANSWER_IRRELEVANT => 0, + ); + + /** + * @ORM\Id() + * @ORM\GeneratedValue() + * @ORM\Column(type="integer") + */ + protected $id; + + /** + * @ORM\ManyToOne(targetEntity="Catalogue", inversedBy="catalogueDetails") + * @ORM\JoinColumn(name="catalogue_id", referencedColumnName="id", onDelete="SET NULL") + */ + protected $catalogue; + + /** + * @ORM\ManyToOne(targetEntity="CatalogueDetail") + * @ORM\JoinColumn(name="prev_catalogue_detail", referencedColumnName="id", onDelete="SET NULL") + */ + protected $prevCatalogueDetail; + + /** + * @ORM\ManyToOne(targetEntity="CatalogueDetail") + * @ORM\JoinColumn(name="next_catalogue_detail", referencedColumnName="id", onDelete="SET NULL") + */ + protected $nextCatalogueDetail; + + /** + * @ORM\ManyToOne(targetEntity="Question") + * @ORM\JoinColumn(name="question", referencedColumnName="id") + */ + protected $question; + + /** + * @ORM\Column(name="answer", type="string", columnDefinition="enum('fulfilled', 'not_fulfilled', 'partly_fulfilled', 'widely_fulfilled', 'irrelevant')", nullable=true) + */ + protected $answer; + + /** + * @ORM\Column(type="smallint", nullable=false, options={"unsigned" = true}) + */ + protected $orderNo; + + /** + * @ORM\Column(type="text", nullable=true) + */ + protected $note; + + /** + * CatalogueDetail constructor. + * @param Question $question + * @param $orderNo + * @param CatalogueDetail|null $prevCatalogueDetail + * @param CatalogueDetail|null $nextCatalogueDetail + */ + public function __construct(Question $question, $orderNo) + { + $this->question = $question; + $this->orderNo = $orderNo; + } + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } + + /** + * @return mixed + */ + public function getCatalogue() + { + return $this->catalogue; + } + + /** + * @param mixed $catalogue + */ + public function setCatalogue($catalogue): void + { + $this->catalogue = $catalogue; + } + + /** + * @return mixed + */ + public function getPrevCatalogueDetail() + { + return $this->prevCatalogueDetail; + } + + /** + * @param mixed $prevCatalogueDetail + */ + public function setPrevCatalogueDetail($prevCatalogueDetail): void + { + $this->prevCatalogueDetail = $prevCatalogueDetail; + } + + /** + * @return mixed + */ + public function getNextCatalogueDetail() + { + return $this->nextCatalogueDetail; + } + + /** + * @param mixed $nextCatalogueDetail + */ + public function setNextCatalogueDetail($nextCatalogueDetail): void + { + $this->nextCatalogueDetail = $nextCatalogueDetail; + } + + /** + * @return Question + */ + public function getQuestion(): Question + { + return $this->question; + } + + /** + * @param Question $question + */ + public function setQuestion(Question $question): void + { + $this->question = $question; + } + + /** + * @return mixed + */ + public function getAnswer() + { + return $this->answer; + } + + /** + * @param mixed $answer + */ + public function setAnswer($answer): void + { + if (!array_key_exists($answer, self::$validAnswers)) { + throw new \Exception('invalid answer'); + } + $this->answer = $answer; + + } + + /** + * @return mixed + */ + public function getOrderNo() + { + return $this->orderNo; + } + + /** + * @param mixed $orderNo + */ + public function setOrderNo($orderNo): void + { + $this->orderNo = $orderNo; + } + + /** + * @return mixed + */ + public function getNote() + { + return $this->note; + } + + /** + * @param mixed $note + */ + public function setNote($note): void + { + $this->note = $note; + } + + public function clientMapper() + { + return [ + 'answer' => $this->answer, + 'orderNo' => $this->orderNo, + 'note' => $this->note + ]; + } +} diff --git a/httpdocs/src/Entity/DinAsset.php b/httpdocs/src/Entity/DinAsset.php new file mode 100644 index 0000000..bd799b4 --- /dev/null +++ b/httpdocs/src/Entity/DinAsset.php @@ -0,0 +1,106 @@ +id; + } + + /** + * @param mixed $id + */ + public function setId($id): void + { + $this->id = $id; + } + + /** + * @return mixed + */ + public function getDinNumber() + { + return $this->dinNumber; + } + + /** + * @param mixed $dinNumber + */ + public function setDinNumber($dinNumber): void + { + $this->dinNumber = $dinNumber; + } + + /** + * @return mixed + */ + public function getName() + { + return $this->name; + } + + /** + * @param mixed $name + */ + public function setName($name): void + { + $this->name = $name; + } + + /** + * @return mixed + */ + public function getTasks() + { + return $this->tasks; + } + + /** + * @param mixed $tasks + */ + public function setTasks($tasks): void + { + $this->tasks = $tasks; + } + + /** + * @param mixed $task + */ + public function addTask($task): void + { + $this->tasks[] = $task; + } +} diff --git a/httpdocs/src/Entity/DinAssetTask.php b/httpdocs/src/Entity/DinAssetTask.php new file mode 100644 index 0000000..ba5fc82 --- /dev/null +++ b/httpdocs/src/Entity/DinAssetTask.php @@ -0,0 +1,328 @@ +id; + } + + /** + * @return mixed + */ + public function getDinAsset() + { + return $this->dinAsset; + } + + /** + * @param mixed $dinAsset + */ + public function setDinAsset($dinAsset): void + { + $this->dinAsset = $dinAsset; + } + + /** + * @return mixed + */ + public function getDelimitation() + { + return $this->delimitation; + } + + /** + * @param mixed $delimitation + */ + public function setDelimitation($delimitation): void + { + $this->delimitation = $delimitation; + } + + /** + * @return mixed + */ + public function getTask() + { + return $this->task; + } + + /** + * @param mixed $task + */ + public function setTask($task): void + { + $this->task = $task; + } + + /** + * @return mixed + */ + public function getInspection() + { + return $this->inspection; + } + + /** + * @param mixed $inspection + */ + public function setInspection($inspection): void + { + $this->inspection = $inspection; + } + + /** + * @return mixed + */ + public function getMaintenance() + { + return $this->maintenance; + } + + /** + * @param mixed $maintenance + */ + public function setMaintenance($maintenance): void + { + $this->maintenance = $maintenance; + } + + /** + * @return mixed + */ + public function getService() + { + return $this->service; + } + + /** + * @param mixed $service + */ + public function setService($service): void + { + $this->service = $service; + } + + /** + * @return mixed + */ + public function getExpert() + { + return $this->expert; + } + + /** + * @param mixed $expert + */ + public function setExpert($expert): void + { + $this->expert = $expert; + } + + /** + * @return mixed + */ + public function getSpecialist() + { + return $this->specialist; + } + + /** + * @param mixed $specialist + */ + public function setSpecialist($specialist): void + { + $this->specialist = $specialist; + } + + /** + * @return mixed + */ + public function getSkilledPersonnel() + { + return $this->skilledPersonnel; + } + + /** + * @param mixed $skilledPersonnel + */ + public function setSkilledPersonnel($skilledPersonnel): void + { + $this->skilledPersonnel = $skilledPersonnel; + } + + /** + * @return mixed + */ + public function getNorm() + { + return $this->norm; + } + + /** + * @param mixed $norm + */ + public function setNorm($norm): void + { + $this->norm = $norm; + } + + /** + * @return mixed + */ + public function getMinMonths() + { + return $this->minMonths; + } + + /** + * @param mixed $minMonths + */ + public function setMinMonths($minMonths): void + { + $this->minMonths = $minMonths; + } + + /** + * @return mixed + */ + public function getMaxMonths() + { + return $this->maxMonths; + } + + /** + * @param mixed $maxMonths + */ + public function setMaxMonths($maxMonths): void + { + $this->maxMonths = $maxMonths; + } + + /** + * @return mixed + */ + public function getMonthRecommendedInspection() + { + return $this->monthRecommendedInspection; + } + + /** + * @param mixed $monthRecommendedInspection + */ + public function setMonthRecommendedInspection($monthRecommendedInspection): void + { + $this->monthRecommendedInspection = $monthRecommendedInspection; + } + + /** + * @return mixed + */ + public function getMonthRecommendedMaintenance() + { + return $this->monthRecommendedMaintenance; + } + + /** + * @param mixed $monthRecommendedMaintenance + */ + public function setMonthRecommendedMaintenance($monthRecommendedMaintenance): void + { + $this->monthRecommendedMaintenance = $monthRecommendedMaintenance; + } + + +} diff --git a/httpdocs/src/Entity/Question.php b/httpdocs/src/Entity/Question.php new file mode 100644 index 0000000..315856d --- /dev/null +++ b/httpdocs/src/Entity/Question.php @@ -0,0 +1,96 @@ +questionType = $questionType; + } + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } + + /** + * @return mixed + */ + public function getQuestionType() + { + return $this->questionType; + } + + /** + * @return mixed + */ + public function getQuestionText() + { + return $this->questionText; + } + + /** + * @param mixed $questionText + */ + public function setQuestionText($questionText): void + { + $this->questionText = $questionText; + } + + /** + * @return mixed + */ + public function getWeight() + { + return $this->weight; + } + + /** + * @param mixed $weight + */ + public function setWeight($weight): void + { + $this->weight = $weight; + } + + public function clientMapper() + { + return [ + 'questionType' => $this->questionType->getType(), + 'questionText' => $this->questionText, + ]; + } +} diff --git a/httpdocs/src/Entity/QuestionType.php b/httpdocs/src/Entity/QuestionType.php new file mode 100644 index 0000000..ea503db --- /dev/null +++ b/httpdocs/src/Entity/QuestionType.php @@ -0,0 +1,151 @@ + [ + self::RES_A => 'Sie haben keines der Kriterien in diesem Handlungsfeld als relevant für Ihre Organisation eingestuft!', + self::RES_B => 'Die benötigten Rahmenbedingungen (organisatorische, strategische, vertragliche bzw. finanzielle Voraussetzungen) sind nicht gegeben.', + self::RES_C => 'Die benötigten Rahmenbedingungen (organisatorische, strategische, vertragliche bzw. finanzielle Voraussetzungen) sind teilweise gegeben.', + self::RES_D => 'Die benötigten Rahmenbedingungen (organisatorische, strategische, vertragliche bzw. finanzielle Voraussetzungen) sind weitgehend gegeben.', + self::RES_E => 'Die benötigten Rahmenbedingungen (organisatorische, strategische, vertragliche bzw. finanzielle Voraussetzungen) sind gegeben.', + ], + 2 => [ + self::RES_A => 'Sie haben keines der Kriterien in diesem Handlungsfeld als relevant für Ihre Organisation eingestuft!', + self::RES_B => 'Die notwendigen Abläufe sind nicht geregelt.', + self::RES_C => 'Die notwendigen Abläufe sind teilweise geregelt.', + self::RES_D => 'Die notwendigen Abläufe sind weitgehend geregelt.', + self::RES_E => 'Die notwendigen Abläufe sind geregelt.', + ], + 3 => [ + self::RES_A => 'Sie haben keines der Kriterien in diesem Handlungsfeld als relevant für Ihre Organisation eingestuft!', + self::RES_B => 'Die erforderlichen personellen Ressourcen sind nicht vorhanden.', + self::RES_C => 'Die erforderlichen personellen Ressourcen sind teilweise vorhanden.', + self::RES_D => 'Die erforderlichen personellen Ressourcen sind weitgehend vorhanden.', + self::RES_E => 'Die erforderlichen personellen Ressourcen sind vorhanden.', + ], + 4 => [ + self::RES_A => 'Sie haben keines der Kriterien in diesem Handlungsfeld als relevant für Ihre Organisation eingestuft!', + self::RES_B => 'Die erforderlichen technischen Voraussetzungen sind nicht erfüllt.', + self::RES_C => 'Die erforderlichen technischen Voraussetzungen sind teilweise erfüllt.', + self::RES_D => 'Die erforderlichen technischen Voraussetzungen sind weitgehend erfüllt.', + self::RES_E => 'Die erforderlichen technischen Voraussetzungen sind erfüllt.', + ] + ]; + + // Text for actions of result pdf per category id + public static $txtActionPerType = [ + 1 => [ + self::RES_A => 'Überprüfen Sie bitte Ihre Antworten. Es ist sehr unwahrscheinlich, dass keines der Kriterien in diesem Handlungsfeld für Ihre Organisation relevant ist.', + self::RES_B => 'Soweit noch nicht geschehen, definieren Sie die für Ihre Organisation relevanten Anwendungsfälle und ermitteln Sie den Mehrwert sowie den Aufwand einer Einführung/Anwendung der BIM-Methodik.', + self::RES_C => 'Legen Sie anhand der ermittelten Mehrwerte und definierten Anwendungsfälle die BIM-Ziele und BIM-Strategie (ggf. auch BIM2FIELD und BIM2FM) für Ihre Organisation fest. Erstellen Sie eine Roadmap/ einen Aktionsplan zur schrittweisen Umsetzung der Strategie und Zielerreichung und sorgen Sie für eine Bereitstellung der für die Einführung der BIM-Methodik benötigten Finanzmittel. Berücksichtigen Sie BIM-spezifische Aufgaben in Ihrer Aufbauorganisation. Definieren Sie die übergeordneten (Organisations- und Asset-bezogenen) sowie projektspezifischen Informationsanforderungen und erstellen Sie BIM-spezifische vertragliche Regelungen oder Vertragsdokumente. ', + self::RES_D => 'Evaluieren Sie die Wirksamkeit durchgeführter Maßnahmen aus der Roadmap/des Aktionsplans zur Einführung der BIM-Methodik (wie die Anpassung der Aufbauorganisation, das Definieren von Informationsanforderungen, Regelungen in Verträgen, das Bereitstellen finanzieller Ressourcen). Schließen Sie identifizierte Lücken in der Roadmap und klären Sie ggf. aufgetretene Widersprüche. Sammeln und analysieren Sie Erfahrungen, indem Sie z. B. Pilotprojekte durchführen.', + self::RES_E => 'Überprüfen Sie, inwieweit Sie die mit der Anwendung der BIM-Methodik verknüpften Ziele bereits erreicht haben. Schließen Sie eventuell noch vorhandene Lücken in der Roadmap und initiieren Sie auf Basis von in durchgeführten Pilotprojekten gewonnenen lessons learned zusätzliche Verbesserungsmaßnahmen.', + ], + 2 => [ + self::RES_A => 'Überprüfen Sie bitte Ihre Antworten. Es ist sehr unwahrscheinlich, dass keines der Kriterien in diesem Handlungsfeld für Ihre Organisation relevant ist.', + self::RES_B => 'Regeln Sie zunächst die zugehörigen elementaren Prozesse vor allem (zunächst) zur Koordination der verschiedenen Fachdisziplinen/-bereiche mit Ihren separaten IT-Systemen im Planen, Bauen und Betreiben. Legen Sie auch die Grundlagen zur Lenkung dokumentierter Informationen (Daten, Modelle und Dokumente und deren Austausch in Papierform oder als elektronische Dokumente) und der Kommunikation fest.', + self::RES_C => 'Überarbeiten Sie die vorhandenen Prozessbeschreibungen für das Planen, Bauen und Betreiben hinsichtlich der Unterstützung durch die IT-Systeme und der Lenkung dokumentierter Informationen bei einer objektbasierten Modellierung (Daten, Modelle und Dokumente in 2D und/oder 3D) sowie den Austausch zwischen den Systemen. Standardisieren Sie dazu die Datenstrukturen und -formate (Klassifizierung und Attributierung von Objekten sowie deren Beziehungen/Hierarchien zur Vererbung, Austauschformate) für Ihre Organisation. Ergänzen Sie auch noch fehlende Ablaufregelungen.', + self::RES_D => 'Überprüfen Sie die Regelungen für Prozesse des Planens, Bauens und Betreibens sowie deren Umsetzung und die Unterstützung der Workflows durch IT-Systeme. Treffen bzw. konkretisieren Sie dabei Festlegungen zur Prüfung und Koordination von Daten und Modellen, zur Ermittlung von Herstell- und Nutzungskosten, zum geforderten Informationsgehalt an Meilensteinen und beim FM-Handover, zum Umfang der zu pflegenden Bestands- und Prozessdaten sowie betriebsrelevanter Dokumente und zu Eignungskriterien für externe Partner sowie zum Frontloading durch Betreiber/Nutzer. Stellen Sie in bereits vorhandenen Insellösungen für Fachgebiete bzw. Fachbereiche eine vollständige modellbasierte Kooperation in einer 3D-Umgebung über proprietäre Schnittstellen bzw. Middleware sicher. Passen Sie die Richtlinien zur Lenkung dokumentierter Informationen (Daten, Modelle und Dokumente) an und, wenn notwendig, verfeinern Sie die Standards für Datenstrukturen und -formate (Klassifizierung und Attributierung von Objekten sowie deren Beziehungen/Hierarchien zur Vererbung, Austauschformate) für Ihre Organisation. Ergänzen Sie auch ggf. noch fehlende Ablaufregelungen.', + self::RES_E => 'Überprüfen Sie, ob die BIM-Methodik in allen definierten Anwendungsfällen wie vorgesehen (auch über 3D hinaus) angewendet wird und dieses auch in der interdisziplinären Zusammenarbeit und Lebenszyklusphasen-übergreifend erfolgt. Überwachen Sie die Erreichung der BIM-Ziele durch Festlegen und Messen von Kennzahlen (KPI).', + ], + 3 => [ + self::RES_A => 'Überprüfen Sie bitte Ihre Antworten. Es ist sehr unwahrscheinlich, dass keines der Kriterien in diesem Handlungsfeld für Ihre Organisation relevant ist.', + self::RES_B => 'Beschreiben Sie die Rollen/Funktionen und deren grundsätzlichen Verantwortlichkeiten in den elementaren Prozessen. Ermitteln Sie die benötigten Qualifikationen interner und externer Prozessbeteiligter zur Einführung sowie Anwendung der BIM-Methodik und gleichen Sie diese mit den vorhandenen ab. Beginnen Sie mit der Planung notwendiger Qualifizierungsmaßnahmen.', + self::RES_C => 'Legen Sie zunächst die für die - projekt- sowie prozessspezifisch - wahrzunehmenden Aufgaben grundsätzlich verantwortlichen und rechenschaftspflichtigen Rollen/Funktionen fest. Delegieren Sie die Verantwortlichkeiten an bereits für die Organisation tätige Personen und statten Sie diese mit den entsprechend notwendigen Kompetenzen aus. Bemessen Sie zu den ermittelten Qualifikationen nun die erforderlichen personellen Kapazitäten zur Einführung und Anwendung der BIM-Methodik. Planen Sie Rekrutierungs- und weitere Qualifizierungsmaßnahmen und beginnen Sie mit deren Umsetzung.', + self::RES_D => 'Legen Sie nach den verantwortlichen und rechenschaftspflichtigen Rollen/Funktionen für die wahrzunehmenden Aufgaben in der Aufbauorganisation und in Projekten nun auch die zu konsultierenden und informierenden fest. Konkretisieren Sie diesbezüglich Funktions-/Stellenbeschreibungen, aber auch Leistungsbeschreibungen und Auswahlkriterien für externe Prozessbeteiligte. Sorgen Sie für eine Umsetzung der geplanten Qualifizierungs- und Rekrutierungsmaßnahmen.', + self::RES_E => 'Detaillieren Sie, soweit notwendig, die für die grundsätzlich in der Aufbauorganisation und in Projekten wahrzunehmenden Aufgaben getroffenen Festlegungen von verantwortlichen, rechenschaftspflichtigen, zu konsultierenden und informierenden Rollen/Funktionen für durchzuführende Tätigkeiten. Überprüfen Sie die Wirksamkeit durchgeführter Qualifizierungsmaßnahmen, die Eignung rekrutierten Personals sowie die Leistung externer Prozessbeteiligter.', + ], + 4 => [ + self::RES_A => 'Überprüfen Sie bitte Ihre Antworten. Es ist sehr unwahrscheinlich, dass keines der Kriterien in diesem Handlungsfeld für Ihre Organisation relevant ist.', + self::RES_B => 'Erfassen Sie die in den Fachdisziplinen/-bereichen vorhandenen, separaten IT-Systeme und wofür Sie derzeit bei den relevanten Prozessen angewendet werden. Überprüfen Sie auch die Möglichkeiten des Datenaustauschs über Ex-/Import und vorhandene Schnittstellen sowie die Voraussetzungen für die Bereitstellung von Kollaborationsplattformen durch Ihre Organisation und die Zugriffsmöglichkeiten darauf durch externe Prozessbeteiligte. Bewerten Sie die Eignung der vorhandenen IT-Infrastruktur für eine Anwendung der BIM-Methodik und ermitteln Sie den Bedarf an zusätzlicher Hard- und Software für die - zeitnah und perspektivisch - in Eigenleistung zu erbringenden Aufgaben sowie ergänzender externer Services.', + self::RES_C => 'Beschaffen Sie schrittweise die als erforderlich ermittelte Hard- und Software zur IT-Unterstützung der verschiedenen BIM-Anwendungsfälle im Betrieb und in Projekten, entsprechend der zeitnah und perspektivisch in Eigenleistung zu erbringenden Aufgaben. Stellen Sie eine für die Kollaboration bei einer objektbasierten Modellierung geeignete gemeinsame Datenumgebung bereit und gewährleisten Sie den notwendigen Datenaustausch mittels Ex-/Import, Schnittstellen bzw. Collaboration-Tools sowie eine ordnungsgemäße Datensicherung.', + self::RES_D => 'Stellen Sie mit den bereits in Fachgebieten/-bereichen vorhandenen Insellösungen eine vollständige modellbasierte Kooperation in einer 3D-Umgebung über Schnittstellen bzw. Middleware sicher. Überprüfen Sie, ob die gemeinsame Datenumgebung den Spezifikationen entspricht und hinterfragen Sie, ob die Zugriffs- und Auswertungsmöglichkeiten und der Informationsgehalt für die internen und externen Anwender zur Wahrnehmung ihrer Aufgaben ausreichend sind, insbesondere an den verschiedenen Meilensteinen und Datenübergabepunkten. Ermitteln Sie den erforderlichen zusätzlichen Bedarf an Hard- und Software sowie externer Services, sowohl für eventuell noch nicht abgedeckte Anwendungsfälle als auch für eine vollständige netzwerkbasierte Integration und zentralisierte Datenhaltung.', + self::RES_E => 'Überführen Sie noch in Fachgebieten/-bereichen vorhandene Insellösungen in eine integrierte, netzwerkbasierte IT-Landschaft mit zentralisierter und strukturierter Datenhaltung auf Organisations-, Asset- und Projektebene. Überprüfen Sie, ob die Zugriffs- und Auswertungsmöglichkeiten und der Informationsgehalt für alle internen und externen Anwender zur Wahrnehmung ihrer Aufgaben ausreichend sind, insbesondere an den verschiedenen Meilensteinen und Datenübergabepunkten. Stellen Sie bei Datenaustausch und Zusammenarbeit möglichst von proprietären auf herstellerneutrale Schnittstellen sowie IFC/IFD-konforme Webservices und spezielle Modelserver um.', + ] + ]; + + public static $txtResultTotal = [ + self::RES_A => 'Sie haben keine einzige Frage als relevant für Ihre Organisation eingestuft!', + self::RES_B => 'Die Voraussetzungen für eine Anwendung der BIM-Methodik in Ihrer Organisation sind offenbar noch nicht erfüllt, auch wenn bereits Maßnahmen dazu initiiert wurden. Der Reifegrad Ihrer Organisation ist noch als "Pre-BIM" zu bezeichnen.', + self::RES_C => 'Die Voraussetzungen für die Anwendung der BIM-Methodik sind offenbar nur in einigen Teilbereichen Ihrer Organisation erfüllt, die Aufbau- und Ablauforganisation nur hierfür definiert. Der Reifegrad Ihrer Organisation erlaubt eine "objektbasierte Modellierung".', + self::RES_D => 'Die BIM-Methodik ist in Ihrer Organisation eingeführt, die Voraussetzungen für eine gelenkte Anwendung sind weitgehend erfüllt. Der Reifegrad Ihrer Organisation entspricht dem einer "modellbasierten Kooperation" oder auch "pBIM" bzw. "little BIM".', + self::RES_E => 'Die BIM-Methodik ist anscheinend in Ihrer Organisation integriert, die Voraussetzungen für eine umfängliche Anwendung ist grundsätzlich erfüllt. Der Reifegrad Ihrer Organisation entspricht dem einer "netzwerkbasierten Integration" oder auch "iBIM" bzw. "big BIM".', + ]; + + public static $txtActionTotal = [ + self::RES_A => 'Überprüfen Sie bitte Ihre Antworten. Da kann was nicht stimmen!', + self::RES_B => 'Das Erreichen der nächst höheren Reifestufe (objektbasierte Modellierung) erfordert fundamentale und dauerhafte Änderungen oder auch „Transformationen“ in Ihrer Organisation. Diese Veränderungen erfolgen in der Regel aber nicht auf einen Schlag, sondern in Form von Schritten, die verschiedenen Handlungsfeldern zugeordnet werden können. Hinweise, welche grundlegenden Voraussetzungen für eine Einführung der BIM-Methodik zu schaffen sind, sind aus den Ergebnissen in den einzelnen Handlungsfeldern abzulesen.', + self::RES_C => 'Das Erreichen der nächst höheren Reifestufe (modellbasierte Kooperation oder auch pBIM bzw. little BIM) erfordert fundamentale und dauerhafte Änderungen oder auch „Transformationen“ in Ihrer Organisation. Diese Veränderungen erfolgen in der Regel aber nicht auf einen Schlag, sondern in Form von Schritten, die verschiedenen Handlungsfeldern zugeordnet werden können. Hinweise, welche Voraussetzungen für eine Anwendung der BIM-Methodik noch zu schaffen sind, sind aus den Ergebnissen in den einzelnen Handlungsfeldern abzulesen.', + self::RES_D => 'Das Erreichen der nächst höheren Reifestufe (vollständige Integration oder auch "iBIM" bzw. "bigBIM") erfordert noch einige fundamentale und dauerhafte Änderungen oder auch „Transformationen“ in Ihrer Organisation. Diese Veränderungen erfolgen in der Regel aber nicht auf einen Schlag, sondern in Form von Schritten, die verschiedenen Handlungsfeldern zugeordnet werden können. Hinweise auf dazu notwendige Schritte sind aus den Ergebnissen in den einzelnen Handlungsfeldern abzulesen.', + self::RES_E => 'Hinweise auf eventuell noch notwendige Schritte zu einer vollständigen Integration der BIM-Methodik in Ihrer Organisation sind aus den Ergebnissen in den einzelnen Handlungsfeldern abzulesen.', + ]; + + + /** + * @ORM\Id() + * @ORM\GeneratedValue() + * @ORM\Column(type="integer") + */ + protected $id; + + /** + * @ORM\Column(name="type", type="string", length=191, nullable=false, unique=true) + */ + protected $type; + + + public function __construct($type) + { + $this->type = $type; + } + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } + + /** + * @return mixed + */ + public function getType() + { + return $this->type; + } + + public static function getResultCategoryTextIdentifier($percentage, $count) + { + if ($count === 0) { + return self::RES_A; + } + if ($percentage < 50) { + return self::RES_B; + } + if ($percentage < 67) { + return self::RES_C; + } + if ($percentage < 81) { + return self::RES_D; + } + return self::RES_E; + } +} diff --git a/httpdocs/src/Entity/User.php b/httpdocs/src/Entity/User.php new file mode 100644 index 0000000..222ad9f --- /dev/null +++ b/httpdocs/src/Entity/User.php @@ -0,0 +1,758 @@ +getType() === UserTypeRepository::USER_TYPE_SYSTEM) { + $systemUser = $em->getRepository(self::class)->findBy(['userType' => $userType]); + if (!empty($systemUser)) { + throw new Exception('system user already exists'); + } + } + $this->setUserType($userType, $editingUser); + + // Check password length + if (!Utils::isValidPasswordLength($password)) { + throw new Exception('invalid password length'); + } + + $this->email = $email; + $this->firstname = $firstName; + $this->lastname = $lastName; + $this->setPassword($password); + $this->active = true; + $this->creationUser = $editingUser; + $this->maxCatalogues = self::MAX_CATALOGUES_PER_USER; + $this->creation_date = new \DateTime('now', new \DateTimeZone('Europe/Berlin')); + $this->acceptedTerms = false; + $this->acceptedLegal = false; + + if ($userType->getType() === UserTypeRepository::USER_TYPE_USER) { + $this->valid_until_date = new \DateTime('now', new \DateTimeZone('Europe/Berlin')); + $this->valid_until_date->modify('+3 year'); + } + } + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } + + /** + * @return mixed + */ + public function getEmail() + { + return $this->email; + } + + /** + * @return mixed + */ + public function getUserType() + { + return $this->userType; + } + + /** + * @return mixed + */ + public function getFirstname() + { + return $this->firstname; + } + + /** + * @return mixed + */ + public function getLastname() + { + return $this->lastname; + } + + /** + * @return mixed + */ + public function getCatalogues() + { + return $this->catalogues; + } + + + public function addNewCatalogue(ObjectManager $em) + { + if (!$this->isActive()) { + throw new \Exception('user inactive'); + } + + if (count($this->catalogues) >= $this->getMaxCatalogues()) { + throw new \Exception('max number of catalogues reached'); + } + + foreach ($this->catalogues as $catalogue) { + if (!$catalogue->getFinished()) { + throw new \Exception('active catalogue exists'); + } + } + $newCatalogue = new Catalogue($em, $this); + $this->catalogues[] = new Catalogue($em, $this); + return $newCatalogue; + } + + public function getActiveCatalogue() + { + /** @var Catalogue $catalogue */ + foreach ($this->catalogues as $catalogue) { + if (!$catalogue->getFinished()) { + return $catalogue; + } + } + return null; + } + + /** + * @return int + */ + public function getMaxCatalogues(): int + { + return $this->maxCatalogues; + } + + /** + * @param int $maxCatalogues + */ + public function setMaxCatalogues(int $maxCatalogues): void + { + $this->maxCatalogues = $maxCatalogues; + } + + /** + * @return User|null + */ + public function getCreationUser(): ?User + { + return $this->creationUser; + } + + /** + * @return mixed + */ + public function getCompany() + { + return $this->company; + } + + /** + * @param mixed $company + */ + public function setCompany($company): void + { + $this->company = $company; + } + + /** + * @return mixed + */ + public function getDepartment() + { + return $this->department; + } + + /** + * @param mixed $department + */ + public function setDepartment($department): void + { + $this->department = $department; + } + + /** + * @return mixed + */ + public function getOccupation() + { + return $this->occupation; + } + + /** + * @param mixed $occupation + */ + public function setOccupation($occupation): void + { + $this->occupation = $occupation; + } + + /** + * @return mixed + */ + public function getIndustry() + { + return $this->industry; + } + + /** + * @param mixed $industry + */ + public function setIndustry($industry): void + { + $this->industry = $industry; + } + + /** + * @return mixed + */ + public function getOrganisationUnit() + { + return $this->organisationUnit; + } + + /** + * @param mixed $organisationUnit + */ + public function setOrganisationUnit($organisationUnit): void + { + $this->organisationUnit = $organisationUnit; + } + + /** + * @return mixed + */ + public function getPhoneNo() + { + return $this->phoneNo; + } + + /** + * @param mixed $phoneNo + */ + public function setPhoneNo($phoneNo): void + { + $this->phoneNo = $phoneNo; + } + + /** + * @return mixed + */ + public function getInvoiceRecipient() + { + return $this->invoiceRecipient; + } + + /** + * @param mixed $invoiceRecipient + */ + public function setInvoiceRecipient($invoiceRecipient): void + { + $this->invoiceRecipient = $invoiceRecipient; + } + + /** + * @return mixed + */ + public function getInvoiceDepartment() + { + return $this->invoiceDepartment; + } + + /** + * @param mixed $invoiceDepartment + */ + public function setInvoiceDepartment($invoiceDepartment): void + { + $this->invoiceDepartment = $invoiceDepartment; + } + + /** + * @return mixed + */ + public function getInvoiceStreet() + { + return $this->invoiceStreet; + } + + /** + * @param mixed $invoiceStreet + */ + public function setInvoiceStreet($invoiceStreet): void + { + $this->invoiceStreet = $invoiceStreet; + } + + /** + * @return mixed + */ + public function getInvoiceZip() + { + return $this->invoiceZip; + } + + /** + * @param mixed $invoiceZip + */ + public function setInvoiceZip($invoiceZip): void + { + $this->invoiceZip = $invoiceZip; + } + + /** + * @return mixed + */ + public function getInvoiceCity() + { + return $this->invoiceCity; + } + + /** + * @param mixed $invoiceCity + */ + public function setInvoiceCity($invoiceCity): void + { + $this->invoiceCity = $invoiceCity; + } + + /** + * @return mixed + */ + public function getOrderNo() + { + return $this->orderNo; + } + + /** + * @param mixed $orderNo + */ + public function setOrderNo($orderNo): void + { + $this->orderNo = $orderNo; + } + + /** + * @return mixed + */ + public function getCostCenter() + { + return $this->costCenter; + } + + /** + * @param mixed $costCenter + */ + public function setCostCenter($costCenter): void + { + $this->costCenter = $costCenter; + } + + /** + * @return mixed + */ + public function getPassword() + { + return $this->password; + } + + /** + * @return bool + */ + public function isActive(): bool + { + return $this->active; + } + + /** + * @return mixed + */ + public function getCreationDate() + { + return $this->creation_date; + } + + /** + * @return \DateTime + */ + public function getValidUntilDate(): ?\DateTime + { + return $this->valid_until_date; + } + + /** + * Returns username as part of UserInterface needed in Symfony + * @return string + */ + public function getUsername() + { + return $this->email; + } + + /** + * Returns roles as part of UserInterface needed in Symfony + * @return array + */ + public function getRoles() + { + return UserTypeRepository::getUserRoles($this->userType); + } + + /** + * Erases credentials as part of UserInterface needed in Symfony + */ + public function eraseCredentials() {} + + /** + * Checks password as part of UserInterface needed in Symfony + * @param $password + * @return bool + */ + public function checkPassword($password) + { + return $this->active && password_verify($password, $this->password); + } + + /** + * Returns salt as part of UserInterface needed in Symfony + * @return null|string|void + */ + public function getSalt() {} + + /** + * @param UserType $userType + * @param User|null $editingUser + */ + public function setUserType(UserType $userType, User $editingUser = null): void + { + if ($userType->getType() !== UserTypeRepository::USER_TYPE_SYSTEM) { + if ($editingUser === null) { + throw new Exception('editing user required'); + } + + if (!UserTypeRepository::isHigherUserType($editingUser->getUserType(), $userType)) { + throw new Exception('creating user has not enough rights to create this user type'); + } + } + $this->userType = $userType; + } + + /** + * Sets email with check on validity and existence + * @param ObjectManager $em + * @param $email + */ + public function setEmail(ObjectManager $em, $email) + { + if ($email != $this->email) { + if (!Utils::validateEmail($em, $email)) { + throw new Exception('email is invalid or already exists: '.$email); + } + $this->email = $email; + } + } + + /** + * @param bool|string $password + */ + public function setPassword($password): void + { + $this->password = password_hash($password, PASSWORD_BCRYPT, ["cost" => self::CRYPT_COST]); + } + + /** + * @param bool $active + */ + public function setActive(bool $active): void + { + $this->active = $active; + } + + /** + * @param \DateTime $valid_until_date + */ + public function setValidUntilDate(?\DateTime $valid_until_date): void + { + $this->valid_until_date = $valid_until_date; + } + + /** + * @param mixed $lastname + */ + public function setLastname($lastname): void + { + $this->lastname = $lastname; + } + + /** + * @param string $firstname + * @return User + */ + public function setFirstname(string $firstname): self + { + $this->firstname = $firstname; + + return $this; + } + + /** + * @param bool $visible + */ + public function setVisible(bool $visible): void + { + $this->visible = $visible; + } + + /** + * @return mixed + */ + public function getAcceptedTerms() + { + return $this->acceptedTerms; + } + + /** + * @param mixed $acceptedTerms + */ + public function setAcceptedTerms($acceptedTerms): void + { + $this->acceptedTerms = $acceptedTerms; + } + + /** + * @return mixed + */ + public function getAcceptedLegal() + { + return $this->acceptedLegal; + } + + /** + * @param mixed $acceptedLegal + */ + public function setAcceptedLegal($acceptedLegal): void + { + $this->acceptedLegal = $acceptedLegal; + } + + /** + * Returns whether this user is on higher user role level than given user to compare with + * @param User $compareUser + * @return bool + */ + public function isHigherUser(User $compareUser) + { + return UserTypeRepository::isHigherUserType($this->userType, $compareUser->getUserType()); + } + + + /** + * Sets client data + * @param ObjectManager $em + * @param $clientData + */ + public function setClientData(ObjectManager $em, $clientData) + { + $this->setFirstname($clientData->firstname); + $this->setLastname($clientData->lastname); + $this->setEmail($em, $clientData->email); + } + + /** + * Client mapper + * @param ObjectManager $em + * @param bool $fullMapping + * @return array + */ + public function clientMapper(ObjectManager $em, $fullMapping = false) + { + /** @var UserType $userType */ + $userType = $em->getRepository('App:UserType')->find($this->userTypeId); + + return [ + 'id' => $this->id, + 'email' => $this->email, + 'firstname' => $this->firstname, + 'lastname' => $this->lastname, + 'active' => $this->active, + 'visible' => $this->visible, + 'valid_until_date' => $this->getValidUntilDate(), + 'v_translated_role' => UserType::getTranslatedRole($this->userTypeId), + 'v_user_type' => $userType->clientMapper($em, $fullMapping), + ]; + } + +} diff --git a/httpdocs/src/Entity/UserType.php b/httpdocs/src/Entity/UserType.php new file mode 100644 index 0000000..06e548d --- /dev/null +++ b/httpdocs/src/Entity/UserType.php @@ -0,0 +1,46 @@ +type = $type; + } + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } + + /** + * @return mixed + */ + public function getType() + { + return $this->type; + } +} diff --git a/httpdocs/src/EventListener/ControllerListener.php b/httpdocs/src/EventListener/ControllerListener.php new file mode 100755 index 0000000..6cdf4e0 --- /dev/null +++ b/httpdocs/src/EventListener/ControllerListener.php @@ -0,0 +1,61 @@ +router = $router; + $this->tokenStorage = $tokenStorage; + $this->em = $em; + } + + public function onKernelRequest(RequestEvent $event) + { + $request = $event->getRequest(); + $route = $request->attributes->get('_route'); + + if ($this->tokenStorage->getToken() !== null) { + /** @var User $user */ + $user = $this->tokenStorage->getToken()->getUser(); + $isNormalUser = $user !== 'anon.' && $user->getUserType()->getType() === UserTypeRepository::USER_TYPE_USER; + + if ($isNormalUser && $route !== null && $route !== 'legal_page' && $route !== 'accept_legal_terms') { + + if (!$user->getAcceptedLegal() || !$user->getAcceptedTerms()) { + $url = $this->router->generate('legal_page'); + $response = new RedirectResponse($url); + $event->setResponse($response); + } + } + } + } + + public function onKernelException(ExceptionEvent $event) + { + + } +} \ No newline at end of file diff --git a/httpdocs/src/Kernel.php b/httpdocs/src/Kernel.php new file mode 100644 index 0000000..655e796 --- /dev/null +++ b/httpdocs/src/Kernel.php @@ -0,0 +1,38 @@ +import('../config/{packages}/*.yaml'); + $container->import('../config/{packages}/'.$this->environment.'/*.yaml'); + + if (is_file(\dirname(__DIR__).'/config/services.yaml')) { + $container->import('../config/services.yaml'); + $container->import('../config/{services}_'.$this->environment.'.yaml'); + } elseif (is_file($path = \dirname(__DIR__).'/config/services.php')) { + (require $path)($container->withPath($path), $this); + } + } + + protected function configureRoutes(RoutingConfigurator $routes): void + { + $routes->import('../config/{routes}/'.$this->environment.'/*.yaml'); + $routes->import('../config/{routes}/*.yaml'); + + if (is_file(\dirname(__DIR__).'/config/routes.yaml')) { + $routes->import('../config/routes.yaml'); + } elseif (is_file($path = \dirname(__DIR__).'/config/routes.php')) { + (require $path)($routes->withPath($path), $this); + } + } +} diff --git a/httpdocs/src/Repository/.gitignore b/httpdocs/src/Repository/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/httpdocs/src/Repository/UserRepository.php b/httpdocs/src/Repository/UserRepository.php new file mode 100644 index 0000000..16232a8 --- /dev/null +++ b/httpdocs/src/Repository/UserRepository.php @@ -0,0 +1,156 @@ +setFirstname($clientData->firstname); + $user->setLastname($clientData->lastname); + $user->setPhoneNo($clientData->phoneNo); + $user->setMaxCatalogues($clientData->maxCatalogues); + $user->setCompany($clientData->company); + $user->setDepartment($clientData->department); + $user->setOccupation($clientData->occupation); + $user->setIndustry($clientData->industry); + $user->setOrganisationUnit($clientData->organisationUnit); + $user->setInvoiceRecipient($clientData->invoiceRecipient); + $user->setInvoiceDepartment($clientData->invoiceDepartment); + $user->setInvoiceStreet($clientData->invoiceStreet); + $user->setInvoiceZip($clientData->invoiceZip); + $user->setInvoiceCity($clientData->invoiceCity); + $user->setOrderNo($clientData->orderNo); + $user->setCostCenter($clientData->costCenter); + $user->setActive($clientData->active); + $user->setValidUntilDate($clientData->validUntilDate !== '' ? \DateTime::createFromFormat('Y-m-d', $clientData->validUntilDate) : null); + return $user; + } + + /** + * Renders user catalogue + * + * @param Environment $twig + * @param Catalogue $catalogue + * @return Dompdf + * @throws \Twig\Error\LoaderError + * @throws \Twig\Error\RuntimeError + * @throws \Twig\Error\SyntaxError + */ + public static function renderCatalogue(Environment $twig, Catalogue $catalogue) + { + // Configure Dompdf according to your needs + $pdfOptions = new Options(); + $pdfOptions->set('defaultFont', 'Arial'); + $pdfOptions->set('isRemoteEnabled', true); + + // Instantiate Dompdf with our options + $dompdf = new Dompdf($pdfOptions); + $dompdf->setPaper('A4', 'portrait'); + + $result = []; + /** @var CatalogueDetail $catalogueDetail */ + foreach($catalogue->getCatalogueDetails() as $catalogueDetail) { + /** @var Question $question */ + $question = $catalogueDetail->getQuestion(); + $questionType = $question->getQuestionType(); + $questionTypeName = $questionType->getType(); + if (!array_key_exists($questionTypeName, $result)) { + $result[$questionTypeName] = [ + 'count' => 0, + 'maxPoints' => 0, + 'points' => 0, + 'countAll' => 0, + 'percentage' => 0, + 'id' => $questionType->getId(), + 'txtResult' => '', + 'txtAction' => '', + ]; + } + $answer = $catalogueDetail->getAnswer(); + $result[$questionTypeName]['countAll']++; + if ($answer !== CatalogueDetail::ANSWER_IRRELEVANT) { + $result[$questionTypeName]['maxPoints'] += $question->getWeight(); + $result[$questionTypeName]['count']++; + } + if ($answer === CatalogueDetail::ANSWER_FULFILLED || $answer === CatalogueDetail::ANSWER_PARTLY_FULFILLED || $answer === CatalogueDetail::ANSWER_WIDELY_FULFILLED) { + $result[$questionTypeName]['points'] += $question->getWeight() * CatalogueDetail::$validAnswers[$answer]; + } + } + + $total = [ + 'count' => 0, + 'maxPoints' => 0, + 'points' => 0, + 'countAll' => 0, + 'percentage' => 0, + 'txtResult' => '', + 'txtAction' => '', + ]; + foreach ($result as $qTypeName => $item) { + $percentage = $item['maxPoints'] > 0 ? ($item['points'] / $item['maxPoints'] * 100) : 0; + $result[$qTypeName]['percentage'] = $percentage; + $result[$qTypeName]['txtResult'] = QuestionType::$txtResultPerType[$item['id']][QuestionType::getResultCategoryTextIdentifier($percentage, $item['count'])]; + $result[$qTypeName]['txtAction'] = QuestionType::$txtActionPerType[$item['id']][QuestionType::getResultCategoryTextIdentifier($percentage, $item['count'])]; + $total['count'] += $item['count']; + $total['maxPoints'] += $item['maxPoints']; + $total['points'] += $item['points']; + $total['countAll'] += $item['countAll']; + } + $total['percentage'] = $total['maxPoints'] > 0 ? ($total['points'] / $total['maxPoints'] * 100) : 0; + $total['txtResult'] = QuestionType::$txtResultTotal[QuestionType::getResultCategoryTextIdentifier($total['percentage'], $total['count'])]; + $total['txtAction'] = QuestionType::$txtActionTotal[QuestionType::getResultCategoryTextIdentifier($total['percentage'], $total['count'])]; + + + // Retrieve the HTML generated in our twig file + $html = $twig->render('pdf/pdf.html.twig', [ + 'user' => $catalogue->getUser(), + 'catalogue' => $catalogue, + 'result' => $result, + 'total' => $total + ]); + + // Load HTML to Dompdf + $dompdf->loadHtml($html); + + // (Optional) Setup the paper size and orientation 'portrait' or 'portrait' + $dompdf->setPaper('A4', 'portrait'); + + // Render the HTML as PDF + $dompdf->render(); + + $x = 505; + $y = 790; + $text = "{PAGE_NUM} von {PAGE_COUNT}"; + $font = $dompdf->getFontMetrics()->getFont('Helvetica', 'normal'); + $size = 10; + $color = array(0,0,0); + $word_space = 0.0; + $char_space = 0.0; + $angle = 0.0; + + $dompdf->getCanvas()->page_text( + $x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle + ); + + return $dompdf; + } +} diff --git a/httpdocs/src/Repository/UserTypeRepository.php b/httpdocs/src/Repository/UserTypeRepository.php new file mode 100644 index 0000000..bf39813 --- /dev/null +++ b/httpdocs/src/Repository/UserTypeRepository.php @@ -0,0 +1,99 @@ + array(self::USER_ROLE_ADMIN, self::USER_ROLE_SYSTEM), + self::USER_TYPE_ADMIN => array(self::USER_ROLE_ADMIN, self::USER_ROLE_USER), + self::USER_TYPE_USER => array(self::USER_ROLE_USER), + ); + + private static $validUserTypes = [ + self::USER_TYPE_SYSTEM, self::USER_TYPE_ADMIN, self::USER_TYPE_USER + ]; + + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, UserType::class); + } + + /** + * Returns all available user roles + * @return array + */ + public static function getAllUserRoles() + { + return self::$userRoles; + } + + /** + * Returns user roles + * @param UserType $userType + * @return string[] + */ + public static function getUserRoles(UserType $userType) + { + return self::$userRoles[$userType->getType()]; + } + + /** + * Check if a given user type is higher + * + * @param UserType $higherUserType + * @param UserType $lowerUserType + * @return bool + */ + public static function isHigherUserType(UserType $higherUserType, UserType $lowerUserType) + { + return $higherUserType->getId() < $lowerUserType->getId(); + } + + /** + * Returns system user + * + * @param ObjectManager $em + * @return object|null + */ + public static function getSystemUser(ObjectManager $em) + { + /** @var UserType $systemUserType */ + $systemUserType = $em->getRepository(UserType::class)->findOneBy(['type' => self::USER_TYPE_SYSTEM]); + return $em->getRepository(User::class)->findOneBy(['userType' => $systemUserType]); + } + + /** + * Return user type by given user type name + * + * @param ObjectManager $em + * @param $userTypeName + * @return object|null + * @throws \Exception + */ + public static function getUserType(ObjectManager $em, $userTypeName) + { + if (!in_array($userTypeName, self::$validUserTypes)) { + throw new \Exception('invalid user type name'); + } + return $em->getRepository(UserType::class)->findOneBy(['type' => $userTypeName]); + } + +} diff --git a/httpdocs/src/Security/LoginFormAuthenticator.php b/httpdocs/src/Security/LoginFormAuthenticator.php new file mode 100644 index 0000000..aaf3249 --- /dev/null +++ b/httpdocs/src/Security/LoginFormAuthenticator.php @@ -0,0 +1,120 @@ +entityManager = $entityManager; + $this->urlGenerator = $urlGenerator; + $this->csrfTokenManager = $csrfTokenManager; + } + + public function supports(Request $request) + { + return self::LOGIN_ROUTE === $request->attributes->get('_route') + && $request->isMethod('POST'); + } + + public function getCredentials(Request $request) + { + $credentials = [ + 'email' => $request->request->get('email'), + 'password' => $request->request->get('password'), + 'csrf_token' => $request->request->get('_csrf_token'), + ]; + $request->getSession()->set( + Security::LAST_USERNAME, + $credentials['email'] + ); + + return $credentials; + } + + public function getUser($credentials, UserProviderInterface $userProvider) + { + $token = new CsrfToken('authenticate', $credentials['csrf_token']); + if (!$this->csrfTokenManager->isTokenValid($token)) { + throw new InvalidCsrfTokenException(); + } + + $user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $credentials['email']]); + + if (!$user) { + // fail authentication with a custom error + throw new CustomUserMessageAuthenticationException('Fehlerhafte oder nicht mehr gültige Zugangsdaten.'); + } + + return $user; + } + + public function checkCredentials($credentials, UserInterface $user) + { + /** @var User $user */ + $this->user = $user; + + $userShipNotExpired = true; + if ($user->getUserType()->getType() === UserTypeRepository::USER_TYPE_USER) { + $userShipNotExpired = $user->getValidUntilDate() > new \DateTime('now'); + } + + return $user->checkPassword($credentials['password']) && $user->isActive() && $userShipNotExpired; + // Check the user's password or other credentials and return true or false + // If there are no credentials to check, you can just return true + //throw new \Exception('TODO: check the credentials inside '.__FILE__); + } + + public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey) + { + if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) { + return new RedirectResponse($targetPath); + } + + $roles = $this->user->getRoles(); + $route = in_array('ROLE_ADMIN', $roles) ? 'admin_start' : 'start'; + return new RedirectResponse($this->urlGenerator->generate($route)); + + // For example : return new RedirectResponse($this->urlGenerator->generate('some_route')); + //throw new \Exception('TODO: provide a valid redirect inside '.__FILE__); + } + +// public function onAuthenticationFailure(Request $request, AuthenticationException $exception) +// { +// return new Response('jojoj'); +// } + + protected function getLoginUrl() + { + return $this->urlGenerator->generate(self::LOGIN_ROUTE); + } +} diff --git a/httpdocs/src/Utils/Utils.php b/httpdocs/src/Utils/Utils.php new file mode 100644 index 0000000..1bcc611 --- /dev/null +++ b/httpdocs/src/Utils/Utils.php @@ -0,0 +1,175 @@ +getRepository('App:User')->findOneBy(['email' => $email]); + return !is_null($existingUserEmail); + } + + /** + * Validates email and checks existence + * @param ObjectManager $em + * @param $email + * @return bool + */ + public static function validateEmail(ObjectManager $em, $email) + { + return self::isValidEmail($email) && !self::emailUserExists($em, $email); + } + + /** + * Checks length of password + * @param $password + * @return bool + */ + public static function isValidPasswordLength($password) + { + return strlen($password) >= self::PASSWORD_MIN_LENGTH && + strlen($password) <= self::PASSWORD_MAX_LENGTH; + } + + /** + * Returns sorted array by getter name + * @param $getterName + * @param $arr + * @return array + */ + public static function getSortedObjects($getterName, $arr) + { + $res = []; + foreach ($arr as $item) { + $res[$item->{$getterName}()] = $item; + } + return $res; + } + + /** + * Returns sorted array by getter name + * @param $arr + * @return array + */ + public static function getSortedObjectsById($arr) + { + return self::getSortedObjects('getId', $arr); + } + + /** + * Returns sorted array by getter name + * @param $firstGetterName + * @param $secondGetterName + * @param $arr + * @return array + */ + public static function getSortedMultipleObjects($firstGetterName, $secondGetterName, $arr) + { + $res = []; + foreach ($arr as $item) { + $res[$item->{$firstGetterName}()][$item->{$secondGetterName}()] = $item; + } + return $res; + } + + /** + * Returns sorted array by key + * @param $key + * @param $arr + * @return array + */ + public static function getSortedArray($key, $arr) + { + $res = []; + foreach ($arr as $item) { + $res[$item[$key]] = $item; + } + return $res; + } + + /** + * Returns inverted array (values are keys) + * @param $arr + * @return array + */ + public static function getInvertedArray($arr) + { + $res = []; + foreach ($arr as $key => $value) { + $res[$value] = $key; + } + return $res; + } + + /** + * Generates strong password + * https://gist.github.com/tylerhall/521810 + * + * @param int $length + * @param false $add_dashes + * @param string $available_sets + * @return string + */ + public static function generateStrongPassword($length = 9, $add_dashes = false, $available_sets = 'luds') + { + $sets = array(); + if(strpos($available_sets, 'l') !== false) + $sets[] = 'abcdefghjkmnpqrstuvwxyz'; + if(strpos($available_sets, 'u') !== false) + $sets[] = 'ABCDEFGHJKMNPQRSTUVWXYZ'; + if(strpos($available_sets, 'd') !== false) + $sets[] = '23456789'; + if(strpos($available_sets, 's') !== false) + $sets[] = '!@#$%&*?'; + + $all = ''; + $password = ''; + foreach($sets as $set) + { + $password .= $set[array_rand(str_split($set))]; + $all .= $set; + } + + $all = str_split($all); + for($i = 0; $i < $length - count($sets); $i++) + $password .= $all[array_rand($all)]; + + $password = str_shuffle($password); + + if(!$add_dashes) + return $password; + + $dash_len = floor(sqrt($length)); + $dash_str = ''; + while(strlen($password) > $dash_len) + { + $dash_str .= substr($password, 0, $dash_len) . '-'; + $password = substr($password, $dash_len); + } + $dash_str .= $password; + return $dash_str; + } +} \ No newline at end of file diff --git a/httpdocs/symfony.lock b/httpdocs/symfony.lock new file mode 100644 index 0000000..01a3119 --- /dev/null +++ b/httpdocs/symfony.lock @@ -0,0 +1,598 @@ +{ + "composer/package-versions-deprecated": { + "version": "1.11.99.1" + }, + "doctrine/annotations": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "a2759dd6123694c8d901d0ec80006e044c2e6457" + }, + "files": [ + "config/routes/annotations.yaml" + ] + }, + "doctrine/cache": { + "version": "1.10.2" + }, + "doctrine/collections": { + "version": "1.6.7" + }, + "doctrine/common": { + "version": "3.1.2" + }, + "doctrine/data-fixtures": { + "version": "1.5.0" + }, + "doctrine/dbal": { + "version": "2.13.0" + }, + "doctrine/deprecations": { + "version": "v0.5.3" + }, + "doctrine/doctrine-bundle": { + "version": "2.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "2.3", + "ref": "9777bf185961283a450b6237281132935025fe04" + }, + "files": [ + "config/packages/doctrine.yaml", + "config/packages/prod/doctrine.yaml", + "config/packages/test/doctrine.yaml", + "src/Entity/.gitignore", + "src/Repository/.gitignore" + ] + }, + "doctrine/doctrine-fixtures-bundle": { + "version": "3.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.0", + "ref": "e5b542d4ef47d8a003c91beb35650c76907f7e53" + }, + "files": [ + "src/DataFixtures/AppFixtures.php" + ] + }, + "doctrine/doctrine-migrations-bundle": { + "version": "3.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.1", + "ref": "ee609429c9ee23e22d6fa5728211768f51ed2818" + }, + "files": [ + "config/packages/doctrine_migrations.yaml", + "migrations/.gitignore" + ] + }, + "doctrine/event-manager": { + "version": "1.1.1" + }, + "doctrine/inflector": { + "version": "2.0.3" + }, + "doctrine/instantiator": { + "version": "1.4.0" + }, + "doctrine/lexer": { + "version": "1.2.1" + }, + "doctrine/migrations": { + "version": "3.1.1" + }, + "doctrine/orm": { + "version": "2.8.4" + }, + "doctrine/persistence": { + "version": "2.1.0" + }, + "doctrine/sql-formatter": { + "version": "1.1.1" + }, + "dompdf/dompdf": { + "version": "v1.0.2" + }, + "egulias/email-validator": { + "version": "3.1.1" + }, + "ezyang/htmlpurifier": { + "version": "v4.16.0" + }, + "friendsofphp/proxy-manager-lts": { + "version": "v1.0.3" + }, + "laminas/laminas-code": { + "version": "4.1.0" + }, + "laminas/laminas-eventmanager": { + "version": "3.3.1" + }, + "laminas/laminas-zendframework-bridge": { + "version": "1.2.0" + }, + "maennchen/zipstream-php": { + "version": "2.2.6" + }, + "markbaker/complex": { + "version": "3.0.2" + }, + "markbaker/matrix": { + "version": "3.0.1" + }, + "monolog/monolog": { + "version": "2.2.0" + }, + "myclabs/php-enum": { + "version": "1.8.4" + }, + "nikic/php-parser": { + "version": "v4.10.4" + }, + "phenx/php-font-lib": { + "version": "0.5.2" + }, + "phenx/php-svg-lib": { + "version": "v0.3.3" + }, + "phpdocumentor/reflection-common": { + "version": "2.2.0" + }, + "phpdocumentor/reflection-docblock": { + "version": "5.2.2" + }, + "phpdocumentor/type-resolver": { + "version": "1.4.0" + }, + "phpoffice/phpspreadsheet": { + "version": "1.29.0" + }, + "psr/cache": { + "version": "1.0.1" + }, + "psr/container": { + "version": "1.1.1" + }, + "psr/event-dispatcher": { + "version": "1.0.0" + }, + "psr/http-client": { + "version": "1.0.2" + }, + "psr/http-factory": { + "version": "1.0.2" + }, + "psr/http-message": { + "version": "1.1" + }, + "psr/link": { + "version": "1.0.0" + }, + "psr/log": { + "version": "1.1.3" + }, + "psr/simple-cache": { + "version": "1.0.1" + }, + "sabberworm/php-css-parser": { + "version": "8.3.1" + }, + "sensio/framework-extra-bundle": { + "version": "5.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.2", + "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b" + }, + "files": [ + "config/packages/sensio_framework_extra.yaml" + ] + }, + "swiftmailer/swiftmailer": { + "version": "v6.2.7" + }, + "symfony/asset": { + "version": "v5.2.4" + }, + "symfony/browser-kit": { + "version": "v5.2.4" + }, + "symfony/cache": { + "version": "v5.2.6" + }, + "symfony/cache-contracts": { + "version": "v2.2.0" + }, + "symfony/config": { + "version": "v5.2.4" + }, + "symfony/console": { + "version": "5.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.1", + "ref": "c6d02bdfba9da13c22157520e32a602dbee8a75c" + }, + "files": [ + "bin/console" + ] + }, + "symfony/css-selector": { + "version": "v5.2.4" + }, + "symfony/debug-bundle": { + "version": "4.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.1", + "ref": "f8863cbad2f2e58c4b65fa1eac892ab189971bea" + }, + "files": [ + "config/packages/dev/debug.yaml" + ] + }, + "symfony/debug-pack": { + "version": "v1.0.9" + }, + "symfony/dependency-injection": { + "version": "v5.2.6" + }, + "symfony/deprecation-contracts": { + "version": "v2.2.0" + }, + "symfony/doctrine-bridge": { + "version": "v5.2.6" + }, + "symfony/dom-crawler": { + "version": "v5.2.4" + }, + "symfony/dotenv": { + "version": "v5.2.4" + }, + "symfony/error-handler": { + "version": "v5.2.6" + }, + "symfony/event-dispatcher": { + "version": "v5.2.4" + }, + "symfony/event-dispatcher-contracts": { + "version": "v2.2.0" + }, + "symfony/expression-language": { + "version": "v5.2.4" + }, + "symfony/filesystem": { + "version": "v5.2.6" + }, + "symfony/finder": { + "version": "v5.2.4" + }, + "symfony/flex": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "c0eeb50665f0f77226616b6038a9b06c03752d8e" + }, + "files": [ + ".env" + ] + }, + "symfony/form": { + "version": "v5.2.6" + }, + "symfony/framework-bundle": { + "version": "5.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.2", + "ref": "6ec87563dcc85cd0c48856dcfbfc29610506d250" + }, + "files": [ + "config/packages/cache.yaml", + "config/packages/framework.yaml", + "config/packages/test/framework.yaml", + "config/preload.php", + "config/routes/dev/framework.yaml", + "config/services.yaml", + "public/index.php", + "src/Controller/.gitignore", + "src/Kernel.php" + ] + }, + "symfony/http-client": { + "version": "v5.2.6" + }, + "symfony/http-client-contracts": { + "version": "v2.3.1" + }, + "symfony/http-foundation": { + "version": "v5.2.4" + }, + "symfony/http-kernel": { + "version": "v5.2.6" + }, + "symfony/intl": { + "version": "v5.2.4" + }, + "symfony/mailer": { + "version": "4.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.3", + "ref": "15658c2a0176cda2e7dba66276a2030b52bd81b2" + }, + "files": [ + "config/packages/mailer.yaml" + ] + }, + "symfony/maker-bundle": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" + } + }, + "symfony/mime": { + "version": "v5.2.6" + }, + "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": "f4adb4379ee437f91ecb1bd5a41c1de6286b9a04" + }, + "files": [ + "config/packages/dev/monolog.yaml", + "config/packages/prod/deprecations.yaml", + "config/packages/prod/monolog.yaml", + "config/packages/test/monolog.yaml" + ] + }, + "symfony/notifier": { + "version": "5.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.0", + "ref": "c31585e252b32fe0e1f30b1f256af553f4a06eb9" + }, + "files": [ + "config/packages/notifier.yaml" + ] + }, + "symfony/options-resolver": { + "version": "v5.2.4" + }, + "symfony/orm-pack": { + "version": "v2.1.0" + }, + "symfony/phpunit-bridge": { + "version": "5.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.1", + "ref": "bf16921ef8309a81d9f046e9b6369c46bcbd031f" + }, + "files": [ + ".env.test", + "bin/phpunit", + "phpunit.xml.dist", + "tests/bootstrap.php" + ] + }, + "symfony/polyfill-intl-grapheme": { + "version": "v1.22.1" + }, + "symfony/polyfill-intl-icu": { + "version": "v1.22.1" + }, + "symfony/polyfill-intl-idn": { + "version": "v1.22.1" + }, + "symfony/polyfill-intl-normalizer": { + "version": "v1.22.1" + }, + "symfony/polyfill-mbstring": { + "version": "v1.22.1" + }, + "symfony/polyfill-php73": { + "version": "v1.22.1" + }, + "symfony/polyfill-php80": { + "version": "v1.22.1" + }, + "symfony/polyfill-php81": { + "version": "v1.24.0" + }, + "symfony/process": { + "version": "v5.2.4" + }, + "symfony/profiler-pack": { + "version": "v1.0.5" + }, + "symfony/property-access": { + "version": "v5.2.4" + }, + "symfony/property-info": { + "version": "v5.2.4" + }, + "symfony/proxy-manager-bridge": { + "version": "v5.2.4" + }, + "symfony/routing": { + "version": "5.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.1", + "ref": "b4f3e7c95e38b606eef467e8a42a8408fc460c43" + }, + "files": [ + "config/packages/prod/routing.yaml", + "config/packages/routing.yaml", + "config/routes.yaml" + ] + }, + "symfony/security-bundle": { + "version": "5.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.1", + "ref": "0a4bae19389d3b9cba1ca0102e3b2bccea724603" + }, + "files": [ + "config/packages/security.yaml" + ] + }, + "symfony/security-core": { + "version": "v5.2.6" + }, + "symfony/security-csrf": { + "version": "v5.2.4" + }, + "symfony/security-guard": { + "version": "v5.2.4" + }, + "symfony/security-http": { + "version": "v5.2.6" + }, + "symfony/serializer": { + "version": "v5.2.4" + }, + "symfony/serializer-pack": { + "version": "v1.0.4" + }, + "symfony/service-contracts": { + "version": "v2.2.0" + }, + "symfony/stopwatch": { + "version": "v5.2.4" + }, + "symfony/string": { + "version": "v5.2.6" + }, + "symfony/swiftmailer-bundle": { + "version": "2.5", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "2.5", + "ref": "ae4d22af30bbd484506bc1817c5a3ef72c855b93" + }, + "files": [ + "config/packages/dev/swiftmailer.yaml", + "config/packages/swiftmailer.yaml", + "config/packages/test/swiftmailer.yaml" + ] + }, + "symfony/test-pack": { + "version": "v1.0.7" + }, + "symfony/translation": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "2ad9d2545bce8ca1a863e50e92141f0b9d87ffcd" + }, + "files": [ + "config/packages/translation.yaml", + "translations/.gitignore" + ] + }, + "symfony/translation-contracts": { + "version": "v2.3.0" + }, + "symfony/twig-bridge": { + "version": "v5.2.6" + }, + "symfony/twig-bundle": { + "version": "5.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.0", + "ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d" + }, + "files": [ + "config/packages/test/twig.yaml", + "config/packages/twig.yaml", + "templates/base.html.twig" + ] + }, + "symfony/twig-pack": { + "version": "v1.0.1" + }, + "symfony/validator": { + "version": "4.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.3", + "ref": "d902da3e4952f18d3bf05aab29512eb61cabd869" + }, + "files": [ + "config/packages/test/validator.yaml", + "config/packages/validator.yaml" + ] + }, + "symfony/var-dumper": { + "version": "v5.2.6" + }, + "symfony/var-exporter": { + "version": "v5.2.4" + }, + "symfony/web-link": { + "version": "v5.2.5" + }, + "symfony/web-profiler-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" + }, + "files": [ + "config/packages/dev/web_profiler.yaml", + "config/packages/test/web_profiler.yaml", + "config/routes/dev/web_profiler.yaml" + ] + }, + "symfony/yaml": { + "version": "v5.2.5" + }, + "twig/extra-bundle": { + "version": "v3.3.0" + }, + "twig/twig": { + "version": "v3.3.0" + }, + "webmozart/assert": { + "version": "1.10.0" + } +} diff --git a/httpdocs/templates/base.html.twig b/httpdocs/templates/base.html.twig new file mode 100644 index 0000000..1329703 --- /dev/null +++ b/httpdocs/templates/base.html.twig @@ -0,0 +1,101 @@ + + + + + My BIM Score - {% block title %}Start{% endblock %} + {# Run `composer require symfony/webpack-encore-bundle` + and uncomment the following Encore helpers to start using Symfony UX #} + {% block stylesheets %} + {#{{ encore_entry_link_tags('app') }}#} + + {% endblock %} + + {% block javascripts %} + {#{{ encore_entry_script_tags('app') }}#} + + + + {% endblock %} + + +
+
+
+ +
+
+ {% block body %}{% endblock %} +
+
+ +
+
+ + diff --git a/httpdocs/templates/email/new_password_email.html.twig b/httpdocs/templates/email/new_password_email.html.twig new file mode 100644 index 0000000..6ba405b --- /dev/null +++ b/httpdocs/templates/email/new_password_email.html.twig @@ -0,0 +1,21 @@ +

Sehr geehrte Nutzerin, sehr geehrter Nutzer,

+

+

Ihr Passwort für MyBIMScore wurde geändert. Ihr neues Passwort lautet:

+

{{ password }}

+
+

Bitte bewahren Sie Ihre Daten sicher auf. Bei Fragen oder Problemen wenden sie sich bitte an unseren Administrator unter:

+office@realfm.de +

+

Hier geht es zu MyBIMScore: https://mybimscore.realfm.de

+
+

Mit freundlichen Grüßen

+

Ihr MyBIMScore - Team

+

--

+

RealFM e.V.
+ Schiffbauerdamm 40 / Büro 5407
+ (Haus der Bundespressekonferenz e.V.)
+ 10117 Berlin
+ T +49 (0)30 20 65 39 81
+ F +49 (0)30 20 65 39 83
+ E office@RealFM.de
+ W www.RealFM.de

diff --git a/httpdocs/templates/email/new_user_email.html.twig b/httpdocs/templates/email/new_user_email.html.twig new file mode 100644 index 0000000..196d99c --- /dev/null +++ b/httpdocs/templates/email/new_user_email.html.twig @@ -0,0 +1,24 @@ +

Sehr geehrte Nutzerin, sehr geehrter Nutzer,

+

+

Sie haben sich erfolgreich bei MyBIMScore angemeldet und sind von unserem System freigeschaltet worden.

+
+

Ihre Zugangsdaten lauten:

+

Benutzername: {{ user.email }}

+

Passwort: {{ password }}

+
+

Bitte bewahren sie Ihre Daten sicher auf. Bei Fragen oder Problemen wenden sie sich bitte an unseren Administrator unter:

+office@realfm.de +

+

Hier geht es zu MyBIMScore: https://mybimscore.realfm.de

+
+

Mit freundlichen Grüßen

+

Ihr MyBIMScore - Team

+

--

+

RealFM e.V.
+ Schiffbauerdamm 40 / Büro 5407
+ (Haus der Bundespressekonferenz e.V.)
+ 10117 Berlin
+ T +49 (0)30 20 65 39 81
+ F +49 (0)30 20 65 39 83
+ E office@RealFM.de
+ W www.RealFM.de

diff --git a/httpdocs/templates/pages-admin/admin_create_user.html.twig b/httpdocs/templates/pages-admin/admin_create_user.html.twig new file mode 100644 index 0000000..0f3e751 --- /dev/null +++ b/httpdocs/templates/pages-admin/admin_create_user.html.twig @@ -0,0 +1,17 @@ +{% extends 'base.html.twig' %} + +{% block title %}Admin Bereich - Neuen Benutzer anlegen{% endblock %} + +{% block body %} + +

Admin - Neuen Benutzer anlegen

+
+ {% include 'snippets/listing-form.html.twig' with { + data: { + + } + } %} +
+{% endblock %} diff --git a/httpdocs/templates/pages-admin/admin_start.html.twig b/httpdocs/templates/pages-admin/admin_start.html.twig new file mode 100644 index 0000000..a05c4c7 --- /dev/null +++ b/httpdocs/templates/pages-admin/admin_start.html.twig @@ -0,0 +1,50 @@ +{% extends 'base.html.twig' %} + +{% block title %}Admin Bereich - Userverwaltung{% endblock %} + +{% block body %} +

Admin - Userverwaltung

+ +
+
    + {% for user in users %} +
  • +
    +

    {{ user.firstname }} {{ user.lastname }}{% if not user.active %} (inaktiv){% endif %}

    +
    +
    + {% set userCats = [] %} + {% for catalogue in user.catalogues %} + {% if catalogue.finished %} + {% set userCats = userCats|merge([catalogue]) %} + {% endif %} + {% endfor %} + {% set i = 1 %} + {% set cntCats = userCats|length %} + {% for userCat in userCats %} + + + {% set i = i + 1 %} + {% endfor %} +
    + + +
    +
    +
    +
    + {% include 'snippets/listing-form.html.twig' with { + data: { + 'user': user + } + } %} +
    +
    +
  • +{# {{ dump(user) }}#} + {% endfor %} +
+
+{% endblock %} diff --git a/httpdocs/templates/pages-static/imprint.html.twig b/httpdocs/templates/pages-static/imprint.html.twig new file mode 100644 index 0000000..1a59d9b --- /dev/null +++ b/httpdocs/templates/pages-static/imprint.html.twig @@ -0,0 +1,51 @@ +{% extends 'base.html.twig' %} + +{% block title %}Impressum{% endblock %} + +{% block header %}{% endblock %} + +{% block body %} + +

RealFM e.V.  Association for Real Estate and Facility Managers

+ +

Hausanschrift:
Schiffbauerdamm 40/Büro 5407
(im Haus der Bundespressekonferenz e.V.)
10117 Berlin

+ +

Postanschrift:
Schiffbauerdamm 40/Büro 5407
10117 Berlin

+ +

Telefon: +49(0)30- 20653981
Telefax: +49(0)30- 20653983
E-Mail
Internet: www.realfm.de
Google Maps

+ +

Lageplan/Anfahrtsbeschreibung

+ +

Vertretungsberechtigter Vorstand (Präsidium)
Dirk Otto (Präsident)
Jörg Petri (Vizepräsident) 
Jürgen Janda (Präsidiumsmitglied) 
Robert Paul (Präsidiumsmitglied)
Danilo Schön (Präsidiumsmitglied)

+ +

Registergericht: 
Amtsgericht Berlin-Charlottenburg

+ +

Register-Nr.:    VR 26713 B

Ust.-Ident.Nr.: DE 254 635 928

+ +

Gestaltung & Realisierung Website

+ +

spawntree GmbH
https://www.spawntree.de

+ +

DISCLAIMER/HAFTUNGSAUSSCHLUSS

+ +

1. Inhalt des Onlineangebotes

+ +

RealFM e.V. übernimmt keine Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereitgestellten Informationen. Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens RealFM e.V. kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt. RealFM e.V. behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen.

+ +

2. Verweise und Links

+ +

Bei direkten oder indirekten Verweisen auf fremde Webseiten (“Hyperlinks”), die außerhalb des Verantwortungsbereiches von RealFM e.V. liegen, würde eine Haftungsverpflichtung ausschließlich in dem Fall in Kraft treten, in dem der Autor von den Inhalten Kenntnis hat und es ihm technisch möglich und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern. RealFM e.V. erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der gelinkten/verknüpften Seiten hat RealFM e.V. keinerlei Einfluss. Deshalb distanziert sie sich hiermit ausdrücklich von allen Inhalten aller gelinkten /verknüpften Seiten, die nach der Linksetzung verändert wurden. Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes gesetzten Links und Verweise sowie für Fremdeinträge in von RealFM e.V. eingerichteten Gästebüchern, Diskussionsforen und Mailinglisten. Für illegale, fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung solcherart dargebotener Informationen entstehen, haftet allein der Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist.

+ +

3. Urheber- und Kennzeichenrecht

+ +

RealFM e.V. ist bestrebt, in allen Publikationen die Urheberrechte zu beachten. Alle innerhalb des Internetangebotes genannten und ggf. durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind! Das Copyright für veröffentlichte, von RealFM e.V. selbst erstellte Objekte bleibt allein beim Autor der Seiten. Eine Vervielfältigung oder Verwendung solcher Grafiken, Tondokumente, Videosequenzen und Texte in anderen elektronischen oder gedruckten Publikationen ist ohne ausdrückliche Zustimmung des Autors nicht gestattet.

+ +

4. Datenschutz

+ +

Sofern innerhalb des Internetangebotes die Möglichkeit zur Eingabe persönlicher oder geschäftlicher Daten (Emailadressen, Namen, Anschriften) besteht, so erfolgt die Preisgabe dieser Daten seitens des Nutzers auf ausdrücklich freiwilliger Basis. Die Inanspruchnahme und Bezahlung aller angebotenen Dienste ist – soweit technisch möglich und zumutbar – auch ohne Angabe solcher Daten bzw. unter Angabe anonymisierter Daten oder eines Pseudonyms gestattet. Die Nutzung der im Rahmen des Impressums oder vergleichbarer Angaben veröffentlichten Kontaktdaten wie Postanschriften, Telefon- und Faxnummern sowie Emailadressen durch Dritte zur Übersendung von nicht ausdrücklich angeforderten Informationen ist nicht gestattet. Rechtliche Schritte gegen die Versender von sogenannten Spam-Mails bei Verstössen gegen dieses Verbot sind ausdrücklich vorbehalten.

+ +

5. Rechtswirksamkeit dieses Haftungsausschlusses

+ +

Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten, von dem aus auf diese Seite verwiesen wurde. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt.

+ +{% endblock %} diff --git a/httpdocs/templates/pages-static/privacy.html.twig b/httpdocs/templates/pages-static/privacy.html.twig new file mode 100644 index 0000000..0e9c02f --- /dev/null +++ b/httpdocs/templates/pages-static/privacy.html.twig @@ -0,0 +1,146 @@ +{% extends 'base.html.twig' %} + +{% block title %}Datenschutz{% endblock %} + +{% block header %}{% endblock %} + +{% block body %} +

Personenbezogene Daten

+

Information zur Verarbeitung Ihrer personenbezogenen Daten gemäß Art. 13, 14 und 21 EU-DSGVO

Hiermit möchten wir Sie gemäß den Art. 13, 14 und 21 Datenschutz-Grundverordnung (im Folgenden „DSGVO“) über die Verarbeitung Ihrer personenbezogenen Daten durch den RealFM e.V. und die über die Ihnen nach dem Datenschutzrecht zustehenden Rechte informieren.

Verarbeitung Ihrer personengebundener Daten:

+ +

Datenschutz Homepage

+

I. Name und Anschrift des Verantwortlichen

+

Der Verantwortliche im Sinne der europäischen Datenschutz-Grundverordnung ist die:

+

RealFM e.V. Association for Real Estate and Facility Managers
Schiffbauerdamm 40/Büro 5407
10117 Berlin
Telefon: +49(0)30-20653981
Telefax: +49(0)30-20653983
E-Mail: datenschutz(at)realfm.de

+

II. Kontaktdaten des Datenschutzbeauftragten

+

Sie erreichen den Datenschutzbeauftragten unter:

+

Der Datenschutzbeauftragte
c/o RealFM e.V.  Association for Real Estate and Facility Managers
Schiffbauerdamm 40/Büro 5407
10117 Berlin
Telefon: +49(0)30-20653981
Telefax: +49(0)30-20653983
E-Mail: datenschutz(at)realfm.de

+

III. Allgemeines zur Datenverarbeitung

+

Der Schutz Ihrer persönlichen Daten ist uns sehr wichtig. Wir verarbeiten diese in erster Linie, um eine funktionsfähige und komfortabel zu bedienende Website bereitzuhalten. Wir möchten sicherstellen, dass Sie über diese Webseiten unsere Inhalte und Angebote nutzen können.

Außerdem verarbeiten wir Ihre Daten nur, wenn und soweit dies durch gesetzliche Vorschriften gestattet ist. Weitergehende Hinweise entnehmen Sie bitte den nachfolgenden Ausführungen.

+

IV. Bereitstellung der Website und Erstellung von Logfiles

+

Bei jedem Aufruf unserer Internetseite werden von unserem System automatisiert Daten und Informationen Ihres Computersystems erhoben. Wir erheben dabei folgende Daten:

+
    +
  1. Die IP-Adresse (pseudoanonymisiert)
  2. +
  3. Den verwendeten Browser
  4. +
  5. Uhrzeit und Datum
  6. +
  7. Genutzte System eines Seitenbesuchers
  8. +
+

Diese Daten werden in den Logfiles unseres Systems gespeichert. Es findet keine Speicherung der vorgenannten Daten zusammen mit anderen personenbezogenen Daten statt.

Es ist erforderlich, dass unser System die IP-Adresse vorrübergehend speichert, damit eine Auslieferung der Website an Ihren Rechner erfolgen kann. Für die Dauer der jeweiligen Nutzung der Website muss hierfür Ihre IP-Adresse gespeichert bleiben. Die Speicherung in Logfiles dient daher der Funktionsfähigkeit der Website. Zudem nutzen wir diese Daten zur Optimierung unserer Website und Absicherung unserer informationstechnischen Systeme. Die Daten werden in diesem Zusammenhang nicht zu Marketingzwecken verwendet.  Rechtsgrundlage für die vorübergehende Speicherung der Daten und der Logfiles ist Art. 6 Abs. 1 lit. f Datenschutzgrundverordnung (nachfolgend: „DS-GVO“).

Die Daten werden solange gespeichert, bis die Erreichung des Zweckes ihrer Erhebung erforderlich ist. Sofern Daten zur Bereitstellung der Website erforderlich sind, entfällt die Erforderlichkeit, wenn die jeweilige Sitzung beendet ist. Ihre Daten werden danach automatisch gelöscht. Im Falle der Speicherung der Daten in Logfiles ist dies nach spätestens vierzehn Tagen der Fall. Werden die vorgenannten Daten weiter gespeichert, wird Ihre IP-Adresse wird in diesem Falle jedoch gelöscht oder verfremdet, sodass keine Zuordnung des aufrufenden Internetanschlusses mehr möglich ist.

+

V. Verwendung von Cookies

+

Wir verwenden auf unserer Internetseite sog. „Cookies“. Hierbei handelt es sich um Textdateien, die in bzw. von Ihrem Internetbrowser auf Ihrem Computersystem gespeichert werden. Wenn Sie unsere Website aufrufen, kann ein Cookie auf Ihrem System gespeichert werden. Dieser enthält eine individuelle Zeichenfolge, anhand derer Ihr Browser beim nächsten Aufruf der Website identifiziert werden kann.

In den nachfolgenden Abschnitten zu Ziff. 1 („Technisch erforderliche Cookies“) und zu Ziff. 2 („Cookies zur Analyse des Surfverhaltens“) erläutern wir detailliert, welche Arten von Cookies wir verwenden und welche Daten dort jeweils verarbeitet werden.

Soweit in den nachfolgenden Erklärungen nicht abweichende Löschfristen genannt werden, gilt unabhängig von Art und Zweck der Cookies für die Speicherdauer zusammenfassend Folgendes:

Sie haben uneingeschränkte Kontrolle über die Verwendung von Cookies. Diese werden auf Ihrem Rechner gespeichert und die Daten von diesem an unsere Seite übermittelt. Die meisten Browser sind standardmäßig so eingestellt, dass sie Cookies akzeptieren, durch eine Änderung der Browser-Einstellungen kann die Übertragung von Cookies jedoch deaktiviert oder einschränkt werden. Bereits gespeicherte Cookies können jederzeit gelöscht werden. Dies kann durch entsprechende Einstellung Ihres Browsers auch automatisiert erfolgen.

Werden Cookies für unsere Website generell deaktiviert, können möglicherweise nicht mehr alle Funktionen der Website vollumfänglich genutzt werden.

Beim Aufruf unserer Website werden Sie durch einen Info-Banner über oben genannte Verwendung von Cookies informiert und auf die vorliegende Datenschutzerklärung verwiesen. Wir bitten Sie hierbei um Ihre Einwilligung in die Verwendung von Cookies, die Sie uns mit einem Klick auf den Button „Ich stimme zu“ erteilen.

Rechtmäßigkeitsgrundlage für die Verarbeitung Ihrer Daten ist also insofern Art. 6 Abs. 1 lit. a DS-GVO.

+ + + + + + +
Sie können der Verwendung von Cookies jederzeit widersprechen. Dies können Sie tun, indem Sie entweder der Verwendung von Cookies im angezeigten Banner gar nicht erst zustimmen oder Ihre Browser-Einstellungen entsprechend abändern.
+

1. Technisch erforderliche Cookies

+

Einige Funktionen unserer Website erfordern, dass der Browser auch nach einem Seitenwechsel wiedererkannt wird. Diese Funktionen könnten ohne den Einsatz von Cookies nicht angeboten werden. In den Cookies werden dabei folgende Daten gespeichert und übermittelt:

+
    +
  1. Log-In-Details
  2. +
+

Für folgende Anwendungen benötigen wir aus technischen Gründen Cookies:

+
    +
  1. Unterbrechungsfreier Log-In
  2. +
+

Die Rechtsgrundlage für die Verarbeitung personenbezogener Daten unter Verwendung von Cookies ist Art. 6 Abs. 1 lit. f DS-GVO. Die durch technisch notwendige Cookies erhobenen Daten werden nicht zur Erstellung von Nutzerprofilen verwendet.

Sofern Sie der Verwendung dieser Cookies widersprechen oder Ihren Browser entsprechend konfigurieren, wird unsere Website Ihren Browser nicht wiedererkennen und es kann dazu kommen, dass bestimmte Inhalte nicht abrufbar sind oder Daten (z.B. aus einer Eingabemaske) verloren gehen.

Für die Speicherdauer von technisch erforderlichen Cookies gilt das unter Ziff. V. Gesagte.

+

2. Cookies zur Analyse des Surfverhaltens

+

Wir verwenden auf unserer Website darüber hinaus Cookies, die eine Analyse Ihres Surfverhaltens ermöglichen. Die in diesem Rahmen erhobenen Daten werden durch technische Vorkehrungen pseudonymisiert. Die Daten können Ihnen dann nicht mehr zugeordnet werden. Diese Daten werden nicht gemeinsam mit Ihren sonstigen personenbezogenen Daten gespeichert.

Auf diese Weise können folgende Daten übermittelt werden:

+
    +
  1. der verwendete Browsertyp und die Browserversion, (sofern vom Benutzer übermittelt!)
  2. +
  3. das Betriebssystem
  4. +
  5. Datum und Uhrzeit der Serveranfrage
  6. +
  7. die Anzahl der Besuche
  8. +
  9. die Verweildauer auf der Website
  10. +
  11. die vorher besuchte Website, (sofern vom Benutzer übermittelt!)
  12. +
  13. die IP-Adresse der Nutzer wird anonymisiert, bevor sie gespeichert wird
  14. +
+

Die Verwendung der Analyse-Cookies erfolgt zu dem Zweck, die Qualität unserer Website und ihre Inhalte zu verbessern. Durch die Analyse-Cookies erfahren wir, wie die Website genutzt wird und können so unser Angebot stetig optimieren. In diesen Zwecken liegt auch unser berechtigtes Interesse in der Verarbeitung der personenbezogenen Daten nach Art. 6 Abs. 1 lit. f DS-GVO. Diese Rechtmäßigkeitsgrundlage steht neben der von Ihnen im Rahmen des Cookie-Banners erteilten Einwilligung.

Wenn Sie der Verwendung dieser Cookies widersprechen oder Ihren Browser entsprechend konfigurieren, hat dies keine Nachteile für Sie. Alle Funktionen der Website sind weiterhin gegeben.

Für die Speicherdauer von Cookies zur Analyse des Surfverhaltens gilt das unter V. Gesagte.

Folgende Dienste verwenden wir auf unserer Website, die auf Analyse-Cookies basieren:

Wir setzen Google Analytics, einen Webanalysedienst der Google Inc., 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA (nachfolgend: „Google“) ein. Dieser verwendet Cookies. Die durch das Cookie erzeugten Informationen über die Benutzung des Onlineangebotes durch Sie werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert.

Google wird diese Informationen in unserem Auftrag benutzen, um die Nutzung unseres Onlineangebotes auszuwerten, um Reports über die Aktivitäten innerhalb dieses Onlineangebotes zusammenzustellen und um weitere mit der Nutzung dieses Onlineangebotes und der Internetnutzung verbundene Dienstleistungen uns gegenüber zu erbringen. Dabei können aus den verarbeiteten Daten pseudonyme Nutzungsprofile erstellt werden.

Wir setzen Google Analytics nur mit aktivierter IP-Anonymisierung ein. Das bedeutet, Ihre IP-Adresse wird von Google innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum gekürzt. Nur in Ausnahmefällen wird die volle IP-Adresse an einen Server von Google in den USA übertragen und dort gekürzt. Die von Ihrem Browser übermittelte IP-Adresse wird nicht mit anderen Daten von Google zusammengeführt.

Sie können die Speicherung der Cookies durch eine entsprechende Einstellung Ihrer Browser-Software verhindern; Sie können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf ihre Nutzung des Onlineangebotes bezogenen Daten an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem Sie das unter dem folgenden Link verfügbare Browser-Plug-In herunterladen und installieren: https://tools.google.com/dlpage/gaoptout?hl=de.

Weitere Informationen zur Datennutzung zu Werbezwecken durch Google, Einstellungs- und Widerspruchsmöglichkeiten erfahren Sie auf den Webseiten von Google: https://www.google.com/intl/de/policies/privacy/partners/ („Datennutzung durch Google bei Ihrer Nutzung von Websites oder Apps unserer Partner“), https://www.google.com/policies/technologies/ads („Datennutzung zu Werbezwecken“), https://www.google.de/settings/ads („Informationen verwalten, die Google verwendet, um Ihnen Werbung einzublenden“) und https://www.google.com/ads/preferences/ („Bestimmen Sie, welche Werbung Google Ihnen zeigt“).

Alternativ zum Browser-Add-On oder innerhalb von Browsern auf mobilen Geräten, klicken Sie bitte diesen Link, um die Erfassung durch Google Analytics innerhalb dieser Website zukünftig zu verhindern. Dabei wird ein Opt-Out-Cookie auf Ihrem Gerät abgelegt. In diesem ist gespeichert, dass wir Ihre Daten für Google Analytics nicht löschen dürfen. Löschen Sie Ihre gespeicherten Cookies, müssen Sie diesen Link erneut klicken.

Für die Speicherdauer der Cookies gilt das unter Ziff. V. Gesagte.

+

VI. Log-In-Bereich

+

Weite Teile unserer Website sind ohne Registrierung und Angabe Ihrer Personalien möglich.
Wir bieten registrierten Nutzern die Möglichkeit, sich im Log-In Bereich anzumelden. Welche weiteren Daten wir dabei verarbeiten, hängt davon ab, welche Daten Sie bei der Registrierung hinterlegt haben und welche Services Sie nutzen möchten. Dies ergibt sich also aus der weiteren Korrespondenz im Rahmen der Registrierung.

Rechtsgrundlage für die Verarbeitung ist die abgeschlossene Registrierung und Nutzungsvereinbarung für den Log-In-Bereich sowie ein zugrundeliegendes Vertragsverhältnis bzw. die Anbahnung eines entsprechenden Vertragsverhältnisses, gem. Art. 6 Abs. 1 lit. b DS-GVO.

Ihre Daten werden gelöscht, sobald sie für die Erreichung des Zweckes ihrer Erhebung nicht mehr erforderlich sind. Dies ist bei im Rahmen der Registrierung erhobenen Daten in der Regel dann der Fall, wenn Sie die Registrierung rückgängig machen bzw. Ihren Zugang löschen.

Soweit diese Daten auch zur Erfüllung eines Vertrages oder zur Durchführung vorvertraglicher Maßnahmen erforderlich sind, kann eine vorzeitige Löschung allerdings nur erfolgen, soweit vertragliche oder gesetzliche Verpflichtungen dies zulassen. Möglicherweise sind wir vertraglich oder gesetzlich verpflichtet, Daten auch nach der Vertragsbeendigung zu speichern (z.B. steuerliche Zwecke). Welche Speicherfristen hierbei gelten, muss für die jeweiligen Verträge und Vertragsparteien individuell ermittelt werden.

+

VII. E-Mail-Kontakt

+

Sie können per E-Mail mit uns in Kontakt treten. Sofern eine Kontaktaufnahme über eine bereitgestellte E-Mail-Adresse erfolgt, werden die mit Ihrer E-Mail übermittelten personenbezogenen Daten gespeichert. Rechtsgrundlage für die Verarbeitung Ihrer Daten ist insoweit Art. 6 Abs. 1 lit. f DS-GVO, da unsererseits ein berechtigtes Interesse hieran besteht. Steht die Kontaktaufnahme im Zusammenhang mit dem Abschluss oder Durchführung eines Vertrages, so ist zusätzlich Art. 6 Abs. 1 lit. b DS-GVO Rechtsgrundlage für die Verarbeitung.

Personenbezogene Daten aus E-Mails verarbeiten wir ausschließlich zur Bearbeitung der Kontaktaufnahme. Eine Weitergabe der Daten an Dritte erfolgt insoweit nicht.

Wir löschen Ihre Daten, sobald sie für die Erreichung des jeweiligen Zweckes ihrer Erhebung nicht mehr erforderlich sind. Für personenbezogene Daten, die per E-Mail übertragen wurden, tritt dieser Fall ein, wenn die jeweilige Korrespondenz mit Ihnen beendet ist. Die Korrespondenz ist beendet, wenn sich aus den Umständen entnehmen lässt, dass der betroffene Sachverhalt abschließend geklärt ist.

+ + + + + + +
Im Falle einer Kontaktaufnahme per E-Mail können Sie der Speicherung Ihrer personenbezogenen Daten jederzeit widersprechen. Dazu richten Sie lediglich formlos eine entsprechende Nachricht an die auf S. 1 genannten Kontaktdaten.

In diesen Fällen ist eine Bearbeitung Ihrer Nachricht allerdings unter Umständen nicht möglich.
+

Falls die Daten zur Erfüllung eines Vertrages oder zur Durchführung vorvertraglicher Maßnahmen erforderlich sind, kann eine vorzeitige Löschung nur erfolgen, soweit vertragliche oder gesetzliche Verpflichtungen dies zulassen. Welche Speicherfristen hierbei gelten, muss für die jeweiligen Verträge und Vertragsparteien individuell ermittelt werden.

+

VIII. Newsletter

+

Sie können sich für unseren kostenlosen Newsletter anmelden. Hierfür tragen Sie Ihre Daten in die dafür vorgesehene Eingabemaske ein und diese werden an uns übermittelt. Bei der Anmeldung werden Ihre E-Mail-Adresse und Ihr Name erhoben.

Vor Absendung Ihrer Daten bitten wir Sie jeweils darum, Ihre Einwilligung zu dieser Verarbeitung der Daten abzugeben und wir verweisen auf diese Datenschutzerklärung. Die Verarbeitung Ihrer Daten erfolgt mit Ihrer Einwilligung. Insoweit ist Art. 6 Abs. 1 lit. a DS-GVO Rechtsgrundlage. Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt.

Sie erhalten nach der Anmeldung eine E-Mail, in der Sie um die Bestätigung Ihrer Anmeldung gebeten werden. Diese Bestätigung ist notwendig, damit sich niemand mit fremden E-Mail-Adressen anmelden kann. Die Anmeldungen zum Newsletter werden protokolliert, um den Anmeldeprozess entsprechend den rechtlichen Anforderungen nachweisen zu können. Hierzu gehört die Speicherung des Anmelde- und des Bestätigungszeitpunkts und Ihrer verwendeten IP-Adresse.

Da die Verarbeitung der Daten zudem erforderlich ist, um den bestellten Newsletter zuzustellen, dienen daneben auch Art. 6 Abs. 1 lit. b und Art. 6 Abs. 1 lit. f DS-GVO als Rechtsgrundlage.

Es erfolgt im Zusammenhang mit der Datenverarbeitung für den Versand von Newslettern keine Weitergabe der Daten an Dritte. Die Daten werden ausschließlich für den Versand des Newsletters verwendet.

+ + + + + + +
Sie können das Abonnement des Newsletters jederzeit kündigen oder der Zusendung weiterer Newsletter widersprechen. Jeder Newsletter enthält einen entsprechenden Link zum Abmeldeformular bzw. einen Hinweis zur Abmeldemöglichkeit. Hierdurch ermöglichen wir zugleich den Widerruf Ihrer Einwilligung in die Speicherung Ihrer Daten. Ihren Widerruf können Sie aber auch jederzeit formlos an die auf S. 1 genannten Kontaktdaten richten.
+

Wir löschen Ihre Daten, sobald sie für die Erreichung des Zweckes ihrer Erhebung nicht mehr erforderlich sind. Ihre E-Mail-Adresse wird solange gespeichert, wie das Abonnement des Newsletters besteht.

Falls die Daten zur Erfüllung eines Vertrages oder zur Durchführung vorvertraglicher Maßnahmen erforderlich sind, kann eine vorzeitige Löschung allerdings nur erfolgen, soweit vertragliche oder gesetzliche Verpflichtungen dies zulassen. Möglicherweise sind wir vertraglich oder gesetzlich verpflichtet, Daten auch nach der Vertragsbeendigung zu speichern (z. B. steuerliche Zwecke). Welche Speicherfristen hierbei gelten, muss für die jeweiligen Verträge und Vertragsparteien individuell ermittelt werden.

Die Erhebung sonstiger personenbezogener Daten im Rahmen des Anmeldevorgangs dient dazu, einen Missbrauch der Dienste oder der verwendeten E-Mail-Adresse zu verhindern. Auch diese Verarbeitung ist daher auf Grundlage des Art. 6 Abs. 1 lit. f DS-GVO zulässig. Die sonstigen im Rahmen des Anmeldevorgangs erhobenen personenbezogenen Daten löschen wir in der Regel nach einer Frist von vier Wochen nach der Erhebung.

+

IX. Ihre Rechte

+

Nachfolgend möchten wir Ihnen Ihre Rechte nach der Datenschutzgrundverordnung zusammenfassen.

+

1. Recht auf Widerruf der datenschutzrechtlichen Einwilligungserklärung (Art. 7 Abs. 3 DS-GVO)

+

Sie haben das Recht, Ihre Einwilligungen jederzeit zu widerrufen. Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt. Sie werden vor Abgabe der Einwilligung hiervon in Kenntnis gesetzt.

+

2. Auskunftsrecht (Art. 15 DS-GVO, § 34 BDSG)

+

Gem. Art. 15 DS-GVO haben Sie das Recht, von uns eine Bestätigung darüber zu verlangen, ob wir personenbezogene Daten verarbeiten, die Sie betreffen. Ist dies der Fall, so haben Sie ein Recht auf Auskunft über diese personenbezogenen Daten und auf folgende Informationen:

+
    +
  • die Zwecke, für die wir diese Daten verarbeiten;
  • +
  • die Kategorien personenbezogener Daten, die von uns verarbeitet werden;
  • +
  • wem gegenüber diese personenbezogenen Daten offengelegt worden sind oder noch offengelegt werden, insbesondere wenn dies gegenüber Empfängern in Drittländern oder bei internationalen Organisationen erfolgt;
  • +
  • falls möglich die geplante Dauer, für die die personenbezogenen Daten gespeichert werden, oder, falls dies nicht möglich ist, die Kriterien für die Festlegung dieser Dauer;
  • +
  • das Bestehen eines Rechts auf Berichtigung oder Löschung der personenbezogenen Daten, die Sie betreffen oder auf Einschränkung der Verarbeitung uns oder eines Widerspruchsrechts gegen die Verarbeitung durch uns;
  • +
  • das Bestehen eines Beschwerderechts bei einer Aufsichtsbehörde;
    wenn die personenbezogenen Daten nicht bei Ihnen erhoben werden, alle verfügbaren Informationen über die Herkunft der Daten;
  • +
  • ob eine automatisierte Entscheidungsfindung einschließlich Profiling gemäß Artikel 22 Absätze 1 und 4 DS-GVO stattfindet und – falls dies geschieht– aussagekräftige Informationen über die involvierte Logik sowie die Tragweite und die angestrebten Auswirkungen einer derartigen Verarbeitung auf Sie.
  • +
+

Werden personenbezogene Daten an ein Drittland oder an eine internationale Organisation übermittelt, so haben Sie das Recht, darüber unterrichtet zu werden, durch welche geeigneten Garantien sichergestellt wird, dass die Bestimmungen der DS.GVO auch bei diesen Empfängern eingehalten werden.

+

3. Recht auf Berichtigung (Art. 16 DS-GVO, § 35 BDSG)

+

Sie können von uns die unverzügliche Berichtigung unrichtiger Daten verlangen, die Sie betreffen. Unter Berücksichtigung der Zwecke der Verarbeitung haben Sie zudem das Recht, die Vervollständigung unvollständiger personenbezogener Daten – auch mittels einer ergänzenden Erklärung – zu verlangen.

+

4. Recht auf Löschung bzw. „Recht auf Vergessenwerden“ (Art. 17 DS-GVO, § 35 BDSG)

+

Sie haben das Recht, dass wir Daten unverzüglich löschen, sofern einer der folgenden Gründe zutrifft:

+
    +
  • Die Daten sind für die Zwecke, für die sie erhoben oder auf sonstige Weise verarbeitet wurden, nicht mehr notwendig.
  • +
  • Sie widerrufen Ihre Einwilligung, auf die sich die Verarbeitung stützte, und es fehlt an einer anderweitigen Rechtsgrundlage für die Verarbeitung.
  • +
  • Sie legen aus Gründen, die sich aus Ihrer besonderen Situation ergeben, gemäß Artikel 21 Absatz 1 DS-GVO Widerspruch gegen die Verarbeitung ein und es liegen keine vorrangigen berechtigten Gründe für die Verarbeitung vor.
  • +
  • Sie legen gemäß Artikel 21 Absatz 2 DS-GVO Widerspruch gegen die Verarbeitung für Direktwerbung ein.
  • +
  • Die Daten wurden unrechtmäßig verarbeitet.
    Die Löschung der Daten ist zur Erfüllung einer rechtlichen Verpflichtung nach europäischem oder deutschem Recht erforderlich.
  • +
  • Die Daten wurden in Bezug auf angebotene Dienste der Informationsgesellschaft gemäß Artikel 8 Absatz 1 DS-GVO erhoben.
  • +
+

Wenn wir Ihre Daten öffentlich gemacht haben und zur Löschung verpflichtet sind, treffen wir unter Berücksichtigung der verfügbaren Technologie und der Implementierungskosten angemessene Maßnahmen, die Verantwortlichen darüber zu informieren, dass Sie die Löschung verlangt haben.

+

5. Recht auf Einschränkung der Verarbeitung (Art. 18 DS-GVO)

+

Gemäß Art. 18 DS-GVO dürfen wir in folgenden Fällen Daten nur eingeschränkt verarbeiten. Die ist der Fall, wenn:

+
    +
  • Sie die Richtigkeit Ihrer Daten bestreiten, und zwar bis uns eine Überprüfung der Richtigkeit möglich ist.
  • +
  • die Verarbeitung unrechtmäßig ist und Sie die Löschung der Ihrer Daten ablehnen und stattdessen die Einschränkung der Nutzung der personenbezogenen Daten verlangen;
  • +
  • wir die Daten für die Zwecke der Verarbeitung nicht länger benötigen, Sie diese jedoch zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen benötigen, oder
  • +
  • Sie Widerspruch gegen die Verarbeitung gemäß Artikel 21 Absatz 1 DS-GVO aus Gründen, die sich aus Ihrer besonderen Situation ergeben, einlegen, und zwar solange, wie noch nicht feststeht, ob die berechtigten Gründe für die Verarbeitung durch uns gegenüber Ihren Interessen überwiegen.
  • +
+

Wurde die Verarbeitung eingeschränkt, so dürfen wir diese Daten lediglich speichern. Eine darüber hinausgehende Verarbeitung ist dann nur mit Ihrer Einwilligung oder zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen oder zum Schutz der Rechte einer anderen natürlichen oder juristischen Person oder aus Gründen eines wichtigen öffentlichen Interesses der Union oder eines Mitgliedstaats zulässig.

+ + + + + + +
Ihre in diesem Zusammenhang erteilte Einwilligung können Sie jederzeit widerrufen.
+

Sie werden von uns benachrichtigt, bevor die Einschränkung aufgehoben wird.

+

6. Mitteilungspflicht (Art. 19 DS-GVO)

+

Wir sind verpflichtet, alle Empfänger, denen Ihre Daten offengelegt wurden, über eine Berichtigung oder Löschung Ihrer Daten oder eine Einschränkung der Verarbeitung zu informieren. Das gilt nur dann nicht, sofern sich dies sich als unmöglich erweist oder mit einem unverhältnismäßigen Aufwand verbunden ist.

Wir unterrichten Sie über diese Empfänger, wenn Sie dies verlangen.

+

7. Recht auf Datenübertragbarkeit (Art. 20 DS-GVO)

+

Sie haben das Recht, die Sie betreffenden Daten, die sie uns bereitgestellt haben, in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten. Sie haben außerdem das Recht, dass wir diese Daten einem Dritten übermitteln, sofern

+
    +
  • die Verarbeitung der Daten auf Ihrer Einwilligung oder auf einem Vertrag beruht und
  • +
  • die Verarbeitung mithilfe automatisierter Verfahren erfolgt.
  • +
+

Hierbei können Sie verlangen, dass wir Ihre Daten direkt an den Dritten übermitteln, soweit dies technisch machbar ist. Dieses Recht darf die Rechte und Freiheiten anderer Personen nicht beeinträchtigen.

+

8. Automatisierte Entscheidung im Einzelfall einschließlich Profiling (Art. 22 DS-GVO, § 37 BDSG)

+

Auf unserer Website sind Ihre Daten nicht Gegenstand von Entscheidungen, die ausschließlich auf automatisierter Verarbeitung erfolgen (z.B. Profiling).

+

9. Widerspruchsrecht (Art. 21 DS-GVO, § 36 BDSG)

+

Wenn wir Ihre Daten aufgrund eines berechtigten Interesses verarbeiten (Art. 6 Abs. 1 lit. f DS-GVO), haben Sie das Recht, hiergegen Widerspruch einzulegen, wenn sich die Gründe hierfür aus ihrer besonderen Situation ergeben. Dies gilt auch für ein auf diese Bestimmungen gestütztes Profiling. In diesem Fall verarbeiten wir Ihre Daten nicht mehr, es sei denn, wir können zwingende schutzwürdige Gründe für die Verarbeitung nachweisen. Diese müssen Ihre Interessen, Rechte und Freiheiten überwiegen, oder aber die Verarbeitung dient der Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen. Dasselbe gilt, soweit an der Verarbeitung ein zwingendes öffentliches Interesse besteht, das Ihre Interessen überwiegt, oder eine Rechtsvorschrift zur Verarbeitung verpflichtet.

Sofern wir Ihre Daten verarbeiten, um Direktwerbung zu betreiben, können Sie Widerspruch gegen die Verarbeitung der Daten einlegen. Dies gilt auch für das Profiling, soweit es mit solcher Direktwerbung in Verbindung steht.

Nach Ihrem Widerspruch werden Ihre Daten nicht mehr für diese Zwecke verarbeitet.

Für einen Widerspruch richten Sie lediglich formlos eine entsprechende Nachricht an die auf S. 1 genannten Kontaktdaten.

+

10. Recht auf Beschwerde bei einer Aufsichtsbehörde (Art. 77 DS-GVO)

+

Sie haben das Recht, sich bei einer Aufsichtsbehörde, insbesondere in dem Mitgliedstaat Ihres Aufenthaltsorts, Ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes, zu beschweren, wenn Sie der Ansicht sind, dass die Verarbeitung der Sie betreffenden Daten gegen die Datenschutz-Grundverordnung verstößt. Weitere verwaltungsrechtliche oder gerichtliche Rechtsbehelfe, die Ihnen möglicherweise zustehen, bleiben hiervon unberührt.

+{% endblock %} diff --git a/httpdocs/templates/pages/catalogue.html.twig b/httpdocs/templates/pages/catalogue.html.twig new file mode 100644 index 0000000..6e3709f --- /dev/null +++ b/httpdocs/templates/pages/catalogue.html.twig @@ -0,0 +1,49 @@ +{% extends 'base.html.twig' %} + +{% block title %}Fragenkatalog{% endblock %} + +{% block body %} +

Fragenkatalog

+

Bitte entscheiden Sie sich für eine Antwort und speichern Sie diese. Andernfalls gilt die Frage als nicht beantwortet. Sie können jederzeit von einer Frage zu einer anderen Frage und wieder zurück navigieren. Auch bereits gespeicherte Antworten können Sie später bei Bedarf noch einmal bearbeiten und erneut speichern, solange die Bearbeitung des Fragenkataloges noch nicht abgeschlossen wurde. Das Abschließen des Fragebogens ist nur möglich, wenn alle Fragen beantwortet wurden.

+
+
+

Frage: {{ catalogueDetail.orderNo }}/{{ catalogue.numDetails }}

+
+
+
+
+
+

Handlungsfeld: {{ questionType.type }}

+

{{ question.questionText }}

+
+
+
+ + + + + +
+
+ + +
+
+
+ + Letzte offene Frage + Vorherige Frage + +
+ Antwort speichern +
+ + Nächste Frage + Nächste offene Frage + +
+
+ +
+
+{% endblock %} diff --git a/httpdocs/templates/pages/catalogue_finished.html.twig b/httpdocs/templates/pages/catalogue_finished.html.twig new file mode 100644 index 0000000..4301f7d --- /dev/null +++ b/httpdocs/templates/pages/catalogue_finished.html.twig @@ -0,0 +1,16 @@ +{% extends 'base.html.twig' %} + +{% block title %}Fragenkatalog{% endblock %} + +{% block body %} +

Abschluss Fragenkatalog

+

+ Herzlichen Glückwunsch, Sie haben soeben die Bearbeitung Ihres Fragenkatalogs zu MyBIMScore abgeschlossen. Die Auswertung Ihrer Antworten liegt als PDF-Download für Sie bereit. +

+

"Ihr BIMScore"

+

Hier erhalten Sie eine Zusammenfassung Ihrer Antworten zu den Fragen aus MyBIMScore und das Ergebnis der Auswertung als PDF-Dokument.

+ Ergebnis +

+

Sie können die Bearbeitung des Fragenkataloges noch {{ remainingCatalogues }}-mal durchführen. Dazu haben Sie noch {{ remainingDays }} Tage Zeit.

+ Zum Fragenkatalog +{% endblock %} diff --git a/httpdocs/templates/pages/index.html.twig b/httpdocs/templates/pages/index.html.twig new file mode 100644 index 0000000..187cb53 --- /dev/null +++ b/httpdocs/templates/pages/index.html.twig @@ -0,0 +1,38 @@ +{% extends 'base.html.twig' %} + +{% block title %}Startseite{% endblock %} + +{% block body %} + {% if app.user %} +

Hallo, {{ app.user.firstname }} {{ app.user.lastname }}!

+ {% if app.user.userType.type == "admin" %} +

Sie sind als Administrator eingelogged.

+ Benutzer Übersicht + {% else %} +

Willkommen bei MPP-Tool. Starten Sie jetzt mit ihre Analyse.

+ MPP-Analyse + {% endif %} + {% else %} +

Willkommen beim MPP-Tool (index.html.twig)

+

Headline

+

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Real FMLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Hinweise

+
    +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
+

Anmerkung:

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+ {% endif %} +{% endblock %} diff --git a/httpdocs/templates/pages/legal.html.twig b/httpdocs/templates/pages/legal.html.twig new file mode 100644 index 0000000..f8f8456 --- /dev/null +++ b/httpdocs/templates/pages/legal.html.twig @@ -0,0 +1,26 @@ +{% extends 'base.html.twig' %} + +{% block title %}Nutzungsbedingungen{% endblock %} + +{% block body %} +

Bitte akzeptieren Sie zunächst unsere Nutzungsbedingungen.

+{#

Hier stehen Infos zum Fragenkatalog.

#} + + + + +{% endblock %} \ No newline at end of file diff --git a/httpdocs/templates/pages/start.html.twig b/httpdocs/templates/pages/start.html.twig new file mode 100644 index 0000000..b99a369 --- /dev/null +++ b/httpdocs/templates/pages/start.html.twig @@ -0,0 +1,25 @@ +{% extends 'base.html.twig' %} + +{% block title %}Übersicht{% endblock %} + +{% block body %} +

Übersicht

+{#

Hier stehen Infos zum Fragenkatalog.

#} +

RealFM und der Arbeitskreis BIM wünschen Ihnen nun viel Spaß bei der Bearbeitung des Fragenkataloges sowie wichtige Erkenntnisse und wertvolle Hinweise für die BIM2FM-Stategie und für notwendige Maßnahmen zur Umsetzung.

+ {% if noMoreCatalogues %} +

Sie haben die maximale Anzahl an Durchgängen erreicht.

+ {% else %} +
+ {{ userHasUnfinishedCatalogue ? 'Fragenkatalog fortsetzen' : 'Fragenkatalog starten' }} +{#

Leider ist Ihre Nutzungsdauer von 3 Jahren abgelaufen. Wenn Sie den Fragenkatalog noch einmal bearbeiten möchten, wenden Sie sich bitte an die Geschäftsstelle.

#} +
+ {% endif %} + + {% if userHasFinishedCatalogue %} +

"Ihr BIMScore"

+

Hier erhalten Sie eine Zusammenfassung Ihrer Antworten zu den Fragen aus MyBIMScore und das Ergebnis der Auswertung als PDF-Dokument.

+ Herunterladen +

 

+ {% include 'snippets/sponsors.html.twig' %} + {% endif %} +{% endblock %} diff --git a/httpdocs/templates/pdf/pdf.html.twig b/httpdocs/templates/pdf/pdf.html.twig new file mode 100644 index 0000000..25e6ae0 --- /dev/null +++ b/httpdocs/templates/pdf/pdf.html.twig @@ -0,0 +1,473 @@ + + + + + MyBIMScore + + + + + + + + + + + + + + +

MyBIMScore
+ Ergebnis je Handlungsfeld und gesamt

Canzler GmbH

+ + + + + + + + + + + + + + + + + + + + + + +
Dieses Dokument enthält die Bewertung des BIM-Reifegrades Ihrer FM- bzw. CREM-Organisation und erste Handlungsempfehlungen auf Basis des von Ihnen online ausgefüllten Fragenkataloges sowie eine Zusammenfassung der von Ihnen gegebenen Antworten.

+ Mit dem Ergebnis sollen ggf. fehlende Voraussetzungen identifiziert und damit notwendige Maßnahmen zur Erreichung eines höheren BIM-Reifegrades abgeleitet werden können.

+ In Anlehnung an die Handlungsfelder der VDI Agenda BIM war der Fragenkatalog in „Rahmenbedingungen“, „Prozesse“, „Menschen“ und „Technologien“ unterteilt.
+ Die Abstufung bei den Antworten reichte dabei von "nicht erfüllt" bis zu "umfassend erfüllt", soweit die Fragestellung derzeit überhaupt relevant für die zu bewertende Organisation ist.
+
+ +
+
In die Bewertung gingen alle Fragen (bzw. Anforderungen) ein, die der Nutzer des Fragebogens für seine individuelle Organisation als relevant eingestuft hat, das heißt, für die nicht Antwort (A) ausgewählt wurde.

+ Die einzelnen Fragen wurden für die Ermittlung der Prozentsätze von den an der Entwicklung Beteiligten auf Basis ihrer Expertise gewichtet.

+ Das Ergebnis der Selbsteinschätzung wird als Prozentsatz des erreichbaren Wertes ausgegeben, und zwar gesamt sowie bezogen auf das jeweilige Handlungsfeld.
+
+ +
+

+ {% for cat, res in result %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{ cat }}
Anzahl relevanter/beantworteter Fragen:{{ res.count }}
Anzahl Fragen Handlungsfeld gesamt:{{ res.countAll }}
Maximal erreichbare Punkte:{{ res.maxPoints }}
Erreichte Punktzahl:{{ res.points | round | replace({'.': ','}) }}
Erreichte Prozentzahl:{{ res.percentage | round(1) | replace({'.': ','}) }}%

+ + + + + + + + + + + + + + + +
Einstufung:
{{ res.txtResult }}

+ + + + + + + + + + + + + + + + + + + +
Handlungsempfehlung:
{{ res.txtAction }}
+
+ +
+

+ {% endfor %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Gesamt
Anzahl relevanter/beantworteter Fragen:{{ total.count }}
Anzahl Fragen Handlungsfeld gesamt:{{ total.countAll }}
Maximal erreichbare Punkte:{{ total.maxPoints }}
Erreichte Punktzahl:{{ total.points | round | replace({'.': ','}) }}
Erreichte Prozentzahl:{{ total.percentage | round(1) | replace({'.': ','}) }}%

+ + + + + + + + + + + + + + + +
Einstufung:
{{ total.txtResult }}

+ + + + + + + + + + + + + + + +
Handlungsempfehlung:
{{ total.txtAction }}


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

MyBIMScore
+ Ergebnisübersicht


+ + + + + + + + + + + {# #} + + + {% for cat, res in result %} + + + + + + + {# #} + + + {% endfor %} + + + + + + + {# #} + + + + + +

Anforderungskategorie
+ (Handlungsfelder)
Anzahl beantworteter / relevanter FragenMaximal erreichbare PunktzahlErreichte PunktzahlErreichte ProzentzahlErgebnisErgebnis
{{ cat }}{{ res.count }}{{ res.maxPoints }}{{ res.points | round | replace({'.': ','}) }}{{ res.percentage | round(1) | replace({'.': ','}) }}%#} + {# {% if res.percentage | round(1) > 67 %}#} + {# #} + {# {% elseif res.percentage | round(1) > 50 %}#} + {# #} + {# {% else %}#} + {# #} + {# {% endif %}#} + {# +
+
Gesamt{{ total.count }}{{ total.maxPoints }}{{ total.points | round | replace({'.': ','}) }}{{ total.percentage | round(1) | replace({'.': ','}) }}%#} + {# {% if total.percentage | round(1) > 67 %}#} + {# #} + {# {% elseif total.percentage | round(1) > 50 %}#} + {# #} + {# {% else %}#} + {# #} + {# {% endif %}#} + {# +
+


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

Beteiligte Beratungsunternehmen


Für weiterführende Erläuterungen/ Interpretationen Ihrer Ergebnisse, detailliertere Analysen, externe Audits, Projektunterstützung, Implementierungs-Beratung oder Unterstützung bei der Verbesserung Ihres BIM-Reifegrades stehen Ihnen folgende Ansprechpartner der beteiligten Beratungsunternehmen zur Verfügung:

 Dr. Odin GmbH Ulrich Pieper // Dr. Odin GmbH (ulrich.pieper@dr-odin.de), https://www.dr-odin.de
TÜV SÜD Advimo GmbHMatthias Mosig // TÜV SÜD Advimo GmbH (matthias.mosig@tuvsud.com), https://www.tuvsud.com/de-de/branchen/real-estate/immobilien/bauphysik-und-bautechnik/was-ist-bim/bim-beratung
Canzler GmbHAndreas Rausch // Canzler GmbH (andreas.rausch@canzler.de), https://www.canzler.de


Verband und Arbeitskreis danken den oben genannten Unternehmen, die nicht nur ihr Know-How in die Entwicklung des Online-Tools „MyBIMScore“ eingebracht haben, sondern diese auch als Sponsoren unterstützt haben.

+ +
+
Canzler GmbHRealFM e.V. | Schiffbauerdamm 40 / Büro 5407 | 10117 Berlin
+ T +49 (0)30 20 65 39 81 | E office@RealFM.de | W www.RealFM.de


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

BIM-Selbstbewertung

{{ user.firstname }} {{ user.lastname }}
{{ user.email }}
{{ user.company }}
+
+
+
+ {% set i = 1 %} + {% set qType = "" %} + + {% for catalogueDetail in catalogue.catalogueDetails %} + {% if i != 1 %} + + + + + + {% endif %} + {% if catalogueDetail.question.questionType.type != qType %} + {% set qType = catalogueDetail.question.questionType.type %} + + + + + + + + + + + {% endif %} + + + + + + + + + + + + + + + + {% if catalogueDetail.note is not null and catalogueDetail.note != "" %} + + + + + + {% endif %} + {% set i = i + 1 %} + {% endfor %} +
+ +
+
+

{{ catalogueDetail.question.questionType.type }}

+

{{ i }}

{{ catalogueDetail.question.questionText }}

+ {% if catalogueDetail.answer == 'fulfilled' %} + (E) Umfassend erfüllt + {% elseif catalogueDetail.answer == 'widely_fulfilled' %} + (D) Weitgehend erfüllt + {% elseif catalogueDetail.answer == 'partly_fulfilled' %} + (C) Teilweise erfüllt + {% elseif catalogueDetail.answer == 'not_fulfilled' %} + (B) Nicht erfüllt + {% else %} + (A) Derzeit für meine Organisation nicht relevant + {% endif %} +
+
+ {% if catalogueDetail.answer == 'fulfilled' %} + 100% von erreichbaren {{ catalogueDetail.question.weight }} Punkten = {{ catalogueDetail.question.weight }} Punkte + {% elseif catalogueDetail.answer == 'widely_fulfilled' %} + 66,67% von erreichbaren {{ catalogueDetail.question.weight }} Punkten = {{ catalogueDetail.question.weight * 0.6667 | round(1) }} Punkte + {% elseif catalogueDetail.answer == 'partly_fulfilled' %} + 33,33% von erreichbaren {{ catalogueDetail.question.weight }} Punkten = {{ catalogueDetail.question.weight * 0.3333 | round(1) }} Punkte + {% elseif catalogueDetail.answer == 'not_fulfilled' %} + 0% von erreichbaren {{ catalogueDetail.question.weight }} Punkten = 0 Punkte + {% endif %} +

+
+ Feststellung/Anmerkung:
+ {{ catalogueDetail.note | raw }} +

+
+ + \ No newline at end of file diff --git a/httpdocs/templates/security/login.html.twig b/httpdocs/templates/security/login.html.twig new file mode 100644 index 0000000..b166380 --- /dev/null +++ b/httpdocs/templates/security/login.html.twig @@ -0,0 +1,38 @@ +{% extends 'base.html.twig' %} + +{% block title %}Startseite{% endblock %} + +{% block body %} + {% if app.user %} +

Hallo, {{ app.user.firstname }} {{ app.user.lastname }}!

+ {% if app.user.userType.type == "admin" %} +

Sie sind als Administrator eingelogged.

+ Benutzer Übersicht + {% else %} +

Willkommen bei MPP-Tool. Starten Sie jetzt mit ihre Analyse.

+ MPP-Analyse + {% endif %} + {% else %} +

Willkommen beim MPP-Tool

+

Headline

+

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Real FMLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+

Hinweise

+
    +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
  • +
+

Anmerkung:

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+ {% endif %} +{% endblock %} diff --git a/httpdocs/templates/snippets/listing-form.html.twig b/httpdocs/templates/snippets/listing-form.html.twig new file mode 100644 index 0000000..14f6acf --- /dev/null +++ b/httpdocs/templates/snippets/listing-form.html.twig @@ -0,0 +1,120 @@ +{% if data.user is defined %} +{% set user = data.user %} +{% else %} + {% set user = { + id: "-1", + email: "", + firstname: "", + lastname: "", + phoneNo: "", + maxCatalogues: "3", + company: "", + department: "", + occupation: "", + industry: "", + organisationUnit: "", + invoiceRecipient: "", + invoiceDepartment: "", + invoiceStreet: "", + invoiceZip: "", + invoiceCity: "", + orderNo: "", + costCenter: "", + active: false, + validUntilDate: dateInThreeYears + } %} +{% endif %} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+ {% if data.user is defined %} + + {% endif %} + +
+
\ No newline at end of file diff --git a/httpdocs/templates/snippets/sponsors.html.twig b/httpdocs/templates/snippets/sponsors.html.twig new file mode 100644 index 0000000..1cc0c60 --- /dev/null +++ b/httpdocs/templates/snippets/sponsors.html.twig @@ -0,0 +1,16 @@ +

Für weiterführende Erläuterungen/ Interpretationen Ihrer Ergebnisse, detailliertere Analysen, externe Audits, Projektunterstützung, Implementierungs-Beratung oder Unterstützung bei der Verbesserung Ihres BIM-Reifegrades stehen Ihnen folgende Ansprechpartner der beteiligten Beratungsunternehmen zur Verfügung:

+ +

Verband und Arbeitskreis danken den oben genannten Unternehmen, die nicht nur ihr Know-How in die Entwicklung des Online-Tools „MyBIMScore“ eingebracht haben, sondern diese auch als Sponsoren unterstützt haben.

\ No newline at end of file diff --git a/httpdocs/tests/bootstrap.php b/httpdocs/tests/bootstrap.php new file mode 100644 index 0000000..469dcce --- /dev/null +++ b/httpdocs/tests/bootstrap.php @@ -0,0 +1,11 @@ +bootEnv(dirname(__DIR__).'/.env'); +} diff --git a/httpdocs/translations/.gitignore b/httpdocs/translations/.gitignore new file mode 100644 index 0000000..e69de29