mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-10-31 17:28:23 +00:00 
			
		
		
		
	Compare commits
	
		
			272 Commits
		
	
	
		
			fix-admin-
			...
			testing-20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| cf36070c82 | |||
| 8ee836eec3 | |||
| 388030952b | |||
| 82a08f1e27 | |||
| 925fbaed6d | |||
| c407c3029f | |||
| 81b6ae193c | |||
| 51168ac3c4 | |||
| 12ee091d09 | |||
| 49607e431f | |||
| ea4cbfe3b9 | |||
| 9d00b8ae60 | |||
| 00350b9efc | |||
| 9a50dad671 | |||
| 4206d17345 | |||
| 110a2e894f | |||
| a0daf4428f | |||
| bdf1cf71ba | |||
| f78b8cad9c | |||
| 6b0c85cdf0 | |||
| 92b71af239 | |||
| a0db7cd7e6 | |||
| 011b6a29e4 | |||
| 527dc971d7 | |||
| 43e5bc8337 | |||
| 845e582c44 | |||
| f3e04bd2bf | |||
| 96e95dd8f1 | |||
| c40e790425 | |||
| 3a016aa12a | |||
| be448c650e | |||
| 9f32b5ac48 | |||
| e89f5e4713 | |||
| e79d6d670b | |||
| 9adbde0308 | |||
| fe31cfd544 | |||
| e8bca6a502 | |||
| b0918ddd09 | |||
| a368e68abb | |||
| 85b9784eef | |||
| 26fd16ab07 | |||
| 9a3fef862e | |||
| 2c01516f71 | |||
| 246546b313 | |||
| bfe658d4fd | |||
| 7ea6638c3a | |||
| b04f0a9aa4 | |||
| ebdfa04843 | |||
| be213d5b5c | |||
| 4d1032c115 | |||
| e43dfc9a20 | |||
| b11684fb3b | |||
| b8826c6c0f | |||
| a996b05ead | |||
| cfcecf1cdc | |||
| b6985e0e5f | |||
| 6d76b94644 | |||
| ff6ec45575 | |||
| f3fd18e6fb | |||
| c8851a8e8a | |||
| abdfe49c33 | |||
| e933f3e781 | |||
| fb1c34f9c1 | |||
| d506409d93 | |||
| 9be8a533ff | |||
| b414b27ba9 | |||
| 8521672660 | |||
| 3f5ce5f841 | |||
| e1404bf16d | |||
| 65b7ed0755 | |||
| a74118e5d4 | |||
| 828739edf5 | |||
| d0811c8118 | |||
| 176bff0551 | |||
| 66c089e862 | |||
| aa44577484 | |||
| 8c59cbc6a0 | |||
| 8c5a7ac3e1 | |||
| a6e523ee0a | |||
| d49058805a | |||
| 73496e0e1f | |||
| 973450110b | |||
| 0f6b10aa0a | |||
| edeb8edbea | |||
| fc8e3789e0 | |||
| 52a80f9621 | |||
| 5632697c05 | |||
| 75932b0e29 | |||
| 7e2bf91e09 | |||
| 0581b59dbd | |||
| 4661ba9932 | |||
| f85b0c8cf7 | |||
| e701e96187 | |||
| d9d151aa89 | |||
| a14ed78e25 | |||
| 420dd4f868 | |||
| 3d9b9ea672 | |||
| 9f12b42961 | |||
| 2842548c17 | |||
| 35f5501489 | |||
| 5e2d960a19 | |||
| 4129283a58 | |||
| f807d62dab | |||
| 5a7bba83f7 | |||
| 50c75dff1a | |||
| e37f3e7c37 | |||
| b6375cad6c | |||
| 8516c87a14 | |||
| 8c5abbff74 | |||
| e0f94ae900 | |||
| f683e45b6e | |||
| b1b7fb6401 | |||
| 8fa06e143d | |||
| ec3d901d2f | |||
| f12d689382 | |||
| 1c04219859 | |||
| 2b88593e64 | |||
| ee65c46d2a | |||
| 7c239eaf6a | |||
| 694b1f3c1f | |||
| 80b9ce3c3e | |||
| 3f218e7183 | |||
| a2713041da | |||
| 3a904e8ea1 | |||
| 6f1a26742d | |||
| 0d0a626f50 | |||
| ec5f4ed1d6 | |||
| d9251239f7 | |||
| b2d3d806b6 | |||
| 8e952cc966 | |||
| 1c4ee37507 | |||
| 8331a836f2 | |||
| 2482dcc62e | |||
| f9a55a1bfd | |||
| 15aa565caf | |||
| 566b72ec9e | |||
| bb42ee25ff | |||
| aebeca1d7a | |||
| 1955249a60 | |||
| 3b0a4e9c73 | |||
| b5fd9cf4af | |||
| bb30ddc876 | |||
| 5ebb53173e | |||
| d1d6a00ebf | |||
| e48bec490c | |||
| 128d365a72 | |||
| 10f66afdcd | |||
| 89aed74355 | |||
| b3bf405c5b | |||
| 9124fa68e8 | |||
| 68b61b7d8a | |||
| 80d8f967fa | |||
| 1375a41de2 | |||
| 4fa4d3b65c | |||
| bd4c34cc1d | |||
| 4cea678e93 | |||
| 5e6833975b | |||
| f523b9adb3 | |||
| a211549432 | |||
| 17b1363113 | |||
| 3356ed8e57 | |||
| 2a7fa517ee | |||
| 95972399a1 | |||
| 85781c8e14 | |||
| 00eb435896 | |||
| ed71cffd6a | |||
| ae679e6997 | |||
| e1d308fd97 | |||
| d9acda67e3 | |||
| e88da74882 | |||
| 591c44d1a0 | |||
| bf04b7981c | |||
| df33eec30f | |||
| c657c98918 | |||
| ef5eb5b907 | |||
| d683fe002d | |||
| 555bbca59b | |||
| e9e9d5c458 | |||
| b1842a33ae | |||
| 6afeaccf24 | |||
| fb76bac480 | |||
| 6ded185289 | |||
| 95adc29f9d | |||
| 4d0c3e683f | |||
| 018aafc773 | |||
| c4aea4efc2 | |||
| 225e3ca13f | |||
| 8c1fa7956a | |||
| e253d1b276 | |||
| a52aac2d98 | |||
| 9e8cf60dd8 | |||
| 7682d81d50 | |||
| 5d31ce96c1 | |||
| 81ef64a246 | |||
| 49d1f78001 | |||
| 0d0f3528e2 | |||
| d97d5e689a | |||
| 95d80ce13e | |||
| 668720984d | |||
| 245c3fa121 | |||
| 1af3e4c7ec | |||
| 5d0fc7a189 | |||
| 483d50e776 | |||
| b4c6ccf309 | |||
| ac6a81cbd8 | |||
| 9503cb89b6 | |||
| b130dbdcdc | |||
| b2b1865837 | |||
| ec5c4d51b3 | |||
| 180437f637 | |||
| 0c2508d26d | |||
| b2d8d21f04 | |||
| 6a2aa77ecc | |||
| e7cd9e00f9 | |||
| 39f60b5b34 | |||
| c9c29b9105 | |||
| fb806a9579 | |||
| 70ca4acafb | |||
| bd61eedfbb | |||
| 80ce7f0bf1 | |||
| 1ebf838bde | |||
| 85a9c6bb67 | |||
| db073fc920 | |||
| 46ebfca28f | |||
| 22a2605381 | |||
| 4f6a7116a4 | |||
| cac7d33a44 | |||
| 0609e3f4c3 | |||
| 3a738179f2 | |||
| a789bf5e1c | |||
| 0a21fada42 | |||
| 4f030eb11a | |||
| 0d2a487ae7 | |||
| 6cb23344fc | |||
| da0d7a3b9e | |||
| fcc61aa4c0 | |||
| 21ec96b75c | |||
| 93f934152f | |||
| 49f4cce72a | |||
| e69b679938 | |||
| 229f9b7125 | |||
| 4fc433cd63 | |||
| 2c91d2e10f | |||
| 4302506471 | |||
| 09b7558e92 | |||
| 6ba5c91ee6 | |||
| 535409e529 | |||
| 9979378e78 | |||
| 58291c7402 | |||
| 3d397c0145 | |||
| d84f3ee5ad | |||
| 6db16e6d0b | |||
| ed60c6aaa3 | |||
| 13b1d20ade | |||
| 5999c73c98 | |||
| 580366de6d | |||
| 7f69f21b64 | |||
| 683a0bc4e9 | |||
| 4d6d40629f | |||
| 2185791665 | |||
| bf14c92567 | |||
| 7c1c1ed800 | |||
| 3b3659f13f | |||
| ebfdc57fcf | |||
| a562690512 | |||
| 1751c65731 | |||
| 791f5bb4be | |||
| 2c812fc5fe | |||
| 1f1d38acef | |||
| 057c34610d | |||
| 732b7dc8f7 | |||
| cb068cdee7 | 
							
								
								
									
										6
									
								
								.changes/unreleased/DX-20250401-144728.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/unreleased/DX-20250401-144728.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| kind: DX | ||||
| body: Allow TranslatableMessage in flash messages | ||||
| time: 2025-04-01T14:47:28.814268801+02:00 | ||||
| custom: | ||||
|     Issue: "" | ||||
|     SchemaChange: No schema change | ||||
							
								
								
									
										44
									
								
								.changes/unreleased/DX-20250407-121010.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								.changes/unreleased/DX-20250407-121010.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| kind: DX | ||||
| body: | | ||||
|     Rewrite exports to run them asynchronously | ||||
|  | ||||
| changelog: | | ||||
|     - Add new methods to serialize data using the rector rule | ||||
|     - Remove all references to the Request in filters, aggregators, filters. Actually, the most frequent occurence is `$security->getUser()`. | ||||
|     - Refactor manually the initializeQuery method | ||||
|     - Remove the injection of ExportManager into the constructor of each export element: | ||||
|  | ||||
|       ```diff | ||||
|  | ||||
|       - class MyFormatter implements FormatterInterface | ||||
|       + class MyFormatter implements FormatterInterface, \Chill\MainBundle\Export\ExportManagerAwareInterface | ||||
|       { | ||||
|       +    use \Chill\MainBundle\Export\Helper\ExportManagerAwareTrait; | ||||
|  | ||||
|       -    public function __construct(private ExportManager $exportmanager) {} | ||||
|  | ||||
|            public function MyMethod(): void | ||||
|            { | ||||
|       -          $this->exportManager->getFilter('alias'); | ||||
|       +          $this->getExportManager()->getFilter('alias'); | ||||
|            } | ||||
|       } | ||||
|       ``` | ||||
|     - configure messenger to handle export in a queue: | ||||
|  | ||||
|     ```diff | ||||
|     # config/packages/messenger.yaml | ||||
|     framework: | ||||
|         messenger: | ||||
|             routing: | ||||
|     +            'Chill\MainBundle\Export\Messenger\ExportRequestGenerationMessage': priority | ||||
|     ``` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| time: 2025-04-07T12:10:10.682561327+02:00 | ||||
| custom: | ||||
|     Issue: "" | ||||
|     SchemaChange: Add columns or tables | ||||
							
								
								
									
										6
									
								
								.changes/unreleased/Feature-20250211-142243.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/unreleased/Feature-20250211-142243.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| kind: Feature | ||||
| body: Allow the merge of two accompanying period works | ||||
| time: 2025-02-11T14:22:43.134106669+01:00 | ||||
| custom: | ||||
|     Issue: "359" | ||||
|     SchemaChange: No schema change | ||||
							
								
								
									
										6
									
								
								.changes/unreleased/Fixed-20250520-140008.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/unreleased/Fixed-20250520-140008.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| kind: Fixed | ||||
| body: Fix retrieve schema to form full tablename and construct sql statements correctly in Thirdparty merger. | ||||
| time: 2025-05-20T14:00:08.987229634+02:00 | ||||
| custom: | ||||
|     Issue: "" | ||||
|     SchemaChange: No schema change | ||||
							
								
								
									
										6
									
								
								.changes/unreleased/Fixed-20250520-140433.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/unreleased/Fixed-20250520-140433.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| kind: Fixed | ||||
| body: Fix add missing translation | ||||
| time: 2025-05-20T14:04:33.612140549+02:00 | ||||
| custom: | ||||
|     Issue: "" | ||||
|     SchemaChange: No schema change | ||||
							
								
								
									
										6
									
								
								.changes/unreleased/Fixed-20250520-164429.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changes/unreleased/Fixed-20250520-164429.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| kind: Fixed | ||||
| body: Fix the transfer of evaluations and documents during of accompanyingperiodwork | ||||
| time: 2025-05-20T16:44:29.093304653+02:00 | ||||
| custom: | ||||
|     Issue: "" | ||||
|     SchemaChange: No schema change | ||||
| @@ -17,6 +17,7 @@ chill_main: | ||||
|     acl: | ||||
|         form_show_scopes: true | ||||
|         form_show_centers: true | ||||
|         filter_stats_by_center: true | ||||
|     access_global_history: false | ||||
|     access_user_change_password: true | ||||
|     access_permissions_group_list: true | ||||
|   | ||||
| @@ -5,7 +5,6 @@ framework: | ||||
|  | ||||
|         # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling. | ||||
|         failure_transport: failed | ||||
|  | ||||
|         transports: | ||||
|             # those transports are added by chill-bundles recipes | ||||
|             sync: sync:// | ||||
| @@ -19,7 +18,9 @@ framework: | ||||
|                         async: ~ | ||||
|                     auto_setup: true | ||||
|  | ||||
|             priority: '%env(MESSENGER_TRANSPORT_DSN)%/priority' | ||||
|             priority: | ||||
|                 dsn: '%env(MESSENGER_TRANSPORT_DSN)%/priority' | ||||
|  | ||||
|             # end of transports added by chill-bundles recipes | ||||
|             # https://symfony.com/doc/current/messenger.html#transport-configuration | ||||
|             failed: 'doctrine://default?queue_name=failed' | ||||
| @@ -61,6 +62,8 @@ framework: | ||||
|             'Chill\MainBundle\Workflow\Messenger\PostSignatureStateChangeMessage': priority | ||||
|             'Chill\MainBundle\Workflow\Messenger\PostPublicViewMessage': async | ||||
|             'Chill\MainBundle\Service\Workflow\CancelStaleWorkflowMessage': async | ||||
|             'Chill\MainBundle\Export\Messenger\ExportRequestGenerationMessage': priority | ||||
|             'Chill\MainBundle\Export\Messenger\RemoveExportGenerationMessage': async | ||||
|             # end of routes added by chill-bundles recipes | ||||
|             # Route your messages to the transports | ||||
|             # 'App\Message\YourMessage': async | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\PersonBundle\Export\Filter; | ||||
|  | ||||
| use Chill\MainBundle\Export\ExportElementValidatedInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use DateTime; | ||||
| use Doctrine\ORM\Query\Expr; | ||||
| @@ -20,6 +21,7 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface; | ||||
|  | ||||
| class BirthdateFilter implements ExportElementValidatedInterface, FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     // add specific role for this filter | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
| @@ -28,7 +30,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|     } | ||||
|  | ||||
|     // here, we alter the query created by Export | ||||
|     public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data) | ||||
|     public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|         // we create the clause here | ||||
| @@ -52,13 +54,13 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|     } | ||||
|  | ||||
|     // we give information on which type of export this filter applies | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return 'person'; | ||||
|     } | ||||
|  | ||||
|     // we build a form to collect some parameters from the users | ||||
|     public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder) | ||||
|     public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('date_from', DateType::class, [ | ||||
|             'label' => 'Born after this date', | ||||
| @@ -74,6 +76,18 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|             'format' => 'dd-MM-yyyy', | ||||
|         ]); | ||||
|     } | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['date_from' => $this->normalizeDate($formData['date_from']), 'date_to' => $this->normalizeDate($formData['date_to'])]; | ||||
|     } | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['date_from' => $this->denormalizeDate($formData['date_from']), 'date_to' => $this->denormalizeDate($formData['date_to'])]; | ||||
|     } | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['date_from' => new DateTime(), 'date_to' => new DateTime()]; | ||||
| @@ -81,7 +95,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|  | ||||
|     // here, we create a simple string which will describe the action of | ||||
|     // the filter in the Response | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         return ['Filtered by person\'s birtdate: ' | ||||
|             . 'between %date_from% and %date_to%', [ | ||||
| @@ -90,7 +104,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|             ], ]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Filter by person\'s birthdate'; | ||||
|     } | ||||
| @@ -99,7 +113,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac | ||||
|     // is executed here. This function is added by the interface | ||||
|     // `ExportElementValidatedInterface`, and can be ignore if there is | ||||
|     // no need for a validation | ||||
|     public function validateForm($data, ExecutionContextInterface $context) | ||||
|     public function validateForm($data, ExecutionContextInterface $context): void | ||||
|     { | ||||
|         $date_from = $data['date_from']; | ||||
|         $date_to = $data['date_to']; | ||||
|   | ||||
| @@ -36,6 +36,18 @@ class CountPerson implements ExportInterface | ||||
|     { | ||||
|         // this export does not add any form | ||||
|     } | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -60,29 +72,29 @@ class CountPerson implements ExportInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         // this array match the result keys in the query. We have only | ||||
|         // one column. | ||||
|         return ['export_result']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Count peoples'; | ||||
|     } | ||||
|  | ||||
|     public function getType() | ||||
|     public function getType(): string | ||||
|     { | ||||
|         return Declarations::PERSON_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         // we gather all center the user choose. | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|   | ||||
							
								
								
									
										84
									
								
								docs/source/development/export-sequence.puml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								docs/source/development/export-sequence.puml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| @startuml | ||||
| 'https://plantuml.com/sequence-diagram | ||||
|  | ||||
| autonumber | ||||
|  | ||||
| User -> ExportController: configure export using form | ||||
| activate ExportController | ||||
| ExportController -> ExportForm: build form | ||||
| activate ExportForm | ||||
|  | ||||
| loop for every ExportElement (Filter, Aggregator) | ||||
|     ExportForm -> ExportElement: `buildForm` | ||||
|     activate ExportElement | ||||
|     ExportElement -> ExportForm: add form to builders | ||||
|     deactivate ExportElement | ||||
| end | ||||
|  | ||||
| ExportForm -> ExportController | ||||
| deactivate ExportForm | ||||
|  | ||||
| ExportController -> User: show form | ||||
| deactivate ExportController | ||||
|  | ||||
| note left of User: Configure the export:\ncheck filters, aggregators, … | ||||
|  | ||||
| User -> ExportController: post configuration of the export | ||||
| activate ExportController | ||||
|  | ||||
| ExportController -> ExportForm: `getData` | ||||
| activate ExportForm | ||||
| ExportForm -> ExportController: return data: list of entities, etc. | ||||
| deactivate ExportForm | ||||
|  | ||||
| loop for every ExportElement (Filter, Aggregator) | ||||
|     ExportController -> ExportElement: serializeData (data) | ||||
|     activate ExportElement | ||||
|     ExportElement -> ExportController: return serializedData (simple array with string, int, …) | ||||
|     deactivate ExportElement | ||||
| end | ||||
|  | ||||
| ExportController -> Database: `INSERT INTO RequestGeneration_table` (insert new entity) | ||||
| ExportController -> MessageQueue: warn about a new request | ||||
| activate MessageQueue | ||||
| ExportController -> User: "ok, generation is in process" | ||||
| deactivate ExportController | ||||
|  | ||||
| note left of User: The user see a waiting screen | ||||
|  | ||||
| MessageQueue -> MessengerConsumer: forward the message to the MessengerConsumer | ||||
| deactivate MessageQueue | ||||
| activate MessengerConsumer | ||||
| MessengerConsumer -> Database: `SELECT * FROM RequestGeneration_table WHERE id = %s` | ||||
| activate Database | ||||
| Database -> MessengerConsumer: return RequestGeneration with serializedData | ||||
| deactivate Database | ||||
|  | ||||
| loop for every ExportElement (Filter, Aggregator) | ||||
|     MessengerConsumer -> ExportElement: deserializeData | ||||
|     activate ExportElement | ||||
|     ExportElement -> MessengerConsumer: return data (list of entities, etc.) from the serialized array | ||||
|     deactivate ExportElement | ||||
|     MessengerConsumer -> ExportElement: alter the sql query (`ExportElement::alterQuery`) | ||||
|     activate ExportElement | ||||
|     ExportElement -> MessengerConsumer: return the query with WHERE and GROUP BY clauses | ||||
|     deactivate ExportElement | ||||
| end | ||||
|  | ||||
| MessengerConsumer -> MessengerConsumer: prepare the export | ||||
| MessengerConsumer -> MessengerConsumer: save the export as a stored object | ||||
| MessengerConsumer -> Database: `UPDATE RequestGeneration_table SET ready = true` | ||||
| deactivate MessengerConsumer | ||||
|  | ||||
| User -> ExportController: pull every 5s to know if the export is generated | ||||
| activate ExportController | ||||
| ExportController -> User: warn the export is generated | ||||
| deactivate ExportController | ||||
|  | ||||
| User -> ExportController: download the export from object storage | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @enduml | ||||
| @@ -15,24 +15,31 @@ Messages to users, flashbags and buttons | ||||
| Flashbags | ||||
| ========== | ||||
|  | ||||
| The four following levels are defined :  | ||||
| The four following levels are defined : | ||||
|  | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
| |Key        |Intent                                                                                        | | ||||
| +===========+==============================================================================================+ | ||||
| |alert      |A message not linked with the user action, but which should require an action or a            | | ||||
| |           |correction.                                                                                   | | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
| |success    |The user action succeeds.                                                                     | | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
| |notice     |A simple message to give information to the user. The message may be linked or not linked with| | ||||
| |           |the user action.                                                                              | | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
| |warning    |A message linked with an action, the user should correct.                                     | | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
| |error      |The user's action failed: he must correct something to process the action.                    | | ||||
| +-----------+----------------------------------------------------------------------------------------------+ | ||||
|  | ||||
| We can use :code:`TranslatableMessage` (and other :code:`TranslatableMessageInterface` instances) into the controller: | ||||
|  | ||||
| .. code-block:: php | ||||
|  | ||||
|    // in a controller action: | ||||
|    if (($session = $request->getSession()) instanceof Session) { | ||||
|        $session->getFlashBag()->add( | ||||
|            'success', | ||||
|            new TranslatableMessage('saved_export.Saved export is saved!') | ||||
|        ); | ||||
|    } | ||||
|  | ||||
| .. seealso:: | ||||
|  | ||||
|    `Flash Messages on Symfony documentation <http://symfony.com/doc/current/book/controller.html#flash-messages>`_ | ||||
| @@ -66,7 +73,7 @@ To add the action on button, use them as class along with ``sc-button`` : | ||||
| |           |                | - Submitting this form will remove the entity                                | | ||||
| +-----------+----------------+------------------------------------------------------------------------------+ | ||||
| | Edit      | ``bt-edit`` or | Link to a form to edit an entity                                             | | ||||
| |           | ``bt-update``  |                                                                              |  | ||||
| |           | ``bt-update``  |                                                                              | | ||||
| +-----------+----------------+------------------------------------------------------------------------------+ | ||||
| | Save      | ``bt-save``    | Submitting this form will save change on the entity                          | | ||||
| +-----------+----------------+------------------------------------------------------------------------------+ | ||||
|   | ||||
| @@ -3,7 +3,7 @@ parameters: | ||||
|     paths: | ||||
|         - src/ | ||||
|         - utils/ | ||||
|     tmpDir: .cache/ | ||||
|     tmpDir: var/cache/phpstan | ||||
|     reportUnmatchedIgnoredErrors: false | ||||
|     excludePaths: | ||||
|         - .php_cs* | ||||
|   | ||||
| @@ -1,13 +1,24 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" bootstrap="vendor/autoload.php" executionOrder="depends,defects" beStrictAboutOutputDuringTests="true" failOnRisky="true" failOnWarning="true" colors="true" cacheDirectory="var/cache/phpunit.rector.cache" requireCoverageMetadata="true" beStrictAboutCoverageMetadata="true"> | ||||
|   <testsuites> | ||||
|     <testsuite name="default"> | ||||
|       <directory>utils/rector/tests</directory> | ||||
|     </testsuite> | ||||
|   </testsuites> | ||||
|   <source> | ||||
|     <include> | ||||
|       <directory suffix=".php">utils/rector/src</directory> | ||||
|     </include> | ||||
|   </source> | ||||
| <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" | ||||
|          bootstrap="vendor/autoload.php" | ||||
|          executionOrder="depends,defects" | ||||
|          beStrictAboutOutputDuringTests="true" | ||||
|          failOnRisky="true" | ||||
|          failOnWarning="true" | ||||
|          colors="true" | ||||
|          cacheDirectory="var/cache/phpunit.rector.cache" | ||||
|          requireCoverageMetadata="true" | ||||
|          beStrictAboutCoverageMetadata="true" | ||||
|          displayDetailsOnTestsThatTriggerWarnings="true"> | ||||
|     <testsuites> | ||||
|         <testsuite name="default"> | ||||
|             <directory>utils/rector/tests</directory> | ||||
|         </testsuite> | ||||
|     </testsuites> | ||||
|     <source> | ||||
|         <include> | ||||
|             <directory suffix=".php">utils/rector/src</directory> | ||||
|         </include> | ||||
|     </source> | ||||
| </phpunit> | ||||
|   | ||||
							
								
								
									
										22
									
								
								rector.php
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								rector.php
									
									
									
									
									
								
							| @@ -18,14 +18,15 @@ return static function (RectorConfig $rectorConfig): void { | ||||
|     $rectorConfig->paths([ | ||||
|         __DIR__ . '/docs', | ||||
|         __DIR__ . '/src', | ||||
|         __DIR__ . '/rector.php', | ||||
|     ]); | ||||
|  | ||||
|     $rectorConfig->skip([ | ||||
|         \Rector\Php55\Rector\String_\StringClassNameToClassConstantRector::class => __DIR__ . 'src/Bundle/ChillMainBundle/Service/Notifier/LegacyOvhCloudFactory.php' | ||||
|     ]); | ||||
|  | ||||
|     $rectorConfig->symfonyContainerXml(__DIR__ . '/var/cache/dev/test/App_KernelTestDebugContainer.xml  '); | ||||
|     $rectorConfig->symfonyContainerPhp(__DIR__ . '/tests/symfony-container.php'); | ||||
|     //$rectorConfig->symfonyContainerXml(__DIR__ . '/var/cache/dev/test/App_KernelTestDebugContainer.xml  '); | ||||
|     //$rectorConfig->symfonyContainerPhp(__DIR__ . '/tests/symfony-container.php'); | ||||
|  | ||||
|     //$rectorConfig->cacheClass(\Rector\Caching\ValueObject\Storage\FileCacheStorage::class); | ||||
|     //$rectorConfig->cacheDirectory(__DIR__ . '/.cache/rector'); | ||||
| @@ -36,19 +37,17 @@ return static function (RectorConfig $rectorConfig): void { | ||||
|     $rectorConfig->rule(Rector\TypeDeclaration\Rector\Class_\MergeDateTimePropertyTypeDeclarationRector::class); | ||||
|     $rectorConfig->rule(Rector\TypeDeclaration\Rector\ClassMethod\AddReturnTypeDeclarationBasedOnParentClassMethodRector::class); | ||||
|  | ||||
|     // upgrade chill exports | ||||
|     $rectorConfig->rules([\Chill\Utils\Rector\Rector\ChillBundleAddNormalizationMethodsOnExportRector::class]); | ||||
|  | ||||
|     // part of the symfony 54 rules | ||||
|     $rectorConfig->rule(\Rector\Symfony\Symfony53\Rector\StaticPropertyFetch\KernelTestCaseContainerPropertyDeprecationRector::class); | ||||
|     $rectorConfig->rule(\Rector\Symfony\Symfony60\Rector\MethodCall\GetHelperControllerToServiceRector::class); | ||||
|     $rectorConfig->disableParallel(); | ||||
|     //$rectorConfig->disableParallel(); | ||||
|  | ||||
|     //define sets of rules | ||||
|     $rectorConfig->sets([ | ||||
|         LevelSetList::UP_TO_PHP_82, | ||||
|         \Rector\Symfony\Set\SymfonySetList::SYMFONY_40, | ||||
|         \Rector\Symfony\Set\SymfonySetList::SYMFONY_41, | ||||
|         \Rector\Symfony\Set\SymfonySetList::SYMFONY_42, | ||||
|         \Rector\Symfony\Set\SymfonySetList::SYMFONY_43, | ||||
|         \Rector\Symfony\Set\SymfonySetList::SYMFONY_44, | ||||
|         \Rector\Doctrine\Set\DoctrineSetList::DOCTRINE_CODE_QUALITY, | ||||
|         \Rector\PHPUnit\Set\PHPUnitSetList::PHPUNIT_90, | ||||
|     ]); | ||||
| @@ -66,11 +65,6 @@ return static function (RectorConfig $rectorConfig): void { | ||||
|     // some routes are added twice if it remains activated | ||||
|     // $rectorConfig->rule(\Rector\Symfony\Configs\Rector\ClassMethod\AddRouteAnnotationRector::class); | ||||
|  | ||||
|     // chill rules | ||||
|     $rectorConfig->rules([ | ||||
|         \Chill\Utils\Rector\Rector\ChillBundleMakeDataProviderStaticForAbstractExportTestRector::class, | ||||
|     ]); | ||||
|  | ||||
|     // skip some path... | ||||
|     $rectorConfig->skip([ | ||||
|         // waiting for fixing this bug: https://github.com/rectorphp/rector-doctrine/issues/342 | ||||
| @@ -94,4 +88,6 @@ return static function (RectorConfig $rectorConfig): void { | ||||
|         new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Validator\Constraints\Entity\UserCircleConsistency'), | ||||
|         new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Workflow\Validator\EntityWorkflowCreation'), | ||||
|     ]); | ||||
|  | ||||
|  | ||||
| }; | ||||
|   | ||||
| @@ -24,7 +24,7 @@ class ByActivityNumberAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data): void | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb | ||||
|             ->addSelect('(SELECT COUNT(activity.id) FROM '.Activity::class.' activity WHERE activity.accompanyingPeriod = acp) AS activity_by_number_aggregator') | ||||
| @@ -41,12 +41,27 @@ class ByActivityNumberAggregator implements AggregatorInterface | ||||
|         // No form needed | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return static function ($value) { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -33,7 +33,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|         private TranslatableStringHelperInterface $translatableStringHelper, | ||||
|     ) {} | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('after_date', PickRollingDateType::class, [ | ||||
| @@ -46,6 +46,21 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['after_date' => $formData['after_date']->normalize(), 'before_date' => $formData['before_date']->normalize()]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['after_date' => \Chill\MainBundle\Service\RollingDate\RollingDate::fromNormalized($formData['after_date']), 'before_date' => \Chill\MainBundle\Service\RollingDate\RollingDate::fromNormalized($formData['before_date'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -54,7 +69,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, mixed $data) | ||||
|     public function getLabels($key, array $values, mixed $data): callable | ||||
|     { | ||||
|         return function (int|string|null $value): string { | ||||
|             if ('_header' === $value) { | ||||
| @@ -69,12 +84,12 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return [self::PREFIX.'_actype_id']; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aggregator.acp.by_activity_type.title'; | ||||
|     } | ||||
| @@ -84,7 +99,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -115,7 +130,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface | ||||
|             ->addGroupBy("{$p}_actype_id"); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACP_TYPE; | ||||
|     } | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class BySocialActionAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actsocialaction', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.socialActions', 'actsocialaction'); | ||||
| @@ -42,17 +42,32 @@ class BySocialActionAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY_ACP; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value) { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class BySocialIssueAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actsocialissue', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.socialIssues', 'actsocialissue'); | ||||
| @@ -42,17 +42,32 @@ class BySocialIssueAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY_ACP; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -25,7 +25,7 @@ final readonly class ActivityLocationAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actloc', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.location', 'actloc'); | ||||
| @@ -39,17 +39,32 @@ final readonly class ActivityLocationAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form required for this aggregator | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
| @@ -69,7 +84,7 @@ final readonly class ActivityLocationAggregator implements AggregatorInterface | ||||
|         return [self::KEY]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aggregator.activity.by_location.Title'; | ||||
|     } | ||||
|   | ||||
| @@ -22,14 +22,29 @@ final readonly class ActivityPresenceAggregator implements AggregatorInterface | ||||
| { | ||||
|     public function __construct(private ActivityPresenceRepositoryInterface $activityPresenceRepository, private TranslatableStringHelperInterface $translatableStringHelper) {} | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, mixed $data) | ||||
|     public function getLabels($key, array $values, mixed $data): callable | ||||
|     { | ||||
|         return function (int|string|null $value): string { | ||||
|             if ('_header' === $value) { | ||||
| @@ -44,7 +59,7 @@ final readonly class ActivityPresenceAggregator implements AggregatorInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['activity_presence_aggregator_attendee']; | ||||
|     } | ||||
| @@ -59,13 +74,13 @@ final readonly class ActivityPresenceAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data): void | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->addSelect('IDENTITY(activity.attendee) AS activity_presence_aggregator_attendee'); | ||||
|         $qb->addGroupBy('activity_presence_aggregator_attendee'); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|   | ||||
| @@ -36,7 +36,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         // add select element | ||||
|         if ('reasons' === $data['level']) { | ||||
| @@ -72,7 +72,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add( | ||||
|             'level', | ||||
| @@ -89,6 +89,21 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['level' => $formData['level']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['level' => $formData['level']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -96,7 +111,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value) use ($data) { | ||||
|             if ('_header' === $value) { | ||||
| @@ -125,7 +140,7 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         // add select element | ||||
|         if ('reasons' === $data['level']) { | ||||
| @@ -139,12 +154,12 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali | ||||
|         throw new \RuntimeException('The data provided are not recognised.'); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Aggregate by activity reason'; | ||||
|     } | ||||
|  | ||||
|     public function validateForm($data, ExecutionContextInterface $context) | ||||
|     public function validateForm($data, ExecutionContextInterface $context): void | ||||
|     { | ||||
|         if (null === $data['level']) { | ||||
|             $context | ||||
|   | ||||
| @@ -29,7 +29,7 @@ class ActivityTypeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('acttype', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.activityType', 'acttype'); | ||||
| @@ -44,17 +44,32 @@ class ActivityTypeAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form required for this aggregator | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function (int|string|null $value): string { | ||||
|             if ('_header' === $value) { | ||||
| @@ -74,7 +89,7 @@ class ActivityTypeAggregator implements AggregatorInterface | ||||
|         return [self::KEY]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Aggregate by activity type'; | ||||
|     } | ||||
|   | ||||
| @@ -29,7 +29,7 @@ class ActivityUserAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         // add select element | ||||
|         $qb->addSelect(sprintf('IDENTITY(activity.user) AS %s', self::KEY)); | ||||
| @@ -43,17 +43,32 @@ class ActivityUserAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // nothing to add | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, $values, $data): \Closure | ||||
|     public function getLabels($key, $values, $data): callable | ||||
|     { | ||||
|         return function ($value) { | ||||
|             if ('_header' === $value) { | ||||
| @@ -70,7 +85,7 @@ class ActivityUserAggregator implements AggregatorInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return [self::KEY]; | ||||
|     } | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class ActivityUsersAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actusers', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.users', 'actusers'); | ||||
| @@ -43,17 +43,32 @@ class ActivityUsersAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // nothing to add on the form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value) { | ||||
|             if ('_header' === $value) { | ||||
| @@ -70,12 +85,12 @@ class ActivityUsersAggregator implements AggregatorInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['activity_users_aggregator']; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Aggregate by activity users'; | ||||
|     } | ||||
|   | ||||
| @@ -34,7 +34,7 @@ class ActivityUsersJobAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ class ActivityUsersJobAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -34,7 +34,7 @@ class ActivityUsersScopeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ class ActivityUsersScopeAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class ByCreatorAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->addSelect('IDENTITY(activity.createdBy) AS creator_aggregator'); | ||||
|         $qb->addGroupBy('creator_aggregator'); | ||||
| @@ -38,17 +38,32 @@ class ByCreatorAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class ByThirdpartyAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('acttparty', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.thirdParties', 'acttparty'); | ||||
| @@ -42,17 +42,32 @@ class ByThirdpartyAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -34,7 +34,7 @@ class CreatorJobAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ class CreatorJobAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -34,7 +34,7 @@ class CreatorScopeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ class CreatorScopeAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -32,7 +32,7 @@ class DateAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $order = null; | ||||
|  | ||||
| @@ -67,7 +67,7 @@ class DateAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('frequency', ChoiceType::class, [ | ||||
|             'choices' => self::CHOICES, | ||||
| @@ -76,12 +76,27 @@ class DateAggregator implements AggregatorInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['frequency' => $formData['frequency']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['frequency' => $formData['frequency']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['frequency' => self::DEFAULT_CHOICE]; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return static function ($value) use ($data): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class LocationTypeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actloc', $qb->getAllAliases(), true)) { | ||||
|             $qb->leftJoin('activity.location', 'actloc'); | ||||
| @@ -42,17 +42,32 @@ class LocationTypeAggregator implements AggregatorInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -24,17 +24,32 @@ final readonly class HouseholdAggregator implements AggregatorInterface | ||||
| { | ||||
|     public function __construct(private HouseholdRepository $householdRepository) {} | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // nothing to add here | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, mixed $data) | ||||
|     public function getLabels($key, array $values, mixed $data): callable | ||||
|     { | ||||
|         return function (int|string|null $value): string|int { | ||||
|             if ('_header' === $value) { | ||||
| @@ -49,12 +64,12 @@ final readonly class HouseholdAggregator implements AggregatorInterface | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['activity_household_agg']; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aggregator.person.by_household.title'; | ||||
|     } | ||||
| @@ -64,7 +79,7 @@ final readonly class HouseholdAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->join( | ||||
|             HouseholdMember::class, | ||||
| @@ -92,7 +107,7 @@ final readonly class HouseholdAggregator implements AggregatorInterface | ||||
|             ->addGroupBy('activity_household_agg'); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY_PERSON; | ||||
|     } | ||||
|   | ||||
| @@ -21,27 +21,42 @@ final readonly class PersonAggregator implements AggregatorInterface | ||||
| { | ||||
|     public function __construct(private LabelPersonHelper $labelPersonHelper) {} | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // nothing to add here | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, mixed $data) | ||||
|     public function getLabels($key, array $values, mixed $data): callable | ||||
|     { | ||||
|         return $this->labelPersonHelper->getLabel($key, $values, 'export.aggregator.person.by_person.person'); | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['activity_by_person_agg']; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aggregator.person.by_person.title'; | ||||
|     } | ||||
| @@ -51,14 +66,14 @@ final readonly class PersonAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb | ||||
|             ->addSelect('IDENTITY(activity.person) AS activity_by_person_agg') | ||||
|             ->addGroupBy('activity_by_person_agg'); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY_PERSON; | ||||
|     } | ||||
|   | ||||
| @@ -27,17 +27,32 @@ final readonly class PersonsAggregator implements AggregatorInterface | ||||
|  | ||||
|     public function __construct(private LabelPersonHelper $labelPersonHelper) {} | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // nothing to add here | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, mixed $data) | ||||
|     public function getLabels($key, array $values, mixed $data): callable | ||||
|     { | ||||
|         if ($key !== self::PREFIX.'_pid') { | ||||
|             throw new \UnexpectedValueException('this key should not be handled: '.$key); | ||||
| @@ -46,12 +61,12 @@ final readonly class PersonsAggregator implements AggregatorInterface | ||||
|         return $this->labelPersonHelper->getLabel($key, $values, 'export.aggregator.activity.by_persons.Persons'); | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return [self::PREFIX.'_pid']; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aggregator.activity.by_persons.Group activity by persons'; | ||||
|     } | ||||
| @@ -61,7 +76,7 @@ final readonly class PersonsAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -71,7 +86,7 @@ final readonly class PersonsAggregator implements AggregatorInterface | ||||
|             ->addGroupBy("{$p}_pid"); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|   | ||||
| @@ -26,7 +26,7 @@ class SentReceivedAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data): void | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->addSelect('activity.sentReceived AS activity_sentreceived_aggregator') | ||||
|             ->addGroupBy('activity_sentreceived_aggregator'); | ||||
| @@ -42,6 +42,21 @@ class SentReceivedAggregator implements AggregatorInterface | ||||
|         // No form needed | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Repository\ActivityRepository; | ||||
| use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; | ||||
| use Chill\MainBundle\Export\AccompanyingCourseExportHelper; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\ExportInterface; | ||||
| use Chill\MainBundle\Export\FormatterInterface; | ||||
| use Chill\MainBundle\Export\GroupedExportInterface; | ||||
| @@ -38,6 +39,21 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -72,7 +88,7 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return ['export_avg_activity_duration']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -87,7 +103,7 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; | ||||
| use Chill\MainBundle\Export\AccompanyingCourseExportHelper; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\ExportInterface; | ||||
| use Chill\MainBundle\Export\FormatterInterface; | ||||
| use Chill\MainBundle\Export\GroupedExportInterface; | ||||
| @@ -46,6 +47,21 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         // TODO: Implement buildForm() method. | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -80,7 +96,7 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return ['export_avg_activity_visit_duration']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -95,7 +111,7 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -43,6 +43,21 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -77,7 +92,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|         return ['export_count_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -92,7 +107,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -44,6 +44,21 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -78,7 +93,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|         return ['export_count_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -93,7 +108,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -43,6 +43,21 @@ class CountPersonsOnActivity implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -77,7 +92,7 @@ class CountPersonsOnActivity implements ExportInterface, GroupedExportInterface | ||||
|         return ['export_count_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -92,7 +107,7 @@ class CountPersonsOnActivity implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -17,6 +17,7 @@ use Chill\ActivityBundle\Export\Export\ListActivityHelper; | ||||
| use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; | ||||
| use Chill\MainBundle\Entity\Scope; | ||||
| use Chill\MainBundle\Export\AccompanyingCourseExportHelper; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\GroupedExportInterface; | ||||
| use Chill\MainBundle\Export\Helper\TranslatableStringExportLabelHelper; | ||||
| use Chill\MainBundle\Export\ListInterface; | ||||
| @@ -38,6 +39,21 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa | ||||
|         $this->helper->buildForm($builder); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -73,7 +89,7 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return | ||||
|             array_merge( | ||||
| @@ -85,25 +101,23 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa | ||||
|             ); | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $this->helper->getResult($query, $data); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return ListActivityHelper::MSG_KEY.'List activity linked to a course'; | ||||
|     } | ||||
|  | ||||
|     public function getType() | ||||
|     public function getType(): string | ||||
|     { | ||||
|         return $this->helper->getType(); | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|         $qb = $this->entityManager->createQueryBuilder(); | ||||
|  | ||||
|         $qb | ||||
| @@ -114,7 +128,7 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa | ||||
|             ->leftJoin('acppart.person', 'person') | ||||
|             ->andWhere('acppart.startDate != acppart.endDate OR acppart.endDate IS NULL'); | ||||
|  | ||||
|         $this->filterListAccompanyingPeriodHelper->addFilterAccompanyingPeriods($qb, $requiredModifiers, $acl, $data); | ||||
|         $this->filterListAccompanyingPeriodHelper->addFilterAccompanyingPeriods($qb, $requiredModifiers, $acl, $context->byUser, $data); | ||||
|  | ||||
|         $qb | ||||
|             // some grouping are necessary | ||||
|   | ||||
| @@ -40,9 +40,21 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         // TODO: Implement buildForm() method. | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
| @@ -79,7 +91,7 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return ['export_sum_activity_duration']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -94,7 +106,7 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -40,9 +40,21 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         // TODO: Implement buildForm() method. | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
| @@ -79,7 +91,7 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return ['export_sum_activity_visit_duration']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -94,7 +106,7 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -35,6 +35,21 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -64,17 +79,17 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|         return static fn ($value) => '_header' === $value ? 'Number of activities linked to a person' : $value; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['export_count_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Count activities linked to a person'; | ||||
|     } | ||||
| @@ -84,7 +99,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -36,6 +36,21 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -65,17 +80,17 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|         return static fn ($value) => '_header' === $value ? 'export.export.count_household_on_activity_person.header' : $value; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['export_count_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.export.count_household_on_activity_person.title'; | ||||
|     } | ||||
| @@ -85,7 +100,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -78,6 +78,21 @@ class ListActivity implements ListInterface, GroupedExportInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['fields' => $formData['fields']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['fields' => $formData['fields']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -167,17 +182,17 @@ class ListActivity implements ListInterface, GroupedExportInterface | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return $data['fields']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'List activity linked to a person'; | ||||
|     } | ||||
| @@ -187,7 +202,7 @@ class ListActivity implements ListInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
| @@ -49,6 +49,21 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -84,17 +99,17 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return static fn (string $value) => '_header' === $value ? $header : $value; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return ['export_stat_activity']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         if (self::SUM === $this->action) { | ||||
|             return 'Sum activity linked to a person duration'; | ||||
| @@ -108,7 +123,7 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $centers = array_map( | ||||
|             static fn (array $el): Center => $el['center'], | ||||
|   | ||||
| @@ -14,6 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter\ACPFilters; | ||||
| use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Entity\ActivityType; | ||||
| use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickRollingDateType; | ||||
| use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; | ||||
| @@ -25,6 +26,7 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| final readonly class ActivityTypeFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     private const BASE_EXISTS = 'SELECT 1 FROM '.Activity::class.' act_type_filter_activity WHERE act_type_filter_activity.accompanyingPeriod = acp'; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -38,7 +40,7 @@ final readonly class ActivityTypeFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $exists = self::BASE_EXISTS; | ||||
|  | ||||
| @@ -62,12 +64,12 @@ final readonly class ActivityTypeFilter implements FilterInterface | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACP_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_activitytypes', EntityType::class, [ | ||||
|             'class' => ActivityType::class, | ||||
| @@ -92,6 +94,21 @@ final readonly class ActivityTypeFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_activitytypes' => $this->normalizeDoctrineEntity($formData['accepted_activitytypes']), 'date_after' => $formData['date_after']?->normalize(), 'date_before' => $formData['date_before']?->normalize()]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_activitytypes' => $this->denormalizeDoctrineEntity($formData['accepted_activitytypes'], $this->activityTypeRepository), 'date_after' => \Chill\MainBundle\Service\RollingDate\RollingDate::fromNormalized($formData['date_after']), 'date_before' => \Chill\MainBundle\Service\RollingDate\RollingDate::fromNormalized($formData['date_before'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -101,7 +118,7 @@ final readonly class ActivityTypeFilter implements FilterInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $types = []; | ||||
|  | ||||
|   | ||||
| @@ -12,23 +12,28 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter\ACPFilters; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\PersonBundle\Entity\SocialWork\SocialAction; | ||||
| use Chill\PersonBundle\Form\Type\PickSocialActionType; | ||||
| use Chill\PersonBundle\Repository\SocialWork\SocialActionRepository; | ||||
| use Chill\PersonBundle\Templating\Entity\SocialActionRender; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class BySocialActionFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly SocialActionRender $actionRender) {} | ||||
|     use ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private readonly SocialActionRender $actionRender, private readonly SocialActionRepository $socialActionRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actsocialaction', $qb->getAllAliases(), true)) { | ||||
|             $qb->join('activity.socialActions', 'actsocialaction'); | ||||
| @@ -48,19 +53,36 @@ class BySocialActionFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY_ACP; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_socialactions', PickSocialActionType::class, [ | ||||
|             'multiple' => true, | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return []; | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_socialactions' => $this->normalizeDoctrineEntity($formData['accepted_socialactions'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_socialactions' => $this->denormalizeDoctrineEntity($formData['accepted_socialactions'], $this->socialActionRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
|             'accepted_socialactions' => [], | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $actions = []; | ||||
|  | ||||
|   | ||||
| @@ -12,23 +12,28 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter\ACPFilters; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\PersonBundle\Entity\SocialWork\SocialIssue; | ||||
| use Chill\PersonBundle\Form\Type\PickSocialIssueType; | ||||
| use Chill\PersonBundle\Repository\SocialWork\SocialIssueRepository; | ||||
| use Chill\PersonBundle\Templating\Entity\SocialIssueRender; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class BySocialIssueFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly SocialIssueRender $issueRender) {} | ||||
|     use ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private readonly SocialIssueRender $issueRender, private readonly SocialIssueRepository $issueRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actsocialissue', $qb->getAllAliases(), true)) { | ||||
|             $qb->join('activity.socialIssues', 'actsocialissue'); | ||||
| @@ -48,19 +53,34 @@ class BySocialIssueFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY_ACP; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_socialissues', PickSocialIssueType::class, [ | ||||
|             'multiple' => true, | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_socialissues' => $this->normalizeDoctrineEntity($formData['accepted_socialissues'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_socialissues' => $this->denormalizeDoctrineEntity($formData['accepted_socialissues'], $this->issueRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $issues = []; | ||||
|  | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter\ACPFilters; | ||||
|  | ||||
| use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\PersonBundle\Export\Declarations; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| @@ -27,7 +28,7 @@ class HasNoActivityFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb | ||||
|             ->andWhere(' | ||||
| @@ -43,17 +44,32 @@ class HasNoActivityFilter implements FilterInterface | ||||
|         return Declarations::ACP_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form needed | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return ['Filtered acp which has no activities', []]; | ||||
|     } | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter\ACPFilters; | ||||
|  | ||||
| use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickRollingDateType; | ||||
| use Chill\MainBundle\Service\RollingDate\RollingDate; | ||||
| @@ -25,12 +26,12 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt | ||||
|         private RollingDateConverterInterface $rollingDateConverter, | ||||
|     ) {} | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.filter.activity.course_having_activity_between_date.Title'; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('start_date', PickRollingDateType::class, [ | ||||
| @@ -41,6 +42,21 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['start_date' => $formData['start_date']->normalize(), 'end_date' => $formData['end_date']->normalize()]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['start_date' => RollingDate::fromNormalized($formData['start_date']), 'end_date' => RollingDate::fromNormalized($formData['end_date'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -49,7 +65,7 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         return [ | ||||
|             'export.filter.activity.course_having_activity_between_date.Only course having an activity between from and to', | ||||
| @@ -65,7 +81,7 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $alias = 'act_period_having_act_betw_date_alias'; | ||||
|         $from = 'act_period_having_act_betw_date_start'; | ||||
| @@ -82,7 +98,7 @@ final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInt | ||||
|             ->setParameter($to, $this->rollingDateConverter->convert($data['end_date'])); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return \Chill\PersonBundle\Export\Declarations::ACP_TYPE; | ||||
|     } | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickRollingDateType; | ||||
| use Chill\MainBundle\Service\RollingDate\RollingDate; | ||||
| @@ -30,7 +31,7 @@ class ActivityDateFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|         $clause = $qb->expr()->between( | ||||
| @@ -61,7 +62,7 @@ class ActivityDateFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('date_from', PickRollingDateType::class, [ | ||||
| @@ -72,12 +73,27 @@ class ActivityDateFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['date_from' => $formData['date_from']->normalize(), 'date_to' => $formData['date_to']->normalize()]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['date_from' => RollingDate::fromNormalized($formData['date_from']), 'date_to' => RollingDate::fromNormalized($formData['date_to'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['date_from' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), 'date_to' => new RollingDate(RollingDate::T_TODAY)]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         return [ | ||||
|             'Filtered by date of activity: only between %date_from% and %date_to%', | ||||
| @@ -88,7 +104,7 @@ class ActivityDateFilter implements FilterInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Filtered by date activity'; | ||||
|     } | ||||
|   | ||||
| @@ -13,6 +13,8 @@ namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Entity\ActivityPresence; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Repository\ActivityPresenceRepositoryInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelperInterface; | ||||
| use Doctrine\Common\Collections\Collection; | ||||
| @@ -23,17 +25,20 @@ use Symfony\Contracts\Translation\TranslatorInterface; | ||||
|  | ||||
| final readonly class ActivityPresenceFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct( | ||||
|         private TranslatableStringHelperInterface $translatableStringHelper, | ||||
|         private TranslatorInterface $translator, | ||||
|         private ActivityPresenceRepositoryInterface $activityPresenceRepository, | ||||
|     ) {} | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.filter.activity.by_presence.Filter activity by activity presence'; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('presences', EntityType::class, [ | ||||
|             'class' => ActivityPresence::class, | ||||
| @@ -45,12 +50,27 @@ final readonly class ActivityPresenceFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['presences' => $this->normalizeDoctrineEntity($formData['presences'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['presences' => $this->denormalizeDoctrineEntity($formData['presences'], $this->activityPresenceRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         $presences = array_map( | ||||
|             fn (ActivityPresence $presence) => $this->translatableStringHelper->localize($presence->getName()), | ||||
| @@ -68,14 +88,14 @@ final readonly class ActivityPresenceFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb | ||||
|             ->andWhere('activity.attendee IN (:activity_presence_filter_presences)') | ||||
|             ->setParameter('activity_presence_filter_presences', $data['presences']); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Entity\ActivityType; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface; | ||||
| use Chill\MainBundle\Export\ExportElementValidatedInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelperInterface; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| @@ -24,6 +25,8 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface; | ||||
|  | ||||
| class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct( | ||||
|         protected TranslatableStringHelperInterface $translatableStringHelper, | ||||
|         protected ActivityTypeRepositoryInterface $activityTypeRepository, | ||||
| @@ -34,7 +37,7 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $clause = $qb->expr()->in('activity.activityType', ':selected_activity_types'); | ||||
|  | ||||
| @@ -47,7 +50,7 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('types', EntityType::class, [ | ||||
|             'choices' => $this->activityTypeRepository->findAllActive(), | ||||
| @@ -70,12 +73,27 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['types' => $this->normalizeDoctrineEntity($formData['types'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['types' => $this->denormalizeDoctrineEntity($formData['types'], $this->activityTypeRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         // collect all the reasons'name used in this filter in one array | ||||
|         $reasonsNames = array_map( | ||||
| @@ -88,12 +106,12 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter | ||||
|         ]]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Filter by activity type'; | ||||
|     } | ||||
|  | ||||
|     public function validateForm($data, ExecutionContextInterface $context) | ||||
|     public function validateForm($data, ExecutionContextInterface $context): void | ||||
|     { | ||||
|         if (null === $data['types'] || 0 === \count($data['types'])) { | ||||
|             $context | ||||
|   | ||||
| @@ -12,26 +12,30 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickUserDynamicType; | ||||
| use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; | ||||
| use Chill\MainBundle\Repository\UserRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\Entity\UserRender; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class ActivityUsersFilter implements FilterInterface | ||||
| final readonly class ActivityUsersFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly UserRender $userRender) {} | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private UserRender $userRender, private UserRepositoryInterface $userRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $orX = $qb->expr()->orX(); | ||||
|  | ||||
|         foreach ($data['accepted_users'] as $key => $user) { | ||||
|         foreach ($this->userOrMe($data['accepted_users'], $exportGenerationContext) as $key => $user) { | ||||
|             $orX->add($qb->expr()->isMemberOf(':activity_users_filter_u'.$key, 'activity.users')); | ||||
|             $qb->setParameter('activity_users_filter_u'.$key, $user); | ||||
|         } | ||||
| @@ -39,29 +43,44 @@ class ActivityUsersFilter implements FilterInterface | ||||
|         $qb->andWhere($orX); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_users', PickUserDynamicType::class, [ | ||||
|         $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ | ||||
|             'multiple' => true, | ||||
|             'label' => 'Users', | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         $users = []; | ||||
|  | ||||
|         foreach ($data['accepted_users'] as $u) { | ||||
|         foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { | ||||
|             $users[] = $this->userRender->renderString($u, []); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -12,28 +12,32 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickUserDynamicType; | ||||
| use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; | ||||
| use Chill\MainBundle\Repository\UserRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\Entity\UserRender; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class ByCreatorFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly UserRender $userRender) {} | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private readonly UserRender $userRender, private readonly UserRepositoryInterface $userRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb | ||||
|             ->andWhere( | ||||
|                 $qb->expr()->in('activity.createdBy', ':users') | ||||
|             ) | ||||
|             ->setParameter('users', $data['accepted_users']); | ||||
|             ->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext)); | ||||
|     } | ||||
|  | ||||
|     public function applyOn(): string | ||||
| @@ -41,23 +45,38 @@ class ByCreatorFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_users', PickUserDynamicType::class, [ | ||||
|         $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ | ||||
|             'multiple' => true, | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $users = []; | ||||
|  | ||||
|         foreach ($data['accepted_users'] as $u) { | ||||
|         foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { | ||||
|             $users[] = $this->userRender->renderString($u, []); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -14,6 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Entity\User\UserJobHistory; | ||||
| use Chill\MainBundle\Entity\UserJob; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Repository\UserJobRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelper; | ||||
| @@ -26,6 +27,7 @@ use Symfony\Contracts\Translation\TranslatorInterface; | ||||
|  | ||||
| final readonly class CreatorJobFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     private const PREFIX = 'acp_act_filter_creator_job'; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -39,7 +41,7 @@ final readonly class CreatorJobFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -75,7 +77,7 @@ final readonly class CreatorJobFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('jobs', EntityType::class, [ | ||||
| @@ -90,7 +92,22 @@ final readonly class CreatorJobFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['jobs' => $this->normalizeDoctrineEntity($formData['jobs'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['jobs' => $this->denormalizeDoctrineEntity($formData['jobs'], $this->userJobRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $jobs = array_map( | ||||
|             fn (UserJob $job) => $this->translatableStringHelper->localize($job->getLabel()), | ||||
|   | ||||
| @@ -14,6 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Entity\Scope; | ||||
| use Chill\MainBundle\Entity\User\UserScopeHistory; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Repository\ScopeRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelper; | ||||
| @@ -24,6 +25,7 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class CreatorScopeFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     private const PREFIX = 'acp_act_filter_creator_scope'; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -36,7 +38,7 @@ class CreatorScopeFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -72,7 +74,7 @@ class CreatorScopeFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('scopes', EntityType::class, [ | ||||
| @@ -86,7 +88,22 @@ class CreatorScopeFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['scopes' => $this->normalizeDoctrineEntity($formData['scopes'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['scopes' => $this->denormalizeDoctrineEntity($formData['scopes'], $this->scopeRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $scopes = []; | ||||
|  | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Doctrine\ORM\Query\Expr\Andx; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| @@ -35,7 +36,7 @@ class EmergencyFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|  | ||||
| @@ -56,7 +57,7 @@ class EmergencyFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_emergency', ChoiceType::class, [ | ||||
|             'choices' => self::CHOICES, | ||||
| @@ -66,12 +67,27 @@ class EmergencyFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_emergency' => $formData['accepted_emergency']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_emergency' => $formData['accepted_emergency']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['accepted_emergency' => self::DEFAULT_CHOICE]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return [ | ||||
|             'Filtered by emergency: only %emergency%', [ | ||||
|   | ||||
| @@ -12,19 +12,27 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickUserLocationType; | ||||
| use Chill\MainBundle\Repository\LocationRepository; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class LocationFilter implements FilterInterface | ||||
| final readonly class LocationFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct( | ||||
|         private LocationRepository $locationRepository, | ||||
|     ) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->andWhere( | ||||
|             $qb->expr()->in('activity.location', ':location') | ||||
| @@ -38,7 +46,7 @@ class LocationFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_location', PickUserLocationType::class, [ | ||||
|             'multiple' => true, | ||||
| @@ -46,12 +54,27 @@ class LocationFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_location' => $this->normalizeDoctrineEntity($formData['accepted_location'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_location' => $this->denormalizeDoctrineEntity($formData['accepted_location'], $this->locationRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $locations = []; | ||||
|  | ||||
|   | ||||
| @@ -12,8 +12,11 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickLocationTypeType; | ||||
| use Chill\MainBundle\Repository\LocationTypeRepository; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelper; | ||||
| use Doctrine\ORM\Query\Expr\Andx; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| @@ -21,14 +24,16 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class LocationTypeFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly TranslatableStringHelper $translatableStringHelper) {} | ||||
|     use ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private readonly TranslatableStringHelper $translatableStringHelper, private LocationTypeRepository $locationTypeRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('actloc', $qb->getAllAliases(), true)) { | ||||
|             $qb->join('activity.location', 'actloc'); | ||||
| @@ -52,7 +57,7 @@ class LocationTypeFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_locationtype', PickLocationTypeType::class, [ | ||||
|             'multiple' => true, | ||||
| @@ -60,12 +65,27 @@ class LocationTypeFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return []; | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_locationtype' => $this->normalizeDoctrineEntity($formData['accepted_locationtype'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_locationtype' => $this->denormalizeDoctrineEntity($formData['accepted_locationtype'], $this->locationTypeRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['accepted_locationtype' => []]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $types = []; | ||||
|  | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Entity\ActivityReason; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Repository\ActivityReasonRepository; | ||||
| use Chill\MainBundle\Export\ExportElementValidatedInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelper; | ||||
| use Doctrine\Common\Collections\Collection; | ||||
| @@ -26,6 +27,8 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface; | ||||
|  | ||||
| class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(protected TranslatableStringHelper $translatableStringHelper, protected ActivityReasonRepository $activityReasonRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
| @@ -33,7 +36,7 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|         $join = $qb->getDQLPart('join'); | ||||
| @@ -58,7 +61,7 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt | ||||
|         return Declarations::ACTIVITY_PERSON; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('reasons', EntityType::class, [ | ||||
|             'class' => ActivityReason::class, | ||||
| @@ -70,12 +73,27 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['reasons' => $this->normalizeDoctrineEntity($formData['reasons'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['reasons' => $this->denormalizeDoctrineEntity($formData['reasons'], $this->activityReasonRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         // collect all the reasons'name used in this filter in one array | ||||
|         $reasonsNames = array_map( | ||||
| @@ -91,12 +109,12 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'Filter by reason'; | ||||
|     } | ||||
|  | ||||
|     public function validateForm($data, ExecutionContextInterface $context) | ||||
|     public function validateForm($data, ExecutionContextInterface $context): void | ||||
|     { | ||||
|         if (null === $data['reasons'] || 0 === \count($data['reasons'])) { | ||||
|             $context | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Entity\ActivityReason; | ||||
| use Chill\ActivityBundle\Repository\ActivityReasonRepository; | ||||
| use Chill\MainBundle\Export\ExportElementValidatedInterface; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickRollingDateType; | ||||
| use Chill\MainBundle\Service\RollingDate\RollingDate; | ||||
| @@ -39,7 +40,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data): void | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         // create a subquery for activity | ||||
|         $sqb = $qb->getEntityManager()->createQueryBuilder(); | ||||
| @@ -92,7 +93,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem | ||||
|         return Declarations::PERSON_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('date_from_rolling', PickRollingDateType::class, [ | ||||
|             'label' => 'export.filter.activity.person_between_dates.Implied in an activity after this date', | ||||
| @@ -116,6 +117,21 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['date_from_rolling' => $formData['date_from_rolling']->normalize(), 'date_to_rolling' => $formData['date_to_rolling']->normalize()]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['date_from_rolling' => RollingDate::fromNormalized($formData['date_from_rolling']), 'date_to_rolling' => RollingDate::fromNormalized($formData['date_to_rolling'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -125,7 +141,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return [ | ||||
|             [] === $data['reasons'] ? | ||||
| @@ -150,7 +166,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem | ||||
|         return 'export.filter.activity.person_between_dates.title'; | ||||
|     } | ||||
|  | ||||
|     public function validateForm($data, ExecutionContextInterface $context) | ||||
|     public function validateForm($data, ExecutionContextInterface $context): void | ||||
|     { | ||||
|         if ($this->rollingDateConverter->convert($data['date_from_rolling']) | ||||
|             >= $this->rollingDateConverter->convert($data['date_to_rolling'])) { | ||||
|   | ||||
| @@ -13,6 +13,7 @@ namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\ActivityBundle\Tests\Export\Filter\PersonsFilterTest; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\PersonBundle\Form\Type\PickPersonDynamicType; | ||||
| use Chill\PersonBundle\Templating\Entity\PersonRenderInterface; | ||||
| @@ -33,7 +34,7 @@ final readonly class PersonsFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -47,12 +48,12 @@ final readonly class PersonsFilter implements FilterInterface | ||||
|         $qb->andWhere($orX); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_persons', PickPersonDynamicType::class, [ | ||||
|             'multiple' => true, | ||||
| @@ -60,6 +61,21 @@ final readonly class PersonsFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_persons' => $formData['accepted_persons']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_persons' => $formData['accepted_persons']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -67,7 +83,7 @@ final readonly class PersonsFilter implements FilterInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         $users = []; | ||||
|  | ||||
|   | ||||
| @@ -13,6 +13,7 @@ namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Doctrine\ORM\Query\Expr\Andx; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| @@ -36,7 +37,7 @@ class SentReceivedFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|  | ||||
| @@ -57,7 +58,7 @@ class SentReceivedFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_sentreceived', ChoiceType::class, [ | ||||
|             'choices' => self::CHOICES, | ||||
| @@ -68,12 +69,27 @@ class SentReceivedFilter implements FilterInterface | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_sentreceived' => $formData['accepted_sentreceived']]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_sentreceived' => $formData['accepted_sentreceived']]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return ['accepted_sentreceived' => self::DEFAULT_CHOICE]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $sentreceived = array_flip(self::CHOICES)[$data['accepted_sentreceived']]; | ||||
|  | ||||
|   | ||||
| @@ -12,23 +12,27 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickUserDynamicType; | ||||
| use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; | ||||
| use Chill\MainBundle\Repository\UserRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\Entity\UserRender; | ||||
| use Doctrine\ORM\Query\Expr\Andx; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class UserFilter implements FilterInterface | ||||
| final readonly class UserFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly UserRender $userRender) {} | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private UserRender $userRender, private UserRepositoryInterface $userRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $where = $qb->getDQLPart('where'); | ||||
|  | ||||
| @@ -41,7 +45,7 @@ class UserFilter implements FilterInterface | ||||
|         } | ||||
|  | ||||
|         $qb->add('where', $where); | ||||
|         $qb->setParameter('users', $data['accepted_users']); | ||||
|         $qb->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext)); | ||||
|     } | ||||
|  | ||||
|     public function applyOn(): string | ||||
| @@ -49,24 +53,39 @@ class UserFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_users', PickUserDynamicType::class, [ | ||||
|         $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ | ||||
|             'multiple' => true, | ||||
|             'label' => 'Creators', | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $users = []; | ||||
|  | ||||
|         foreach ($data['accepted_users'] as $u) { | ||||
|         foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { | ||||
|             $users[] = $this->userRender->renderString($u, []); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Entity\User\UserJobHistory; | ||||
| use Chill\MainBundle\Entity\UserJob; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Repository\UserJobRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelperInterface; | ||||
| @@ -25,6 +26,7 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class UsersJobFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     private const PREFIX = 'act_filter_user_job'; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -37,7 +39,7 @@ class UsersJobFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -60,12 +62,12 @@ class UsersJobFilter implements FilterInterface | ||||
|             ); | ||||
|     } | ||||
|  | ||||
|     public function applyOn() | ||||
|     public function applyOn(): string | ||||
|     { | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('jobs', EntityType::class, [ | ||||
| @@ -77,7 +79,22 @@ class UsersJobFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['jobs' => $this->normalizeDoctrineEntity($formData['jobs'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['jobs' => $this->denormalizeDoctrineEntity($formData['jobs'], $this->userJobRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         return ['export.filter.activity.by_users_job.Filtered activity by users job: only %jobs%', [ | ||||
|             '%jobs%' => implode( | ||||
| @@ -97,7 +114,7 @@ class UsersJobFilter implements FilterInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.filter.activity.by_users_job.Filter by users job'; | ||||
|     } | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Entity\Scope; | ||||
| use Chill\MainBundle\Entity\User\UserScopeHistory; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Repository\ScopeRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelperInterface; | ||||
| @@ -25,6 +26,7 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class UsersScopeFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     private const PREFIX = 'act_filter_user_scope'; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -37,7 +39,7 @@ class UsersScopeFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,7 +67,7 @@ class UsersScopeFilter implements FilterInterface | ||||
|         return Declarations::ACTIVITY; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('scopes', EntityType::class, [ | ||||
| @@ -77,7 +79,22 @@ class UsersScopeFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['scopes' => $this->normalizeDoctrineEntity($formData['scopes'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['scopes' => $this->denormalizeDoctrineEntity($formData['scopes'], $this->scopeRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return ['export.filter.activity.by_users_scope.Filtered activity by users scope: only %scopes%', [ | ||||
|             '%scopes%' => implode( | ||||
|   | ||||
| @@ -12,8 +12,9 @@ declare(strict_types=1); | ||||
| namespace Chill\ActivityBundle\Repository; | ||||
|  | ||||
| use Chill\ActivityBundle\Entity\ActivityPresence; | ||||
| use Doctrine\Persistence\ObjectRepository; | ||||
|  | ||||
| interface ActivityPresenceRepositoryInterface | ||||
| interface ActivityPresenceRepositoryInterface extends ObjectRepository | ||||
| { | ||||
|     public function find($id): ?ActivityPresence; | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ import "es6-promise/auto"; | ||||
| import { createStore } from "vuex"; | ||||
| import { postLocation } from "./api"; | ||||
| import prepareLocations from "./store.locations.js"; | ||||
| import { makeFetch } from "ChillMainAssets/lib/api/apiMethods"; | ||||
| import {fetchResults, makeFetch} from "ChillMainAssets/lib/api/apiMethods"; | ||||
|  | ||||
| const debug = process.env.NODE_ENV !== "production"; | ||||
| //console.log('window.activity', window.activity); | ||||
| @@ -365,11 +365,11 @@ const store = createStore({ | ||||
|       const accompanyingPeriodId = state.activity.accompanyingPeriod.id; | ||||
|       const url = `/api/1.0/person/accompanying-course/${accompanyingPeriodId}/works.json`; | ||||
|       try { | ||||
|         const works = await makeFetch("GET", url); | ||||
|         // console.log("works", works); | ||||
|         const works = await fetchResults(url); | ||||
|         // console.log('works', works); | ||||
|         commit("setAccompanyingPeriodWorks", works); | ||||
|       } catch (error) { | ||||
|         console.error("Failed to fetch accompanying period works:", error); | ||||
|         console.error('Failed to fetch works:', error); | ||||
|       } | ||||
|     }, | ||||
|     getWhoAmI({ commit }) { | ||||
|   | ||||
| @@ -45,14 +45,20 @@ final class ByCreatorFilterTest extends AbstractFilterTest | ||||
|             ->from(User::class, 'u') | ||||
|             ->select('u') | ||||
|             ->getQuery() | ||||
|             ->setMaxResults(1) | ||||
|             ->getResult(); | ||||
|         $data = []; | ||||
|  | ||||
|         foreach ($array as $a) { | ||||
|             $data[] = [ | ||||
|                 'accepted_users' => $a, | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         $data[] = [ | ||||
|             'accepted_users' => 'me', | ||||
|         ]; | ||||
|  | ||||
|         return $data; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -55,6 +55,10 @@ final class UserFilterTest extends AbstractFilterTest | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         $data[] = [ | ||||
|             'accepted_users' => 'me', | ||||
|         ]; | ||||
|  | ||||
|         return $data; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -30,7 +30,7 @@ class ActivityValidity extends Constraint | ||||
|  | ||||
|     public $socialIssuesMessage = 'For this type of activity, you must add at least one social issue'; | ||||
|  | ||||
|     public function getTargets() | ||||
|     public function getTargets(): string | ||||
|     { | ||||
|         return self::CLASS_CONSTRAINT; | ||||
|     } | ||||
|   | ||||
| @@ -30,7 +30,7 @@ class ByActivityTypeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->addSelect('IDENTITY(aside.type) AS by_aside_activity_type_aggregator') | ||||
|             ->addGroupBy('by_aside_activity_type_aggregator'); | ||||
| @@ -41,17 +41,32 @@ class ByActivityTypeAggregator implements AggregatorInterface | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // No form needed | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -26,12 +26,27 @@ class ByLocationAggregator implements AggregatorInterface | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
| @@ -60,7 +75,7 @@ class ByLocationAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data): void | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->addSelect('IDENTITY(aside.location) AS by_aside_activity_location_aggregator') | ||||
|             ->addGroupBy('by_aside_activity_location_aggregator'); | ||||
|   | ||||
| @@ -34,7 +34,7 @@ class ByUserJobAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ class ByUserJobAggregator implements AggregatorInterface | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -34,7 +34,7 @@ class ByUserScopeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -64,14 +64,29 @@ class ByUserScopeAggregator implements AggregatorInterface | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data) | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -26,6 +26,21 @@ class AvgAsideActivityDuration implements ExportInterface, GroupedExportInterfac | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -60,7 +75,7 @@ class AvgAsideActivityDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return ['export_avg_aside_activity_duration']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -75,7 +90,7 @@ class AvgAsideActivityDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $qb = $this->repository->createQueryBuilder('aside'); | ||||
|  | ||||
|   | ||||
| @@ -26,6 +26,21 @@ class CountAsideActivity implements ExportInterface, GroupedExportInterface | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -63,7 +78,7 @@ class CountAsideActivity implements ExportInterface, GroupedExportInterface | ||||
|         return ['export_result']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -78,7 +93,7 @@ class CountAsideActivity implements ExportInterface, GroupedExportInterface | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $qb = $this->repository->createQueryBuilder('aside'); | ||||
|  | ||||
|   | ||||
| @@ -46,6 +46,21 @@ final readonly class ListAsideActivity implements ListInterface, GroupedExportIn | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -142,7 +157,7 @@ final readonly class ListAsideActivity implements ListInterface, GroupedExportIn | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     public function getQueryKeys($data) | ||||
|     public function getQueryKeys($data): array | ||||
|     { | ||||
|         return [ | ||||
|             'id', | ||||
| @@ -160,12 +175,12 @@ final readonly class ListAsideActivity implements ListInterface, GroupedExportIn | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data): array | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY); | ||||
|     } | ||||
|  | ||||
|     public function getTitle() | ||||
|     public function getTitle(): string|\Symfony\Contracts\Translation\TranslatableInterface | ||||
|     { | ||||
|         return 'export.aside_activity.List of aside activities'; | ||||
|     } | ||||
| @@ -175,7 +190,7 @@ final readonly class ListAsideActivity implements ListInterface, GroupedExportIn | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $qb = $this->em->createQueryBuilder() | ||||
|             ->from(AsideActivity::class, 'aside') | ||||
|   | ||||
| @@ -26,6 +26,21 @@ class SumAsideActivityDuration implements ExportInterface, GroupedExportInterfac | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -60,7 +75,7 @@ class SumAsideActivityDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return ['export_sum_aside_activity_duration']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -75,7 +90,7 @@ class SumAsideActivityDuration implements ExportInterface, GroupedExportInterfac | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): \Doctrine\ORM\QueryBuilder | ||||
|     { | ||||
|         $qb = $this->repository | ||||
|             ->createQueryBuilder('aside'); | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\AsideActivityBundle\Entity\AsideActivityCategory; | ||||
| use Chill\AsideActivityBundle\Export\Declarations; | ||||
| use Chill\AsideActivityBundle\Repository\AsideActivityCategoryRepository; | ||||
| use Chill\AsideActivityBundle\Templating\Entity\CategoryRender; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelperInterface; | ||||
| use Doctrine\Common\Collections\Collection; | ||||
| @@ -24,10 +25,13 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class ByActivityTypeFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct( | ||||
|         private readonly CategoryRender $categoryRender, | ||||
|         private readonly TranslatableStringHelperInterface $translatableStringHelper, | ||||
|         private readonly AsideActivityCategoryRepository $asideActivityTypeRepository, | ||||
|         private readonly AsideActivityCategoryRepository $asideActivityCategoryRepository, | ||||
|     ) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
| @@ -35,7 +39,7 @@ class ByActivityTypeFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $clause = $qb->expr()->in('aside.type', ':types'); | ||||
|  | ||||
| @@ -48,7 +52,7 @@ class ByActivityTypeFilter implements FilterInterface | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('types', EntityType::class, [ | ||||
| @@ -68,12 +72,27 @@ class ByActivityTypeFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['types' => $this->normalizeDoctrineEntity($formData['types'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['types' => $this->denormalizeDoctrineEntity($formData['types'], $this->asideActivityCategoryRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $types = array_map( | ||||
|             fn (AsideActivityCategory $t): string => $this->translatableStringHelper->localize($t->getTitle()), | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\AsideActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\AsideActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickRollingDateType; | ||||
| use Chill\MainBundle\Service\RollingDate\RollingDate; | ||||
| @@ -29,7 +30,7 @@ class ByDateFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $clause = $qb->expr()->between( | ||||
|             'aside.date', | ||||
| @@ -53,7 +54,7 @@ class ByDateFilter implements FilterInterface | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('date_from', PickRollingDateType::class, [ | ||||
| @@ -64,6 +65,21 @@ class ByDateFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['date_from' => $formData['date_from']->normalize(), 'date_to' => $formData['date_to']->normalize()]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['date_from' => RollingDate::fromNormalized($formData['date_from']), 'date_to' => RollingDate::fromNormalized($formData['date_to'])]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return [ | ||||
| @@ -72,7 +88,7 @@ class ByDateFilter implements FilterInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return ['export.filter.Filtered by aside activities between %dateFrom% and %dateTo%', [ | ||||
|             '%dateFrom%' => $this->rollingDateConverter->convert($data['date_from'])->format('d-m-Y'), | ||||
|   | ||||
| @@ -14,8 +14,10 @@ namespace Chill\AsideActivityBundle\Export\Filter; | ||||
| use Chill\AsideActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Entity\Location; | ||||
| use Chill\MainBundle\Entity\User; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickUserLocationType; | ||||
| use Chill\MainBundle\Repository\LocationRepository; | ||||
| use Doctrine\Common\Collections\Collection; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
| @@ -23,8 +25,11 @@ use Symfony\Component\Security\Core\Security; | ||||
|  | ||||
| final readonly class ByLocationFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct( | ||||
|         private Security $security, | ||||
|         private LocationRepository $locationRepository, | ||||
|     ) {} | ||||
|  | ||||
|     public function getTitle(): string | ||||
| @@ -38,6 +43,21 @@ final readonly class ByLocationFilter implements FilterInterface | ||||
|             ->add('locations', PickUserLocationType::class); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['locations' => $this->normalizeDoctrineEntity($formData['locations'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['locations' => $this->denormalizeDoctrineEntity($formData['locations'], $this->locationRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         $user = $this->security->getUser(); | ||||
| @@ -53,7 +73,7 @@ final readonly class ByLocationFilter implements FilterInterface | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $extractFunction = fn (Location $l): string => $l->getName(); | ||||
|         if ($data['locations'] instanceof Collection) { | ||||
| @@ -72,7 +92,7 @@ final readonly class ByLocationFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data): void | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $clause = $qb->expr()->in('aside.location', ':locations'); | ||||
|  | ||||
|   | ||||
| @@ -12,28 +12,32 @@ declare(strict_types=1); | ||||
| namespace Chill\AsideActivityBundle\Export\Filter; | ||||
|  | ||||
| use Chill\AsideActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Form\Type\PickUserDynamicType; | ||||
| use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; | ||||
| use Chill\MainBundle\Repository\UserRepository; | ||||
| use Chill\MainBundle\Templating\Entity\UserRender; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class ByUserFilter implements FilterInterface | ||||
| final readonly class ByUserFilter implements FilterInterface | ||||
| { | ||||
|     public function __construct(private readonly UserRender $userRender) {} | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|  | ||||
|     public function __construct(private UserRender $userRender, private UserRepository $userRepository) {} | ||||
|  | ||||
|     public function addRole(): ?string | ||||
|     { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $clause = $qb->expr()->in('aside.agent', ':users'); | ||||
|  | ||||
|         $qb | ||||
|             ->andWhere($clause) | ||||
|             ->setParameter('users', $data['accepted_users']); | ||||
|             ->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext)); | ||||
|     } | ||||
|  | ||||
|     public function applyOn(): string | ||||
| @@ -41,24 +45,39 @@ class ByUserFilter implements FilterInterface | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder->add('accepted_users', PickUserDynamicType::class, [ | ||||
|         $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ | ||||
|             'multiple' => true, | ||||
|             'label' => 'Creators', | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         $users = []; | ||||
|  | ||||
|         foreach ($data['accepted_users'] as $u) { | ||||
|         foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { | ||||
|             $users[] = $this->userRender->renderString($u, []); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\AsideActivityBundle\Entity\AsideActivity; | ||||
| use Chill\AsideActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Entity\User\UserJobHistory; | ||||
| use Chill\MainBundle\Entity\UserJob; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Repository\UserJobRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelperInterface; | ||||
| @@ -25,6 +26,7 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class ByUserJobFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     private const PREFIX = 'aside_act_filter_user_job'; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -37,7 +39,7 @@ class ByUserJobFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,7 +67,7 @@ class ByUserJobFilter implements FilterInterface | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('jobs', EntityType::class, [ | ||||
| @@ -77,7 +79,22 @@ class ByUserJobFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string'): array | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['jobs' => $this->normalizeDoctrineEntity($formData['jobs'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['jobs' => $this->denormalizeDoctrineEntity($formData['jobs'], $this->userJobRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): array | ||||
|     { | ||||
|         return ['export.filter.by_user_job.Filtered aside activities by user jobs: only %jobs%', [ | ||||
|             '%jobs%' => implode( | ||||
|   | ||||
| @@ -15,6 +15,7 @@ use Chill\AsideActivityBundle\Entity\AsideActivity; | ||||
| use Chill\AsideActivityBundle\Export\Declarations; | ||||
| use Chill\MainBundle\Entity\Scope; | ||||
| use Chill\MainBundle\Entity\User\UserScopeHistory; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Chill\MainBundle\Export\FilterInterface; | ||||
| use Chill\MainBundle\Repository\ScopeRepositoryInterface; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelperInterface; | ||||
| @@ -25,6 +26,7 @@ use Symfony\Component\Form\FormBuilderInterface; | ||||
|  | ||||
| class ByUserScopeFilter implements FilterInterface | ||||
| { | ||||
|     use \Chill\MainBundle\Export\ExportDataNormalizerTrait; | ||||
|     private const PREFIX = 'aside_act_filter_user_scope'; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -37,7 +39,7 @@ class ByUserScopeFilter implements FilterInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,7 +67,7 @@ class ByUserScopeFilter implements FilterInterface | ||||
|         return Declarations::ASIDE_ACTIVITY_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         $builder | ||||
|             ->add('scopes', EntityType::class, [ | ||||
| @@ -77,7 +79,22 @@ class ByUserScopeFilter implements FilterInterface | ||||
|             ]); | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, $format = 'string') | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return ['scopes' => $this->normalizeDoctrineEntity($formData['scopes'])]; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return ['scopes' => $this->denormalizeDoctrineEntity($formData['scopes'], $this->scopeRepository)]; | ||||
|     } | ||||
|  | ||||
|     public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array | ||||
|     { | ||||
|         return ['export.filter.by_user_scope.Filtered aside activities by user scope: only %scopes%', [ | ||||
|             '%scopes%' => implode( | ||||
|   | ||||
| @@ -12,6 +12,8 @@ declare(strict_types=1); | ||||
| namespace Chill\AsideActivityBundle\Tests\Export\Export; | ||||
|  | ||||
| use Chill\AsideActivityBundle\Export\Export\ListAsideActivity; | ||||
| use Chill\MainBundle\Entity\User; | ||||
| use Chill\MainBundle\Export\ExportGenerationContext; | ||||
| use Doctrine\ORM\AbstractQuery; | ||||
| use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; | ||||
|  | ||||
| @@ -33,7 +35,7 @@ class ListAsideActivityTest extends KernelTestCase | ||||
|  | ||||
|     public function testExecuteQuery(): void | ||||
|     { | ||||
|         $qb = $this->listAsideActivity->initiateQuery([], [], []) | ||||
|         $qb = $this->listAsideActivity->initiateQuery([], [], [], new ExportGenerationContext(new User())) | ||||
|             ->setMaxResults(1); | ||||
|  | ||||
|         $results = $qb->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY); | ||||
|   | ||||
| @@ -27,7 +27,7 @@ final readonly class AgentAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('caluser', $qb->getAllAliases(), true)) { | ||||
|             $qb->join('cal.mainUser', 'caluser'); | ||||
| @@ -42,17 +42,32 @@ final readonly class AgentAggregator implements AggregatorInterface | ||||
|         return Declarations::CALENDAR_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class CancelReasonAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         // TODO: still needs to take into account calendars without a cancel reason somehow | ||||
|         if (!\in_array('calcancel', $qb->getAllAliases(), true)) { | ||||
| @@ -43,17 +43,32 @@ class CancelReasonAggregator implements AggregatorInterface | ||||
|         return Declarations::CALENDAR_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -34,7 +34,7 @@ final readonly class JobAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ final readonly class JobAggregator implements AggregatorInterface | ||||
|         return Declarations::CALENDAR_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -26,7 +26,7 @@ final readonly class LocationAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('calloc', $qb->getAllAliases(), true)) { | ||||
|             $qb->join('cal.location', 'calloc'); | ||||
| @@ -40,17 +40,32 @@ final readonly class LocationAggregator implements AggregatorInterface | ||||
|         return Declarations::CALENDAR_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ final readonly class LocationTypeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         if (!\in_array('calloc', $qb->getAllAliases(), true)) { | ||||
|             $qb->join('cal.location', 'calloc'); | ||||
| @@ -42,17 +42,32 @@ final readonly class LocationTypeAggregator implements AggregatorInterface | ||||
|         return Declarations::CALENDAR_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -23,7 +23,7 @@ class MonthYearAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->addSelect("to_char(cal.startDate, 'MM-YYYY') AS month_year_aggregator"); | ||||
|         // $qb->addSelect("extract(month from age(cal.startDate, cal.endDate)) AS month_aggregator"); | ||||
| @@ -35,17 +35,32 @@ class MonthYearAggregator implements AggregatorInterface | ||||
|         return Declarations::CALENDAR_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // No form needed | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return static function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -34,7 +34,7 @@ final readonly class ScopeAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $p = self::PREFIX; | ||||
|  | ||||
| @@ -65,14 +65,29 @@ final readonly class ScopeAggregator implements AggregatorInterface | ||||
|         return Declarations::CALENDAR_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) {} | ||||
|     public function buildForm(FormBuilderInterface $builder): void {} | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -33,7 +33,7 @@ class UrgencyAggregator implements AggregatorInterface | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function alterQuery(QueryBuilder $qb, $data) | ||||
|     public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void | ||||
|     { | ||||
|         $qb->addSelect('cal.urgent AS urgency_aggregator'); | ||||
|         $qb->addGroupBy('urgency_aggregator'); | ||||
| @@ -44,17 +44,32 @@ class UrgencyAggregator implements AggregatorInterface | ||||
|         return Declarations::CALENDAR_TYPE; | ||||
|     } | ||||
|  | ||||
|     public function buildForm(FormBuilderInterface $builder) | ||||
|     public function buildForm(FormBuilderInterface $builder): void | ||||
|     { | ||||
|         // no form | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getLabels($key, array $values, $data): \Closure | ||||
|     public function getLabels($key, array $values, $data): callable | ||||
|     { | ||||
|         return function ($value): string { | ||||
|             if ('_header' === $value) { | ||||
|   | ||||
| @@ -34,6 +34,21 @@ class CountCalendars implements ExportInterface, GroupedExportInterface | ||||
|         // No form necessary | ||||
|     } | ||||
|  | ||||
|     public function getNormalizationVersion(): int | ||||
|     { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     public function normalizeFormData(array $formData): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function denormalizeFormData(array $formData, int $fromVersion): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getFormDefaultData(): array | ||||
|     { | ||||
|         return []; | ||||
| @@ -71,7 +86,7 @@ class CountCalendars implements ExportInterface, GroupedExportInterface | ||||
|         return ['export_result']; | ||||
|     } | ||||
|  | ||||
|     public function getResult($query, $data) | ||||
|     public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context): array | ||||
|     { | ||||
|         return $query->getQuery()->getResult(AbstractQuery::HYDRATE_SCALAR); | ||||
|     } | ||||
| @@ -89,7 +104,7 @@ class CountCalendars implements ExportInterface, GroupedExportInterface | ||||
|     /** | ||||
|      * Initiate the query. | ||||
|      */ | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder | ||||
|     public function initiateQuery(array $requiredModifiers, array $acl, array $data, \Chill\MainBundle\Export\ExportGenerationContext $context): QueryBuilder | ||||
|     { | ||||
|         $centers = array_map(static fn ($el) => $el['center'], $acl); | ||||
|  | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user