Compare commits

..

75 Commits

Author SHA1 Message Date
e1b91ebbfd Release v4.8.0 2025-11-17 15:11:14 +01:00
2139b53fb0 Merge branch '449-scope-picker-form-label' into 'master'
Remove the label if there is only one scope and no scope picking field is displayed.

Closes #449

See merge request Chill-Projet/chill-bundles!911
2025-11-17 10:48:16 +00:00
a43181d60d Remove the label if there is only one scope and no scope picking field is displayed. 2025-11-17 10:48:15 +00:00
04bc1c5de8 Merge branch '463-update-calendar-with-accepted-invites' into 'master'
Update calendar with accepted invites

Closes #463

See merge request Chill-Projet/chill-bundles!921
2025-11-14 14:22:59 +00:00
0a07d68b6d Merge branch '461-calendar-items-clickable' into 'master'
Resolve "Rendre le rendez-vous clicable dans la page "mes rendez-vous""

Closes #461

See merge request Chill-Projet/chill-bundles!919
2025-11-14 14:08:04 +00:00
fccd29e3c7 Resolve "Rendre le rendez-vous clicable dans la page "mes rendez-vous"" 2025-11-14 14:08:03 +00:00
274ee94196 Merge branch '420-localisation-variable' into 'master'
Ajouter une variable de localisation aux utilisateurs

Closes #420

See merge request Chill-Projet/chill-bundles!904
2025-11-14 13:52:33 +00:00
799d04142e Ajouter une variable de localisation aux utilisateurs 2025-11-14 13:52:33 +00:00
dfe8d8b0bf Merge branch 'accessibility/improve-login-page' into 'master'
Improve accessibility on the login page

See merge request Chill-Projet/chill-bundles!922
2025-11-14 10:16:08 +00:00
82f347b93a Improve accessibility on the login page 2025-11-14 10:16:08 +00:00
635efd6f1d Update calendar with accepted invites 2025-11-12 17:01:09 +01:00
869880d8f3 Revert "Display calendar items linked to person within search results"
This reverts commit f7ea7e4dbf.
2025-11-12 13:08:54 +01:00
f7ea7e4dbf Display calendar items linked to person within search results 2025-11-12 13:00:52 +01:00
0a58e05230 Update chill bundles to v4.7.0 2025-11-10 16:47:38 +01:00
68c83223dd Merge branch '455-results-objectives-display-order' into 'master'
Resolve "Action d'accompagnement - afficher les objectifs avant les résultats"

Closes #455

See merge request Chill-Projet/chill-bundles!913
2025-11-07 16:23:53 +00:00
c28bd22560 Resolve "Action d'accompagnement - afficher les objectifs avant les résultats" 2025-11-07 16:23:52 +00:00
a5ef2475fb Merge branch 'text-wrapping-badges' into 'master'
Wrap text when it is too long within badges

See merge request Chill-Projet/chill-bundles!918
2025-11-07 14:48:48 +00:00
86dd9bfb80 Wrap text when it is too long within badges 2025-11-07 15:18:02 +01:00
c28670f0fd Merge branch '457-merge-thirdparty-bug' into 'master'
Fix the fusion of thirdparty properties that are located in another schema...

Closes #457

See merge request Chill-Projet/chill-bundles!916
2025-11-07 10:50:03 +00:00
9e2c030224 Fix the fusion of thirdparty properties that are located in another schema... 2025-11-07 10:50:03 +00:00
a706c6f337 fix: set back to true suggestion of referrer when creating notification for
accompanyingPeriodWorkDocument
2025-11-06 16:18:33 +01:00
bc63b489ee Merge branch '285-cancel-calendar' into 'master'
Permettre d'annuler un rendez-vous

Closes #285

See merge request Chill-Projet/chill-bundles!775
2025-11-06 15:07:11 +00:00
a4cfc6a178 Permettre d'annuler un rendez-vous 2025-11-06 15:07:11 +00:00
f75d1da3b1 Merge branch '385-invitation-list' into 'master'
Add user invitation list page

Closes #385

See merge request Chill-Projet/chill-bundles!866
2025-11-06 12:06:15 +00:00
b8b68e5e5a Rename page title key for invitations list to align with translation standards
- Replaced hardcoded title 'My invitations list' with 'invite.list.title' translation key.
2025-11-06 13:00:38 +01:00
ae5ba67064 Update UserMenuBuilder to adjust menu labels and sort order
- Renamed 'My invitations list' to 'invite.list.title'.
- Updated the sort order for 'My calendar' from 9 to 8, to place "invitation list" just after the calendar list
2025-11-06 13:00:28 +01:00
bfe4dd3aec Merge branch 'master' into 385-invitation-list 2025-11-06 12:14:21 +01:00
3a4c20b53d Merge branch '405-aside-activity-associated-persons' into 'master'
Resolve "Activités annexes: ajouter le nombre d'usagers concernés pour chaque activité annexe"

Closes #405

See merge request Chill-Projet/chill-bundles!895
2025-11-05 09:48:50 +00:00
b0c86e238d Resolve "Activités annexes: ajouter le nombre d'usagers concernés pour chaque activité annexe" 2025-11-05 09:48:50 +00:00
d7614aeab2 Merge branch '454-evaluation-time-spent-choices' into 'master'
Expand timeSpent choices for evaluation document and translate them to user locale or fallback 'fr'

Closes #454

See merge request Chill-Projet/chill-bundles!912
2025-11-05 09:29:51 +00:00
671ed21d59 Expand timeSpent choices for evaluation document and translate them to user locale or fallback 'fr' 2025-11-05 09:29:50 +00:00
4b9db6ceb6 Merge branch '451-activity-social-actions-list' into 'master'
Fix: display also social actions linked to parents of the selected social issue

Closes #451

See merge request Chill-Projet/chill-bundles!907
2025-11-05 08:51:47 +00:00
c79c39b562 Fix: display also social actions linked to parents of the selected social issue 2025-11-05 08:51:47 +00:00
bf768b8e99 Merge branch '404-action-list-add-comments' into 'master'
Feature: add columns for comments linked to an activity (comment, user, date)

Closes #404

See merge request Chill-Projet/chill-bundles!909
2025-11-05 08:50:16 +00:00
2df01833ad Merge branch '453-bug-csv-social-actions' into 'master'
Fix: export actions and their results in csv even when action does not have...

Closes #453

See merge request Chill-Projet/chill-bundles!908
2025-11-05 08:47:50 +00:00
ffb8183d4d Fix: export actions and their results in csv even when action does not have... 2025-11-05 08:47:49 +00:00
5d45339bf7 Merge branch 'fix/loading-wopi-bundle' into 'master'
Fix loading of wopi-bundle

See merge request Chill-Projet/chill-bundles!915
2025-11-05 08:32:55 +00:00
e87e5cbbaf Fix loading of wopi-bundle 2025-11-05 08:32:54 +00:00
fa8e92ebf5 Merge branch '425-rename-cercle-and-centre' into 'master'
Resolve "Partout, renommer "cercle" en "service" et "centre" en "territoire""

Closes #425

See merge request Chill-Projet/chill-bundles!894
2025-11-04 15:25:11 +00:00
b7a92bf656 Resolve "Partout, renommer "cercle" en "service" et "centre" en "territoire"" 2025-11-04 15:25:10 +00:00
3dbbda7b64 Merge branch '452-workflow-suivi-ux' into 'master'
Redo ux for selceting follow-up preferences for workflow

Closes #452

See merge request Chill-Projet/chill-bundles!906
2025-11-04 15:00:51 +00:00
769d76a0cc Fix the possibility to delete a workflow when it is on hold 2025-11-04 13:52:54 +01:00
722b37fbcc Set wopi-bundle dependency back to original 2025-11-04 09:28:23 +01:00
bf38ec22c9 Add missing import in FormEvaluation.vue and temporarily set wopi-bundle requirement to specific commit (until bundles is fully upgraded to sf7) 2025-10-30 11:40:20 +01:00
3d99c0f561 Feature: add columns for comments linked to an activity (comment, user, date) 2025-10-29 15:26:06 +01:00
2221d17930 Redo ux for selceting follow-up preferences for workflow 2025-10-29 11:17:47 +01:00
9c2abb2dfa Merge branch 'send-notification-log-to-channel' into 'master'
Send notifications log to dedicated `notifierLogger` channel if available

See merge request Chill-Projet/chill-bundles!905
2025-10-27 15:58:48 +00:00
94744b9542 Send notifications log to dedicated notifierLogger channel if available 2025-10-27 15:58:48 +00:00
f42bb498e4 Fix deprecation notice League/csv for createFromStream and createFromPath replaced by new from() method 2025-10-27 13:21:04 +01:00
01889ac671 Upgrade to v4.6.1 2025-10-27 12:59:11 +01:00
62e5842311 Fix case where no 'reason' is picked within the PersonHavingActivityBetweenDateFilter.php 2025-10-27 12:50:34 +01:00
8ad6f397a8 Release v4.6.0 2025-10-15 12:40:22 +02:00
d713704633 Merge branch '394-page-workflow-subscribed-only-finalize' into 'master'
Only show active workflow on the page "my tracked workflows"

Closes #394

See merge request Chill-Projet/chill-bundles!901
2025-10-15 10:13:38 +00:00
b1fa9242a0 Only show active workflow on the page "my tracked workflows" 2025-10-15 10:13:38 +00:00
6ac554f93a Merge branch '448-fix-daily-cronjob-digest' into 'master'
Fix sending of daily notification, when the previous last_execution parameter is not a valid last_execution date format

Closes #448

See merge request Chill-Projet/chill-bundles!900
2025-10-15 10:12:10 +00:00
372d8e5825 Fix sending of daily notification, when the previous last_execution parameter is not a valid last_execution date format 2025-10-15 10:12:10 +00:00
10f05e5559 Merge branch 'fix/fix-deletion-attachments' into 'master'
Take permissions into account for deletion of WorkflowAttachment (+ type safety)

See merge request Chill-Projet/chill-bundles!899
2025-10-13 14:12:06 +00:00
ddb2a65419 Take permissions into account for deletion of WorkflowAttachment (+ type safety) 2025-10-13 14:12:06 +00:00
8d40a8089f Merge branch '446-fix-duplicated-filename-stored-object-version' into 'master'
Enforce filename uniqueness in `StoredObjectVersion` with partial unique index...

Closes #446

See merge request Chill-Projet/chill-bundles!898
2025-10-13 10:47:47 +00:00
e1bf4a24d2 Enforce filename uniqueness in StoredObjectVersion with partial unique index... 2025-10-13 10:47:47 +00:00
208a378185 Merge branch 'fix_mado_to_validate' into 'master'
Fix loading of classlists in SocialIssuesAcc.vue

See merge request Chill-Projet/chill-bundles!833
2025-10-08 11:44:49 +00:00
9089c8959b remove ux/translator package in error 2025-10-08 11:35:47 +00:00
1b9b581c31 Hide top_banner by default 2025-10-08 13:10:26 +02:00
aa1abe4c88 Merge branch '423-environment-banner' into 'master'
Resolve "Ajouter un bandeau qui permet de distinguer les différents environnements"

Closes #423

See merge request Chill-Projet/chill-bundles!896
2025-10-08 11:05:22 +00:00
d82c9cc9a7 Resolve "Ajouter un bandeau qui permet de distinguer les différents environnements" 2025-10-08 11:05:22 +00:00
a7e3b1c5d2 Use an object (instead of string) for dynamic classList in SocialIssuesAcc.vue component 2025-10-08 11:37:02 +02:00
84cf11933d Fix loading of classlists in SocialIssuesAcc.vue 2025-10-08 11:21:09 +02:00
bc2fbee5c6 Fix: notification edit template
form field addressesEmail removed
2025-10-06 12:14:00 +02:00
74c9eb5585 Rector corrections 2025-09-30 16:23:27 +02:00
f93c7e014f Add test for MyInvitationsController.php 2025-09-30 15:45:26 +02:00
e6a799abc4 Add translation for invitation list page title 2025-09-30 15:30:38 +02:00
68a0ef7115 Reorganize templates to allow re-use of _list.html.twig within listByUser.html.twig template 2025-09-30 15:30:20 +02:00
1675c56f3d Fix order of paginator parameters passed to findBy method 2025-09-30 15:29:41 +02:00
675e8450fc WIP: switch from ACLAware to normal repository usage 2025-09-30 14:34:47 +02:00
4ffd7034d0 feat: add invitation list
- Introduced `MyInvitationsController` for managing user invitations
- Added `InviteACLAwareRepository` and its interface for handling invite data operations
- Created views for listing and displaying user-specific invitations
- Updated user menu to include "My invitations list" option
2025-09-30 14:34:47 +02:00
2153 changed files with 11102 additions and 9387 deletions

View File

@@ -1,6 +0,0 @@
kind: Fixed
body: Fix the rendering of list of StoredObjectVersions, where there are kept version (before converting to pdf) and intermediate versions deleted
time: 2025-10-03T22:40:44.685474863+02:00
custom:
Issue: ""
SchemaChange: No schema change

14
.changes/v4.6.0.md Normal file
View File

@@ -0,0 +1,14 @@
## v4.6.0 - 2025-10-15
### Feature
* ([#423](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/423)) Create environment banner that can be activated and configured depending on the image deployed
* ([#394](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/394)) Only show active workflow on the page "my tracked workflow"
### Fixed
* Fix loading of classLists in SocialIssuesAcc.vue, ensure elements are present
* Fix the rendering of list of StoredObjectVersions, where there are kept version (before converting to pdf) and intermediate versions deleted
* ([#434](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/434)) Notification: fix editing of sent notification by removing form.addressesEmails, a field that no longer exists
* Fix loading of social issues and social actions within vue component
* ([#446](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/446)) Add unique condition on stored object filename, with cleaning step on existing duplicate filenames
**Schema Change**: Drop or rename table or columns, or enforce new constraint that must be manually fixed
* [workflow] take permissions into account to delete the workflow attachment
* ([#448](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/448)) Fix the execution of daily cronjob notification, when the previous last execution storage was invalid

3
.changes/v4.6.1.md Normal file
View File

@@ -0,0 +1,3 @@
## v4.6.1 - 2025-10-27
### Fixed
* Fix export case where no 'reason' is picked within the PersonHavingActivityBetweenDateFilter.php

21
.changes/v4.7.0.md Normal file
View File

@@ -0,0 +1,21 @@
## v4.7.0 - 2025-11-10
### Feature
* ([#385](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/385)) Create invitation list in user menu
* ([#404](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/404)) Add columns for comments linked to an activity in the activity list export
### Fixed
* ([#451](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/451)) Fix: display also social actions linked to parents of the selected social issue
* ([#453](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/453)) Fix: export actions and their results in csv even when action does not have any goals attached to it.
* Fix the possibility to delete a workflow
**Schema Change**: Drop or rename table or columns, or enforce new constraint that must be manually fixed
* ([#457](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/457)) Fix the fusion of thirdparty properties that are located in another schema than public for TO_ONE relations + add extra loop for MANY_TO_MANY relations where thirdparty is the source instead of the target
* ([#428](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/428)) Fix suggestion of referrer when creating notification for accompanyingPeriodWorkDocument
### DX
* Send notifications log to dedicated channel, if it exists
### UX
* ([#425](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/425)) Change the terms 'cercle' and 'centre' to 'service', and 'territoire' respectively.
* ([#542](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/542)) Improve the ux for selecting whether user wants to be notified of the final step of a workflow or all steps
* Expand timeSpent choices for evaluation document and translate them to user locale or fallback 'fr'
* ([#455](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/455)) Change the order of display for results and objectives in the social work/action form
* Wrap text when it is too long within badges

9
.changes/v4.8.0.md Normal file
View File

@@ -0,0 +1,9 @@
## v4.8.0 - 2025-11-17
### Feature
* ([#461](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/461)) Make a calendar item on the 'mes rendez-vous' page clickable. Clicking will navigate to the edit page of the calendar item.
### Fixed
* ([#463](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/463)) Display calendar items for which an invite was accepted on the mes rendez-vous page
* Improve accessibility on login page
### UX
* ([#449](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/449)) Remove the label if there is only one scope and no scope picking field is displayed.

2
.env
View File

@@ -86,7 +86,7 @@ ADD_ADDRESS_MAP_CENTER_Z=15
## Redis Cache & redis database ## Redis Cache & redis database
REDIS_HOST=redis REDIS_HOST=redis
REDIS_PORT=6379 REDIS_PORT=6379
REDIS_URL="redis://${REDIS_HOST}:${REDIS_PORT}" REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}
###< chill-project/chill-bundles ### ###< chill-project/chill-bundles ###
###> symfony/ovh-cloud-notifier ### ###> symfony/ovh-cloud-notifier ###

View File

@@ -1,4 +0,0 @@
###> symfony/framework-bundle ###
APP_SECRET=72759e571285ef25677c88f967a73386
###< symfony/framework-bundle ###

View File

@@ -1,5 +1,39 @@
# define your env variables for the test env here # variables for .env environement
# those variables suits for gitlab-ci
# Run tests from root to adapt your own environment
KERNEL_CLASS='App\Kernel' KERNEL_CLASS='App\Kernel'
APP_SECRET='$ecretf0rt3st' APP_SECRET='$ecretf0rt3st'
SYMFONY_DEPRECATIONS_HELPER=999999
DEFAULT_CARRIER_CODE=TEST ADMIN_PASSWORD=password
JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem
JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
JWT_PASSPHRASE=2a30f6ba26521a2613821da35f28386e
TWILIO_SID=~
TWILIO_SECRET=~
DEFAULT_CARRIER_CODE=BE
ADD_ADDRESS_DEFAULT_COUNTRY=BE
ADD_ADDRESS_MAP_CENTER_X=50.8443
ADD_ADDRESS_MAP_CENTER_Y=4.3523
ADD_ADDRESS_MAP_CENTER_Z=15
SHORT_MESSAGE_DSN=null://null
MESSENGER_TRANSPORT_DSN=sync://
###> doctrine/doctrine-bundle ###
# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
#
DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5454/test?serverVersion=14&charset=utf8"
###< doctrine/doctrine-bundle ###
ASYNC_UPLOAD_TEMP_URL_KEY=
ASYNC_UPLOAD_TEMP_URL_BASE_PATH=
ASYNC_UPLOAD_TEMP_URL_CONTAINER=
MAILER_DSN=null://null
REDIS_HOST=127.0.0.1
REDIS_PORT=6363

2
.gitignore vendored
View File

@@ -33,7 +33,7 @@ config/packages/dev/*
###> phpunit/phpunit ### ###> phpunit/phpunit ###
/phpunit.xml /phpunit.xml
/.phpunit.cache/ .phpunit.result.cache
###< phpunit/phpunit ### ###< phpunit/phpunit ###
/.php-cs-fixer.cache /.php-cs-fixer.cache

View File

@@ -3,7 +3,7 @@
# Select what we should cache between builds # Select what we should cache between builds
cache: cache:
paths: paths:
- vendor/ - /vendor/
- .cache - .cache
- node_modules/ - node_modules/
@@ -46,7 +46,7 @@ stages:
build: build:
stage: Composer install stage: Composer install
image: chill/base-image:8.4-edge image: chill/base-image:8.3-edge
before_script: before_script:
- composer config -g cache-dir "$(pwd)/.cache" - composer config -g cache-dir "$(pwd)/.cache"
script: script:
@@ -61,7 +61,7 @@ build:
code_style: code_style:
stage: Tests stage: Tests
image: chill/base-image:8.4-edge image: chill/base-image:8.3-edge
script: script:
- php-cs-fixer fix --dry-run -v --show-progress=none - php-cs-fixer fix --dry-run -v --show-progress=none
cache: cache:
@@ -74,25 +74,35 @@ code_style:
phpstan_tests: phpstan_tests:
stage: Tests stage: Tests
image: chill/base-image:8.4-edge image: chill/base-image:8.3-edge
dependencies:
- build
variables: variables:
COMPOSER_MEMORY_LIMIT: 3G COMPOSER_MEMORY_LIMIT: 3G
before_script: before_script:
- bin/console cache:clear --env=dev - bin/console cache:clear --env=dev
script: script:
- composer exec phpstan -- analyze --memory-limit=3G - composer exec phpstan -- analyze --memory-limit=3G
cache:
paths:
- .cache/
artifacts:
expire_in: 1 day
paths:
- vendor/
rector_tests: rector_tests:
stage: Tests stage: Tests
image: chill/base-image:8.4-edge image: chill/base-image:8.3-edge
dependencies:
- build
before_script: before_script:
- bin/console cache:clear --env=dev - bin/console cache:clear --env=dev
script: script:
- composer exec rector -- process --dry-run - composer exec rector -- process --dry-run
cache:
paths:
- .cache/
artifacts:
expire_in: 1 day
paths:
- vendor/
lint: lint:
stage: Tests stage: Tests
@@ -122,9 +132,7 @@ lint:
unit_tests: unit_tests:
stage: Tests stage: Tests
image: chill/base-image:8.4-edge image: chill/base-image:8.3-edge
dependencies:
- build
variables: variables:
COMPOSER_MEMORY_LIMIT: 3G COMPOSER_MEMORY_LIMIT: 3G
before_script: before_script:
@@ -135,6 +143,10 @@ unit_tests:
- php bin/console doctrine:fixtures:load -n --env=test - php bin/console doctrine:fixtures:load -n --env=test
script: script:
- composer exec phpunit -- --colors=never --exclude-group dbIntensive,openstack-integration - composer exec phpunit -- --colors=never --exclude-group dbIntensive,openstack-integration
artifacts:
expire_in: 1 day
paths:
- vendor/
release: release:
stage: Deploy stage: Deploy

View File

@@ -240,9 +240,6 @@ The tests are run from the project's root (not from the bundle's root).
# Run all tests # Run all tests
vendor/bin/phpunit vendor/bin/phpunit
# Run tests for a specific bundle
vendor/bin/phpunit --testsuite NameBundle
# Run a specific test file # Run a specific test file
vendor/bin/phpunit path/to/TestFile.php vendor/bin/phpunit path/to/TestFile.php
@@ -250,6 +247,9 @@ vendor/bin/phpunit path/to/TestFile.php
vendor/bin/phpunit --filter methodName path/to/TestFile.php vendor/bin/phpunit --filter methodName path/to/TestFile.php
``` ```
When writing tests, only test specific files. Do not run all tests or the full
test suite.
#### Test Structure #### Test Structure
Tests are organized by bundle and follow the same structure as the bundle itself: Tests are organized by bundle and follow the same structure as the bundle itself:

View File

@@ -6,6 +6,57 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
and is generated by [Changie](https://github.com/miniscruff/changie). and is generated by [Changie](https://github.com/miniscruff/changie).
## v4.8.0 - 2025-11-17
### Feature
* ([#461](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/461)) Make a calendar item on the 'mes rendez-vous' page clickable. Clicking will navigate to the edit page of the calendar item.
### Fixed
* ([#463](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/463)) Display calendar items for which an invite was accepted on the mes rendez-vous page
* Improve accessibility on login page
### UX
* ([#449](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/449)) Remove the label if there is only one scope and no scope picking field is displayed.
## v4.7.0 - 2025-11-10
### Feature
* ([#385](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/385)) Create invitation list in user menu
* ([#404](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/404)) Add columns for comments linked to an activity in the activity list export
### Fixed
* ([#451](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/451)) Fix: display also social actions linked to parents of the selected social issue
* ([#453](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/453)) Fix: export actions and their results in csv even when action does not have any goals attached to it.
* Fix the possibility to delete a workflow
**Schema Change**: Drop or rename table or columns, or enforce new constraint that must be manually fixed
* ([#457](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/457)) Fix the fusion of thirdparty properties that are located in another schema than public for TO_ONE relations + add extra loop for MANY_TO_MANY relations where thirdparty is the source instead of the target
* ([#428](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/428)) Fix suggestion of referrer when creating notification for accompanyingPeriodWorkDocument
### DX
* Send notifications log to dedicated channel, if it exists
### UX
* ([#425](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/425)) Change the terms 'cercle' and 'centre' to 'service', and 'territoire' respectively.
* ([#542](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/542)) Improve the ux for selecting whether user wants to be notified of the final step of a workflow or all steps
* Expand timeSpent choices for evaluation document and translate them to user locale or fallback 'fr'
* ([#455](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/455)) Change the order of display for results and objectives in the social work/action form
* Wrap text when it is too long within badges
## v4.6.1 - 2025-10-27
### Fixed
* Fix export case where no 'reason' is picked within the PersonHavingActivityBetweenDateFilter.php
## v4.6.0 - 2025-10-15
### Feature
* ([#423](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/423)) Create environment banner that can be activated and configured depending on the image deployed
* ([#394](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/394)) Only show active workflow on the page "my tracked workflow"
### Fixed
* Fix loading of classLists in SocialIssuesAcc.vue, ensure elements are present
* Fix the rendering of list of StoredObjectVersions, where there are kept version (before converting to pdf) and intermediate versions deleted
* ([#434](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/434)) Notification: fix editing of sent notification by removing form.addressesEmails, a field that no longer exists
* Fix loading of social issues and social actions within vue component
* ([#446](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/446)) Add unique condition on stored object filename, with cleaning step on existing duplicate filenames
**Schema Change**: Drop or rename table or columns, or enforce new constraint that must be manually fixed
* [workflow] take permissions into account to delete the workflow attachment
* ([#448](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/448)) Fix the execution of daily cronjob notification, when the previous last execution storage was invalid
## v4.5.1 - 2025-10-03 ## v4.5.1 - 2025-10-03
### Fixed ### Fixed
* Add missing javascript dependency * Add missing javascript dependency

View File

@@ -8,77 +8,78 @@
"social worker" "social worker"
], ],
"require": { "require": {
"php": "^8.4", "php": "^8.2",
"ext-dom": "*", "ext-dom": "*",
"ext-json": "*", "ext-json": "*",
"ext-openssl": "*", "ext-openssl": "*",
"ext-redis": "*", "ext-redis": "*",
"ext-zlib": "*", "ext-zlib": "*",
"champs-libres/wopi-bundle": "dev-master@dev", "champs-libres/wopi-bundle": "dev-symfony-v5@dev",
"champs-libres/wopi-lib": "dev-master@dev", "champs-libres/wopi-lib": "dev-master@dev",
"doctrine/data-fixtures": "^1.8", "doctrine/data-fixtures": "^1.8",
"doctrine/doctrine-bundle": "^2.1", "doctrine/doctrine-bundle": "^2.1",
"doctrine/doctrine-migrations-bundle": "^3.0", "doctrine/doctrine-migrations-bundle": "^3.0",
"doctrine/orm": "^3.5.2", "doctrine/orm": "^2.13.0",
"erusev/parsedown": "^1.7", "erusev/parsedown": "^1.7",
"knplabs/knp-menu-bundle": "^3.0", "knplabs/knp-menu-bundle": "^3.0",
"knplabs/knp-time-bundle": "^2.4", "knplabs/knp-time-bundle": "^1.12",
"knpuniversity/oauth2-client-bundle": "^2.10", "knpuniversity/oauth2-client-bundle": "^2.10",
"league/csv": "^9.7.1", "league/csv": "^9.7.1",
"lexik/jwt-authentication-bundle": "^3.1.1", "lexik/jwt-authentication-bundle": "^2.16",
"nyholm/psr7": "^1.4", "nyholm/psr7": "^1.4",
"ocramius/package-versions": "^1.10 || ^2", "ocramius/package-versions": "^1.10 || ^2",
"odolbeau/phone-number-bundle": "^3.6", "odolbeau/phone-number-bundle": "^3.6",
"ovh/ovh": "^3.0", "ovh/ovh": "^3.0",
"phpoffice/phpspreadsheet": "^1.16", "phpoffice/phpspreadsheet": "^1.16",
"ramsey/uuid-doctrine": "^1.7", "ramsey/uuid-doctrine": "^1.7",
"sensio/framework-extra-bundle": "^5.5",
"smalot/pdfparser": "^2.10", "smalot/pdfparser": "^2.10",
"spomky-labs/base64url": "^2.0", "spomky-labs/base64url": "^2.0",
"symfony/amqp-messenger": "^7.3", "symfony/asset": "^5.4",
"symfony/asset": "^7.2", "symfony/browser-kit": "^5.4",
"symfony/browser-kit": "^7.2", "symfony/cache": "^5.4",
"symfony/cache": "^7.2", "symfony/clock": "^6.2",
"symfony/clock": "^7.2", "symfony/config": "^5.4",
"symfony/config": "^7.2", "symfony/console": "^5.4",
"symfony/console": "^7.2", "symfony/css-selector": "^5.4",
"symfony/css-selector": "^7.2", "symfony/dom-crawler": "^5.4",
"symfony/dom-crawler": "^7.2", "symfony/error-handler": "^5.4",
"symfony/error-handler": "^7.2", "symfony/event-dispatcher": "^5.4",
"symfony/event-dispatcher": "^7.2", "symfony/event-dispatcher-contracts": "^2.4",
"symfony/event-dispatcher-contracts": "^3.0", "symfony/expression-language": "^5.4",
"symfony/expression-language": "^7.2", "symfony/filesystem": "^5.4",
"symfony/filesystem": "^7.2", "symfony/finder": "^5.4",
"symfony/finder": "^7.2", "symfony/form": "^5.4",
"symfony/form": "^7.2", "symfony/framework-bundle": "^5.4",
"symfony/framework-bundle": "^7.2", "symfony/http-client": "^5.4",
"symfony/http-client": "^7.2", "symfony/http-foundation": "^5.4",
"symfony/http-foundation": "^7.2", "symfony/intl": "^5.4",
"symfony/intl": "^7.2", "symfony/mailer": "^5.4",
"symfony/mailer": "^7.2", "symfony/messenger": "^5.4",
"symfony/messenger": "^7.2", "symfony/mime": "^5.4",
"symfony/mime": "^7.2",
"symfony/monolog-bundle": "^3.5", "symfony/monolog-bundle": "^3.5",
"symfony/notifier": "^7.2", "symfony/notifier": "^5.4",
"symfony/options-resolver": "^7.2", "symfony/options-resolver": "^5.4",
"symfony/ovh-cloud-notifier": "^7.2", "symfony/ovh-cloud-notifier": "^5.4",
"symfony/polyfill-intl-messageformatter": "^1.32", "symfony/process": "^5.4",
"symfony/process": "^7.2", "symfony/property-access": "^5.4",
"symfony/property-access": "^7.2", "symfony/property-info": "^5.4",
"symfony/property-info": "^7.2", "symfony/routing": "^5.4",
"symfony/routing": "^7.2", "symfony/security-bundle": "^5.4",
"symfony/security-bundle": "^7.3", "symfony/security-core": "^5.4",
"symfony/security-core": "^7.2", "symfony/security-csrf": "^5.4",
"symfony/security-csrf": "^7.2", "symfony/security-guard": "^5.4",
"symfony/security-http": "^7.2", "symfony/security-http": "^5.4",
"symfony/serializer": "^7.2", "symfony/serializer": "^5.4",
"symfony/string": "^7.2", "symfony/string": "^5.4",
"symfony/translation": "^7.3", "symfony/templating": "^5.4",
"symfony/twig-bundle": "^7.3", "symfony/translation": "^5.4",
"symfony/twig-bundle": "^5.4",
"symfony/ux-translator": "^2.22", "symfony/ux-translator": "^2.22",
"symfony/validator": "^7.2", "symfony/validator": "^5.4",
"symfony/webpack-encore-bundle": "^2.0", "symfony/webpack-encore-bundle": "^1.11",
"symfony/workflow": "^7.2", "symfony/workflow": "^5.4",
"symfony/yaml": "^7.2", "symfony/yaml": "^5.4",
"thenetworg/oauth2-azure": "^2.0", "thenetworg/oauth2-azure": "^2.0",
"twig/extra-bundle": "^3.0", "twig/extra-bundle": "^3.0",
"twig/intl-extra": "^3.0", "twig/intl-extra": "^3.0",
@@ -89,27 +90,27 @@
"require-dev": { "require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.3", "doctrine/doctrine-fixtures-bundle": "^3.3",
"fakerphp/faker": "^1.13", "fakerphp/faker": "^1.13",
"friendsofphp/php-cs-fixer": "3.88.2", "friendsofphp/php-cs-fixer": "3.65.0",
"jangregor/phpstan-prophecy": "^2.2", "jangregor/phpstan-prophecy": "^1.0",
"nelmio/alice": "^3.8", "nelmio/alice": "^3.8",
"nikic/php-parser": "^4.15",
"phpspec/prophecy-phpunit": "^2.0", "phpspec/prophecy-phpunit": "^2.0",
"phpstan/extension-installer": "^1.2", "phpstan/extension-installer": "^1.2",
"phpstan/phpstan": "^2.1.30", "phpstan/phpstan": "^1.9",
"phpstan/phpstan-deprecation-rules": "^2.0", "phpstan/phpstan-deprecation-rules": "^1.1",
"phpstan/phpstan-doctrine": "^2.0", "phpstan/phpstan-strict-rules": "^1.0",
"phpstan/phpstan-strict-rules": "^2.0.7",
"phpstan/phpstan-symfony": "^2.0",
"phpunit/phpunit": "^10.5.24", "phpunit/phpunit": "^10.5.24",
"rector/rector": "^2.2", "rector/rector": "^1.1.0",
"symfony/debug-bundle": "^7.2", "symfony/amqp-messenger": "^5.4.45",
"symfony/dotenv": "^7.2", "symfony/debug-bundle": "^5.4",
"symfony/dotenv": "^5.4",
"symfony/flex": "^2.4", "symfony/flex": "^2.4",
"symfony/maker-bundle": "^1.20", "symfony/maker-bundle": "^1.20",
"symfony/phpunit-bridge": "^7.1", "symfony/phpunit-bridge": "^7.1",
"symfony/runtime": "^7.2", "symfony/runtime": "^5.4",
"symfony/stopwatch": "^7.2", "symfony/stopwatch": "^5.4",
"symfony/var-dumper": "^7.2", "symfony/var-dumper": "^5.4",
"symfony/web-profiler-bundle": "^7.2" "symfony/web-profiler-bundle": "^5.4"
}, },
"conflict": { "conflict": {
"symfony/symfony": "*" "symfony/symfony": "*"

View File

@@ -2,7 +2,6 @@
return [ return [
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
loophp\PsrHttpMessageBridgeBundle\PsrHttpMessageBridgeBundle::class => ['all' => true],
ChampsLibres\WopiBundle\WopiBundle::class => ['all' => true], ChampsLibres\WopiBundle\WopiBundle::class => ['all' => true],
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true],
@@ -14,6 +13,7 @@ return [
Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true],
Nelmio\Alice\Bridge\Symfony\NelmioAliceBundle::class => ['dev' => true, 'test' => true], Nelmio\Alice\Bridge\Symfony\NelmioAliceBundle::class => ['dev' => true, 'test' => true],
Misd\PhoneNumberBundle\MisdPhoneNumberBundle::class => ['all' => true], Misd\PhoneNumberBundle\MisdPhoneNumberBundle::class => ['all' => true],
Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true], Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true],
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
@@ -36,4 +36,5 @@ return [
Chill\WopiBundle\ChillWopiBundle::class => ['all' => true], Chill\WopiBundle\ChillWopiBundle::class => ['all' => true],
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
Symfony\UX\Translator\UxTranslatorBundle::class => ['all' => true], Symfony\UX\Translator\UxTranslatorBundle::class => ['all' => true],
loophp\PsrHttpMessageBridgeBundle\PsrHttpMessageBridgeBundle::class => ['all' => true],
]; ];

View File

@@ -1,6 +1,13 @@
chill_main: chill_main:
available_languages: [ '%env(resolve:LOCALE)%', 'en' ] available_languages: [ '%env(resolve:LOCALE)%', 'en', 'nl' ]
available_countries: ['BE', 'FR'] available_countries: ['BE', 'FR']
top_banner:
visible: false
text:
fr: 'Vous travaillez actuellement avec la version de PRÉ-PRODUCTION.'
nl: 'Je werkt momenteel in de PRE-PRODUCTIE versie'
color: '#353535'
background_color: '#d8bb48'
notifications: notifications:
from_email: '%env(resolve:NOTIFICATION_FROM_EMAIL)%' from_email: '%env(resolve:NOTIFICATION_FROM_EMAIL)%'
from_name: '%env(resolve:NOTIFICATION_FROM_NAME)%' from_name: '%env(resolve:NOTIFICATION_FROM_NAME)%'

View File

@@ -0,0 +1,2 @@
chill_aside_activity:
show_concerned_persons_count: hidden

View File

@@ -1,11 +0,0 @@
# Enable stateless CSRF protection for forms and logins/logouts
framework:
form:
csrf_protection:
token_id: submit
csrf_protection:
stateless_token_ids:
- submit
- authenticate
- logout

View File

@@ -7,7 +7,6 @@ doctrine:
#server_version: '16' #server_version: '16'
use_savepoints: true use_savepoints: true
orm: orm:
enable_lazy_ghost_objects: true
auto_generate_proxy_classes: true auto_generate_proxy_classes: true
naming_strategy: doctrine.orm.naming_strategy.default naming_strategy: doctrine.orm.naming_strategy.default
auto_mapping: true auto_mapping: true

View File

@@ -4,16 +4,6 @@ framework:
#csrf_protection: true #csrf_protection: true
http_method_override: false http_method_override: false
# Enable EntityValueResolver for automatic entity injection in controllers
# This replaces the functionality previously provided by SensioFrameworkExtraBundle
http_client:
enabled: true
request:
formats:
json: ['application/json']
# Enables session support. Note that the session will ONLY be started if you read or write from it. # Enables session support. Note that the session will ONLY be started if you read or write from it.
# Remove or comment this section to explicitly disable session support. # Remove or comment this section to explicitly disable session support.
session: session:

View File

@@ -1,5 +1,7 @@
framework: framework:
messenger: messenger:
# reset services after consuming messages
reset_on_message: true
# Uncomment this (and the failed transport below) to send failed messages to this transport for later handling. # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling.
failure_transport: failed failure_transport: failed

View File

@@ -1,3 +0,0 @@
framework:
property_info:
enabled: true

View File

@@ -1,4 +1,5 @@
security: security:
enable_authenticator_manager: true
# https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
password_hashers: password_hashers:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
@@ -27,13 +28,16 @@ security:
pattern: ^/wopi pattern: ^/wopi
provider: chill_chain_provider provider: chill_chain_provider
stateless: true stateless: true
jwt: ~ guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
dav: dav:
pattern: ^/dav pattern: ^/dav
provider: chill_chain_provider provider: chill_chain_provider
stateless: true stateless: true
custom_authenticator: guard:
- Chill\DocStoreBundle\Security\Authenticator\JWTOnDavUrlAuthenticator authenticators:
- Chill\DocStoreBundle\Security\Guard\JWTOnDavUrlAuthenticator
# this firewall is the main firewall for chill. It should be the last one in the stack, # this firewall is the main firewall for chill. It should be the last one in the stack,
# unless you have specific needs # unless you have specific needs
chill_main: chill_main:
@@ -59,7 +63,7 @@ security:
# Note: Only the *first* access control that matches will be used # Note: Only the *first* access control that matches will be used
access_control: access_control:
# those lines are added by chill-bundles recipes, and are requires to make chill-bundles working # those lines are added by chill-bundles recipes, and are requires to make chill-bundles working
- { path: ^/(login|logout), roles: PUBLIC_ACCESS } - { path: ^/(login|logout), roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/public, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/public, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/wopi, roles: IS_AUTHENTICATED_FULLY } - { path: ^/wopi, roles: IS_AUTHENTICATED_FULLY }
# access for homepage, the homepage redirect admin to admin section # access for homepage, the homepage redirect admin to admin section

View File

@@ -0,0 +1,3 @@
sensio_framework_extra:
router:
annotations: false

View File

@@ -1,4 +0,0 @@
framework:
serializer:
enabled: true
enable_attributes: true

View File

@@ -7,8 +7,7 @@ framework:
- Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument - Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument
- Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork - Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork
- Chill\DocStoreBundle\Entity\AccompanyingCourseDocument - Chill\DocStoreBundle\Entity\AccompanyingCourseDocument
label: Suivi label:
translated_labels:
fr: 'Suivi' fr: 'Suivi'
support_strategy: Chill\MainBundle\Workflow\RelatedEntityWorkflowSupportsStrategy support_strategy: Chill\MainBundle\Workflow\RelatedEntityWorkflowSupportsStrategy
marking_store: marking_store:
@@ -17,13 +16,11 @@ framework:
places: places:
initial: initial:
metadata: metadata:
label: Étape initiale label:
translated_labels:
fr: Étape initiale fr: Étape initiale
attenteModification: attenteModification:
metadata: metadata:
label: En attente de modification du document label:
translated_labels:
fr: En attente de modification du document fr: En attente de modification du document
validationFilterInputLabels: validationFilterInputLabels:
forward: {fr: Modification effectuée} forward: {fr: Modification effectuée}
@@ -31,8 +28,7 @@ framework:
neutral: {fr: Autre} neutral: {fr: Autre}
attenteMiseEnForme: attenteMiseEnForme:
metadata: metadata:
label: En attente de mise en forme label:
translated_labels:
fr: En attente de mise en forme fr: En attente de mise en forme
validationFilterInputLabels: validationFilterInputLabels:
forward: {fr: Mise en forme terminée} forward: {fr: Mise en forme terminée}
@@ -40,8 +36,7 @@ framework:
neutral: {fr: Autre} neutral: {fr: Autre}
attenteVisa: attenteVisa:
metadata: metadata:
label: En attente de visa label:
translated_labels:
fr: En attente de visa fr: En attente de visa
validationFilterInputLabels: validationFilterInputLabels:
forward: {fr: Visa accordé} forward: {fr: Visa accordé}
@@ -52,8 +47,7 @@ framework:
isSignature: ['user', 'person'] isSignature: ['user', 'person']
onSignatureCompleted: onSignatureCompleted:
transitionName: signatureApplied transitionName: signatureApplied
label: En attente de signature label:
translated_labels:
fr: En attente de signature fr: En attente de signature
validationFilterInputLabels: validationFilterInputLabels:
forward: {fr: Signature accordée} forward: {fr: Signature accordée}
@@ -61,8 +55,7 @@ framework:
neutral: {fr: Autre} neutral: {fr: Autre}
postSignature: postSignature:
metadata: metadata:
label: Signatures traitées label:
translated_labels:
fr: Signatures traitées fr: Signatures traitées
validationFilterInputLabels: validationFilterInputLabels:
forward: {fr: Poursuite du traitement} forward: {fr: Poursuite du traitement}
@@ -70,8 +63,7 @@ framework:
neutral: {fr: Autre} neutral: {fr: Autre}
attenteTraitement: attenteTraitement:
metadata: metadata:
label: En attente de traitement label:
translated_labels:
fr: En attente de traitement fr: En attente de traitement
validationFilterInputLabels: validationFilterInputLabels:
forward: {fr: Traitement terminé favorablement} forward: {fr: Traitement terminé favorablement}
@@ -79,8 +71,7 @@ framework:
neutral: {fr: Autre} neutral: {fr: Autre}
attenteEnvoi: attenteEnvoi:
metadata: metadata:
label: En attente d'envoi label:
translated_labels:
fr: En attente d'envoi fr: En attente d'envoi
validationFilterInputLabels: validationFilterInputLabels:
forward: {fr: Document envoyé} forward: {fr: Document envoyé}
@@ -88,8 +79,7 @@ framework:
neutral: {fr: Autre} neutral: {fr: Autre}
attenteValidationMiseEnForme: attenteValidationMiseEnForme:
metadata: metadata:
label: En attente de validation de la mise en forme label:
translated_labels:
fr: En attente de validation de la mise en forme fr: En attente de validation de la mise en forme
validationFilterInputLabels: validationFilterInputLabels:
forward: {fr: Validation de la mise en forme} forward: {fr: Validation de la mise en forme}
@@ -99,8 +89,7 @@ framework:
metadata: metadata:
isSentExternal: true isSentExternal: true
onExternalView: clotureApresLectureEnvoiExterne onExternalView: clotureApresLectureEnvoiExterne
label: En attente d'ouverture par un destinataire externe label:
translated_labels:
fr: En attente d'ouverture par un destinataire externe fr: En attente d'ouverture par un destinataire externe
validationFilterInputLabels: validationFilterInputLabels:
forward: {fr: Document reçu par un destinataire externe} forward: {fr: Document reçu par un destinataire externe}
@@ -110,15 +99,13 @@ framework:
metadata: metadata:
isFinal: true isFinal: true
isFinalPositive: false isFinalPositive: false
label: Annulé label:
translated_labels:
fr: Annulé fr: Annulé
final: final:
metadata: metadata:
isFinal: true isFinal: true
isFinalPositive: true isFinalPositive: true
label: Finalisé label:
translated_labels:
fr: Finalisé fr: Finalisé
transitions: transitions:
# transition qui avancent # transition qui avancent
@@ -127,8 +114,7 @@ framework:
- initial - initial
to: attenteModification to: attenteModification
metadata: metadata:
label: Demande de modification du document label:
translated_labels:
fr: Demande de modification du document fr: Demande de modification du document
isForward: true isForward: true
demandeMiseEnForme: demandeMiseEnForme:
@@ -137,8 +123,7 @@ framework:
- attenteModification - attenteModification
to: attenteMiseEnForme to: attenteMiseEnForme
metadata: metadata:
label: Demande de mise en forme label:
translated_labels:
fr: Demande de mise en forme fr: Demande de mise en forme
isForward: true isForward: true
demandeValidationMiseEnForme: demandeValidationMiseEnForme:
@@ -146,8 +131,7 @@ framework:
- attenteMiseEnForme - attenteMiseEnForme
to: attenteValidationMiseEnForme to: attenteValidationMiseEnForme
metadata: metadata:
label: Demande de validation de la mise en forme label:
translated_labels:
fr: Demande de validation de la mise en forme fr: Demande de validation de la mise en forme
isForward: true isForward: true
demandeVisa: demandeVisa:
@@ -160,8 +144,7 @@ framework:
- attenteTraitement - attenteTraitement
to: attenteVisa to: attenteVisa
metadata: metadata:
label: Demande de visa label:
translated_labels:
fr: Demande de visa fr: Demande de visa
isForward: true isForward: true
demandeSignature: demandeSignature:
@@ -174,18 +157,14 @@ framework:
- attenteTraitement - attenteTraitement
to: attenteSignature to: attenteSignature
metadata: metadata:
label: Demande de signature label: {fr: Demande de signature}
translated_labels:
fr: Demande de signature
isForward: true isForward: true
signatureApplied: signatureApplied:
from: from:
- attenteSignature - attenteSignature
to: postSignature to: postSignature
metadata: metadata:
label: Signatures appliquées label: {fr: Signatures appliquées}
translated_labels:
fr: Signatures appliquées
isForward: true isForward: true
transitionGuard: 'system' # can be 'system+only-dest' or 'only-dest' (only-dest is default) transitionGuard: 'system' # can be 'system+only-dest' or 'only-dest' (only-dest is default)
demandeTraitement: demandeTraitement:
@@ -198,9 +177,7 @@ framework:
- postSignature - postSignature
to: attenteTraitement to: attenteTraitement
metadata: metadata:
label: Demande de traitement label: {fr: Demande de traitement}
translated_labels:
fr: Demande de traitement
isForward: true isForward: true
demandeEnvoi: demandeEnvoi:
from: from:
@@ -213,9 +190,7 @@ framework:
- attenteTraitement - attenteTraitement
to: attenteEnvoi to: attenteEnvoi
metadata: metadata:
label: Demande d'envoi label: {fr: Demande d'envoi}
translated_labels:
fr: Demande d'envoi
isForward: true isForward: true
demandeEnvoiExterne: demandeEnvoiExterne:
from: from:
@@ -228,9 +203,7 @@ framework:
- attenteTraitement - attenteTraitement
to: attenteReceptionExternal to: attenteReceptionExternal
metadata: metadata:
label: Envoi sécurisé par courrier électronique label: {fr: Envoi sécurisé par courrier électronique}
translated_labels:
fr: Envoi sécurisé par courrier électronique
isForward: true isForward: true
clotureApresLectureEnvoiExterne: clotureApresLectureEnvoiExterne:
from: from:
@@ -240,9 +213,7 @@ framework:
metadata: metadata:
transitionGuard: system transitionGuard: system
isForward: true isForward: true
label: Consultation de l'envoi sécurisé label: {fr: Consultation de l'envoi sécurisé}
translated_labels:
fr: Consultation de l'envoi sécurisé
annulation: annulation:
from: from:
- initial - initial
@@ -256,9 +227,7 @@ framework:
- attenteEnvoi - attenteEnvoi
to: annule to: annule
metadata: metadata:
label: Annulation label: {fr: Annulation}
translated_labels:
fr: Annulation
isForward: false isForward: false
transitionGuard: 'system+only-dest' # can be 'system+only-dest' or 'only-dest' (only-dest is default) transitionGuard: 'system+only-dest' # can be 'system+only-dest' or 'only-dest' (only-dest is default)
# transitions qui répètent l'étape # transitions qui répètent l'étape
@@ -268,35 +237,27 @@ framework:
- attenteValidationMiseEnForme - attenteValidationMiseEnForme
to: attenteMiseEnForme to: attenteMiseEnForme
metadata: metadata:
label: Demande de mise en forme supplémentaire label: {fr: Demande de mise en forme supplémentaire}
translated_labels:
fr: Demande de mise en forme supplémentaire
demandeVisaSupplementaire: demandeVisaSupplementaire:
from: from:
- attenteVisa - attenteVisa
to: attenteVisa to: attenteVisa
metadata: metadata:
label: Demande de visa supplémentaire label: {fr: Demande de visa supplémentaire}
translated_labels:
fr: Demande de visa supplémentaire
isForward: true isForward: true
demandeSignatureSupplementaire: demandeSignatureSupplementaire:
from: from:
- postSignature - postSignature
to: attenteSignature to: attenteSignature
metadata: metadata:
label: Demande de signature supplémentaire label: {fr: Demande de signature supplémentaire}
translated_labels:
fr: Demande de signature supplémentaire
isForward: true isForward: true
demandeTraitementSupplementaire: demandeTraitementSupplementaire:
from: from:
- attenteTraitement - attenteTraitement
to: attenteTraitement to: attenteTraitement
metadata: metadata:
label: Demande de traitement supplémentaire label: {fr: Demande de traitement supplémentaire}
translated_labels:
fr: Demande de traitement supplémentaire
# transitions qui renvoient vers une étape précédente # transitions qui renvoient vers une étape précédente
refusEtModificationDocument: refusEtModificationDocument:
from: from:
@@ -306,8 +267,7 @@ framework:
- attenteEnvoi - attenteEnvoi
to: attenteModification to: attenteModification
metadata: metadata:
label: Refus et demande de modification du document label:
translated_labels:
fr: Refus et demande de modification du document fr: Refus et demande de modification du document
isForward: false isForward: false
refusEtDemandeMiseEnForme: refusEtDemandeMiseEnForme:
@@ -317,9 +277,7 @@ framework:
- attenteEnvoi - attenteEnvoi
to: attenteMiseEnForme to: attenteMiseEnForme
metadata: metadata:
label: Refus et demande de mise en forme label: {fr: Refus et demande de mise en forme}
translated_labels:
fr: Refus et demande de mise en forme
isForward: false isForward: false
refusEtDemandeVisa: refusEtDemandeVisa:
from: from:
@@ -327,27 +285,21 @@ framework:
- attenteEnvoi - attenteEnvoi
to: attenteVisa to: attenteVisa
metadata: metadata:
label: Refus et demande de visa label: {fr: Refus et demande de visa}
translated_labels:
fr: Refus et demande de visa
isForward: false isForward: false
refusEtDemandeSignature: refusEtDemandeSignature:
from: from:
- attenteEnvoi - attenteEnvoi
to: attenteSignature to: attenteSignature
metadata: metadata:
label: Refus et demande de signature label: {fr: Refus et demande de signature}
translated_labels:
fr: Refus et demande de signature
isForward: false isForward: false
refusEtDemandeTraitement: refusEtDemandeTraitement:
from: from:
- attenteEnvoi - attenteEnvoi
to: attenteTraitement to: attenteTraitement
metadata: metadata:
label: Refus et demande de traitement label: {fr: Refus et demande de traitement}
translated_labels:
fr: Refus et demande de traitement
isForward: false isForward: false
# transition vers final # transition vers final
initialToFinal: initialToFinal:
@@ -355,9 +307,7 @@ framework:
- initial - initial
to: final to: final
metadata: metadata:
label: Clotûre immédiate et cloture positive label: {fr: Clotûre immédiate et cloture positive}
translated_labels:
fr: Clotûre immédiate et cloture positive
isForward: true isForward: true
attenteMiseEnFormeToFinal: attenteMiseEnFormeToFinal:
from: from:
@@ -365,43 +315,33 @@ framework:
- attenteValidationMiseEnForme - attenteValidationMiseEnForme
to: final to: final
metadata: metadata:
label: Mise en forme terminée et cloture positive label: {fr: Mise en forme terminée et cloture positive}
translated_labels:
fr: Mise en forme terminée et cloture positive
isForward: true isForward: true
attenteVisaToFinal: attenteVisaToFinal:
from: from:
- attenteVisa - attenteVisa
to: final to: final
metadata: metadata:
label: Accorde le visa et cloture positive label: {fr: Accorde le visa et cloture positive}
translated_labels:
fr: Accorde le visa et cloture positive
isForward: true isForward: true
postSignatureToFinal: postSignatureToFinal:
from: from:
- postSignature - postSignature
to: final to: final
metadata: metadata:
label: Cloture positive label: {fr: Cloture positive}
translated_labels:
fr: Cloture positive
isForward: true isForward: true
attenteTraitementToFinal: attenteTraitementToFinal:
from: from:
- attenteTraitement - attenteTraitement
to: final to: final
metadata: metadata:
label: Traitement terminé et cloture positive label: {fr: Traitement terminé et cloture positive}
translated_labels:
fr: Traitement terminé et cloture positive
isForward: true isForward: true
attenteEnvoiToFinal: attenteEnvoiToFinal:
from: from:
- attenteEnvoi - attenteEnvoi
to: final to: final
metadata: metadata:
label: Envoyé et cloture positive label: {fr: Envoyé et cloture positive}
translated_labels:
fr: Envoyé et cloture positive
isForward: true isForward: true

View File

@@ -0,0 +1,3 @@
kernel:
resource: ../../src/app/Kernel.php
type: annotation

View File

@@ -1,3 +0,0 @@
_security_logout:
resource: security.route_loader.logout
type: service

View File

@@ -6,20 +6,8 @@
parameters: parameters:
services: services:
#alias to inject container into AbstractController::setContainer
Psr\Container\ContainerInterface: '@service_container'
# default configuration for services in *this* file # default configuration for services in *this* file
_defaults: _defaults:
autowire: true # Automatically injects dependencies in your services. autowire: true # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
# Custom entity value resolver to replace SensioFrameworkExtraBundle functionality
Chill\MainBundle\ArgumentResolver\EntityValueResolver:
tags:
- { name: controller.argument_value_resolver, priority: 50 }
Chill\MainBundle\Serializer\CircularReferenceHandler:
public: false
tags:
- { name: 'serializer.circular_reference_handler' }

View File

@@ -23,8 +23,8 @@ class "Document" {
- text description - text description
- ArrayCollection_DocumentCategory categories - ArrayCollection_DocumentCategory categories
- varchar_150 content #link to openstack - varchar_150 content #link to openstack
- Center center - Territoire territoire
- Cercle cercle - Service service
- User user - User user
- DateTime date # Creation date - DateTime date # Creation date
} }

View File

@@ -14,6 +14,7 @@ namespace Chill\PersonBundle\Export\Filter;
use Chill\MainBundle\Export\ExportElementValidatedInterface; use Chill\MainBundle\Export\ExportElementValidatedInterface;
use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use DateTime;
use Doctrine\ORM\Query\Expr; use Doctrine\ORM\Query\Expr;
use Symfony\Component\Form\Extension\Core\Type\DateType; use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Validator\Context\ExecutionContextInterface; use Symfony\Component\Validator\Context\ExecutionContextInterface;
@@ -21,7 +22,6 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
class BirthdateFilter implements ExportElementValidatedInterface, FilterInterface class BirthdateFilter implements ExportElementValidatedInterface, FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait; use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
// add specific role for this filter // add specific role for this filter
public function addRole(): ?string public function addRole(): ?string
{ {
@@ -30,7 +30,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac
} }
// here, we alter the query created by Export // here, we alter the query created by Export
public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void
{ {
$where = $qb->getDQLPart('where'); $where = $qb->getDQLPart('where');
// we create the clause here // we create the clause here
@@ -76,25 +76,21 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac
'format' => 'dd-MM-yyyy', 'format' => 'dd-MM-yyyy',
]); ]);
} }
public function getNormalizationVersion(): int public function getNormalizationVersion(): int
{ {
return 1; return 1;
} }
public function normalizeFormData(array $formData): array public function normalizeFormData(array $formData): array
{ {
return ['date_from' => $this->normalizeDate($formData['date_from']), 'date_to' => $this->normalizeDate($formData['date_to'])]; return ['date_from' => $this->normalizeDate($formData['date_from']), 'date_to' => $this->normalizeDate($formData['date_to'])];
} }
public function denormalizeFormData(array $formData, int $fromVersion): array public function denormalizeFormData(array $formData, int $fromVersion): array
{ {
return ['date_from' => $this->denormalizeDate($formData['date_from']), 'date_to' => $this->denormalizeDate($formData['date_to'])]; return ['date_from' => $this->denormalizeDate($formData['date_from']), 'date_to' => $this->denormalizeDate($formData['date_to'])];
} }
public function getFormDefaultData(): array public function getFormDefaultData(): array
{ {
return ['date_from' => new \DateTime(), 'date_to' => new \DateTime()]; return ['date_from' => new DateTime(), 'date_to' => new DateTime()];
} }
// here, we create a simple string which will describe the action of // here, we create a simple string which will describe the action of

View File

@@ -32,7 +32,7 @@ class CountPerson implements ExportInterface
$this->entityManager = $em; $this->entityManager = $em;
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// this export does not add any form // this export does not add any form
} }

View File

@@ -38,7 +38,7 @@ Certaines données sont historisées:
- les référents d'un parcours; - les référents d'un parcours;
- les statuts d'un parcours; - les statuts d'un parcours;
- la liaison entre les centres et les usagers; - la liaison entre les territoires et les usagers;
- etc. - etc.
Dans ces cas-là, Chill crée généralement deux colonnes, qui sont habituellement nommées :code:`startDate` et :code:`endDate`. Lorsque la colonne :code:`endDate` est à :code:`NULL`, cela signifie que la période n'est pas "fermée". La colonne :code:`startDate` n'est pas nullable. Dans ces cas-là, Chill crée généralement deux colonnes, qui sont habituellement nommées :code:`startDate` et :code:`endDate`. Lorsque la colonne :code:`endDate` est à :code:`NULL`, cela signifie que la période n'est pas "fermée". La colonne :code:`startDate` n'est pas nullable.

View File

@@ -1,6 +1,6 @@
order,table_schema,table_name,commentaire order,table_schema,table_name,commentaire
1,chill_3party,party_category,Catégorie de tiers 1,chill_3party,party_category,Catégorie de tiers
2,chill_3party,party_center,Association entre les tiers et les centres (déprécié) 2,chill_3party,party_center,Association entre les tiers et les territoires (déprécié)
3,chill_3party,party_profession,Profession du tiers (déprécié) 3,chill_3party,party_profession,Profession du tiers (déprécié)
4,chill_3party,third_party,Tiers 4,chill_3party,third_party,Tiers
5,chill_3party,thirdparty_category,association tiers - catégories 5,chill_3party,thirdparty_category,association tiers - catégories
@@ -54,7 +54,7 @@ order,table_schema,table_name,commentaire
53,public,activitytpresence,Présence aux échanges 53,public,activitytpresence,Présence aux échanges
54,public,activitytype,Types d'échanges 54,public,activitytype,Types d'échanges
55,public,activitytypecategory,Catégories de types d'échanges 55,public,activitytypecategory,Catégories de types d'échanges
56,public,centers,"Centres (territoires, agences, etc.)" 56,public,centers,"Territoires (territoires, agences, etc.)"
57,public,chill_activity_activity_chill_person_socialaction, 57,public,chill_activity_activity_chill_person_socialaction,
58,public,chill_activity_activity_chill_person_socialissue 58,public,chill_activity_activity_chill_person_socialissue
59,public,chill_docgen_template,Gabarits de documents 59,public,chill_docgen_template,Gabarits de documents
@@ -111,7 +111,7 @@ order,table_schema,table_name,commentaire
110,public,chill_person_marital_status,Etats civils 110,public,chill_person_marital_status,Etats civils
111,public,chill_person_not_duplicate, 111,public,chill_person_not_duplicate,
112,public,chill_person_person,Usagers 112,public,chill_person_person,Usagers
113,public,chill_person_person_center_history,Historique des centres d'un usagers 113,public,chill_person_person_center_history,Historique des territoires d'un usagers
114,public,chill_person_persons_to_addresses,Déprécié 114,public,chill_person_persons_to_addresses,Déprécié
115,public,chill_person_phone,Numéros d etéléphone supplémentaires d'un usager 115,public,chill_person_phone,Numéros d etéléphone supplémentaires d'un usager
116,public,chill_person_relations,Types de relations de filiation 116,public,chill_person_relations,Types de relations de filiation
@@ -142,7 +142,7 @@ order,table_schema,table_name,commentaire
141,public,permission_groups 141,public,permission_groups
142,public,permissionsgroup_rolescope 142,public,permissionsgroup_rolescope
143,public,persons_spoken_languages 143,public,persons_spoken_languages
144,public,regroupment,Regroupement de centres 144,public,regroupment,Regroupement de territoires
145,public,regroupment_center, 145,public,regroupment_center,
146,public,role_scopes, 146,public,role_scopes,
147,public,scopes,Services 147,public,scopes,Services
1 order table_schema table_name commentaire
2 1 chill_3party party_category Catégorie de tiers
3 2 chill_3party party_center Association entre les tiers et les centres (déprécié) Association entre les tiers et les territoires (déprécié)
4 3 chill_3party party_profession Profession du tiers (déprécié)
5 4 chill_3party third_party Tiers
6 5 chill_3party thirdparty_category association tiers - catégories
54 53 public activitytpresence Présence aux échanges
55 54 public activitytype Types d'échanges
56 55 public activitytypecategory Catégories de types d'échanges
57 56 public centers Centres (territoires, agences, etc.) Territoires (territoires, agences, etc.)
58 57 public chill_activity_activity_chill_person_socialaction
59 58 public chill_activity_activity_chill_person_socialissue
60 59 public chill_docgen_template Gabarits de documents
111 110 public chill_person_marital_status Etats civils
112 111 public chill_person_not_duplicate
113 112 public chill_person_person Usagers
114 113 public chill_person_person_center_history Historique des centres d'un usagers Historique des territoires d'un usagers
115 114 public chill_person_persons_to_addresses Déprécié
116 115 public chill_person_phone Numéros d etéléphone supplémentaires d'un usager
117 116 public chill_person_relations Types de relations de filiation
142 141 public permission_groups
143 142 public permissionsgroup_rolescope
144 143 public persons_spoken_languages
145 144 public regroupment Regroupement de centres Regroupement de territoires
146 145 public regroupment_center
147 146 public role_scopes
148 147 public scopes Services

View File

@@ -15,10 +15,10 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class example extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController class example extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController
{ {
public function __construct(private readonly \Doctrine\Persistence\ManagerRegistry $managerRegistry, private readonly \Chill\MainBundle\Pagination\PaginatorFactoryInterface $paginatorFactory) public function __construct(private readonly \Doctrine\Persistence\ManagerRegistry $managerRegistry)
{ {
} }
public function yourAction(): \Symfony\Component\HttpFoundation\Response public function yourAction()
{ {
$em = $this->managerRegistry->getManager(); $em = $this->managerRegistry->getManager();
// first, get the number of total item are available // first, get the number of total item are available
@@ -27,7 +27,7 @@ class example extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractControl
->getSingleScalarResult(); ->getSingleScalarResult();
// get the PaginatorFactory // get the PaginatorFactory
$paginatorFactory = $this->paginatorFactory; $paginatorFactory = $this->get('chill_main.paginator_factory');
// create a pagination instance. This instance is only valid for // create a pagination instance. This instance is only valid for
// the current route and parameters // the current route and parameters

View File

@@ -18,7 +18,7 @@ use Symfony\Component\Security\Core\Role\Role;
class ConsultationController extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController class ConsultationController extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController
{ {
public function __construct(private readonly \Doctrine\Persistence\ManagerRegistry $managerRegistry, private readonly \Chill\PersonBundle\Repository\PersonRepository $personRepository) public function __construct(private readonly \Doctrine\Persistence\ManagerRegistry $managerRegistry)
{ {
} }
/** /**
@@ -28,10 +28,10 @@ class ConsultationController extends \Symfony\Bundle\FrameworkBundle\Controller\
* *
* @return \Symfony\Component\HttpFoundation\Response * @return \Symfony\Component\HttpFoundation\Response
*/ */
public function listAction($id): \Symfony\Component\HttpFoundation\Response public function listAction($id)
{ {
/** @var \Chill\PersonBundle\Entity\Person $person */ /** @var \Chill\PersonBundle\Entity\Person $person */
$person = $this->personRepository $person = $this->get('chill.person.repository.person')
->find($id); ->find($id);
if (null === $person) { if (null === $person) {

View File

@@ -31,7 +31,7 @@ class ChillMainConfiguration implements ConfigurationInterface
$this->setWidgetFactories($widgetFactories); $this->setWidgetFactories($widgetFactories);
} }
public function getConfigTreeBuilder(): \Symfony\Component\Config\Definition\Builder\TreeBuilder public function getConfigTreeBuilder()
{ {
$treeBuilder = new TreeBuilder('chill_main'); $treeBuilder = new TreeBuilder('chill_main');
$rootNode = $treeBuilder->getRootNode(); $rootNode = $treeBuilder->getRootNode();

View File

@@ -27,13 +27,12 @@ class ChillMainExtension extends Extension implements Widget\HasWidgetFactoriesE
*/ */
protected $widgetFactories = []; protected $widgetFactories = [];
public function addWidgetFactory(WidgetFactoryInterface $factory): void public function addWidgetFactory(WidgetFactoryInterface $factory)
{ {
$this->widgetFactories[] = $factory; $this->widgetFactories[] = $factory;
} }
#[\Override] public function getConfiguration(array $config, ContainerBuilder $container)
public function getConfiguration(array $config, ContainerBuilder $container): ?\Symfony\Component\Config\Definition\ConfigurationInterface
{ {
return new Configuration($this->widgetFactories, $container); return new Configuration($this->widgetFactories, $container);
} }
@@ -46,7 +45,7 @@ class ChillMainExtension extends Extension implements Widget\HasWidgetFactoriesE
return $this->widgetFactories; return $this->widgetFactories;
} }
public function load(array $configs, ContainerBuilder $container): void public function load(array $configs, ContainerBuilder $container)
{ {
// configuration for main bundle // configuration for main bundle
$configuration = $this->getConfiguration($configs, $container); $configuration = $this->getConfiguration($configs, $container);

View File

@@ -25,7 +25,7 @@ class ChillPersonAddAPersonListWidgetFactory extends AbstractWidgetFactory
* see http://symfony.com/doc/current/components/config/definition.html * see http://symfony.com/doc/current/components/config/definition.html
* *
*/ */
public function configureOptions($place, NodeBuilder $node): void public function configureOptions($place, NodeBuilder $node)
{ {
$node->booleanNode('only_active') $node->booleanNode('only_active')
->defaultTrue() ->defaultTrue()

View File

@@ -97,12 +97,12 @@ class ChillPersonAddAPersonWidget implements WidgetInterface
$or = new Expr\Orx(); $or = new Expr\Orx();
// add the case where closingDate IS NULL // add the case where closingDate IS NULL
$andWhenClosingDateIsNull = new Expr\Andx(); $andWhenClosingDateIsNull = new Expr\Andx();
$andWhenClosingDateIsNull->add(new Expr()->isNull('ap.closingDate')); $andWhenClosingDateIsNull->add((new Expr())->isNull('ap.closingDate'));
$andWhenClosingDateIsNull->add(new Expr()->gte(':now', 'ap.openingDate')); $andWhenClosingDateIsNull->add((new Expr())->gte(':now', 'ap.openingDate'));
$or->add($andWhenClosingDateIsNull); $or->add($andWhenClosingDateIsNull);
// add the case when now is between opening date and closing date // add the case when now is between opening date and closing date
$or->add( $or->add(
new Expr()->between(':now', 'ap.openingDate', 'ap.closingDate') (new Expr())->between(':now', 'ap.openingDate', 'ap.closingDate')
); );
$and->add($or); $and->add($or);
$qb->setParameter('now', new DateTime(), Type::DATE); $qb->setParameter('now', new DateTime(), Type::DATE);
@@ -124,7 +124,7 @@ class ChillPersonAddAPersonWidget implements WidgetInterface
/** /**
* @return UserInterface * @return UserInterface
*/ */
private function getUser(): void private function getUser()
{ {
// return a user // return a user
} }

View File

@@ -22,7 +22,7 @@ use Symfony\Component\HttpKernel\DependencyInjection\Extension;
*/ */
class ChillPersonExtension extends Extension implements PrependExtensionInterface class ChillPersonExtension extends Extension implements PrependExtensionInterface
{ {
public function load(array $configs, ContainerBuilder $container): void public function load(array $configs, ContainerBuilder $container)
{ {
// ... // ...
} }
@@ -32,7 +32,7 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac
* *
* @param \Chill\PersonBundle\DependencyInjection\containerBuilder $container * @param \Chill\PersonBundle\DependencyInjection\containerBuilder $container
*/ */
public function prepend(ContainerBuilder $container): void public function prepend(ContainerBuilder $container)
{ {
$container->prependExtensionConfig('chill_main', [ $container->prependExtensionConfig('chill_main', [
'widgets' => [ 'widgets' => [

View File

@@ -11,7 +11,6 @@
"@hotwired/stimulus": "^3.0.0", "@hotwired/stimulus": "^3.0.0",
"@luminateone/eslint-baseline": "^1.0.9", "@luminateone/eslint-baseline": "^1.0.9",
"@symfony/stimulus-bridge": "^3.2.0", "@symfony/stimulus-bridge": "^3.2.0",
"@symfony/ux-translator": "file:vendor/symfony/ux-translator/assets",
"@symfony/webpack-encore": "^4.1.0", "@symfony/webpack-encore": "^4.1.0",
"@tsconfig/node20": "^20.1.4", "@tsconfig/node20": "^20.1.4",
"@types/dompurify": "^3.0.5", "@types/dompurify": "^3.0.5",

File diff suppressed because it is too large Load Diff

View File

@@ -22,9 +22,6 @@ parameters:
- src/Bundle/*/src/translations/* - src/Bundle/*/src/translations/*
- src/Bundle/*/src/Resources/* - src/Bundle/*/src/Resources/*
symfony:
containerXmlPath: var/cache/dev/App_KernelDevDebugContainer.xml
includes: includes:
- phpstan-baseline.neon - phpstan-baseline.neon

View File

@@ -1,34 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html --> <!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
backupGlobals="false" backupGlobals="false"
colors="true" colors="true"
failOnNotice="true"
failOnWarning="true"
bootstrap="tests/bootstrap.php" bootstrap="tests/bootstrap.php"
cacheDirectory=".phpunit.cache"
> >
<php> <php>
<ini name="display_errors" value="1" /> <ini name="display_errors" value="1" />
<ini name="error_reporting" value="-1"/> <ini name="error_reporting" value="-1"/>
<server name="APP_ENV" value="test" force="true"/> <server name="APP_ENV" value="test" force="true"/>
<env name="SYMFONY_DEPRECATIONS_HELPER" value="max[direct]=93&amp;max[indirect]=999999"/>
<server name="SHELL_VERBOSITY" value="-1"/> <server name="SHELL_VERBOSITY" value="-1"/>
<server name="SYMFONY_PHPUNIT_REMOVE" value="" />
<server name="SYMFONY_PHPUNIT_VERSION" value="9.5" />
<ini name="date.timezone" value="Europe/Brussels" />
</php> </php>
<testsuites> <testsuites>
<testsuite name="Project Test Suite"> <!--
<directory>tests</directory> <testsuite name="ActivityBundle">
<directory suffix="Test.php">src/Bundle/ChillActivityBundle/Tests/</directory>
</testsuite>
-->
<testsuite name="AsideActivityBundle">
<directory suffix="Test.php">src/Bundle/ChillAsideActivityBundle/src/Tests/</directory>
</testsuite>
<testsuite name="BudgetBundle">
<directory suffix="Test.php">src/Bundle/ChillBudgetBundle/Tests/</directory>
</testsuite>
<testsuite name="CalendarBundle">
<directory suffix="Test.php">src/Bundle/ChillCalendarBundle/Tests/</directory>
</testsuite>
<!-- Missing CustomFieldBundle -->
<testsuite name="DocGeneratorBundle">
<directory suffix="Test.php">src/Bundle/ChillDocGeneratorBundle/tests/</directory>
</testsuite>
<testsuite name="DocStoreBundle">
<directory suffix="Test.php">src/Bundle/ChillDocStoreBundle/Tests/</directory>
</testsuite>
<!--
<testsuite name="EventBundle">
<directory suffix="Test.php">src/Bundle/ChillEventBundle/tests/</directory>
</testsuite>
-->
<testsuite name="MainBundle">
<directory suffix="Test.php">src/Bundle/ChillMainBundle/Tests/</directory>
</testsuite>
<testsuite name="PersonBundle">
<directory suffix="Test.php">src/Bundle/ChillPersonBundle/Tests/</directory>
<!-- we are rewriting accompanying periods... Work in progress -->
<exclude>src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingPeriodControllerTest.php</exclude>
<!-- we are rewriting address, Work in progress -->
<exclude>src/Bundle/ChillPersonBundle/Tests/Controller/PersonAddressControllerTest.php</exclude>
<!-- find a solution to create multiple configs -->
<exclude>src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateWithHiddenFieldsTest.php</exclude>
<!-- temporarily removed, the time to find a fix -->
<exclude>src/Bundle/ChillPersonBundle/Tests/Controller/PersonDuplicateControllerViewTest.php</exclude>
</testsuite>
<!--
<testsuite name="ReportBundle">
<directory suffix="Test.php">src/Bundle/ChillReportBundle/Tests/</directory>
</testsuite>
-->
<!--
<testsuite name="TaskBundle">
<directory suffix="Test.php">src/Bundle/ChillTaskBundle/Tests</directory>
</testsuite>
-->
<testsuite name="ThirdPartyBundle">
<directory suffix="Test.php">src/Bundle/ChillThirdPartyBundle/Tests</directory>
</testsuite>
<testsuite name="WopiBundle">
<directory suffix="Test.php">src/Bundle/ChillWopiBundle/tests/</directory>
</testsuite> </testsuite>
</testsuites> </testsuites>
<!-- Run `composer require symfony/panther` before enabling this extension -->
<source ignoreSuppressionOfDeprecations="true" restrictNotices="true" restrictWarnings="true"> <!--
<include>
<directory>src</directory>
</include>
</source>
<extensions> <extensions>
<extension class="Symfony\Component\Panther\ServerExtension" />
</extensions> </extensions>
-->
</phpunit> </phpunit>

View File

@@ -13,16 +13,78 @@ use Rector\CodeQuality\Rector\Class_\InlineConstructorDefaultToPropertyRector;
use Rector\Config\RectorConfig; use Rector\Config\RectorConfig;
use Rector\Php80\Rector\Class_\AnnotationToAttributeRector; use Rector\Php80\Rector\Class_\AnnotationToAttributeRector;
use Rector\Set\ValueObject\LevelSetList; use Rector\Set\ValueObject\LevelSetList;
use Rector\Set\ValueObject\SetList;
use Rector\Symfony\Set\SymfonySetList;
return RectorConfig::configure() return static function (RectorConfig $rectorConfig): void {
->withPaths(['./src', './docs', './rector.php']) $rectorConfig->paths([
->withComposerBased(twig: true, doctrine: true, symfony: true) __DIR__ . '/docs',
->withSymfonyContainerXml(__DIR__.'/var/cache/dev/App_KernelDevDebugContainer.xml') __DIR__ . '/src',
->withSymfonyContainerPhp(__DIR__.'/var/cache/dev/App_KernelDevDebugContainer.php') __DIR__ . '/rector.php',
->withDeadCodeLevel(0) ]);
->withCodeQualityLevel(0)
->withTypeCoverageLevel(0) $rectorConfig->skip([
->withTypeCoverageDocblockLevel(0) \Rector\Php55\Rector\String_\StringClassNameToClassConstantRector::class => __DIR__ . 'src/Bundle/ChillMainBundle/Service/Notifier/LegacyOvhCloudFactory.php'
->withCodingStyleLevel(0); ]);
//$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');
// register a single rule
$rectorConfig->rule(InlineConstructorDefaultToPropertyRector::class);
$rectorConfig->rule(Rector\TypeDeclaration\Rector\ClassMethod\AddParamTypeFromPropertyTypeRector::class);
$rectorConfig->rule(Rector\TypeDeclaration\Rector\Class_\MergeDateTimePropertyTypeDeclarationRector::class);
$rectorConfig->rule(Rector\TypeDeclaration\Rector\ClassMethod\AddReturnTypeDeclarationBasedOnParentClassMethodRector::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();
//define sets of rules
$rectorConfig->sets([
LevelSetList::UP_TO_PHP_82,
\Rector\Doctrine\Set\DoctrineSetList::DOCTRINE_CODE_QUALITY,
\Rector\PHPUnit\Set\PHPUnitSetList::PHPUNIT_90,
]);
$rectorConfig->ruleWithConfiguration(\Rector\Php80\Rector\Class_\AnnotationToAttributeRector::class, [
new \Rector\Php80\ValueObject\AnnotationToAttribute('Symfony\Component\Serializer\Annotation\Context'),
]);
// migrate for phpunit
$rectorConfig->rules([
\Rector\PHPUnit\PHPUnit100\Rector\Class_\StaticDataProviderClassMethodRector::class,
\Rector\PHPUnit\PHPUnit100\Rector\Class_\PublicDataProviderClassMethodRector::class
]);
// some routes are added twice if it remains activated
// $rectorConfig->rule(\Rector\Symfony\Configs\Rector\ClassMethod\AddRouteAnnotationRector::class);
// skip some path...
$rectorConfig->skip([
// waiting for fixing this bug: https://github.com/rectorphp/rector-doctrine/issues/342
\Rector\Doctrine\CodeQuality\Rector\Property\ImproveDoctrineCollectionDocTypeInEntityRector::class,
]);
$rectorConfig->ruleWithConfiguration(AnnotationToAttributeRector::class, [
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\PersonBundle\Validator\Constraints\AccompanyingPeriod\AccompanyingPeriodValidity'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\PersonBundle\Validator\Constraints\Household\HouseholdMembershipSequential'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\PersonBundle\Validator\Constraints\Household\MaxHolder'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\PersonBundle\Validator\Constraints\AccompanyingPeriod\ConfidentialCourseMustHaveReferrer'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\PersonBundle\Validator\Constraints\AccompanyingPeriod\LocationValidity'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\PersonBundle\Validator\Constraints\AccompanyingPeriod\ParticipationOverlap'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\PersonBundle\Validator\Constraints\AccompanyingPeriod\ResourceDuplicateCheck'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\PersonBundle\Validator\Constraints\Person\Birthdate'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\PersonBundle\Validator\Constraints\Person\PersonHasCenter'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\PersonBundle\Validator\Constraints\Relationship\RelationshipNoDuplicate'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\ActivityBundle\Validator\Constraints\ActivityValidity'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\DocStoreBundle\Validator\Constraints\AsyncFileExists'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Validation\Constraint\PhonenumberConstraint'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Validator\Constraints\Entity\UserCircleConsistency'),
new \Rector\Php80\ValueObject\AnnotationToAttribute('Chill\MainBundle\Workflow\Validator\EntityWorkflowCreation'),
]);
};

View File

@@ -74,8 +74,8 @@ final class ActivityController extends AbstractController
/** /**
* Deletes a Activity entity. * Deletes a Activity entity.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/activity/{id}/delete', name: 'chill_activity_activity_delete', methods: ['GET', 'POST', 'DELETE'])] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/activity/{id}/delete', name: 'chill_activity_activity_delete', methods: ['GET', 'POST', 'DELETE'])]
public function deleteAction(Request $request, mixed $id): \Symfony\Component\HttpFoundation\RedirectResponse|Response public function deleteAction(Request $request, mixed $id)
{ {
$view = null; $view = null;
@@ -83,7 +83,7 @@ final class ActivityController extends AbstractController
$activity = $this->activityRepository->find($id); $activity = $this->activityRepository->find($id);
if (null === $activity) { if (!$activity) {
throw $this->createNotFoundException('Unable to find Activity entity.'); throw $this->createNotFoundException('Unable to find Activity entity.');
} }
@@ -104,11 +104,11 @@ final class ActivityController extends AbstractController
if ($form->isSubmitted() && $form->isValid()) { if ($form->isSubmitted() && $form->isValid()) {
$this->logger->notice('An activity has been removed', [ $this->logger->notice('An activity has been removed', [
'by_user' => $this->getUser()->getUserIdentifier(), 'by_user' => $this->getUser()->getUsername(),
'activity_id' => $activity->getId(), 'activity_id' => $activity->getId(),
'person_id' => null === $activity->getPerson() ? $activity->getPerson()->getId() : null, 'person_id' => $activity->getPerson() ? $activity->getPerson()->getId() : null,
'comment' => null === $activity->getComment()->getComment(), 'comment' => $activity->getComment()->getComment(),
'scope_id' => null === $activity->getScope() ? $activity->getScope()->getId() : null, 'scope_id' => $activity->getScope() ? $activity->getScope()->getId() : null,
'reasons_ids' => $activity->getReasons() 'reasons_ids' => $activity->getReasons()
->map( ->map(
static fn (ActivityReason $ar): int => $ar->getId() static fn (ActivityReason $ar): int => $ar->getId()
@@ -134,7 +134,7 @@ final class ActivityController extends AbstractController
return $this->render($view, [ return $this->render($view, [
'activity' => $activity, 'activity' => $activity,
'delete_form' => $form, 'delete_form' => $form->createView(),
'person' => $person, 'person' => $person,
'accompanyingCourse' => $accompanyingPeriod, 'accompanyingCourse' => $accompanyingPeriod,
]); ]);
@@ -143,7 +143,7 @@ final class ActivityController extends AbstractController
/** /**
* Displays a form to edit an existing Activity entity. * Displays a form to edit an existing Activity entity.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/activity/{id}/edit', name: 'chill_activity_activity_edit', methods: ['GET', 'POST', 'PUT'])] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/activity/{id}/edit', name: 'chill_activity_activity_edit', methods: ['GET', 'POST', 'PUT'])]
public function editAction(int $id, Request $request): Response public function editAction(int $id, Request $request): Response
{ {
$view = null; $view = null;
@@ -226,8 +226,8 @@ final class ActivityController extends AbstractController
return $this->render($view, [ return $this->render($view, [
'entity' => $entity, 'entity' => $entity,
'edit_form' => $form, 'edit_form' => $form->createView(),
'delete_form' => $deleteForm, 'delete_form' => $deleteForm->createView(),
'person' => $person, 'person' => $person,
'accompanyingCourse' => $accompanyingPeriod, 'accompanyingCourse' => $accompanyingPeriod,
'activity_json' => $activity_array, 'activity_json' => $activity_array,
@@ -237,7 +237,7 @@ final class ActivityController extends AbstractController
/** /**
* Lists all Activity entities. * Lists all Activity entities.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/activity/', name: 'chill_activity_activity_list')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/activity/', name: 'chill_activity_activity_list')]
public function listAction(Request $request): Response public function listAction(Request $request): Response
{ {
$view = null; $view = null;
@@ -341,7 +341,7 @@ final class ActivityController extends AbstractController
return $filterBuilder->build(); return $filterBuilder->build();
} }
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/activity/new', name: 'chill_activity_activity_new', methods: ['POST', 'GET'])] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/activity/new', name: 'chill_activity_activity_new', methods: ['POST', 'GET'])]
public function newAction(Request $request): Response public function newAction(Request $request): Response
{ {
$view = null; $view = null;
@@ -364,7 +364,7 @@ final class ActivityController extends AbstractController
$activityData = null; $activityData = null;
if ($request->query->has('activityData')) { if ($request->query->has('activityData')) {
$activityData = $request->query->all('activityData'); $activityData = $request->query->get('activityData');
} }
if ( if (
@@ -516,13 +516,13 @@ final class ActivityController extends AbstractController
'person' => $person, 'person' => $person,
'accompanyingCourse' => $accompanyingPeriod, 'accompanyingCourse' => $accompanyingPeriod,
'entity' => $entity, 'entity' => $entity,
'form' => $form, 'form' => $form->createView(),
'activity_json' => $activity_array, 'activity_json' => $activity_array,
'default_location' => $defaultLocation, 'default_location' => $defaultLocation,
]); ]);
} }
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/activity/select-type', name: 'chill_activity_activity_select_type')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/activity/select-type', name: 'chill_activity_activity_select_type')]
public function selectTypeAction(Request $request): Response public function selectTypeAction(Request $request): Response
{ {
$view = null; $view = null;
@@ -567,7 +567,7 @@ final class ActivityController extends AbstractController
]); ]);
} }
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/activity/{id}/show', name: 'chill_activity_activity_show')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/activity/{id}/show', name: 'chill_activity_activity_show')]
public function showAction(Request $request, int $id): Response public function showAction(Request $request, int $id): Response
{ {
$entity = $this->activityRepository->find($id); $entity = $this->activityRepository->find($id);
@@ -611,7 +611,7 @@ final class ActivityController extends AbstractController
'person' => $person, 'person' => $person,
'accompanyingCourse' => $accompanyingPeriod, 'accompanyingCourse' => $accompanyingPeriod,
'entity' => $entity, 'entity' => $entity,
'delete_form' => $deleteForm, 'delete_form' => $deleteForm->createView(),
]); ]);
} }

View File

@@ -15,7 +15,6 @@ use Chill\ActivityBundle\Entity\ActivityReasonCategory;
use Chill\ActivityBundle\Form\ActivityReasonCategoryType; use Chill\ActivityBundle\Form\ActivityReasonCategoryType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
/** /**
@@ -28,8 +27,8 @@ class ActivityReasonCategoryController extends AbstractController
/** /**
* Creates a new ActivityReasonCategory entity. * Creates a new ActivityReasonCategory entity.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activityreasoncategory/create', name: 'chill_activity_activityreasoncategory_create', methods: ['POST'])] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/create', name: 'chill_activity_activityreasoncategory_create', methods: ['POST'])]
public function createAction(Request $request): \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response public function createAction(Request $request)
{ {
$entity = new ActivityReasonCategory(); $entity = new ActivityReasonCategory();
$form = $this->createCreateForm($entity); $form = $this->createCreateForm($entity);
@@ -45,15 +44,15 @@ class ActivityReasonCategoryController extends AbstractController
return $this->render('@ChillActivity/ActivityReasonCategory/new.html.twig', [ return $this->render('@ChillActivity/ActivityReasonCategory/new.html.twig', [
'entity' => $entity, 'entity' => $entity,
'form' => $form, 'form' => $form->createView(),
]); ]);
} }
/** /**
* Lists all ActivityReasonCategory entities. * Lists all ActivityReasonCategory entities.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activityreasoncategory/', name: 'chill_activity_activityreasoncategory')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/', name: 'chill_activity_activityreasoncategory')]
public function indexAction(): \Symfony\Component\HttpFoundation\Response public function indexAction()
{ {
$em = $this->managerRegistry->getManager(); $em = $this->managerRegistry->getManager();
@@ -67,29 +66,29 @@ class ActivityReasonCategoryController extends AbstractController
/** /**
* Displays a form to create a new ActivityReasonCategory entity. * Displays a form to create a new ActivityReasonCategory entity.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activityreasoncategory/new', name: 'chill_activity_activityreasoncategory_new')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/new', name: 'chill_activity_activityreasoncategory_new')]
public function newAction(): \Symfony\Component\HttpFoundation\Response public function newAction()
{ {
$entity = new ActivityReasonCategory(); $entity = new ActivityReasonCategory();
$form = $this->createCreateForm($entity); $form = $this->createCreateForm($entity);
return $this->render('@ChillActivity/ActivityReasonCategory/new.html.twig', [ return $this->render('@ChillActivity/ActivityReasonCategory/new.html.twig', [
'entity' => $entity, 'entity' => $entity,
'form' => $form, 'form' => $form->createView(),
]); ]);
} }
/** /**
* Edits an existing ActivityReasonCategory entity. * Edits an existing ActivityReasonCategory entity.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activityreasoncategory/{id}/update', name: 'chill_activity_activityreasoncategory_update', methods: ['POST', 'PUT'])] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreasoncategory/{id}/update', name: 'chill_activity_activityreasoncategory_update')]
public function updateAction(Request $request, mixed $id): \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response public function updateAction(Request $request, mixed $id)
{ {
$em = $this->managerRegistry->getManager(); $em = $this->managerRegistry->getManager();
$entity = $em->getRepository(ActivityReasonCategory::class)->find($id); $entity = $em->getRepository(ActivityReasonCategory::class)->find($id);
if (null === $entity) { if (!$entity) {
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.'); throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
} }
@@ -104,7 +103,7 @@ class ActivityReasonCategoryController extends AbstractController
return $this->render('@ChillActivity/ActivityReasonCategory/edit.html.twig', [ return $this->render('@ChillActivity/ActivityReasonCategory/edit.html.twig', [
'entity' => $entity, 'entity' => $entity,
'edit_form' => $editForm, 'edit_form' => $editForm->createView(),
]); ]);
} }
@@ -112,8 +111,10 @@ class ActivityReasonCategoryController extends AbstractController
* Creates a form to create a ActivityReasonCategory entity. * Creates a form to create a ActivityReasonCategory entity.
* *
* @param ActivityReasonCategory $entity The entity * @param ActivityReasonCategory $entity The entity
*
* @return \Symfony\Component\Form\Form The form
*/ */
private function createCreateForm(ActivityReasonCategory $entity): FormInterface private function createCreateForm(ActivityReasonCategory $entity)
{ {
$form = $this->createForm(ActivityReasonCategoryType::class, $entity, [ $form = $this->createForm(ActivityReasonCategoryType::class, $entity, [
'action' => $this->generateUrl('chill_activity_activityreasoncategory_create'), 'action' => $this->generateUrl('chill_activity_activityreasoncategory_create'),
@@ -129,8 +130,10 @@ class ActivityReasonCategoryController extends AbstractController
* Creates a form to edit a ActivityReasonCategory entity. * Creates a form to edit a ActivityReasonCategory entity.
* *
* @param ActivityReasonCategory $entity The entity * @param ActivityReasonCategory $entity The entity
*
* @return \Symfony\Component\Form\Form The form
*/ */
private function createEditForm(ActivityReasonCategory $entity): FormInterface private function createEditForm(ActivityReasonCategory $entity)
{ {
$form = $this->createForm(ActivityReasonCategoryType::class, $entity, [ $form = $this->createForm(ActivityReasonCategoryType::class, $entity, [
'action' => $this->generateUrl('chill_activity_activityreasoncategory_update', ['id' => $entity->getId()]), 'action' => $this->generateUrl('chill_activity_activityreasoncategory_update', ['id' => $entity->getId()]),

View File

@@ -16,8 +16,6 @@ use Chill\ActivityBundle\Form\ActivityReasonType;
use Chill\ActivityBundle\Repository\ActivityReasonRepository; use Chill\ActivityBundle\Repository\ActivityReasonRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
/** /**
@@ -30,8 +28,8 @@ class ActivityReasonController extends AbstractController
/** /**
* Creates a new ActivityReason entity. * Creates a new ActivityReason entity.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activityreason/create', name: 'chill_activity_activityreason_create', methods: ['POST'])] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/create', name: 'chill_activity_activityreason_create', methods: ['POST'])]
public function createAction(Request $request): \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response public function createAction(Request $request)
{ {
$entity = new ActivityReason(); $entity = new ActivityReason();
$form = $this->createCreateForm($entity); $form = $this->createCreateForm($entity);
@@ -47,15 +45,15 @@ class ActivityReasonController extends AbstractController
return $this->render('@ChillActivity/ActivityReason/new.html.twig', [ return $this->render('@ChillActivity/ActivityReason/new.html.twig', [
'entity' => $entity, 'entity' => $entity,
'form' => $form, 'form' => $form->createView(),
]); ]);
} }
/** /**
* Lists all ActivityReason entities. * Lists all ActivityReason entities.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activityreason/', name: 'chill_activity_activityreason')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/', name: 'chill_activity_activityreason')]
public function indexAction(): \Symfony\Component\HttpFoundation\Response public function indexAction()
{ {
$em = $this->managerRegistry->getManager(); $em = $this->managerRegistry->getManager();
@@ -69,29 +67,29 @@ class ActivityReasonController extends AbstractController
/** /**
* Displays a form to create a new ActivityReason entity. * Displays a form to create a new ActivityReason entity.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activityreason/new', name: 'chill_activity_activityreason_new')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/new', name: 'chill_activity_activityreason_new')]
public function newAction(): \Symfony\Component\HttpFoundation\Response public function newAction()
{ {
$entity = new ActivityReason(); $entity = new ActivityReason();
$form = $this->createCreateForm($entity); $form = $this->createCreateForm($entity);
return $this->render('@ChillActivity/ActivityReason/new.html.twig', [ return $this->render('@ChillActivity/ActivityReason/new.html.twig', [
'entity' => $entity, 'entity' => $entity,
'form' => $form, 'form' => $form->createView(),
]); ]);
} }
/** /**
* Edits an existing ActivityReason entity. * Edits an existing ActivityReason entity.
*/ */
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activityreason/{id}/update', name: 'chill_activity_activityreason_update', methods: ['POST', 'PUT'])] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activityreason/{id}/update', name: 'chill_activity_activityreason_update')]
public function updateAction(Request $request, mixed $id): \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response public function updateAction(Request $request, mixed $id)
{ {
$em = $this->managerRegistry->getManager(); $em = $this->managerRegistry->getManager();
$entity = $em->getRepository(ActivityReason::class)->find($id); $entity = $em->getRepository(ActivityReason::class)->find($id);
if (null === $entity) { if (!$entity) {
throw $this->createNotFoundException('Unable to find ActivityReason entity.'); throw $this->createNotFoundException('Unable to find ActivityReason entity.');
} }
@@ -106,7 +104,7 @@ class ActivityReasonController extends AbstractController
return $this->render('@ChillActivity/ActivityReason/edit.html.twig', [ return $this->render('@ChillActivity/ActivityReason/edit.html.twig', [
'entity' => $entity, 'entity' => $entity,
'edit_form' => $editForm, 'edit_form' => $editForm->createView(),
]); ]);
} }
@@ -114,8 +112,10 @@ class ActivityReasonController extends AbstractController
* Creates a form to create a ActivityReason entity. * Creates a form to create a ActivityReason entity.
* *
* @param ActivityReason $entity The entity * @param ActivityReason $entity The entity
*
* @return \Symfony\Component\Form\Form The form
*/ */
private function createCreateForm(ActivityReason $entity): FormInterface private function createCreateForm(ActivityReason $entity)
{ {
$form = $this->createForm(ActivityReasonType::class, $entity, [ $form = $this->createForm(ActivityReasonType::class, $entity, [
'action' => $this->generateUrl('chill_activity_activityreason_create'), 'action' => $this->generateUrl('chill_activity_activityreason_create'),
@@ -131,8 +131,10 @@ class ActivityReasonController extends AbstractController
* Creates a form to edit a ActivityReason entity. * Creates a form to edit a ActivityReason entity.
* *
* @param ActivityReason $entity The entity * @param ActivityReason $entity The entity
*
* @return \Symfony\Component\Form\Form The form
*/ */
private function createEditForm(ActivityReason $entity): FormInterface private function createEditForm(ActivityReason $entity)
{ {
$form = $this->createForm(ActivityReasonType::class, $entity, [ $form = $this->createForm(ActivityReasonType::class, $entity, [
'action' => $this->generateUrl('chill_activity_activityreason_update', ['id' => $entity->getId()]), 'action' => $this->generateUrl('chill_activity_activityreason_update', ['id' => $entity->getId()]),

View File

@@ -22,7 +22,6 @@ class AdminActivityPresenceController extends CRUDController
* *
* @return \Doctrine\ORM\QueryBuilder|mixed * @return \Doctrine\ORM\QueryBuilder|mixed
*/ */
#[\Override]
protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator) protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator)
{ {
/* @var \Doctrine\ORM\QueryBuilder $query */ /* @var \Doctrine\ORM\QueryBuilder $query */

View File

@@ -22,7 +22,6 @@ class AdminActivityTypeCategoryController extends CRUDController
* *
* @return \Doctrine\ORM\QueryBuilder|mixed * @return \Doctrine\ORM\QueryBuilder|mixed
*/ */
#[\Override]
protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator) protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator)
{ {
/* @var \Doctrine\ORM\QueryBuilder $query */ /* @var \Doctrine\ORM\QueryBuilder $query */

View File

@@ -22,7 +22,6 @@ class AdminActivityTypeController extends CRUDController
* *
* @return \Doctrine\ORM\QueryBuilder|mixed * @return \Doctrine\ORM\QueryBuilder|mixed
*/ */
#[\Override]
protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator) protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator)
{ {
/* @var \Doctrine\ORM\QueryBuilder $query */ /* @var \Doctrine\ORM\QueryBuilder $query */

View File

@@ -18,15 +18,15 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
*/ */
class AdminController extends AbstractController class AdminController extends AbstractController
{ {
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activity', name: 'chill_activity_admin_index')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activity', name: 'chill_activity_admin_index')]
public function indexActivityAction(): \Symfony\Component\HttpFoundation\Response public function indexActivityAction()
{ {
return $this->render('@ChillActivity/Admin/layout_activity.html.twig'); return $this->render('@ChillActivity/Admin/layout_activity.html.twig');
} }
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activity_redirect_to_main', name: 'chill_admin_aside_activity_redirect_to_admin_index', options: [null])] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activity_redirect_to_main', name: 'chill_admin_aside_activity_redirect_to_admin_index', options: [null])]
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/admin/activity_redirect_to_main', name: 'chill_admin_activity_redirect_to_admin_index')] #[\Symfony\Component\Routing\Annotation\Route(path: '/{_locale}/admin/activity_redirect_to_main', name: 'chill_admin_activity_redirect_to_admin_index')]
public function redirectToAdminIndexAction(): \Symfony\Component\HttpFoundation\RedirectResponse public function redirectToAdminIndexAction()
{ {
return $this->redirectToRoute('chill_main_admin_central'); return $this->redirectToRoute('chill_main_admin_central');
} }

View File

@@ -27,6 +27,8 @@ use Faker\Factory as FakerFactory;
class LoadActivity extends AbstractFixture implements OrderedFixtureInterface class LoadActivity extends AbstractFixture implements OrderedFixtureInterface
{ {
use \Symfony\Component\DependencyInjection\ContainerAwareTrait;
private readonly \Faker\Generator $faker; private readonly \Faker\Generator $faker;
public function __construct(private readonly EntityManagerInterface $em) public function __construct(private readonly EntityManagerInterface $em)
@@ -61,7 +63,7 @@ class LoadActivity extends AbstractFixture implements OrderedFixtureInterface
public function newRandomActivity($person): ?Activity public function newRandomActivity($person): ?Activity
{ {
$activity = new Activity() $activity = (new Activity())
->setUser($this->getRandomUser()) ->setUser($this->getRandomUser())
->setPerson($person) ->setPerson($person)
->setDate($this->faker->dateTimeThisYear()) ->setDate($this->faker->dateTimeThisYear())

View File

@@ -54,7 +54,7 @@ class LoadActivityReason extends AbstractFixture implements OrderedFixtureInterf
foreach ($reasons as $r) { foreach ($reasons as $r) {
echo 'Creating activity reason : '.$r['name']['en']."\n"; echo 'Creating activity reason : '.$r['name']['en']."\n";
$activityReason = new ActivityReason() $activityReason = (new ActivityReason())
->setName($r['name']) ->setName($r['name'])
->setActive(true) ->setActive(true)
->setCategory($this->getReference($r['category'], ActivityReasonCategory::class)); ->setCategory($this->getReference($r['category'], ActivityReasonCategory::class));

View File

@@ -35,7 +35,7 @@ class LoadActivityReasonCategory extends AbstractFixture implements OrderedFixtu
foreach ($categs as $c) { foreach ($categs as $c) {
echo 'Creating activity reason category : '.$c['name']['en']."\n"; echo 'Creating activity reason category : '.$c['name']['en']."\n";
$activityReasonCategory = new ActivityReasonCategory() $activityReasonCategory = (new ActivityReasonCategory())
->setName($c['name']) ->setName($c['name'])
->setActive(true); ->setActive(true);
$manager->persist($activityReasonCategory); $manager->persist($activityReasonCategory);

View File

@@ -56,7 +56,7 @@ class LoadActivityType extends Fixture implements OrderedFixtureInterface
foreach ($types as $t) { foreach ($types as $t) {
echo 'Creating activity type : '.$t['name']['fr'].' (cat:'.$t['category']." \n"; echo 'Creating activity type : '.$t['name']['fr'].' (cat:'.$t['category']." \n";
$activityType = new ActivityType() $activityType = (new ActivityType())
->setName($t['name']) ->setName($t['name'])
->setCategory($this->getReference('activity_type_cat_'.$t['category'], ActivityTypeCategory::class)) ->setCategory($this->getReference('activity_type_cat_'.$t['category'], ActivityTypeCategory::class))
->setSocialIssuesVisible(1) ->setSocialIssuesVisible(1)

View File

@@ -44,7 +44,7 @@ class LoadActivityTypeCategory extends Fixture implements OrderedFixtureInterfac
foreach ($categories as $cat) { foreach ($categories as $cat) {
echo 'Creating activity type category : '.$cat['ref']."\n"; echo 'Creating activity type category : '.$cat['ref']."\n";
$newCat = new ActivityTypeCategory() $newCat = (new ActivityTypeCategory())
->setName($cat['name']); ->setName($cat['name']);
$manager->persist($newCat); $manager->persist($newCat);

View File

@@ -64,25 +64,25 @@ class LoadActivitytACL extends AbstractFixture implements OrderedFixtureInterfac
$permissionsGroup->getName(), $permissionsGroup->getName(),
$scope->getName()['en'] $scope->getName()['en']
); );
$roleScopeUpdate = new RoleScope() $roleScopeUpdate = (new RoleScope())
->setRole('CHILL_ACTIVITY_UPDATE') ->setRole('CHILL_ACTIVITY_UPDATE')
->setScope($scope); ->setScope($scope);
$permissionsGroup->addRoleScope($roleScopeUpdate); $permissionsGroup->addRoleScope($roleScopeUpdate);
$roleScopeCreate = new RoleScope() $roleScopeCreate = (new RoleScope())
->setRole(ActivityVoter::CREATE_ACCOMPANYING_COURSE) ->setRole(ActivityVoter::CREATE_ACCOMPANYING_COURSE)
->setScope($scope); ->setScope($scope);
$roleScopeCreate = new RoleScope() $roleScopeCreate = (new RoleScope())
->setRole(ActivityVoter::CREATE_PERSON) ->setRole(ActivityVoter::CREATE_PERSON)
->setScope($scope); ->setScope($scope);
$permissionsGroup->addRoleScope($roleScopeCreate); $permissionsGroup->addRoleScope($roleScopeCreate);
$roleScopeDelete = new RoleScope() $roleScopeDelete = (new RoleScope())
->setRole('CHILL_ACTIVITY_DELETE') ->setRole('CHILL_ACTIVITY_DELETE')
->setScope($scope); ->setScope($scope);
$permissionsGroup->addRoleScope($roleScopeDelete); $permissionsGroup->addRoleScope($roleScopeDelete);
$roleScopeList = new RoleScope() $roleScopeList = (new RoleScope())
->setRole(ActivityStatsVoter::LISTS); ->setRole(ActivityStatsVoter::LISTS);
$permissionsGroup->addRoleScope($roleScopeList); $permissionsGroup->addRoleScope($roleScopeList);
$roleScopeStat = new RoleScope() $roleScopeStat = (new RoleScope())
->setRole(ActivityStatsVoter::STATS); ->setRole(ActivityStatsVoter::STATS);
$permissionsGroup->addRoleScope($roleScopeStat); $permissionsGroup->addRoleScope($roleScopeStat);

View File

@@ -25,7 +25,7 @@ use Symfony\Component\HttpKernel\DependencyInjection\Extension;
*/ */
class ChillActivityExtension extends Extension implements PrependExtensionInterface class ChillActivityExtension extends Extension implements PrependExtensionInterface
{ {
public function load(array $configs, ContainerBuilder $container): void public function load(array $configs, ContainerBuilder $container)
{ {
$configuration = new Configuration(); $configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs); $config = $this->processConfiguration($configuration, $configs);
@@ -44,14 +44,14 @@ class ChillActivityExtension extends Extension implements PrependExtensionInterf
$loader->load('services/doctrine.entitylistener.yaml'); $loader->load('services/doctrine.entitylistener.yaml');
} }
public function prepend(ContainerBuilder $container): void public function prepend(ContainerBuilder $container)
{ {
$this->prependRoutes($container); $this->prependRoutes($container);
$this->prependAuthorization($container); $this->prependAuthorization($container);
$this->prependCruds($container); $this->prependCruds($container);
} }
public function prependAuthorization(ContainerBuilder $container): void public function prependAuthorization(ContainerBuilder $container)
{ {
$container->prependExtensionConfig('security', [ $container->prependExtensionConfig('security', [
'role_hierarchy' => [ 'role_hierarchy' => [
@@ -71,7 +71,7 @@ class ChillActivityExtension extends Extension implements PrependExtensionInterf
/** (non-PHPdoc). /** (non-PHPdoc).
* @see \Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface::prepend() * @see \Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface::prepend()
*/ */
public function prependRoutes(ContainerBuilder $container): void public function prependRoutes(ContainerBuilder $container)
{ {
// add routes for custom bundle // add routes for custom bundle
$container->prependExtensionConfig('chill_main', [ $container->prependExtensionConfig('chill_main', [

View File

@@ -22,7 +22,7 @@ use function is_int;
*/ */
class Configuration implements ConfigurationInterface class Configuration implements ConfigurationInterface
{ {
public function getConfigTreeBuilder(): TreeBuilder public function getConfigTreeBuilder()
{ {
$treeBuilder = new TreeBuilder('chill_activity'); $treeBuilder = new TreeBuilder('chill_activity');
$rootNode = $treeBuilder->getRootNode(); $rootNode = $treeBuilder->getRootNode();

View File

@@ -34,9 +34,9 @@ use Chill\ThirdPartyBundle\Entity\ThirdParty;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Attribute\DiscriminatorMap; use Symfony\Component\Serializer\Annotation\DiscriminatorMap;
use Symfony\Component\Serializer\Attribute\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Attribute\SerializedName; use Symfony\Component\Serializer\Annotation\SerializedName;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
/** /**
@@ -53,9 +53,9 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
use TrackUpdateTrait; use TrackUpdateTrait;
final public const string SENTRECEIVED_RECEIVED = 'received'; final public const SENTRECEIVED_RECEIVED = 'received';
final public const string SENTRECEIVED_SENT = 'sent'; final public const SENTRECEIVED_SENT = 'sent';
#[Groups(['read'])] #[Groups(['read'])]
#[ORM\ManyToOne(targetEntity: AccompanyingPeriod::class)] #[ORM\ManyToOne(targetEntity: AccompanyingPeriod::class)]
@@ -447,7 +447,9 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
return (int) round(($this->travelTime->getTimestamp() + $this->travelTime->getOffset()) / 60.0, 0); return (int) round(($this->travelTime->getTimestamp() + $this->travelTime->getOffset()) / 60.0, 0);
} }
#[\Deprecated] /**
* @deprecated
*/
public function getType(): ActivityType public function getType(): ActivityType
{ {
return $this->activityType; return $this->activityType;
@@ -630,7 +632,9 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
return $this; return $this;
} }
#[\Deprecated] /**
* @deprecated
*/
public function setType(ActivityType $activityType): self public function setType(ActivityType $activityType): self
{ {
$this->activityType = $activityType; $this->activityType = $activityType;

View File

@@ -12,7 +12,7 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Entity; namespace Chill\ActivityBundle\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Attribute as Serializer; use Symfony\Component\Serializer\Annotation as Serializer;
/** /**
* Class ActivityPresence. * Class ActivityPresence.

View File

@@ -37,8 +37,10 @@ class ActivityReason
/** /**
* Get active. * Get active.
*
* @return bool
*/ */
public function getActive(): bool public function getActive()
{ {
return $this->active; return $this->active;
} }
@@ -53,8 +55,10 @@ class ActivityReason
/** /**
* Get id. * Get id.
*
* @return int
*/ */
public function getId(): ?int public function getId()
{ {
return $this->id; return $this->id;
} }

View File

@@ -58,16 +58,20 @@ class ActivityReasonCategory implements \Stringable
/** /**
* Get active. * Get active.
*
* @return bool
*/ */
public function getActive(): bool public function getActive()
{ {
return $this->active; return $this->active;
} }
/** /**
* Get id. * Get id.
*
* @return int
*/ */
public function getId(): ?int public function getId()
{ {
return $this->id; return $this->id;
} }

View File

@@ -12,8 +12,8 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Entity; namespace Chill\ActivityBundle\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Attribute as Serializer; use Symfony\Component\Serializer\Annotation as Serializer;
use Symfony\Component\Serializer\Attribute\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface; use Symfony\Component\Validator\Context\ExecutionContextInterface;
@@ -25,11 +25,11 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
#[ORM\Table(name: 'activitytype')] #[ORM\Table(name: 'activitytype')]
class ActivityType class ActivityType
{ {
final public const int FIELD_INVISIBLE = 0; final public const FIELD_INVISIBLE = 0;
final public const int FIELD_OPTIONAL = 1; final public const FIELD_OPTIONAL = 1;
final public const int FIELD_REQUIRED = 2; final public const FIELD_REQUIRED = 2;
/** /**
* @deprecated not in use * @deprecated not in use
@@ -188,7 +188,7 @@ class ActivityType
private int $userVisible = self::FIELD_REQUIRED; private int $userVisible = self::FIELD_REQUIRED;
#[Assert\Callback] #[Assert\Callback]
public function checkSocialActionsVisibility(ExecutionContextInterface $context, mixed $payload): void public function checkSocialActionsVisibility(ExecutionContextInterface $context, mixed $payload)
{ {
if ($this->socialIssuesVisible !== $this->socialActionsVisible) { if ($this->socialIssuesVisible !== $this->socialActionsVisible) {
// if social issues are invisible then social actions cannot be optional or required + if social issues are optional then social actions shouldn't be required // if social issues are invisible then social actions cannot be optional or required + if social issues are optional then social actions shouldn't be required
@@ -461,17 +461,11 @@ class ActivityType
{ {
$property = $field.'Visible'; $property = $field.'Visible';
// Get the real class name (not the proxy) if (!property_exists($this, $property)) {
$class = static::class;
if (str_contains($class, '__CG__')) {
$class = get_parent_class($this);
}
$realClass = $class;
if (!property_exists($realClass, $property)) {
throw new \InvalidArgumentException('Field "'.$field.'" not found'); throw new \InvalidArgumentException('Field "'.$field.'" not found');
} }
/* @phpstan-ignore-next-line */
return self::FIELD_INVISIBLE !== $this->{$property}; return self::FIELD_INVISIBLE !== $this->{$property};
} }

View File

@@ -21,7 +21,7 @@ class ActivityEntityListener
{ {
public function __construct(private readonly EntityManagerInterface $em, private readonly AccompanyingPeriodWorkRepository $workRepository) {} public function __construct(private readonly EntityManagerInterface $em, private readonly AccompanyingPeriodWorkRepository $workRepository) {}
public function persistActionToCourse(Activity $activity): void public function persistActionToCourse(Activity $activity)
{ {
if ($activity->getAccompanyingPeriod() instanceof AccompanyingPeriod) { if ($activity->getAccompanyingPeriod() instanceof AccompanyingPeriod) {
$period = $activity->getAccompanyingPeriod(); $period = $activity->getAccompanyingPeriod();

View File

@@ -25,7 +25,7 @@ use Symfony\Component\Form\FormBuilderInterface;
final readonly class ByActivityTypeAggregator implements AggregatorInterface final readonly class ByActivityTypeAggregator implements AggregatorInterface
{ {
private const string PREFIX = 'acp_by_activity_type_agg'; private const PREFIX = 'acp_by_activity_type_agg';
public function __construct( public function __construct(
private RollingDateConverterInterface $rollingDateConverter, private RollingDateConverterInterface $rollingDateConverter,
@@ -53,7 +53,7 @@ final readonly class ByActivityTypeAggregator implements AggregatorInterface
public function normalizeFormData(array $formData): array public function normalizeFormData(array $formData): array
{ {
return ['after_date' => $formData['after_date']?->normalize(), 'before_date' => $formData['before_date']?->normalize()]; return ['after_date' => $formData['after_date']->normalize(), 'before_date' => $formData['before_date']->normalize()];
} }
public function denormalizeFormData(array $formData, int $fromVersion): array public function denormalizeFormData(array $formData, int $fromVersion): array

View File

@@ -18,7 +18,7 @@ use Symfony\Component\Form\FormBuilderInterface;
final readonly class ActivityLocationAggregator implements AggregatorInterface final readonly class ActivityLocationAggregator implements AggregatorInterface
{ {
public const string KEY = 'activity_location_aggregator'; public const KEY = 'activity_location_aggregator';
public function addRole(): ?string public function addRole(): ?string
{ {

View File

@@ -20,7 +20,7 @@ use Symfony\Component\Form\FormBuilderInterface;
class ActivityTypeAggregator implements AggregatorInterface class ActivityTypeAggregator implements AggregatorInterface
{ {
final public const string KEY = 'activity_type_aggregator'; final public const KEY = 'activity_type_aggregator';
public function __construct(protected ActivityTypeRepositoryInterface $activityTypeRepository, protected TranslatableStringHelperInterface $translatableStringHelper) {} public function __construct(protected ActivityTypeRepositoryInterface $activityTypeRepository, protected TranslatableStringHelperInterface $translatableStringHelper) {}

View File

@@ -20,7 +20,7 @@ use Symfony\Component\Form\FormBuilderInterface;
class ActivityUserAggregator implements AggregatorInterface class ActivityUserAggregator implements AggregatorInterface
{ {
final public const string KEY = 'activity_user_id'; final public const KEY = 'activity_user_id';
public function __construct(private readonly UserRepository $userRepository, private readonly UserRender $userRender) {} public function __construct(private readonly UserRepository $userRepository, private readonly UserRender $userRender) {}

View File

@@ -22,7 +22,7 @@ use Symfony\Component\Form\FormBuilderInterface;
class ActivityUsersJobAggregator implements AggregatorInterface class ActivityUsersJobAggregator implements AggregatorInterface
{ {
private const string PREFIX = 'act_agg_user_job'; private const PREFIX = 'act_agg_user_job';
public function __construct( public function __construct(
private readonly UserJobRepositoryInterface $userJobRepository, private readonly UserJobRepositoryInterface $userJobRepository,

View File

@@ -22,7 +22,7 @@ use Symfony\Component\Form\FormBuilderInterface;
class ActivityUsersScopeAggregator implements AggregatorInterface class ActivityUsersScopeAggregator implements AggregatorInterface
{ {
private const string PREFIX = 'act_agg_user_scope'; private const PREFIX = 'act_agg_user_scope';
public function __construct( public function __construct(
private readonly ScopeRepositoryInterface $scopeRepository, private readonly ScopeRepositoryInterface $scopeRepository,

View File

@@ -22,7 +22,7 @@ use Symfony\Component\Form\FormBuilderInterface;
class CreatorJobAggregator implements AggregatorInterface class CreatorJobAggregator implements AggregatorInterface
{ {
private const string PREFIX = 'acp_agg_creator_job'; private const PREFIX = 'acp_agg_creator_job';
public function __construct( public function __construct(
private readonly UserJobRepositoryInterface $userJobRepository, private readonly UserJobRepositoryInterface $userJobRepository,

View File

@@ -22,7 +22,7 @@ use Symfony\Component\Form\FormBuilderInterface;
class CreatorScopeAggregator implements AggregatorInterface class CreatorScopeAggregator implements AggregatorInterface
{ {
private const string PREFIX = 'acp_agg_creator_scope'; private const PREFIX = 'acp_agg_creator_scope';
public function __construct( public function __construct(
private readonly ScopeRepository $scopeRepository, private readonly ScopeRepository $scopeRepository,

View File

@@ -19,13 +19,13 @@ use Symfony\Component\Form\FormBuilderInterface;
class DateAggregator implements AggregatorInterface class DateAggregator implements AggregatorInterface
{ {
private const array CHOICES = [ private const CHOICES = [
'by month' => 'month', 'by month' => 'month',
'by week' => 'week', 'by week' => 'week',
'by year' => 'year', 'by year' => 'year',
]; ];
private const string DEFAULT_CHOICE = 'year'; private const DEFAULT_CHOICE = 'year';
public function addRole(): ?string public function addRole(): ?string
{ {

View File

@@ -23,7 +23,7 @@ use Symfony\Component\Form\FormBuilderInterface;
*/ */
final readonly class PersonsAggregator implements AggregatorInterface final readonly class PersonsAggregator implements AggregatorInterface
{ {
private const string PREFIX = 'act_persons_agg'; private const PREFIX = 'act_persons_agg';
public function __construct(private LabelPersonHelper $labelPersonHelper) {} public function __construct(private LabelPersonHelper $labelPersonHelper) {}

View File

@@ -42,7 +42,7 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac
$this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center'];
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
// TODO: Implement buildForm() method. // TODO: Implement buildForm() method.
} }

View File

@@ -42,7 +42,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe
$this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center'];
} }
public function buildForm(FormBuilderInterface $builder): void {} public function buildForm(FormBuilderInterface $builder) {}
public function getNormalizationVersion(): int public function getNormalizationVersion(): int
{ {

View File

@@ -34,7 +34,7 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa
private FilterListAccompanyingPeriodHelperInterface $filterListAccompanyingPeriodHelper, private FilterListAccompanyingPeriodHelperInterface $filterListAccompanyingPeriodHelper,
) {} ) {}
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$this->helper->buildForm($builder); $this->helper->buildForm($builder);
} }
@@ -154,7 +154,7 @@ final readonly class ListActivity implements ListInterface, GroupedExportInterfa
return ActivityStatsVoter::LISTS; return ActivityStatsVoter::LISTS;
} }
public function supportsModifiers(): array public function supportsModifiers()
{ {
return array_merge( return array_merge(
$this->helper->supportsModifiers(), $this->helper->supportsModifiers(),

View File

@@ -34,7 +34,7 @@ final readonly class CountHouseholdOnActivity implements ExportInterface, Groupe
$this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center'];
} }
public function buildForm(FormBuilderInterface $builder): void {} public function buildForm(FormBuilderInterface $builder) {}
public function getNormalizationVersion(): int public function getNormalizationVersion(): int
{ {

View File

@@ -11,7 +11,6 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Export\LinkedToPerson; namespace Chill\ActivityBundle\Export\Export\LinkedToPerson;
use Chill\ActivityBundle\Entity\Activity;
use Chill\ActivityBundle\Entity\ActivityReason; use Chill\ActivityBundle\Entity\ActivityReason;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityRepository; use Chill\ActivityBundle\Repository\ActivityRepository;
@@ -34,9 +33,6 @@ use Symfony\Contracts\Translation\TranslatorInterface;
class ListActivity implements ListInterface, GroupedExportInterface class ListActivity implements ListInterface, GroupedExportInterface
{ {
/**
* @var string[]
*/
protected array $fields = [ protected array $fields = [
'id', 'id',
'date', 'date',
@@ -63,20 +59,22 @@ class ListActivity implements ListInterface, GroupedExportInterface
$this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center'];
} }
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('fields', ChoiceType::class, [ $builder->add('fields', ChoiceType::class, [
'multiple' => true, 'multiple' => true,
'expanded' => true, 'expanded' => true,
'choices' => array_combine($this->fields, $this->fields), 'choices' => array_combine($this->fields, $this->fields),
'label' => 'Fields to include in export', 'label' => 'Fields to include in export',
'constraints' => [new Callback(callback: static function ($selected, ExecutionContextInterface $context): void { 'constraints' => [new Callback([
'callback' => static function ($selected, ExecutionContextInterface $context) {
if (0 === \count($selected)) { if (0 === \count($selected)) {
$context->buildViolation('You must select at least one element') $context->buildViolation('You must select at least one element')
->atPath('fields') ->atPath('fields')
->addViolation(); ->addViolation();
} }
})], },
])],
]); ]);
} }
@@ -216,7 +214,7 @@ class ListActivity implements ListInterface, GroupedExportInterface
$qb = $this->entityManager->createQueryBuilder(); $qb = $this->entityManager->createQueryBuilder();
$qb $qb
->from(Activity::class, 'activity') ->from('ChillActivityBundle:Activity', 'activity')
->join('activity.person', 'person') ->join('activity.person', 'person')
->join( ->join(
HouseholdMember::class, HouseholdMember::class,

View File

@@ -30,7 +30,7 @@ use Symfony\Component\Form\FormBuilderInterface;
*/ */
class StatActivityDuration implements ExportInterface, GroupedExportInterface class StatActivityDuration implements ExportInterface, GroupedExportInterface
{ {
final public const string SUM = 'sum'; final public const SUM = 'sum';
private readonly bool $filterStatsByCenters; private readonly bool $filterStatsByCenters;
/** /**

View File

@@ -28,7 +28,7 @@ use Symfony\Contracts\Translation\TranslatorInterface;
class ListActivityHelper class ListActivityHelper
{ {
final public const string MSG_KEY = 'export.list.activity.'; final public const MSG_KEY = 'export.list.activity.';
public function __construct( public function __construct(
private readonly ActivityPresenceRepositoryInterface $activityPresenceRepository, private readonly ActivityPresenceRepositoryInterface $activityPresenceRepository,
@@ -66,6 +66,9 @@ class ListActivityHelper
->leftJoin('activity.location', 'location') ->leftJoin('activity.location', 'location')
->addSelect('location.name AS locationName') ->addSelect('location.name AS locationName')
->addSelect('activity.sentReceived') ->addSelect('activity.sentReceived')
->addSelect('activity.comment.comment AS commentText')
->addSelect('activity.comment.date AS commentDate')
->addSelect('JSON_BUILD_OBJECT(\'uid\', activity.comment.userId, \'d\', activity.comment.date) AS commentUser')
->addSelect('JSON_BUILD_OBJECT(\'uid\', IDENTITY(activity.createdBy), \'d\', activity.createdAt) AS createdBy') ->addSelect('JSON_BUILD_OBJECT(\'uid\', IDENTITY(activity.createdBy), \'d\', activity.createdAt) AS createdBy')
->addSelect('activity.createdAt') ->addSelect('activity.createdAt')
->addSelect('JSON_BUILD_OBJECT(\'uid\', IDENTITY(activity.updatedBy), \'d\', activity.updatedAt) AS updatedBy') ->addSelect('JSON_BUILD_OBJECT(\'uid\', IDENTITY(activity.updatedBy), \'d\', activity.updatedAt) AS updatedBy')
@@ -87,6 +90,8 @@ class ListActivityHelper
'createdAt', 'updatedAt' => $this->dateTimeHelper->getLabel($key), 'createdAt', 'updatedAt' => $this->dateTimeHelper->getLabel($key),
'createdBy', 'updatedBy' => $this->userHelper->getLabel($key, $values, $key), 'createdBy', 'updatedBy' => $this->userHelper->getLabel($key, $values, $key),
'date' => $this->dateTimeHelper->getLabel(self::MSG_KEY.$key), 'date' => $this->dateTimeHelper->getLabel(self::MSG_KEY.$key),
'commentDate' => $this->dateTimeHelper->getLabel(self::MSG_KEY.'comment_date'),
'commentUser' => $this->userHelper->getLabel($key, $values, self::MSG_KEY.'comment_user'),
'attendeeName' => function ($value) { 'attendeeName' => function ($value) {
if ('_header' === $value) { if ('_header' === $value) {
return 'Attendee'; return 'Attendee';
@@ -176,6 +181,9 @@ class ListActivityHelper
'usersNames', 'usersNames',
'thirdPartiesIds', 'thirdPartiesIds',
'thirdPartiesNames', 'thirdPartiesNames',
'commentText',
'commentDate',
'commentUser',
'createdBy', 'createdBy',
'createdAt', 'createdAt',
'updatedBy', 'updatedBy',

View File

@@ -27,7 +27,7 @@ use Symfony\Component\Form\FormBuilderInterface;
final readonly class ActivityTypeFilter implements FilterInterface final readonly class ActivityTypeFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait; use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
private const string BASE_EXISTS = 'SELECT 1 FROM '.Activity::class.' act_type_filter_activity WHERE act_type_filter_activity.accompanyingPeriod = acp'; private const BASE_EXISTS = 'SELECT 1 FROM '.Activity::class.' act_type_filter_activity WHERE act_type_filter_activity.accompanyingPeriod = acp';
public function __construct( public function __construct(
private ActivityTypeRepositoryInterface $activityTypeRepository, private ActivityTypeRepositoryInterface $activityTypeRepository,

View File

@@ -28,7 +28,7 @@ use Symfony\Contracts\Translation\TranslatorInterface;
final readonly class CreatorJobFilter implements FilterInterface final readonly class CreatorJobFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait; use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
private const string PREFIX = 'acp_act_filter_creator_job'; private const PREFIX = 'acp_act_filter_creator_job';
public function __construct( public function __construct(
private TranslatableStringHelper $translatableStringHelper, private TranslatableStringHelper $translatableStringHelper,

View File

@@ -26,7 +26,7 @@ use Symfony\Component\Form\FormBuilderInterface;
class CreatorScopeFilter implements FilterInterface class CreatorScopeFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait; use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
private const string PREFIX = 'acp_act_filter_creator_scope'; private const PREFIX = 'acp_act_filter_creator_scope';
public function __construct( public function __construct(
private readonly TranslatableStringHelper $translatableStringHelper, private readonly TranslatableStringHelper $translatableStringHelper,

View File

@@ -22,12 +22,12 @@ use Symfony\Contracts\Translation\TranslatorInterface;
class EmergencyFilter implements FilterInterface class EmergencyFilter implements FilterInterface
{ {
private const array CHOICES = [ private const CHOICES = [
'activity is emergency' => 'true', 'activity is emergency' => 'true',
'activity is not emergency' => 'false', 'activity is not emergency' => 'false',
]; ];
private const string DEFAULT_CHOICE = 'false'; private const DEFAULT_CHOICE = 'false';
public function __construct(private readonly TranslatorInterface $translator) {} public function __construct(private readonly TranslatorInterface $translator) {}

View File

@@ -90,7 +90,9 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt
public function getFormDefaultData(): array public function getFormDefaultData(): array
{ {
return []; return [
'reasons' => [],
];
} }
public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array public function describeAction($data, ExportGenerationContext $context): string|\Symfony\Contracts\Translation\TranslatableInterface|array

View File

@@ -42,6 +42,8 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void
{ {
error_log('alterQuery called with data: '.json_encode(array_keys($data)));
// create a subquery for activity // create a subquery for activity
$sqb = $qb->getEntityManager()->createQueryBuilder(); $sqb = $qb->getEntityManager()->createQueryBuilder();
$sqb->select('1') $sqb->select('1')
@@ -59,7 +61,6 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
if (\in_array('activity', $qb->getAllAliases(), true)) { if (\in_array('activity', $qb->getAllAliases(), true)) {
$sqb->andWhere('activity_person_having_activity.id = activity.id'); $sqb->andWhere('activity_person_having_activity.id = activity.id');
} }
if (isset($data['reasons']) && [] !== $data['reasons']) { if (isset($data['reasons']) && [] !== $data['reasons']) {
// add clause activity reason // add clause activity reason
$sqb->join('activity_person_having_activity.reasons', 'reasons_person_having_activity'); $sqb->join('activity_person_having_activity.reasons', 'reasons_person_having_activity');
@@ -124,12 +125,38 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
public function normalizeFormData(array $formData): array public function normalizeFormData(array $formData): array
{ {
return ['date_from_rolling' => $formData['date_from_rolling']->normalize(), 'date_to_rolling' => $formData['date_to_rolling']->normalize()]; $normalized = [
'date_from_rolling' => $formData['date_from_rolling']->normalize(),
'date_to_rolling' => $formData['date_to_rolling']->normalize(),
'reasons' => [],
];
if (isset($formData['reasons']) && [] !== $formData['reasons']) {
$normalized['reasons'] = array_map(
fn (ActivityReason $reason) => $reason->getId(),
$formData['reasons']
);
}
return $normalized;
} }
public function denormalizeFormData(array $formData, int $fromVersion): array 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'])]; $denormalized = [
'date_from_rolling' => RollingDate::fromNormalized($formData['date_from_rolling']),
'date_to_rolling' => RollingDate::fromNormalized($formData['date_to_rolling']),
'reasons' => [],
];
if (isset($formData['reasons']) && [] !== $formData['reasons']) {
$denormalized['reasons'] = array_map(
fn ($id) => $this->activityReasonRepository->find($id),
$formData['reasons']
);
}
return $denormalized;
} }
public function getFormDefaultData(): array public function getFormDefaultData(): array
@@ -143,10 +170,12 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
public function describeAction($data, ExportGenerationContext $context): array public function describeAction($data, ExportGenerationContext $context): array
{ {
$reasons = $data['reasons'] ?? [];
return [ return [
[] === $data['reasons'] ? [] === $reasons ?
'export.filter.person_between_dates.describe_action_with_no_subject' 'export.filter.activity.describe_action_with_no_subject'
: 'export.filter.person_between_dates.describe_action_with_subject', : 'export.filter.activity.describe_action_with_subject',
[ [
'date_from' => $this->rollingDateConverter->convert($data['date_from_rolling']), 'date_from' => $this->rollingDateConverter->convert($data['date_from_rolling']),
'date_to' => $this->rollingDateConverter->convert($data['date_to_rolling']), 'date_to' => $this->rollingDateConverter->convert($data['date_to_rolling']),
@@ -154,7 +183,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
', ', ', ',
array_map( array_map(
fn (ActivityReason $r): string => '"'.$this->translatableStringHelper->localize($r->getName()).'"', fn (ActivityReason $r): string => '"'.$this->translatableStringHelper->localize($r->getName()).'"',
$data['reasons'] $reasons
) )
), ),
], ],
@@ -168,6 +197,7 @@ final readonly class PersonHavingActivityBetweenDateFilter implements ExportElem
public function validateForm($data, ExecutionContextInterface $context): void public function validateForm($data, ExecutionContextInterface $context): void
{ {
error_log('validateForm called with data: '.json_encode(array_keys($data)));
if ($this->rollingDateConverter->convert($data['date_from_rolling']) if ($this->rollingDateConverter->convert($data['date_from_rolling'])
>= $this->rollingDateConverter->convert($data['date_to_rolling'])) { >= $this->rollingDateConverter->convert($data['date_to_rolling'])) {
$context->buildViolation('export.filter.activity.person_between_dates.date mismatch') $context->buildViolation('export.filter.activity.person_between_dates.date mismatch')

View File

@@ -25,7 +25,7 @@ use Symfony\Component\Form\FormBuilderInterface;
*/ */
final readonly class PersonsFilter implements FilterInterface final readonly class PersonsFilter implements FilterInterface
{ {
private const string PREFIX = 'act_persons_filter'; private const PREFIX = 'act_persons_filter';
public function __construct(private PersonRenderInterface $personRender) {} public function __construct(private PersonRenderInterface $personRender) {}

View File

@@ -23,12 +23,12 @@ use Symfony\Contracts\Translation\TranslatorInterface;
class SentReceivedFilter implements FilterInterface class SentReceivedFilter implements FilterInterface
{ {
private const array CHOICES = [ private const CHOICES = [
'export.filter.activity.by_sent_received.is sent' => Activity::SENTRECEIVED_SENT, 'export.filter.activity.by_sent_received.is sent' => Activity::SENTRECEIVED_SENT,
'export.filter.activity.by_sent_received.is received' => Activity::SENTRECEIVED_RECEIVED, 'export.filter.activity.by_sent_received.is received' => Activity::SENTRECEIVED_RECEIVED,
]; ];
private const string DEFAULT_CHOICE = Activity::SENTRECEIVED_SENT; private const DEFAULT_CHOICE = Activity::SENTRECEIVED_SENT;
public function __construct(private readonly TranslatorInterface $translator) {} public function __construct(private readonly TranslatorInterface $translator) {}

View File

@@ -27,7 +27,7 @@ use Symfony\Component\Form\FormBuilderInterface;
class UsersJobFilter implements FilterInterface class UsersJobFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait; use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
private const string PREFIX = 'act_filter_user_job'; private const PREFIX = 'act_filter_user_job';
public function __construct( public function __construct(
private readonly TranslatableStringHelperInterface $translatableStringHelper, private readonly TranslatableStringHelperInterface $translatableStringHelper,

View File

@@ -27,7 +27,7 @@ use Symfony\Component\Form\FormBuilderInterface;
class UsersScopeFilter implements FilterInterface class UsersScopeFilter implements FilterInterface
{ {
use \Chill\MainBundle\Export\ExportDataNormalizerTrait; use \Chill\MainBundle\Export\ExportDataNormalizerTrait;
private const string PREFIX = 'act_filter_user_scope'; private const PREFIX = 'act_filter_user_scope';
public function __construct( public function __construct(
private readonly ScopeRepositoryInterface $scopeRepository, private readonly ScopeRepositoryInterface $scopeRepository,

View File

@@ -19,7 +19,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
class ActivityReasonCategoryType extends AbstractType class ActivityReasonCategoryType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('name', TranslatableStringFormType::class) ->add('name', TranslatableStringFormType::class)
@@ -29,15 +29,17 @@ class ActivityReasonCategoryType extends AbstractType
/** /**
* @param OptionsResolverInterface $resolver * @param OptionsResolverInterface $resolver
*/ */
public function configureOptions(OptionsResolver $resolver): void public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults([ $resolver->setDefaults([
'data_class' => \Chill\ActivityBundle\Entity\ActivityReasonCategory::class, 'data_class' => \Chill\ActivityBundle\Entity\ActivityReasonCategory::class,
]); ]);
} }
#[\Override] /**
public function getBlockPrefix(): string * @return string
*/
public function getBlockPrefix()
{ {
return 'chill_activitybundle_activityreasoncategory'; return 'chill_activitybundle_activityreasoncategory';
} }

View File

@@ -21,7 +21,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
class ActivityReasonType extends AbstractType class ActivityReasonType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('name', TranslatableStringFormType::class) ->add('name', TranslatableStringFormType::class)
@@ -29,15 +29,17 @@ class ActivityReasonType extends AbstractType
->add('category', TranslatableActivityReasonCategoryType::class); ->add('category', TranslatableActivityReasonCategoryType::class);
} }
public function configureOptions(OptionsResolver $resolver): void public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults([ $resolver->setDefaults([
'data_class' => ActivityReason::class, 'data_class' => ActivityReason::class,
]); ]);
} }
#[\Override] /**
public function getBlockPrefix(): string * @return string
*/
public function getBlockPrefix()
{ {
return 'chill_activitybundle_activityreason'; return 'chill_activitybundle_activityreason';
} }

View File

@@ -88,8 +88,8 @@ class ActivityType extends AbstractType
if (null !== $options['data']->getPerson()) { if (null !== $options['data']->getPerson()) {
$builder->add('scope', ScopePickerType::class, [ $builder->add('scope', ScopePickerType::class, [
'center' => $options['center'],
'role' => ActivityVoter::CREATE === (string) $options['role'] ? ActivityVoter::CREATE_PERSON : (string) $options['role'], 'role' => ActivityVoter::CREATE === (string) $options['role'] ? ActivityVoter::CREATE_PERSON : (string) $options['role'],
'center' => $options['center'],
'required' => true, 'required' => true,
]); ]);
} }
@@ -357,7 +357,7 @@ class ActivityType extends AbstractType
$durationTimeTransformer, $durationTimeTransformer,
$durationTimeOptions, $durationTimeOptions,
$fieldName $fieldName
): void { ) {
// set the timezone to GMT, and fix the difference between current and GMT // set the timezone to GMT, and fix the difference between current and GMT
// the datetimetransformer will then handle timezone as GMT // the datetimetransformer will then handle timezone as GMT
$timezoneUTC = new \DateTimeZone('GMT'); $timezoneUTC = new \DateTimeZone('GMT');
@@ -400,7 +400,6 @@ class ActivityType extends AbstractType
->setAllowedTypes('accompanyingPeriod', [AccompanyingPeriod::class, 'null']); ->setAllowedTypes('accompanyingPeriod', [AccompanyingPeriod::class, 'null']);
} }
#[\Override]
public function getBlockPrefix(): string public function getBlockPrefix(): string
{ {
return 'chill_activitybundle_activity'; return 'chill_activitybundle_activity';

View File

@@ -27,7 +27,7 @@ class ActivityTypeType extends AbstractType
{ {
public function __construct(private readonly TranslatableStringHelper $translatableStringHelper) {} public function __construct(private readonly TranslatableStringHelper $translatableStringHelper) {}
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('name', TranslatableStringFormType::class) ->add('name', TranslatableStringFormType::class)
@@ -67,7 +67,7 @@ class ActivityTypeType extends AbstractType
->add('commentVisible', ActivityFieldPresence::class); ->add('commentVisible', ActivityFieldPresence::class);
} }
public function configureOptions(OptionsResolver $resolver): void public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults([ $resolver->setDefaults([
'data_class' => \Chill\ActivityBundle\Entity\ActivityType::class, 'data_class' => \Chill\ActivityBundle\Entity\ActivityType::class,

View File

@@ -18,7 +18,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
class ActivityFieldPresence extends AbstractType class ActivityFieldPresence extends AbstractType
{ {
public function configureOptions(OptionsResolver $resolver): void public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults( $resolver->setDefaults(
[ [
@@ -31,8 +31,7 @@ class ActivityFieldPresence extends AbstractType
); );
} }
#[\Override] public function getParent()
public function getParent(): ?string
{ {
return ChoiceType::class; return ChoiceType::class;
} }

View File

@@ -30,7 +30,7 @@ class PickActivityReasonType extends AbstractType
private readonly TranslatableStringHelperInterface $translatableStringHelper, private readonly TranslatableStringHelperInterface $translatableStringHelper,
) {} ) {}
public function configureOptions(OptionsResolver $resolver): void public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults( $resolver->setDefaults(
[ [
@@ -49,14 +49,12 @@ class PickActivityReasonType extends AbstractType
); );
} }
#[\Override] public function getBlockPrefix()
public function getBlockPrefix(): string
{ {
return 'translatable_activity_reason'; return 'translatable_activity_reason';
} }
#[\Override] public function getParent()
public function getParent(): ?string
{ {
return EntityType::class; return EntityType::class;
} }

View File

@@ -25,7 +25,7 @@ class TranslatableActivityReasonCategoryType extends AbstractType
{ {
public function __construct(private readonly TranslatableStringHelperInterface $translatableStringHelper, private readonly TranslatorInterface $translator) {} public function __construct(private readonly TranslatableStringHelperInterface $translatableStringHelper, private readonly TranslatorInterface $translator) {}
public function configureOptions(OptionsResolver $resolver): void public function configureOptions(OptionsResolver $resolver)
{ {
$resolver->setDefaults( $resolver->setDefaults(
[ [
@@ -36,8 +36,7 @@ class TranslatableActivityReasonCategoryType extends AbstractType
); );
} }
#[\Override] public function getParent()
public function getParent(): ?string
{ {
return EntityType::class; return EntityType::class;
} }

Some files were not shown because too many files have changed in this diff Show More