Compare commits

..

No commits in common. "dev" and "main" have entirely different histories.
dev ... main

36 changed files with 28 additions and 5423 deletions

View File

@ -10,7 +10,7 @@ APP_SECRET=79e3e28a27aa752548962c961aee5324
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db" # DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
# DATABASE_URL="postgres://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=8&charset=utf8mb4" # DATABASE_URL="postgres://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=8&charset=utf8mb4"
DB_DATABASE=stat_an DB_DATABASE=stat_an
DB_HOST=stat-an-postgres DB_HOST=postgres
DB_PORT=5432 DB_PORT=5432
DB_USERNAME=postgres DB_USERNAME=postgres
DB_PASSWORD=postgres DB_PASSWORD=postgres

View File

@ -11,18 +11,11 @@
"doctrine/doctrine-bundle": "^2.14", "doctrine/doctrine-bundle": "^2.14",
"doctrine/doctrine-migrations-bundle": "^3.4", "doctrine/doctrine-migrations-bundle": "^3.4",
"doctrine/orm": "^3.3", "doctrine/orm": "^3.3",
"league/tactician-bundle": "^1.5",
"league/tactician-doctrine": "^1.2",
"phpdocumentor/reflection-docblock": "^5.6",
"phpstan/phpdoc-parser": "^2.1",
"symfony/console": "7.2.*", "symfony/console": "7.2.*",
"symfony/dotenv": "7.2.*", "symfony/dotenv": "7.2.*",
"symfony/flex": "^2", "symfony/flex": "^2",
"symfony/framework-bundle": "7.2.*", "symfony/framework-bundle": "7.2.*",
"symfony/property-access": "7.2.*",
"symfony/property-info": "7.2.*",
"symfony/runtime": "7.2.*", "symfony/runtime": "7.2.*",
"symfony/serializer": "7.2.*",
"symfony/yaml": "7.2.*" "symfony/yaml": "7.2.*"
}, },
"require-dev": { "require-dev": {

923
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "97a3015a0d62baaa09109aaacb210b6f", "content-hash": "0de5194aa02e73e25f4a87a916a437ef",
"packages": [ "packages": [
{ {
"name": "doctrine/cache", "name": "doctrine/cache",
@ -1223,535 +1223,6 @@
}, },
"time": "2025-01-24T11:45:48+00:00" "time": "2025-01-24T11:45:48+00:00"
}, },
{
"name": "league/tactician",
"version": "v1.1.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/tactician.git",
"reference": "e79f763170f3d5922ec29e85cffca0bac5cd8975"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/tactician/zipball/e79f763170f3d5922ec29e85cffca0bac5cd8975",
"reference": "e79f763170f3d5922ec29e85cffca0bac5cd8975",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"require-dev": {
"mockery/mockery": "^1.3",
"phpunit/phpunit": "^7.5.20 || ^9.3.8",
"squizlabs/php_codesniffer": "^3.5.8"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"psr-4": {
"League\\Tactician\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ross Tuck",
"homepage": "http://tactician.thephpleague.com"
}
],
"description": "A small, flexible command bus. Handy for building service layers.",
"keywords": [
"command",
"command bus",
"service layer"
],
"support": {
"issues": "https://github.com/thephpleague/tactician/issues",
"source": "https://github.com/thephpleague/tactician/tree/v1.1.0"
},
"time": "2021-02-14T15:29:04+00:00"
},
{
"name": "league/tactician-bundle",
"version": "v1.5.2",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/tactician-bundle.git",
"reference": "8acdfffc227295cca945ff1a964f88e4f034cdf9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/tactician-bundle/zipball/8acdfffc227295cca945ff1a964f88e4f034cdf9",
"reference": "8acdfffc227295cca945ff1a964f88e4f034cdf9",
"shasum": ""
},
"require": {
"league/tactician": "^1.0",
"league/tactician-container": "^2.0|^3.0",
"league/tactician-logger": "^0.10|^0.11",
"php": ">=7.2",
"symfony/config": "^3.4|^4.4|^5.0|^6.0|^7.0",
"symfony/dependency-injection": "^3.4|^4.4|^5.0|^6.0|^7.0",
"symfony/http-kernel": "^3.4|^4.4|^5.0|^6.0|^7.0",
"symfony/yaml": "^3.4|^4.4|^5.0|^6.0|^7.0"
},
"require-dev": {
"matthiasnoback/symfony-config-test": "^4.2.1",
"matthiasnoback/symfony-dependency-injection-test": "^4.2.1",
"mockery/mockery": "~1.0",
"phpspec/prophecy": "^1.18",
"phpunit/phpunit": "~8.5",
"symfony/console": "^3.4|^4.4|^5.0|^6.0|^7.0",
"symfony/framework-bundle": "^3.4.31|^4.4|^5.0|^6.0|^7.0",
"symfony/security-bundle": "^3.4|^4.4|^5.0|^6.0|^7.0",
"symfony/security-core": "^3.4|^4.4|^5.0|^6.0|^7.0",
"symfony/validator": "^3.4|^4.4|^5.0|^6.0|^7.0"
},
"suggest": {
"league/tactician-doctrine": "For doctrine transaction middleware",
"symfony/console": "For debugging command-to-handler routing using the tactician:debug console command",
"symfony/security": "For command security middleware",
"symfony/validator": "For command validator middleware"
},
"type": "symfony-bundle",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
"League\\Tactician\\Bundle\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Rafael Dohms",
"homepage": "http://doh.ms"
},
{
"name": "Richard Tuin",
"homepage": "http://www.rtuin.nl/"
},
{
"name": "Xander Smalbil",
"email": "xander@videofunk.nl"
},
{
"name": "Ross Tuck",
"email": "me@rosstuck.com"
}
],
"description": "Bundle to integrate Tactician with Symfony projects",
"keywords": [
"bundle",
"symfony",
"tactician"
],
"support": {
"issues": "https://github.com/thephpleague/tactician-bundle/issues",
"source": "https://github.com/thephpleague/tactician-bundle/tree/v1.5.2"
},
"time": "2025-02-19T08:17:44+00:00"
},
{
"name": "league/tactician-container",
"version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/tactician-container.git",
"reference": "5150cbf861a51b1b27eba28449b46deee18cc423"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/tactician-container/zipball/5150cbf861a51b1b27eba28449b46deee18cc423",
"reference": "5150cbf861a51b1b27eba28449b46deee18cc423",
"shasum": ""
},
"require": {
"league/tactician": "^1.0",
"php": ">=7.4",
"psr/container": "~2.0"
},
"require-dev": {
"league/container": "~4.0",
"phpunit/phpunit": "~6.0",
"squizlabs/php_codesniffer": "~2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"League\\Tactician\\Container\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nigel Greenway",
"homepage": "http://futurepixels.co.uk"
}
],
"description": "Tactician integration for any container implementing PSR-11",
"keywords": [
"container",
"container-interop",
"di",
"interoperable",
"league",
"tactician"
],
"support": {
"issues": "https://github.com/thephpleague/tactician-container/issues",
"source": "https://github.com/thephpleague/tactician-container/tree/v3.0.0"
},
"time": "2021-12-16T20:15:05+00:00"
},
{
"name": "league/tactician-doctrine",
"version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/tactician-doctrine.git",
"reference": "3ae678caddd008da3b54ba77be8dbf6e46e7c06a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/tactician-doctrine/zipball/3ae678caddd008da3b54ba77be8dbf6e46e7c06a",
"reference": "3ae678caddd008da3b54ba77be8dbf6e46e7c06a",
"shasum": ""
},
"require": {
"doctrine/dbal": "^2.4 || ^3.1.5",
"league/tactician": "^1.1",
"php": ">=7.1"
},
"require-dev": {
"doctrine/orm": "^2.4",
"mockery/mockery": "^1.3.5",
"phpunit/phpunit": "^7.5.20 || ^9.5.10",
"squizlabs/php_codesniffer": "^3.6.2",
"yoast/phpunit-polyfills": "^1.0"
},
"suggest": {
"doctrine/orm": "Required if you need to use ORM Transaction Middleware"
},
"type": "library",
"autoload": {
"psr-4": {
"League\\Tactician\\Doctrine\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ross Tuck"
}
],
"description": "Plugins for Tactician commands using Doctrine, like wrapping every command in a transaction",
"homepage": "https://github.com/thephpleague/tactician-doctrine",
"keywords": [
"command bus",
"doctrine",
"tactician",
"transactions"
],
"support": {
"issues": "https://github.com/thephpleague/tactician-doctrine/issues",
"source": "https://github.com/thephpleague/tactician-doctrine/tree/v1.2.0"
},
"time": "2022-01-17T17:03:37+00:00"
},
{
"name": "league/tactician-logger",
"version": "v0.11.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/tactician-logger.git",
"reference": "586a9f9781e9481a527010561ae80c0403d3f23d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/tactician-logger/zipball/586a9f9781e9481a527010561ae80c0403d3f23d",
"reference": "586a9f9781e9481a527010561ae80c0403d3f23d",
"shasum": ""
},
"require": {
"league/tactician": "^1.1",
"php": ">=7.3",
"psr/log": "^1.0|^2.0|^3.0"
},
"require-dev": {
"mockery/mockery": "^1.3",
"phpunit/phpunit": "^9.3",
"squizlabs/php_codesniffer": "^3.5.8"
},
"type": "library",
"autoload": {
"psr-4": {
"League\\Tactician\\Logger\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ross Tuck"
}
],
"description": "Adds PSR-3 logging support to the Tactician command bus",
"homepage": "https://github.com/thephpleague/tactician-logger",
"keywords": [
"log",
"logging",
"tactician"
],
"support": {
"issues": "https://github.com/thephpleague/tactician-logger/issues",
"source": "https://github.com/thephpleague/tactician-logger/tree/v0.11.1"
},
"time": "2025-04-18T13:03:20+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.6.2",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "92dde6a5919e34835c506ac8c523ef095a95ed62"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62",
"reference": "92dde6a5919e34835c506ac8c523ef095a95ed62",
"shasum": ""
},
"require": {
"doctrine/deprecations": "^1.1",
"ext-filter": "*",
"php": "^7.4 || ^8.0",
"phpdocumentor/reflection-common": "^2.2",
"phpdocumentor/type-resolver": "^1.7",
"phpstan/phpdoc-parser": "^1.7|^2.0",
"webmozart/assert": "^1.9.1"
},
"require-dev": {
"mockery/mockery": "~1.3.5 || ~1.6.0",
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-mockery": "^1.1",
"phpstan/phpstan-webmozart-assert": "^1.2",
"phpunit/phpunit": "^9.5",
"psalm/phar": "^5.26"
},
"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": "opensource@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.6.2"
},
"time": "2025-04-13T19:20:35+00:00"
},
{
"name": "phpdocumentor/type-resolver",
"version": "1.10.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a",
"reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a",
"shasum": ""
},
"require": {
"doctrine/deprecations": "^1.0",
"php": "^7.3 || ^8.0",
"phpdocumentor/reflection-common": "^2.0",
"phpstan/phpdoc-parser": "^1.18|^2.0"
},
"require-dev": {
"ext-tokenizer": "*",
"phpbench/phpbench": "^1.2",
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-phpunit": "^1.1",
"phpunit/phpunit": "^9.5",
"rector/rector": "^0.13.9",
"vimeo/psalm": "^4.25"
},
"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.10.0"
},
"time": "2024-11-09T15:12:26+00:00"
},
{
"name": "phpstan/phpdoc-parser",
"version": "2.1.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68",
"reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0"
},
"require-dev": {
"doctrine/annotations": "^2.0",
"nikic/php-parser": "^5.3.0",
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^2.0",
"phpstan/phpstan-phpunit": "^2.0",
"phpstan/phpstan-strict-rules": "^2.0",
"phpunit/phpunit": "^9.6",
"symfony/process": "^5.2"
},
"type": "library",
"autoload": {
"psr-4": {
"PHPStan\\PhpDocParser\\": [
"src/"
]
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0"
},
"time": "2025-02-19T13:28:12+00:00"
},
{ {
"name": "psr/cache", "name": "psr/cache",
"version": "3.0.0", "version": "3.0.0",
@ -3789,167 +3260,6 @@
], ],
"time": "2025-02-20T12:04:08+00:00" "time": "2025-02-20T12:04:08+00:00"
}, },
{
"name": "symfony/property-access",
"version": "v7.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/property-access.git",
"reference": "b28732e315d81fbec787f838034de7d6c9b2b902"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/property-access/zipball/b28732e315d81fbec787f838034de7d6c9b2b902",
"reference": "b28732e315d81fbec787f838034de7d6c9b2b902",
"shasum": ""
},
"require": {
"php": ">=8.2",
"symfony/property-info": "^6.4|^7.0"
},
"require-dev": {
"symfony/cache": "^6.4|^7.0"
},
"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/v7.2.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": "2025-01-17T10:56:55+00:00"
},
{
"name": "symfony/property-info",
"version": "v7.2.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/property-info.git",
"reference": "f00fd9685ecdbabe82ca25c7b739ce7bba99302c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/property-info/zipball/f00fd9685ecdbabe82ca25c7b739ce7bba99302c",
"reference": "f00fd9685ecdbabe82ca25c7b739ce7bba99302c",
"shasum": ""
},
"require": {
"php": ">=8.2",
"symfony/string": "^6.4|^7.0",
"symfony/type-info": "~7.1.9|^7.2.2"
},
"conflict": {
"phpdocumentor/reflection-docblock": "<5.2",
"phpdocumentor/type-resolver": "<1.5.1",
"symfony/cache": "<6.4",
"symfony/dependency-injection": "<6.4",
"symfony/serializer": "<6.4"
},
"require-dev": {
"phpdocumentor/reflection-docblock": "^5.2",
"phpstan/phpdoc-parser": "^1.0|^2.0",
"symfony/cache": "^6.4|^7.0",
"symfony/dependency-injection": "^6.4|^7.0",
"symfony/serializer": "^6.4|^7.0"
},
"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/v7.2.5"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2025-03-06T16:27:19+00:00"
},
{ {
"name": "symfony/routing", "name": "symfony/routing",
"version": "v7.2.3", "version": "v7.2.3",
@ -4110,104 +3420,6 @@
], ],
"time": "2024-12-29T21:39:47+00:00" "time": "2024-12-29T21:39:47+00:00"
}, },
{
"name": "symfony/serializer",
"version": "v7.2.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/serializer.git",
"reference": "be549655b034edc1a16ed23d8164aa04318c5ec1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/serializer/zipball/be549655b034edc1a16ed23d8164aa04318c5ec1",
"reference": "be549655b034edc1a16ed23d8164aa04318c5ec1",
"shasum": ""
},
"require": {
"php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "~1.8"
},
"conflict": {
"phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0",
"symfony/dependency-injection": "<6.4",
"symfony/property-access": "<6.4",
"symfony/property-info": "<6.4",
"symfony/uid": "<6.4",
"symfony/validator": "<6.4",
"symfony/yaml": "<6.4"
},
"require-dev": {
"phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0",
"phpstan/phpdoc-parser": "^1.0|^2.0",
"seld/jsonlint": "^1.10",
"symfony/cache": "^6.4|^7.0",
"symfony/config": "^6.4|^7.0",
"symfony/console": "^6.4|^7.0",
"symfony/dependency-injection": "^7.2",
"symfony/error-handler": "^6.4|^7.0",
"symfony/filesystem": "^6.4|^7.0",
"symfony/form": "^6.4|^7.0",
"symfony/http-foundation": "^6.4|^7.0",
"symfony/http-kernel": "^6.4|^7.0",
"symfony/messenger": "^6.4|^7.0",
"symfony/mime": "^6.4|^7.0",
"symfony/property-access": "^6.4|^7.0",
"symfony/property-info": "^6.4|^7.0",
"symfony/translation-contracts": "^2.5|^3",
"symfony/type-info": "^7.1",
"symfony/uid": "^6.4|^7.0",
"symfony/validator": "^6.4|^7.0",
"symfony/var-dumper": "^6.4|^7.0",
"symfony/var-exporter": "^6.4|^7.0",
"symfony/yaml": "^6.4|^7.0"
},
"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/v7.2.6"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2025-04-27T13:34:41+00:00"
},
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
"version": "v3.5.1", "version": "v3.5.1",
@ -4440,81 +3652,6 @@
], ],
"time": "2025-04-20T20:18:16+00:00" "time": "2025-04-20T20:18:16+00:00"
}, },
{
"name": "symfony/type-info",
"version": "v7.2.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/type-info.git",
"reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/type-info/zipball/c4824a6b658294c828e609d3d8dbb4e87f6a375d",
"reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d",
"shasum": ""
},
"require": {
"php": ">=8.2",
"psr/container": "^1.1|^2.0"
},
"require-dev": {
"phpstan/phpdoc-parser": "^1.0|^2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\TypeInfo\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mathias Arlaud",
"email": "mathias.arlaud@gmail.com"
},
{
"name": "Baptiste LEDUC",
"email": "baptiste.leduc@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Extracts PHP types information.",
"homepage": "https://symfony.com",
"keywords": [
"PHPStan",
"phpdoc",
"symfony",
"type"
],
"support": {
"source": "https://github.com/symfony/type-info/tree/v7.2.5"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2025-03-24T09:03:36+00:00"
},
{ {
"name": "symfony/var-dumper", "name": "symfony/var-dumper",
"version": "v7.2.6", "version": "v7.2.6",
@ -4745,64 +3882,6 @@
} }
], ],
"time": "2025-04-04T10:10:11+00:00" "time": "2025-04-04T10:10:11+00:00"
},
{
"name": "webmozart/assert",
"version": "1.11.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
"reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
"reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"php": "^7.2 || ^8.0"
},
"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.11.0"
},
"time": "2022-06-03T18:03:27+00:00"
} }
], ],
"packages-dev": [ "packages-dev": [

View File

@ -5,5 +5,4 @@ return [
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
League\Tactician\Bundle\TacticianBundle::class => ['all' => true],
]; ];

View File

@ -23,17 +23,11 @@ doctrine:
Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity
auto_mapping: true auto_mapping: true
mappings: mappings:
App\Domain\Entity: App:
type: php type: attribute
dir: '%kernel.project_dir%/src/Infrastructure/Persistence/Mapping'
is_bundle: false is_bundle: false
prefix: App\Domain\Entity dir: '%kernel.project_dir%/src/Entity'
alias: App prefix: 'App\Entity'
App\Application\ReadModel:
type: php
dir: '%kernel.project_dir%/src/Infrastructure/Persistence/Mapping'
is_bundle: false
prefix: App\Application\ReadModel
alias: App alias: App
controller_resolver: controller_resolver:
auto_mapping: false auto_mapping: false

View File

@ -1,15 +0,0 @@
# Library documentation: http://tactician.thephpleague.com/
# Bundle documentation: https://github.com/thephpleague/tactician-bundle/blob/v1.0/README.md
tactician:
commandbus:
default:
middleware:
# Security middleware - https://github.com/thephpleague/tactician-bundle#security-middleware-tacticianmiddlewaresecurity
# - tactician.middleware.security
# Validator middleware - https://github.com/thephpleague/tactician-bundle/tree/v1.0#validator-middleware-tacticianmiddlewarevalidator
# - tactician.middleware.validator
# Locking middleware - http://tactician.thephpleague.com/plugins/locking-middleware/
- tactician.middleware.locking
# Doctrine transactional middleware, requires additional package - https://github.com/thephpleague/tactician-doctrine
- tactician.middleware.doctrine
- command_handler

View File

@ -1,4 +1,5 @@
healthcheck: controllers:
path: / resource:
controller: App\Infrastructure\Controller\HealthCheck path: ../src/Controller/
methods: GET namespace: App\Controller
type: attribute

View File

@ -16,30 +16,9 @@ services:
App\: App\:
resource: '../src/' resource: '../src/'
exclude: exclude:
- '../src/Domain' - '../src/DependencyInjection/'
- '../src/Infrastructure/Persistence/Mapping' - '../src/Entity/'
- '../src/Application/ReadModel'
- '../src/Kernel.php' - '../src/Kernel.php'
App\Application\UseCase\:
resource: '../src/Application/UseCase'
exclude:
- '../src/Application/UseCase/**/*Request.php'
- '../src/Application/UseCase/**/*Context.php'
public: true
League\Tactician\Handler\Locator\HandlerLocator: '@App\Application\CommandBus\ContainerCommandHandlerLocator'
App\Infrastructure\CommandBus\CommandBusCaller: '@App\Infrastructure\CommandBus\UnmanagedErrorsCommandBusCaller'
command_handler:
class: League\Tactician\Handler\CommandHandlerMiddleware
arguments:
$commandNameExtractor: '@tactician.handler.command_name_extractor.class_name'
$handlerLocator: '@App\Application\CommandBus\ContainerCommandHandlerLocator'
$methodNameInflector: '@tactician.handler.method_name_inflector.handle'
Psr\Container\ContainerInterface: '@service_container'
# add more service definitions when explicit configuration is needed # add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones # please note that last definitions always *replace* previous ones

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Application\AssembleeNationale;
use Symfony\Component\Serializer\Attribute\SerializedPath;
readonly class InterExtraction
{
public function __construct(
#[SerializedPath('[@nom_orateur]')]
public string $nomOrateur,
#[SerializedPath('[@id_acteur]')]
public string $idActeur,
#[SerializedPath('[@id_nomination_oe]')]
public int $idNominationOe,
#[SerializedPath('[@id_nomination_op]')]
public int $idNominationOp,
#[SerializedPath('[@id_mandat]')]
public string $idMandat,
#[SerializedPath('[@qualite]')]
public ?string $qualite,
#[SerializedPath('[paragraphe]')]
/** @var ?Paragraphe[] $paragraphes */
public ?array $paragraphes,
) {
}
}

View File

@ -1,20 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Application\AssembleeNationale;
use Symfony\Component\Serializer\Attribute\SerializedPath;
readonly class Orateur
{
public function __construct(
#[SerializedPath('[nom]')]
public string $nom,
#[SerializedPath('[id]')]
public string $id,
#[SerializedPath('[qualite]')]
public string $qualite,
) {
}
}

View File

@ -1,40 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Application\AssembleeNationale;
use Symfony\Component\Serializer\Attribute\SerializedPath;
readonly class Paragraphe
{
public function __construct(
#[SerializedPath('[orateurs]')]
public ?array $orateur,
public array|string $texte,
#[SerializedPath('[@ordre_absolu_seance]')]
public int $ordreAbsoluteSeance,
#[SerializedPath('[@code_grammaire]')]
public string $codeGrammaire,
#[SerializedPath('[@code_style]')]
public string $codeStyle,
#[SerializedPath('[@code_parole]')]
public string $codeParole,
#[SerializedPath('[@id_acteur]')]
public null|string $idActeur,
#[SerializedPath('[@id_mandat]')]
public null|string|int $idMandat,
#[SerializedPath('[@id_nomination_oe]')]
public null|string|int $idNominationOe,
#[SerializedPath('[@id_nomination_op]')]
public null|string|int $idNominationOp,
#[SerializedPath('[@art]')]
public ?int $art,
#[SerializedPath('[@adt]')]
public ?int $adt,
/** @var ?Paragraphe[] $paragraphes */
public ?array $paragraphes,
) {
}
}

View File

@ -1,29 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Application\AssembleeNationale;
use Symfony\Component\Serializer\Attribute\SerializedPath;
readonly class Point
{
public function __construct(
#[SerializedPath('[texte]')]
public string|array|null $texte,
#[SerializedPath('[@nivpoint]')]
public int $nivPoint,
#[SerializedPath('[@structure]')]
public ?string $structure,
#[SerializedPath('[point]')]
/** @var ?Point[] $points */
public ?array $points,
#[SerializedPath('[paragraphe]')]
/** @var ?Paragraphe[] $paragraphes */
public ?array $paragraphes,
#[SerializedPath('[interExtraction]')]
/** @var ?InterExtraction[] $interExtraction */
public ?array $interExtraction,
) {
}
}

View File

@ -1,28 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Application\AssembleeNationale;
use Symfony\Component\Serializer\Attribute\Context;
use Symfony\Component\Serializer\Attribute\SerializedPath;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
readonly class Seance
{
public function __construct(
#[SerializedPath('[uid]')]
public string $uid,
#[SerializedPath('[metadonnees][dateSeance]')]
#[Context([DateTimeNormalizer::FORMAT_KEY => 'YmdHisv'])]
public \DateTimeImmutable $dateSeance,
#[SerializedPath('[metadonnees][legislature]')]
public int $legislature,
#[SerializedPath('[metadonnees][session]')]
public string $session,
#[SerializedPath('[contenu][point]')]
/** @var Point[] $points */
public array $points,
) {
}
}

View File

@ -1,27 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Application\CommandBus;
use League\Tactician\Exception\MissingHandlerException;
use League\Tactician\Handler\Locator\HandlerLocator;
use Psr\Container\ContainerInterface;
class ContainerCommandHandlerLocator implements HandlerLocator
{
public function __construct(
private readonly ContainerInterface $container
) {
}
public function getHandlerForCommand($commandName)
{
$commandHandler = substr($commandName, 0, -\strlen('Request'));
if (!$this->container->has($commandHandler)) {
throw MissingHandlerException::forCommand($commandName);
}
return $this->container->get($commandHandler);
}
}

View File

View File

@ -1,23 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Application\UseCase;
use App\Application\AssembleeNationale\Seance;
use Symfony\Component\Serializer\SerializerInterface;
class DeserializeCompteRenduAN
{
public function __construct(
private readonly SerializerInterface $serializer
) {
}
public function handle(DeserializeCompteRenduANRequest $request): void
{
$compteRenduXML = file_get_contents($request->filename);
dd($this->serializer->deserialize($compteRenduXML, Seance::class, 'xml'));
}
}

View File

@ -1,13 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Application\UseCase;
class DeserializeCompteRenduANRequest
{
public function __construct(
public string $filename,
) {
}
}

View File

@ -1,13 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Application\UseCase;
class HealthCheck
{
public function handle(HealthCheckRequest $request): string
{
return $request->test;
}
}

View File

@ -1,13 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Application\UseCase;
readonly class HealthCheckRequest
{
public function __construct(
public string $test,
) {
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class HealthcheckController
{
#[Route('/', name: 'healthcheck')]
public function healthcheck(): Response
{
return new Response("ok");
}
}

View File

View File

@ -1,10 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Infrastructure\CommandBus;
interface CommandBusCaller
{
public function callCommandBus(object $request): mixed;
}

View File

@ -1,20 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Infrastructure\CommandBus;
use League\Tactician\CommandBus;
readonly class UnmanagedErrorsCommandBusCaller implements CommandBusCaller
{
public function __construct(
private CommandBus $commandBus
) {
}
public function callCommandBus(object $request): mixed
{
return $this->commandBus->handle($request);
}
}

View File

@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Infrastructure\Console;
use App\Application\UseCase\DeserializeCompteRenduANRequest;
use App\Infrastructure\CommandBus\CommandBusCaller;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
#[AsCommand('stat-an:debug:deserialize:compte-rendu')]
class DebugDeserializeCompteRendu extends Command
{
public function __construct(
private readonly CommandBusCaller $commandBusCaller,
) {
parent::__construct();
}
public function execute(InputInterface $input, OutputInterface $output): int
{
$compteRendu = $this->commandBusCaller->callCommandBus(new DeserializeCompteRenduANRequest(__DIR__ . '/../../../samples/CRSANR5L17S2025O1N201.xml'));
dd($compteRendu);
return Command::SUCCESS;
}
}

View File

@ -1,21 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Infrastructure\Controller;
use App\Infrastructure\CommandBus\CommandBusCaller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
abstract class AController extends AbstractController
{
public function __construct(
private readonly CommandBusCaller $commandBusCaller,
) {
}
protected function callCommandBus(object $request): mixed
{
return $this->commandBusCaller->callCommandBus($request);
}
}

View File

@ -1,22 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Infrastructure\Controller;
use App\Application\UseCase\HealthCheckRequest;
use Symfony\Component\HttpFoundation\JsonResponse;
class HealthCheck extends AController
{
public function __invoke(): JsonResponse
{
$healthcheck = $this->callCommandBus(new HealthCheckRequest('ok'));
return new JsonResponse(
[
'status' => $healthcheck,
]
);
}
}

View File

@ -38,18 +38,6 @@
".php-cs-fixer.dist.php" ".php-cs-fixer.dist.php"
] ]
}, },
"league/tactician-bundle": {
"version": "1.5",
"recipe": {
"repo": "github.com/symfony/recipes-contrib",
"branch": "main",
"version": "1.0",
"ref": "222c3d39d38378bc6a9790a0b5baf841ba6679b9"
},
"files": [
"config/packages/league_tactician.yaml"
]
},
"phpstan/phpstan": { "phpstan/phpstan": {
"version": "2.1", "version": "2.1",
"recipe": { "recipe": {