mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
Merge remote-tracking branch 'origin/master' into 616_rapid-action
This commit is contained in:
commit
d60ba3ecb2
20
.changes/v2.10.0.md
Normal file
20
.changes/v2.10.0.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
## v2.10.0 - 2023-10-24
|
||||||
|
### Feature
|
||||||
|
* ([#172](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/172)) [export] Add a filter "grouping accompanying period by opening date" and "grouping accompanying period by closing date"
|
||||||
|
* ([#172](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/172)) [export] add a filter and aggregator on accompanying period work: group/filter by handling third party
|
||||||
|
* ([#172](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/172)) [export] add a filter and aggregator on activites: group/filter activities by people participating to the activities
|
||||||
|
* ([#172](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/172)) [export] add a grouping on accompanying period export: group by activity type associated to at least one activity within the accompanying period
|
||||||
|
* [export] sort filters and aggregators by title
|
||||||
|
* ([#179](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/179)) [export] create a parameter that will force to skip the filtering by center (ACL) when generating an export
|
||||||
|
### Fixed
|
||||||
|
* ([#177](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/177)) [export] fix date range selection on filter and grouping "by status of the course at date", on accompanying periods
|
||||||
|
|
||||||
|
### Résumé francophone des changements
|
||||||
|
|
||||||
|
- Ajout d'un regroupement sur les parcours: par date de cloture et d'ouverture;
|
||||||
|
- Ajouter d'un filtre et regroupement par tiers traitant sur les actions d'accompagnement;
|
||||||
|
- ajout d'un filtre et regroupement par usager participant sur les échanges
|
||||||
|
- ajout d'un regroupement: par type d'activité associé au parcours;
|
||||||
|
- trie les filtre et regroupements par ordre alphabétique dans els exports
|
||||||
|
- ajout d'un paramètre qui permet de désactiver le filtre par centre dans les exports
|
||||||
|
- correction de l'interface de date dans les filtres et regroupements "par statut du parcours à la date"
|
3
.changes/v2.10.1.md
Normal file
3
.changes/v2.10.1.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.10.1 - 2023-10-24
|
||||||
|
### Fixed
|
||||||
|
* Fix export controller when generating an export without any data in session
|
3
.changes/v2.10.2.md
Normal file
3
.changes/v2.10.2.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.10.2 - 2023-10-26
|
||||||
|
### Fixed
|
||||||
|
* ([#175](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/175)) Use injection of translator instead of ->get().
|
3
.changes/v2.10.3.md
Normal file
3
.changes/v2.10.3.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.10.3 - 2023-10-26
|
||||||
|
### Fixed
|
||||||
|
* ([#175](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/175)) Replace old method of getting translator with injection of translatorInterface
|
3
.changes/v2.10.4.md
Normal file
3
.changes/v2.10.4.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.10.4 - 2023-10-26
|
||||||
|
### Fixed
|
||||||
|
* Fix null value constraint errors when merging relationships in doubles
|
4
.changes/v2.10.5.md
Normal file
4
.changes/v2.10.5.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
## v2.10.5 - 2023-11-05
|
||||||
|
### Fixed
|
||||||
|
* ([#183](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/183)) Fix "problem during download" on some filters, which used a wrong data type
|
||||||
|
* ([#184](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/184)) Fix filter "activity by date"
|
4
.changes/v2.10.6.md
Normal file
4
.changes/v2.10.6.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
## v2.10.6 - 2023-11-07
|
||||||
|
### Fixed
|
||||||
|
* ([#182](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/182)) Fix merging of double person files. Adjustement relationship sql statement
|
||||||
|
* ([#185](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/185)) Export: fix aggregator by geographical unit on person: avoid inconsistencies
|
6
.changes/v2.11.0.md
Normal file
6
.changes/v2.11.0.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
## v2.11.0 - 2023-11-07
|
||||||
|
### Feature
|
||||||
|
* ([#194](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/194)) Export: add a filter "filter activity by creator job"
|
||||||
|
### Fixed
|
||||||
|
* ([#185](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/185)) Export: fix "group accompanying period by geographical unit": take into account the accompanying periods when the period is not located within an unit
|
||||||
|
* Fix "group activity by creator job" aggregator
|
26
.changes/v2.12.0.md
Normal file
26
.changes/v2.12.0.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
## v2.12.0 - 2023-11-15
|
||||||
|
### Feature
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add an aggregator "group activities by presence"
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add a filter "filter activity by activity presence"
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add an aggregator "group activities by person" (only for the activities saved in a person context)
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add a new aggregator "group peoples by postal code"
|
||||||
|
* ([#200](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/200)) Export: split export about person on accompanying period work: one with the people associated with the work, another one with the people associated with the accompanying period
|
||||||
|
* ([#204](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/204)) Add 3 new filters and 3 new aggregators for work action creator (with jobs and scopes)
|
||||||
|
|
||||||
|
* ([#202](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/202)) Create export for the average duration of social work actions
|
||||||
|
* ([#206](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/206)) Export: add a export which count persons on accompanying period work
|
||||||
|
* ([#206](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/206)) Export: add an export which count persons on activity
|
||||||
|
* ([#203](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/203)) Export: add clauses on the social work start date and end date within the filter "Filter accompanying period by accompanying period work"
|
||||||
|
### Fixed
|
||||||
|
* Export: fix typo in filter "filter accompanying period work on end date"
|
||||||
|
* ([#189](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/189)) Export: Fix failure in export linked to household
|
||||||
|
* ([#205](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/205)) Fix loading of accompanying period work referrers
|
||||||
|
### Traduction francophone des principaux changements
|
||||||
|
* export: ajout d'un regroupement "grouper les échanges par présence de l'usager";
|
||||||
|
* export: ajout d'un filtre "filtre les échanges par présence de l'usager";
|
||||||
|
* export: ajout d'un regroupement "regrouper les échanges par personne" (seulement pour les échanges enregistrés dans le contexte de l'usager);
|
||||||
|
* export: ajout d'un regroupement "grouper les usagers par codes postaux"
|
||||||
|
* export: séparation des exports sur les actions: dans l'un, les filtres des usagers portent sur les usagers concernés par l'action, dans l'autre, les filtres portent sur les usagers concernés par le parcours de l'action;
|
||||||
|
* export: ajout de 3 nouveaux filtres et regroupements sur le créateur de l'action, son métier et son service;
|
||||||
|
* export: correction de l'export sur les ménages liés aux parcours;
|
||||||
|
* correction du chargement des actions d'accompagnement
|
3
.changes/v2.12.1.md
Normal file
3
.changes/v2.12.1.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.12.1 - 2023-11-16
|
||||||
|
### Fixed
|
||||||
|
* ([#208](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/208)) Export: fix loading of form for "filter action by type, goal and result"
|
9
.changes/v2.13.0.md
Normal file
9
.changes/v2.13.0.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
## v2.13.0 - 2023-11-21
|
||||||
|
### Feature
|
||||||
|
* ([#173](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/173)) Allow user to add a phonenumber to their profile which will be included in automatically generated documents
|
||||||
|
### Fixed
|
||||||
|
* ([#211](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/211)) Export: fix loading of "Group activity by type"
|
||||||
|
* ([#190](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/190)) Export: fix loading of "group activity by reasons"
|
||||||
|
* ([#213](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/213)) Export: fix usage of some Collection returned instead of array in export filters
|
||||||
|
* ([#215](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/215)) Use only the string 'both' for gender (with a database migration)
|
||||||
|
* ([#212](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/212)) Clean the database to make working the "Group people by gender" aggregator
|
8
.changes/v2.14.0.md
Normal file
8
.changes/v2.14.0.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
## v2.14.0 - 2023-11-24
|
||||||
|
### Feature
|
||||||
|
* ([#161](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/161)) Export: in filter "Filter accompanying period work (social action) by type, goal and result", order the items alphabetically or with the defined order
|
||||||
|
### Fixed
|
||||||
|
* ([#141](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/141)) Export: on filter "action by type goals, and results", restore the fields when editing a saved export
|
||||||
|
* ([#219](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/219)) Export: fix the list of accompanying period work, when the "calc date" is null
|
||||||
|
* ([#222](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/222)) Fix rendering of custom fields
|
||||||
|
* Fix various errors in custom fields administration
|
5
.changes/v2.14.1.md
Normal file
5
.changes/v2.14.1.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
## v2.14.1 - 2023-11-29
|
||||||
|
### Fixed
|
||||||
|
* Export: fix list person with custom fields
|
||||||
|
* ([#100](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/100)) Add a paginator to budget elements (resource and charge types) in the admin
|
||||||
|
* Fix error in ListEvaluation when "handling agents" are alone
|
11
.changes/v2.15.0.md
Normal file
11
.changes/v2.15.0.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
## v2.15.0 - 2023-12-11
|
||||||
|
### Feature
|
||||||
|
* ([#191](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/191)) Add export "number of household associate with an exchange"
|
||||||
|
* ([#235](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/235)) Export: add dates on the filter "filter course by activity type"
|
||||||
|
### Fixed
|
||||||
|
* ([#214](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/214)) Fix error when posting an empty comment on an accompanying period.
|
||||||
|
* ([#233](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/233)) Fix "filter evaluation by evaluation type" (and add select2 to the list of evaluation types to pick)
|
||||||
|
* ([#234](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/234)) Fix "filter aside activity by date"
|
||||||
|
|
||||||
|
* ([#228](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/228)) Fix export of activity for people created before the introduction of the createdAt column on person (during v1)
|
||||||
|
* ([#246](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/246)) Do not show activities, evaluations and social work when associated to a confidential accompanying period, except for the users which are allowed to see them
|
5
.changes/v2.15.1.md
Normal file
5
.changes/v2.15.1.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
## v2.15.1 - 2023-12-20
|
||||||
|
### Fixed
|
||||||
|
* Fix the household export query to exclude accompanying periods that are in draft state.
|
||||||
|
### DX
|
||||||
|
* ([#167](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/167)) Fixed readthedocs compilation by updating readthedocs config file and requirements for Sphinx
|
5
.changes/v2.15.2.md
Normal file
5
.changes/v2.15.2.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
## v2.15.2 - 2024-01-11
|
||||||
|
### Fixed
|
||||||
|
* Fix the id_seq used when creating a new accompanying period participation during fusion of two person files
|
||||||
|
### DX
|
||||||
|
* Set placeholder to False for expanded EntityType form fields where required is set to False.
|
15
.changes/v2.16.0.md
Normal file
15
.changes/v2.16.0.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
## v2.16.0 - 2024-02-08
|
||||||
|
### Feature
|
||||||
|
* ([#231](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/231)) Create new filter for persons having a participation in an accompanying period during a certain time span
|
||||||
|
* ([#241](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/241)) [Export][List of accompanyign period] Add two columns: the list of persons participating to the period, and their ids
|
||||||
|
* ([#244](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/244)) Add capability to generate export about change of steps of accompanying period, and generate exports for this
|
||||||
|
* ([#253](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/253)) Export: group accompanying period by person participating
|
||||||
|
* ([#243](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/243)) Export: add filter for courses not linked to a reference address
|
||||||
|
* ([#229](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/229)) Allow to group activities linked with accompanying period by reason
|
||||||
|
* ([#115](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/115)) Prevent social work to be saved when another user edited conccurently the social work
|
||||||
|
* Modernize the event bundle, with some new fields and multiple improvements
|
||||||
|
### Fixed
|
||||||
|
* ([#220](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/220)) Fix error in logs about wrong typing of eventArgs in onEditNotificationComment method
|
||||||
|
* ([#256](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/256)) Fix the conditions upon which social actions should be optional or required in relation to social issues within the activity creation form
|
||||||
|
### UX
|
||||||
|
* ([#260](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/260)) Order list of centers alphabetically in dropdown 'user' section admin.
|
3
.changes/v2.16.1.md
Normal file
3
.changes/v2.16.1.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.16.1 - 2024-02-09
|
||||||
|
### Fixed
|
||||||
|
* Force bootstrap version to avoid error in builds with newer version
|
3
.changes/v2.16.2.md
Normal file
3
.changes/v2.16.2.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.16.2 - 2024-02-21
|
||||||
|
### Fixed
|
||||||
|
* Check for null values in closing motive of parcours d'accompagnement for correct rendering of template
|
5
.changes/v2.16.3.md
Normal file
5
.changes/v2.16.3.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
## v2.16.3 - 2024-02-26
|
||||||
|
### Fixed
|
||||||
|
* ([#236](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/236)) Fix translation of user job -> 'service' must be 'métier'
|
||||||
|
### UX
|
||||||
|
* ([#232](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/232)) Order user jobs and services alphabetically in export filters
|
9
.changes/v2.17.0.md
Normal file
9
.changes/v2.17.0.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
## v2.17.0 - 2024-03-19
|
||||||
|
### Feature
|
||||||
|
* ([#237](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/237)) New export filter for social actions with an evaluation created between two dates
|
||||||
|
* ([#258](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/258)) In the list of accompangying period, add the list of person's centers and the duration of the course
|
||||||
|
* ([#238](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/238)) Allow to customize list person with new fields
|
||||||
|
* ([#159](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/159)) Admin can publish news on the homepage
|
||||||
|
### Fixed
|
||||||
|
* ([#264](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/264)) Fix languages: load the languages in all availables languages configured for Chill
|
||||||
|
* ([#259](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/259)) Keep a consistent behaviour between the filtering of activities within the document generation (model "accompanying period with activities"), and the same filter in the list of activities for an accompanying period
|
5
.changes/v2.18.0.md
Normal file
5
.changes/v2.18.0.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
## v2.18.0 - 2024-03-26
|
||||||
|
### Feature
|
||||||
|
* ([#268](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/268)) Improve admin UX to configure document templates for document generation
|
||||||
|
### Fixed
|
||||||
|
* ([#267](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/267)) Fix the join between job and user in the user list (admin): show only the current user job
|
3
.changes/v2.18.1.md
Normal file
3
.changes/v2.18.1.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.18.1 - 2024-03-26
|
||||||
|
### Fixed
|
||||||
|
* Fix layout issue in document generation for admin (minor)
|
3
.changes/v2.18.2.md
Normal file
3
.changes/v2.18.2.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.18.2 - 2024-04-12
|
||||||
|
### Fixed
|
||||||
|
* ([#250](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/250)) Postal codes import : fix the source URL and the keys to handle each record
|
20
.changes/v2.19.0.md
Normal file
20
.changes/v2.19.0.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
## v2.19.0 - 2024-05-14
|
||||||
|
### Feature
|
||||||
|
* ([#197](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/197)) Make the script which subscribe to microsoft calendars changes more tolerant to errors or missing configuration on the microsoft side
|
||||||
|
* ([#276](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/276)) Take closing date into account when computing the geographical unit on accompanying period. When a person moved after an accompanying period is closed, the date of closing accompanying period is took into account if it is earlier than the date given by the user.
|
||||||
|
### Fixed
|
||||||
|
* ([#270](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/270)) Fix broken link in homepage when a evaluation from a closed acc period was present in the homepage widget
|
||||||
|
* ([#275](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/275)) Allow the filter "filter accompanying period by geographical unit" to take period's location on address into account
|
||||||
|
### UX
|
||||||
|
* Form for document generation moved to the top of document list page
|
||||||
|
* ([#266](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/266)) Event bundle: adjust certain graphical issues for better user experience
|
||||||
|
|
||||||
|
|
||||||
|
### Traduction francophone des principaux changements
|
||||||
|
|
||||||
|
- script de synchronisation des agendas de microsoft Outlook: le script est plus tolérant aux erreurs de configuration côté serveur (manque de droit d'accès);
|
||||||
|
- dans les statistiques sur les parcours d'accompagnements, regroupement et filtre par unité géographique: lorsque la date de prise en compte de l'adresse est postérieure à la fermeture du parcours, c'est la date de fermeture du parcours qui est prise en compte (cela permet de tenir compte de la localisation de l'usager au moment de la fermeture dans le cas où celui-ci aurait déménagé par la suite);
|
||||||
|
- sur la page d'accueil, il n'y a plus de rappel pour les évaluations pour les parcours cloturés;
|
||||||
|
- correction du filtre "filtrer par zone géographique"
|
||||||
|
- répétition du bouton pour générer un document en haut de la page "liste des documents", quand il y a plus de cinq documents;
|
||||||
|
- module événement: améliorerations graphiques
|
21
.changes/v2.20.0.md
Normal file
21
.changes/v2.20.0.md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
## v2.20.0 - 2024-06-05
|
||||||
|
### Fixed
|
||||||
|
* ([#170](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/170)) Display agents traitants instead of accompanying period referrer in export list social actions.
|
||||||
|
* Added translations for choices of durations (> 5 hours)
|
||||||
|
### Feature
|
||||||
|
* ([#145](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/145)) Allow to open documents in LibreOffice locally (need configuration within security);
|
||||||
|
|
||||||
|
This endpoint should be added to make the endpoint works properly:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
security:
|
||||||
|
firewalls:
|
||||||
|
dav:
|
||||||
|
pattern: ^/dav
|
||||||
|
provider: chain_provider
|
||||||
|
stateless: true
|
||||||
|
guard:
|
||||||
|
authenticators:
|
||||||
|
- Chill\DocStoreBundle\Security\Guard\JWTOnDavUrlAuthenticator
|
||||||
|
|
||||||
|
```
|
3
.changes/v2.20.1.md
Normal file
3
.changes/v2.20.1.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.20.1 - 2024-06-05
|
||||||
|
### Fixed
|
||||||
|
* Do not allow StoredObjectCreated for edit and convert buttons
|
39
.changes/v2.5.0.md
Normal file
39
.changes/v2.5.0.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
## v2.5.0 - 2023-07-14
|
||||||
|
### Feature
|
||||||
|
* Allow filtering on the basis of a user within general tasks lists
|
||||||
|
* ([#120](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/120)) Adding OrderFilter to the list of social actions.
|
||||||
|
* ([#125](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/125)) [export] Add a list for people with their associated course
|
||||||
|
* [export] Add ordering by person's lastname or course opening date in list which concerns accompanying course or peoples
|
||||||
|
* ([#128](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/128)) [Export] allow to group activities by localisation
|
||||||
|
* ([#129](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/129)) [export] Add a filter "filter course having an activity between two dates"
|
||||||
|
* ([#112](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/112)) [addresses] Add a cronjob to re-associate addresses with addresses reference every 6 hours
|
||||||
|
* Improve filtering layout
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
* reimplement the visualization of all calculator results
|
||||||
|
* ([#117](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/117)) Repair my unread notification list with actions and evaluations documents
|
||||||
|
* ([#126](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/126)) Correct bug in thirdparty API search query: simplify address joins clause for child and parent kind
|
||||||
|
|
||||||
|
### DX
|
||||||
|
* Documentation for database principles
|
||||||
|
* [cronjob] when a cronjob is executed, it may return an array of data that will be passed as argument on the next execution
|
||||||
|
|
||||||
|
### UX
|
||||||
|
* ([#93](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/93)) Better integration of address details button: look, position, title tag
|
||||||
|
* ([#93](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/93)) Show address detail button on person and household banners
|
||||||
|
* Improve residential address position on show onthefly modale
|
||||||
|
|
||||||
|
### Traduction francophone des principaux changements
|
||||||
|
|
||||||
|
* Ajout d'un filtre "par utilisateur" aux pages de tâche
|
||||||
|
* Filtre des actions d'accompagnement par date, type, intervenant
|
||||||
|
* export: liste des usagers concernés avec détail de leurs parcours
|
||||||
|
* export: ajout d'un regroupement des échanges par localisation
|
||||||
|
* export: ajout d'un filtre "parcours ayant reçu un échange entre deux dates"
|
||||||
|
* ajout d'une tâche cron pour associer les adresses à une adresse de référence
|
||||||
|
* correction: réparation de la liste des notifications sur la page d'accueil, dans le cas où une notification concerne une action ou un document dans une évaluation
|
||||||
|
* correction: réparation de la recherche des tiers ayant des codes postaux similaires entre les parents et enfants
|
||||||
|
* meilleure intégration du bouton "détail d'une adresse": améliration de la taille et de la position
|
||||||
|
* bouton permettant de visualiser les détails d'une adresse (modale avec carte) dans la bannière "Usager" et "Ménage"
|
||||||
|
* amélioration de la modale permettant de voir les détails d'un usager: les adresses de résidence sont dans la continuité des autres adresses, et non plus dans une colonne séparée
|
||||||
|
* améliore le design et l'expérience utilisateur des filtres
|
3
.changes/v2.5.1.md
Normal file
3
.changes/v2.5.1.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.5.1 - 2023-07-14
|
||||||
|
### Fixed
|
||||||
|
* [collate addresses] block collating addresses to another address reference where the address reference is already the best match
|
3
.changes/v2.5.2.md
Normal file
3
.changes/v2.5.2.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.5.2 - 2023-07-15
|
||||||
|
### Fixed
|
||||||
|
* [Collate Address] when updating address point, do not use the point's address reference if the similarity is below the requirement for associating the address reference and the address (it uses the postcode's center instead)
|
3
.changes/v2.5.3.md
Normal file
3
.changes/v2.5.3.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.5.3 - 2023-07-20
|
||||||
|
### Fixed
|
||||||
|
* ([#132](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/132)) Rendez-vous documents created would appear in all documents lists of all persons with an accompanying period. Or statements are now added to the where clause to filter out documents that come from unrelated accompanying period/ or person rendez-vous.
|
21
.changes/v2.6.0.md
Normal file
21
.changes/v2.6.0.md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
## v2.6.0 - 2023-09-14
|
||||||
|
### Feature
|
||||||
|
* ([#133](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/133)) Add locations in Aside Activity. By default, suggest user location, otherwise a select with all locations.
|
||||||
|
* ([#133](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/133)) Adapt Aside Activity exports: display location, filter by location, group by location
|
||||||
|
* Use the CRUD controller for center entity + add the isActive property to be able to mask instances of Center that are no longer in use.
|
||||||
|
### Fixed
|
||||||
|
* ([#107](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/107)) reinstate the fusion of duplicate persons
|
||||||
|
* Missing translation in Work Actions exports
|
||||||
|
* Reimplement the mission type filter on tasks, only for instances that have a config parameter indicating true for this.
|
||||||
|
* ([#135](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/135)) Corrects a typing error in 2 filters, which caused an
|
||||||
|
error when trying to reedit a saved export
|
||||||
|
|
||||||
|
|
||||||
|
* ([#136](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/136)) [household] when moving a person to a sharing position to a not-sharing position on the same household on the same date, remove the previous household membership on the same household. This fix duplicate member.
|
||||||
|
* Add missing translation for comment field placeholder in repositionning household editor.
|
||||||
|
|
||||||
|
* Do not send an email to creator twice when adding a comment to a notification
|
||||||
|
* ([#107](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/107)) Fix gestion doublon functionality to work with chill bundles v2
|
||||||
|
### UX
|
||||||
|
* Uniformize badge-person in household banner (background, size)
|
||||||
|
|
3
.changes/v2.6.1.md
Normal file
3
.changes/v2.6.1.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.6.1 - 2023-09-14
|
||||||
|
### Fixed
|
||||||
|
* Filter out active centers in exports, which uses a different PickCenterType.
|
3
.changes/v2.6.2.md
Normal file
3
.changes/v2.6.2.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.6.2 - 2023-09-18
|
||||||
|
### Fixed
|
||||||
|
* Fix doctrine mapping of AbstractTaskPlaceEvent and SingleTaskPlaceEvent: id property moved.
|
4
.changes/v2.6.3.md
Normal file
4
.changes/v2.6.3.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
## v2.6.3 - 2023-09-19
|
||||||
|
### Fixed
|
||||||
|
* Remove id property from document
|
||||||
|
mappedsuperclass
|
6
.changes/v2.7.0.md
Normal file
6
.changes/v2.7.0.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
## v2.7.0 - 2023-09-27
|
||||||
|
### Feature
|
||||||
|
* ([#155](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/155)) The regulation list load accompanying periods by exact postal code (address associated with postal code), and not by the content of the postal code (postal code with same code's string)
|
||||||
|
### Fixed
|
||||||
|
* ([#142](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/142)) Fix the label of filter ActivityTypeFilter to a more obvious one
|
||||||
|
* ([#140](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/140)) [export] Fix association of filter "filter location by type" which did not appears on "list of activities"
|
19
.changes/v2.8.0.md
Normal file
19
.changes/v2.8.0.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
## v2.8.0 - 2023-10-05
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
* ([#162](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/162)) Reassigning list: when reassigning courses to a new user, the job associated with the course become the one of the new user (if any)
|
||||||
|
* Reassining list: the length of the list is increased to 100 courses
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
* ([#143](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/143)) Fix filter "accompanying course by social action" to avoid duplication in list
|
||||||
|
* ([#164](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/164)) View a third party: avoid errors when a contact has a civility
|
||||||
|
* ([#163](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/163)) Fix the filters and aggregators on exports "count peoples"
|
||||||
|
* ([#143](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/143)) From the database, avoid the creation of location history for same period and at same dates
|
||||||
|
|
||||||
|
### Traduction francophone des principaux changements
|
||||||
|
|
||||||
|
- Fonctionnalité: Réassigner les parcours en lot: lorsque des parcours sont réassignés "en lot", les parcours sont maintenant associés au métier du nouveau référent;
|
||||||
|
- Correction: certaines causes qui créaient des doublons dans les listes ont été corrigées;
|
||||||
|
- Correction des associations entre l'export "nombre de personnes" et les filtres et regroupements associés
|
23
.changes/v2.9.0.md
Normal file
23
.changes/v2.9.0.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
## v2.9.0 - 2023-10-17
|
||||||
|
### Feature
|
||||||
|
* ([#147](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/147)) Add history to scopes and to jobs in administrator section. When user job or main scope of user is changed, automaticaly add a new row in history.
|
||||||
|
* ([#146](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/146)) Allow closing motives to be identified as 'canceling the accompanying period' + don't take canceled accompanying periods into account
|
||||||
|
* [export] add an aggregator for activities: group by job scope's creator aggregator
|
||||||
|
* DX: prepare the code for the upgrade to symfony 5.4
|
||||||
|
|
||||||
|
### Traductions francophones des principaux changements
|
||||||
|
|
||||||
|
- ajout de l'historique des services et métiers pour les utilisateurs. Les exports, filtres et regroupements sont adaptés pour tenir compte du métier et du service
|
||||||
|
de l'utilisateur au moment de l'échange, de sa désignation comme agent traitant de l'échange ou du moment du rendez-vous ([#147](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/147)))
|
||||||
|
- modification des motifs de cloture des parcours: ajout d'un chanmp "annule le parcours", qui permet d'indiquer que le motif "annule" le parcours. Les parcours annulés n'apparaissent
|
||||||
|
pas dans les statistiques
|
||||||
|
- ajouter d'un regroupement pour les échanges: grouper par métier et service du créateur de l'échange
|
||||||
|
|
||||||
|
|
||||||
|
### Possible BC break in configuration
|
||||||
|
|
||||||
|
This release remove the use of deprecated package [symfony/templating](https://symfony.com/components/Templating).
|
||||||
|
|
||||||
|
If you use this package in your own bundle (usually `src/` directory, or other dependencies), you should add this dependencies in your local composer.json (`composer require symfony/templating`).
|
||||||
|
|
||||||
|
But if you do not need this any more, you must ensure that the configuration key `framework.templating` is removed. This is usually located into `config/packages/framework.yaml`. [See here an example](https://gitea.champs-libres.be/Chill-project/chill-skeleton-basic/commit/cc716beaecc239e6a189f3db62ea95f169a37505#diff-df607fe73ff82c569824a7392edf5e760e998efe)
|
3
.changes/v2.9.1.md
Normal file
3
.changes/v2.9.1.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.9.1 - 2023-10-17
|
||||||
|
### Fixed
|
||||||
|
* Fix the handling of activity form when editing or creating an activity in an accompanying period with multiple centers
|
3
.changes/v2.9.2.md
Normal file
3
.changes/v2.9.2.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
## v2.9.2 - 2023-10-17
|
||||||
|
### Fixed
|
||||||
|
* Fix possible null values in string's entities
|
@ -7,7 +7,7 @@ versionFormat: '## {{.Version}} - {{.Time.Format "2006-01-02"}}'
|
|||||||
kindFormat: '### {{.Kind}}'
|
kindFormat: '### {{.Kind}}'
|
||||||
# Note: it is possible to add a `.custom.Long` text manually into the yaml file produced by `changie new`. This will add a long description.
|
# Note: it is possible to add a `.custom.Long` text manually into the yaml file produced by `changie new`. This will add a long description.
|
||||||
changeFormat: >-
|
changeFormat: >-
|
||||||
* {{ if not (eq .Custom.Issue "") }}([#{{ .Custom.Issue }}](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/{{ .Custom.Issue }})) {{ end }}{{.Body}} {{ if not (eq .Custom.Long "") }}
|
* {{ if not (eq .Custom.Issue "") }}([#{{ .Custom.Issue }}](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/{{ .Custom.Issue }})) {{ end }}{{.Body}} {{ if and (.Custom.Long) (not (eq .Custom.Long "")) }}
|
||||||
|
|
||||||
{{ .Custom.Long }}{{ end }}
|
{{ .Custom.Long }}{{ end }}
|
||||||
custom:
|
custom:
|
||||||
@ -30,6 +30,8 @@ kinds:
|
|||||||
auto: patch
|
auto: patch
|
||||||
- label: DX
|
- label: DX
|
||||||
auto: patch
|
auto: patch
|
||||||
|
- label: UX
|
||||||
|
auto: patch
|
||||||
newlines:
|
newlines:
|
||||||
afterChangelogHeader: 1
|
afterChangelogHeader: 1
|
||||||
beforeChangelogVersion: 1
|
beforeChangelogVersion: 1
|
||||||
|
@ -23,3 +23,7 @@ max_line_length = 0
|
|||||||
indent_size = 2
|
indent_size = 2
|
||||||
indent_style = space
|
indent_style = space
|
||||||
|
|
||||||
|
[.rst]
|
||||||
|
ident_size = 3
|
||||||
|
ident_style = space
|
||||||
|
|
||||||
|
36
.env.test
36
.env.test
@ -3,3 +3,39 @@
|
|||||||
# Run tests from root to adapt your own environment
|
# Run tests from root to adapt your own environment
|
||||||
KERNEL_CLASS='App\Kernel'
|
KERNEL_CLASS='App\Kernel'
|
||||||
APP_SECRET='$ecretf0rt3st'
|
APP_SECRET='$ecretf0rt3st'
|
||||||
|
|
||||||
|
ADMIN_PASSWORD=password
|
||||||
|
|
||||||
|
LOCALE=fr
|
||||||
|
REDIS_URL=redis
|
||||||
|
REDIS_PORT=6379
|
||||||
|
REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}
|
||||||
|
|
||||||
|
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://
|
||||||
|
###< symfony/messenger ###
|
||||||
|
|
||||||
|
###> 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://postgres:postgres@db:5432/test?serverVersion=14&charset=utf8"
|
||||||
|
###< doctrine/doctrine-bundle ###
|
||||||
|
|
||||||
|
ASYNC_UPLOAD_TEMP_URL_KEY=
|
||||||
|
ASYNC_UPLOAD_TEMP_URL_BASE_PATH=
|
||||||
|
ASYNC_UPLOAD_TEMP_URL_CONTAINER=
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
# Select what we should cache between builds
|
# Select what we should cache between builds
|
||||||
cache:
|
cache:
|
||||||
paths:
|
paths:
|
||||||
- tests/app/vendor/
|
- /vendor/
|
||||||
- .cache
|
- .cache
|
||||||
|
|
||||||
# Bring in any services we need http://docs.gitlab.com/ee/ci/docker/using_docker_images.html#what-is-a-service
|
# Bring in any services we need http://docs.gitlab.com/ee/ci/docker/using_docker_images.html#what-is-a-service
|
||||||
@ -11,6 +11,10 @@ cache:
|
|||||||
services:
|
services:
|
||||||
- name: postgis/postgis:14-3.3-alpine
|
- name: postgis/postgis:14-3.3-alpine
|
||||||
alias: db
|
alias: db
|
||||||
|
command:
|
||||||
|
- postgres
|
||||||
|
- "-c"
|
||||||
|
- max_connections=1000
|
||||||
- name: redis
|
- name: redis
|
||||||
alias: redis
|
alias: redis
|
||||||
|
|
||||||
@ -23,13 +27,15 @@ variables:
|
|||||||
# configure database access
|
# configure database access
|
||||||
DATABASE_URL: postgresql://postgres:postgres@db:5432/postgres?serverVersion=14&charset=utf8
|
DATABASE_URL: postgresql://postgres:postgres@db:5432/postgres?serverVersion=14&charset=utf8
|
||||||
# fetch the chill-app using git submodules
|
# fetch the chill-app using git submodules
|
||||||
GIT_SUBMODULE_STRATEGY: recursive
|
# GIT_SUBMODULE_STRATEGY: recursive
|
||||||
REDIS_HOST: redis
|
REDIS_HOST: redis
|
||||||
REDIS_PORT: 6379
|
REDIS_PORT: 6379
|
||||||
REDIS_URL: redis://redis:6379
|
REDIS_URL: redis://redis:6379
|
||||||
# change vendor dir to make the app install into tests/apps
|
|
||||||
COMPOSER_VENDOR_DIR: tests/app/vendor
|
|
||||||
DEFAULT_CARRIER_CODE: BE
|
DEFAULT_CARRIER_CODE: BE
|
||||||
|
# force a timezone
|
||||||
|
TZ: Europe/Brussels
|
||||||
|
# avoid direct deprecations (using symfony phpunit bridge: https://symfony.com/doc/4.x/components/phpunit_bridge.html#internal-deprecations
|
||||||
|
SYMFONY_DEPRECATIONS_HELPER: max[total]=99999999&max[self]=0&max[direct]=0&verbose=1
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- Composer install
|
- Composer install
|
||||||
@ -47,10 +53,10 @@ build:
|
|||||||
paths:
|
paths:
|
||||||
- .cache/
|
- .cache/
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 30 min
|
expire_in: 1 day
|
||||||
paths:
|
paths:
|
||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- vendor/
|
||||||
|
|
||||||
code_style:
|
code_style:
|
||||||
stage: Tests
|
stage: Tests
|
||||||
@ -61,10 +67,10 @@ code_style:
|
|||||||
paths:
|
paths:
|
||||||
- .cache/
|
- .cache/
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 30 min
|
expire_in: 1 day
|
||||||
paths:
|
paths:
|
||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- vendor/
|
||||||
|
|
||||||
phpstan_tests:
|
phpstan_tests:
|
||||||
stage: Tests
|
stage: Tests
|
||||||
@ -75,24 +81,25 @@ phpstan_tests:
|
|||||||
paths:
|
paths:
|
||||||
- .cache/
|
- .cache/
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 30 min
|
expire_in: 1 day
|
||||||
paths:
|
paths:
|
||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- vendor/
|
||||||
|
|
||||||
rector_tests:
|
rector_tests:
|
||||||
stage: Tests
|
stage: Tests
|
||||||
image: gitea.champs-libres.be/chill-project/chill-skeleton-basic/base-image:php82
|
image: gitea.champs-libres.be/chill-project/chill-skeleton-basic/base-image:php82
|
||||||
script:
|
script:
|
||||||
- bin/rector --dry-run
|
- tests/console cache:clear
|
||||||
|
- bin/rector process --dry-run
|
||||||
cache:
|
cache:
|
||||||
paths:
|
paths:
|
||||||
- .cache/
|
- .cache/
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 30 min
|
expire_in: 1 day
|
||||||
paths:
|
paths:
|
||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- vendor/
|
||||||
|
|
||||||
# psalm_tests:
|
# psalm_tests:
|
||||||
# stage: Tests
|
# stage: Tests
|
||||||
@ -109,19 +116,17 @@ rector_tests:
|
|||||||
unit_tests:
|
unit_tests:
|
||||||
stage: Tests
|
stage: Tests
|
||||||
image: gitea.champs-libres.be/chill-project/chill-skeleton-basic/base-image:php82
|
image: gitea.champs-libres.be/chill-project/chill-skeleton-basic/base-image:php82
|
||||||
# until we fix testes
|
|
||||||
allow_failure: true
|
|
||||||
script:
|
script:
|
||||||
- php tests/app/bin/console doctrine:migrations:migrate -n
|
- php tests/console doctrine:migrations:migrate -n --env=test
|
||||||
- php -d memory_limit=2G tests/app/bin/console cache:clear --env=dev
|
- php tests/console chill:db:sync-views --env=test
|
||||||
- php -d memory_limit=3G tests/app/bin/console doctrine:fixtures:load -n
|
- php -d memory_limit=2G tests/console cache:clear --env=test
|
||||||
- php -d memory_limit=2G tests/app/bin/console cache:clear --env=test
|
- php -d memory_limit=3G tests/console doctrine:fixtures:load -n
|
||||||
- php -d memory_limit=4G bin/phpunit --colors=never
|
- php -d memory_limit=4G bin/phpunit --colors=never --exclude-group dbIntensive
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 30 min
|
expire_in: 1 day
|
||||||
paths:
|
paths:
|
||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- vendor/
|
||||||
|
|
||||||
release:
|
release:
|
||||||
stage: Deploy
|
stage: Deploy
|
||||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,6 +1,3 @@
|
|||||||
[submodule "_exts/sphinx-php"]
|
[submodule "_exts/sphinx-php"]
|
||||||
path = _exts/sphinx-php
|
path = _exts/sphinx-php
|
||||||
url = https://github.com/fabpot/sphinx-php.git
|
url = https://github.com/fabpot/sphinx-php.git
|
||||||
[submodule "tests/app"]
|
|
||||||
path = tests/app
|
|
||||||
url = https://gitlab.com/Chill-projet/chill-app.git
|
|
||||||
|
@ -91,7 +91,7 @@ $rules = array_merge(
|
|||||||
[
|
[
|
||||||
'@PhpCsFixer' => true,
|
'@PhpCsFixer' => true,
|
||||||
'@PhpCsFixer:risky' => false,
|
'@PhpCsFixer:risky' => false,
|
||||||
'@Symfony' => false,
|
'@Symfony' => true,
|
||||||
'@Symfony:risky' => false,
|
'@Symfony:risky' => false,
|
||||||
'ordered_class_elements' => [
|
'ordered_class_elements' => [
|
||||||
'order' => [
|
'order' => [
|
||||||
@ -111,7 +111,7 @@ $rules = array_merge(
|
|||||||
'method_private',
|
'method_private',
|
||||||
],
|
],
|
||||||
'sort_algorithm' => 'alpha',
|
'sort_algorithm' => 'alpha',
|
||||||
]
|
],
|
||||||
],
|
],
|
||||||
$rules,
|
$rules,
|
||||||
$riskyRules,
|
$riskyRules,
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
---
|
---
|
||||||
version: 2
|
version: 2
|
||||||
|
|
||||||
|
build:
|
||||||
|
os: ubuntu-22.04
|
||||||
|
tools:
|
||||||
|
python: "3.7"
|
||||||
|
|
||||||
sphinx:
|
sphinx:
|
||||||
configuration: docs/source/conf.py
|
configuration: docs/source/conf.py
|
||||||
|
|
||||||
python:
|
python:
|
||||||
version: 3.7
|
|
||||||
install:
|
install:
|
||||||
- requirements: docs/requirements.txt
|
- requirements: docs/requirements.txt
|
381
CHANGELOG.md
381
CHANGELOG.md
@ -6,6 +6,387 @@ 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).
|
||||||
|
|
||||||
|
|
||||||
|
## v2.20.1 - 2024-06-05
|
||||||
|
### Fixed
|
||||||
|
* Do not allow StoredObjectCreated for edit and convert buttons
|
||||||
|
|
||||||
|
## v2.20.0 - 2024-06-05
|
||||||
|
### Fixed
|
||||||
|
* ([#170](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/170)) Display agents traitants instead of accompanying period referrer in export list social actions.
|
||||||
|
* Added translations for choices of durations (> 5 hours)
|
||||||
|
### Feature
|
||||||
|
* ([#145](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/145)) Allow to open documents in LibreOffice locally (need configuration within security);
|
||||||
|
|
||||||
|
This endpoint should be added to make the endpoint works properly:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
security:
|
||||||
|
firewalls:
|
||||||
|
dav:
|
||||||
|
pattern: ^/dav
|
||||||
|
provider: chain_provider
|
||||||
|
stateless: true
|
||||||
|
guard:
|
||||||
|
authenticators:
|
||||||
|
- Chill\DocStoreBundle\Security\Guard\JWTOnDavUrlAuthenticator
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## v2.19.0 - 2024-05-14
|
||||||
|
### Feature
|
||||||
|
* ([#197](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/197)) Make the script which subscribe to microsoft calendars changes more tolerant to errors or missing configuration on the microsoft side
|
||||||
|
* ([#276](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/276)) Take closing date into account when computing the geographical unit on accompanying period. When a person moved after an accompanying period is closed, the date of closing accompanying period is took into account if it is earlier than the date given by the user.
|
||||||
|
### Fixed
|
||||||
|
* ([#270](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/270)) Fix broken link in homepage when a evaluation from a closed acc period was present in the homepage widget
|
||||||
|
* ([#275](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/275)) Allow the filter "filter accompanying period by geographical unit" to take period's location on address into account
|
||||||
|
### UX
|
||||||
|
* Form for document generation moved to the top of document list page
|
||||||
|
* ([#266](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/266)) Event bundle: adjust certain graphical issues for better user experience
|
||||||
|
|
||||||
|
|
||||||
|
### Traduction francophone des principaux changements
|
||||||
|
|
||||||
|
- script de synchronisation des agendas de microsoft Outlook: le script est plus tolérant aux erreurs de configuration côté serveur (manque de droit d'accès);
|
||||||
|
- dans les statistiques sur les parcours d'accompagnements, regroupement et filtre par unité géographique: lorsque la date de prise en compte de l'adresse est postérieure à la fermeture du parcours, c'est la date de fermeture du parcours qui est prise en compte (cela permet de tenir compte de la localisation de l'usager au moment de la fermeture dans le cas où celui-ci aurait déménagé par la suite);
|
||||||
|
- sur la page d'accueil, il n'y a plus de rappel pour les évaluations pour les parcours cloturés;
|
||||||
|
- correction du filtre "filtrer par zone géographique"
|
||||||
|
- répétition du bouton pour générer un document en haut de la page "liste des documents", quand il y a plus de cinq documents;
|
||||||
|
- module événement: améliorerations graphiques
|
||||||
|
|
||||||
|
## v2.18.2 - 2024-04-12
|
||||||
|
### Fixed
|
||||||
|
* ([#250](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/250)) Postal codes import : fix the source URL and the keys to handle each record
|
||||||
|
|
||||||
|
## v2.18.1 - 2024-03-26
|
||||||
|
### Fixed
|
||||||
|
* Fix layout issue in document generation for admin (minor)
|
||||||
|
|
||||||
|
## v2.18.0 - 2024-03-26
|
||||||
|
### Feature
|
||||||
|
* ([#268](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/268)) Improve admin UX to configure document templates for document generation
|
||||||
|
### Fixed
|
||||||
|
* ([#267](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/267)) Fix the join between job and user in the user list (admin): show only the current user job
|
||||||
|
|
||||||
|
## v2.17.0 - 2024-03-19
|
||||||
|
### Feature
|
||||||
|
* ([#237](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/237)) New export filter for social actions with an evaluation created between two dates
|
||||||
|
* ([#258](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/258)) In the list of accompangying period, add the list of person's centers and the duration of the course
|
||||||
|
* ([#238](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/238)) Allow to customize list person with new fields
|
||||||
|
* ([#159](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/159)) Admin can publish news on the homepage
|
||||||
|
### Fixed
|
||||||
|
* ([#264](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/264)) Fix languages: load the languages in all availables languages configured for Chill
|
||||||
|
* ([#259](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/259)) Keep a consistent behaviour between the filtering of activities within the document generation (model "accompanying period with activities"), and the same filter in the list of activities for an accompanying period
|
||||||
|
|
||||||
|
## v2.16.3 - 2024-02-26
|
||||||
|
### Fixed
|
||||||
|
* ([#236](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/236)) Fix translation of user job -> 'service' must be 'métier'
|
||||||
|
### UX
|
||||||
|
* ([#232](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/232)) Order user jobs and services alphabetically in export filters
|
||||||
|
|
||||||
|
## v2.16.2 - 2024-02-21
|
||||||
|
### Fixed
|
||||||
|
* Check for null values in closing motive of parcours d'accompagnement for correct rendering of template
|
||||||
|
|
||||||
|
## v2.16.1 - 2024-02-09
|
||||||
|
### Fixed
|
||||||
|
* Force bootstrap version to avoid error in builds with newer version
|
||||||
|
|
||||||
|
## v2.16.0 - 2024-02-08
|
||||||
|
### Feature
|
||||||
|
* ([#231](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/231)) Create new filter for persons having a participation in an accompanying period during a certain time span
|
||||||
|
* ([#241](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/241)) [Export][List of accompanyign period] Add two columns: the list of persons participating to the period, and their ids
|
||||||
|
* ([#244](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/244)) Add capability to generate export about change of steps of accompanying period, and generate exports for this
|
||||||
|
* ([#253](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/253)) Export: group accompanying period by person participating
|
||||||
|
* ([#243](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/243)) Export: add filter for courses not linked to a reference address
|
||||||
|
* ([#229](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/229)) Allow to group activities linked with accompanying period by reason
|
||||||
|
* ([#115](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/115)) Prevent social work to be saved when another user edited conccurently the social work
|
||||||
|
* Modernize the event bundle, with some new fields and multiple improvements
|
||||||
|
### Fixed
|
||||||
|
* ([#220](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/220)) Fix error in logs about wrong typing of eventArgs in onEditNotificationComment method
|
||||||
|
* ([#256](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/256)) Fix the conditions upon which social actions should be optional or required in relation to social issues within the activity creation form
|
||||||
|
### UX
|
||||||
|
* ([#260](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/260)) Order list of centers alphabetically in dropdown 'user' section admin.
|
||||||
|
|
||||||
|
## v2.15.2 - 2024-01-11
|
||||||
|
### Fixed
|
||||||
|
* Fix the id_seq used when creating a new accompanying period participation during fusion of two person files
|
||||||
|
### DX
|
||||||
|
* Set placeholder to False for expanded EntityType form fields where required is set to False.
|
||||||
|
|
||||||
|
## v2.15.1 - 2023-12-20
|
||||||
|
### Fixed
|
||||||
|
* Fix the household export query to exclude accompanying periods that are in draft state.
|
||||||
|
### DX
|
||||||
|
* ([#167](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/167)) Fixed readthedocs compilation by updating readthedocs config file and requirements for Sphinx
|
||||||
|
|
||||||
|
## v2.15.0 - 2023-12-11
|
||||||
|
### Feature
|
||||||
|
* ([#191](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/191)) Add export "number of household associate with an exchange"
|
||||||
|
* ([#235](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/235)) Export: add dates on the filter "filter course by activity type"
|
||||||
|
### Fixed
|
||||||
|
* ([#214](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/214)) Fix error when posting an empty comment on an accompanying period.
|
||||||
|
* ([#233](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/233)) Fix "filter evaluation by evaluation type" (and add select2 to the list of evaluation types to pick)
|
||||||
|
* ([#234](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/234)) Fix "filter aside activity by date"
|
||||||
|
|
||||||
|
* ([#228](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/228)) Fix export of activity for people created before the introduction of the createdAt column on person (during v1)
|
||||||
|
* ([#246](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/246)) Do not show activities, evaluations and social work when associated to a confidential accompanying period, except for the users which are allowed to see them
|
||||||
|
|
||||||
|
## v2.14.1 - 2023-11-29
|
||||||
|
### Fixed
|
||||||
|
* Export: fix list person with custom fields
|
||||||
|
* ([#100](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/100)) Add a paginator to budget elements (resource and charge types) in the admin
|
||||||
|
* Fix error in ListEvaluation when "handling agents" are alone
|
||||||
|
|
||||||
|
## v2.14.0 - 2023-11-24
|
||||||
|
### Feature
|
||||||
|
* ([#161](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/161)) Export: in filter "Filter accompanying period work (social action) by type, goal and result", order the items alphabetically or with the defined order
|
||||||
|
### Fixed
|
||||||
|
* ([#141](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/141)) Export: on filter "action by type goals, and results", restore the fields when editing a saved export
|
||||||
|
* ([#219](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/219)) Export: fix the list of accompanying period work, when the "calc date" is null
|
||||||
|
* ([#222](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/222)) Fix rendering of custom fields
|
||||||
|
* Fix various errors in custom fields administration
|
||||||
|
|
||||||
|
## v2.13.0 - 2023-11-21
|
||||||
|
### Feature
|
||||||
|
* ([#173](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/173)) Allow user to add a phonenumber to their profile which will be included in automatically generated documents
|
||||||
|
### Fixed
|
||||||
|
* ([#211](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/211)) Export: fix loading of "Group activity by type"
|
||||||
|
* ([#190](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/190)) Export: fix loading of "group activity by reasons"
|
||||||
|
* ([#213](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/213)) Export: fix usage of some Collection returned instead of array in export filters
|
||||||
|
* ([#215](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/215)) Use only the string 'both' for gender (with a database migration)
|
||||||
|
* ([#212](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/212)) Clean the database to make working the "Group people by gender" aggregator
|
||||||
|
|
||||||
|
## v2.12.1 - 2023-11-16
|
||||||
|
### Fixed
|
||||||
|
* ([#208](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/208)) Export: fix loading of form for "filter action by type, goal and result"
|
||||||
|
|
||||||
|
## v2.12.0 - 2023-11-15
|
||||||
|
### Feature
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add an aggregator "group activities by presence"
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add a filter "filter activity by activity presence"
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add an aggregator "group activities by person" (only for the activities saved in a person context)
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add a new aggregator "group peoples by postal code"
|
||||||
|
* ([#200](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/200)) Export: split export about person on accompanying period work: one with the people associated with the work, another one with the people associated with the accompanying period
|
||||||
|
* ([#204](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/204)) Add 3 new filters and 3 new aggregators for work action creator (with jobs and scopes)
|
||||||
|
|
||||||
|
* ([#202](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/202)) Create export for the average duration of social work actions
|
||||||
|
* ([#206](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/206)) Export: add a export which count persons on accompanying period work
|
||||||
|
* ([#206](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/206)) Export: add an export which count persons on activity
|
||||||
|
* ([#203](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/203)) Export: add clauses on the social work start date and end date within the filter "Filter accompanying period by accompanying period work"
|
||||||
|
### Fixed
|
||||||
|
* Export: fix typo in filter "filter accompanying period work on end date"
|
||||||
|
* ([#189](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/189)) Export: Fix failure in export linked to household
|
||||||
|
* ([#205](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/205)) Fix loading of accompanying period work referrers
|
||||||
|
### Traduction francophone des principaux changements
|
||||||
|
* export: ajout d'un regroupement "grouper les échanges par présence de l'usager";
|
||||||
|
* export: ajout d'un filtre "filtre les échanges par présence de l'usager";
|
||||||
|
* export: ajout d'un regroupement "regrouper les échanges par personne" (seulement pour les échanges enregistrés dans le contexte de l'usager);
|
||||||
|
* export: ajout d'un regroupement "grouper les usagers par codes postaux"
|
||||||
|
* export: séparation des exports sur les actions: dans l'un, les filtres des usagers portent sur les usagers concernés par l'action, dans l'autre, les filtres portent sur les usagers concernés par le parcours de l'action;
|
||||||
|
* export: ajout de 3 nouveaux filtres et regroupements sur le créateur de l'action, son métier et son service;
|
||||||
|
* export: correction de l'export sur les ménages liés aux parcours;
|
||||||
|
* correction du chargement des actions d'accompagnement
|
||||||
|
|
||||||
|
## v2.11.0 - 2023-11-07
|
||||||
|
### Feature
|
||||||
|
* ([#194](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/194)) Export: add a filter "filter activity by creator job"
|
||||||
|
### Fixed
|
||||||
|
* ([#185](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/185)) Export: fix "group accompanying period by geographical unit": take into account the accompanying periods when the period is not located within an unit
|
||||||
|
* Fix "group activity by creator job" aggregator
|
||||||
|
|
||||||
|
## v2.10.6 - 2023-11-07
|
||||||
|
### Fixed
|
||||||
|
* ([#182](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/182)) Fix merging of double person files. Adjustement relationship sql statement
|
||||||
|
* ([#185](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/185)) Export: fix aggregator by geographical unit on person: avoid inconsistencies
|
||||||
|
|
||||||
|
## v2.10.5 - 2023-11-05
|
||||||
|
### Fixed
|
||||||
|
* ([#183](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/183)) Fix "problem during download" on some filters, which used a wrong data type
|
||||||
|
* ([#184](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/184)) Fix filter "activity by date"
|
||||||
|
|
||||||
|
## v2.10.4 - 2023-10-26
|
||||||
|
### Fixed
|
||||||
|
* Fix null value constraint errors when merging relationships in doubles
|
||||||
|
|
||||||
|
## v2.10.3 - 2023-10-26
|
||||||
|
### Fixed
|
||||||
|
* ([#175](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/175)) Replace old method of getting translator with injection of translatorInterface
|
||||||
|
|
||||||
|
## v2.10.2 - 2023-10-26
|
||||||
|
### Fixed
|
||||||
|
* ([#175](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/175)) Use injection of translator instead of ->get().
|
||||||
|
|
||||||
|
## v2.10.1 - 2023-10-24
|
||||||
|
### Fixed
|
||||||
|
* Fix export controller when generating an export without any data in session
|
||||||
|
|
||||||
|
## v2.10.0 - 2023-10-24
|
||||||
|
### Feature
|
||||||
|
* ([#172](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/172)) [export] Add a filter "grouping accompanying period by opening date" and "grouping accompanying period by closing date"
|
||||||
|
* ([#172](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/172)) [export] add a filter and aggregator on accompanying period work: group/filter by handling third party
|
||||||
|
* ([#172](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/172)) [export] add a filter and aggregator on activites: group/filter activities by people participating to the activities
|
||||||
|
* ([#172](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/172)) [export] add a grouping on accompanying period export: group by activity type associated to at least one activity within the accompanying period
|
||||||
|
* [export] sort filters and aggregators by title
|
||||||
|
* ([#179](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/179)) [export] create a parameter that will force to skip the filtering by center (ACL) when generating an export
|
||||||
|
### Fixed
|
||||||
|
* ([#177](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/177)) [export] fix date range selection on filter and grouping "by status of the course at date", on accompanying periods
|
||||||
|
|
||||||
|
### Résumé francophone des changements
|
||||||
|
|
||||||
|
- Ajout d'un regroupement sur les parcours: par date de cloture et d'ouverture;
|
||||||
|
- Ajouter d'un filtre et regroupement par tiers traitant sur les actions d'accompagnement;
|
||||||
|
- ajout d'un filtre et regroupement par usager participant sur les échanges
|
||||||
|
- ajout d'un regroupement: par type d'activité associé au parcours;
|
||||||
|
- trie les filtre et regroupements par ordre alphabétique dans els exports
|
||||||
|
- ajout d'un paramètre qui permet de désactiver le filtre par centre dans les exports
|
||||||
|
- correction de l'interface de date dans les filtres et regroupements "par statut du parcours à la date"
|
||||||
|
|
||||||
|
## v2.9.2 - 2023-10-17
|
||||||
|
### Fixed
|
||||||
|
* Fix possible null values in string's entities
|
||||||
|
|
||||||
|
## v2.9.1 - 2023-10-17
|
||||||
|
### Fixed
|
||||||
|
* Fix the handling of activity form when editing or creating an activity in an accompanying period with multiple centers
|
||||||
|
|
||||||
|
## v2.9.0 - 2023-10-17
|
||||||
|
### Feature
|
||||||
|
* ([#147](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/147)) Add history to scopes and to jobs in administrator section. When user job or main scope of user is changed, automaticaly add a new row in history.
|
||||||
|
* ([#146](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/146)) Allow closing motives to be identified as 'canceling the accompanying period' + don't take canceled accompanying periods into account
|
||||||
|
* [export] add an aggregator for activities: group by job scope's creator aggregator
|
||||||
|
* DX: prepare the code for the upgrade to symfony 5.4
|
||||||
|
|
||||||
|
### Traductions francophones des principaux changements
|
||||||
|
|
||||||
|
- ajout de l'historique des services et métiers pour les utilisateurs. Les exports, filtres et regroupements sont adaptés pour tenir compte du métier et du service
|
||||||
|
de l'utilisateur au moment de l'échange, de sa désignation comme agent traitant de l'échange ou du moment du rendez-vous ([#147](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/147)))
|
||||||
|
- modification des motifs de cloture des parcours: ajout d'un chanmp "annule le parcours", qui permet d'indiquer que le motif "annule" le parcours. Les parcours annulés n'apparaissent
|
||||||
|
pas dans les statistiques
|
||||||
|
- ajouter d'un regroupement pour les échanges: grouper par métier et service du créateur de l'échange
|
||||||
|
|
||||||
|
|
||||||
|
### Possible BC break in configuration
|
||||||
|
|
||||||
|
This release remove the use of deprecated package [symfony/templating](https://symfony.com/components/Templating).
|
||||||
|
|
||||||
|
If you use this package in your own bundle (usually `src/` directory, or other dependencies), you should add this dependencies in your local composer.json (`composer require symfony/templating`).
|
||||||
|
|
||||||
|
But if you do not need this any more, you must ensure that the configuration key `framework.templating` is removed. This is usually located into `config/packages/framework.yaml`. [See here an example](https://gitea.champs-libres.be/Chill-project/chill-skeleton-basic/commit/cc716beaecc239e6a189f3db62ea95f169a37505#diff-df607fe73ff82c569824a7392edf5e760e998efe)
|
||||||
|
|
||||||
|
## v2.8.0 - 2023-10-05
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
* ([#162](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/162)) Reassigning list: when reassigning courses to a new user, the job associated with the course become the one of the new user (if any)
|
||||||
|
* Reassining list: the length of the list is increased to 100 courses
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
* ([#143](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/143)) Fix filter "accompanying course by social action" to avoid duplication in list
|
||||||
|
* ([#164](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/164)) View a third party: avoid errors when a contact has a civility
|
||||||
|
* ([#163](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/163)) Fix the filters and aggregators on exports "count peoples"
|
||||||
|
* ([#143](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/143)) From the database, avoid the creation of location history for same period and at same dates
|
||||||
|
|
||||||
|
### Traduction francophone des principaux changements
|
||||||
|
|
||||||
|
- Fonctionnalité: Réassigner les parcours en lot: lorsque des parcours sont réassignés "en lot", les parcours sont maintenant associés au métier du nouveau référent;
|
||||||
|
- Correction: certaines causes qui créaient des doublons dans les listes ont été corrigées;
|
||||||
|
- Correction des associations entre l'export "nombre de personnes" et les filtres et regroupements associés
|
||||||
|
|
||||||
|
## v2.7.0 - 2023-09-27
|
||||||
|
### Feature
|
||||||
|
* ([#155](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/155)) The regulation list load accompanying periods by exact postal code (address associated with postal code), and not by the content of the postal code (postal code with same code's string)
|
||||||
|
### Fixed
|
||||||
|
* ([#142](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/142)) Fix the label of filter ActivityTypeFilter to a more obvious one
|
||||||
|
* ([#140](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/140)) [export] Fix association of filter "filter location by type" which did not appears on "list of activities"
|
||||||
|
|
||||||
|
## v2.6.3 - 2023-09-19
|
||||||
|
### Fixed
|
||||||
|
* Remove id property from document
|
||||||
|
mappedsuperclass
|
||||||
|
|
||||||
|
## v2.6.2 - 2023-09-18
|
||||||
|
### Fixed
|
||||||
|
* Fix doctrine mapping of AbstractTaskPlaceEvent and SingleTaskPlaceEvent: id property moved.
|
||||||
|
|
||||||
|
## v2.6.1 - 2023-09-14
|
||||||
|
### Fixed
|
||||||
|
* Filter out active centers in exports, which uses a different PickCenterType.
|
||||||
|
|
||||||
|
## v2.6.0 - 2023-09-14
|
||||||
|
### Feature
|
||||||
|
* ([#133](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/133)) Add locations in Aside Activity. By default, suggest user location, otherwise a select with all locations.
|
||||||
|
* ([#133](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/133)) Adapt Aside Activity exports: display location, filter by location, group by location
|
||||||
|
* Use the CRUD controller for center entity + add the isActive property to be able to mask instances of Center that are no longer in use.
|
||||||
|
### Fixed
|
||||||
|
* ([#107](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/107)) reinstate the fusion of duplicate persons
|
||||||
|
* Missing translation in Work Actions exports
|
||||||
|
* Reimplement the mission type filter on tasks, only for instances that have a config parameter indicating true for this.
|
||||||
|
* ([#135](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/135)) Corrects a typing error in 2 filters, which caused an
|
||||||
|
error when trying to reedit a saved export
|
||||||
|
|
||||||
|
|
||||||
|
* ([#136](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/136)) [household] when moving a person to a sharing position to a not-sharing position on the same household on the same date, remove the previous household membership on the same household. This fix duplicate member.
|
||||||
|
* Add missing translation for comment field placeholder in repositionning household editor.
|
||||||
|
|
||||||
|
* Do not send an email to creator twice when adding a comment to a notification
|
||||||
|
* ([#107](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/107)) Fix gestion doublon functionality to work with chill bundles v2
|
||||||
|
### UX
|
||||||
|
* Uniformize badge-person in household banner (background, size)
|
||||||
|
|
||||||
|
|
||||||
|
## v2.5.3 - 2023-07-20
|
||||||
|
### Fixed
|
||||||
|
* ([#132](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/132)) Rendez-vous documents created would appear in all documents lists of all persons with an accompanying period. Or statements are now added to the where clause to filter out documents that come from unrelated accompanying period/ or person rendez-vous.
|
||||||
|
|
||||||
|
## v2.5.2 - 2023-07-15
|
||||||
|
### Fixed
|
||||||
|
* [Collate Address] when updating address point, do not use the point's address reference if the similarity is below the requirement for associating the address reference and the address (it uses the postcode's center instead)
|
||||||
|
|
||||||
|
## v2.5.1 - 2023-07-14
|
||||||
|
### Fixed
|
||||||
|
* [collate addresses] block collating addresses to another address reference where the address reference is already the best match
|
||||||
|
|
||||||
|
## v2.5.0 - 2023-07-14
|
||||||
|
### Feature
|
||||||
|
* Allow filtering on the basis of a user within general tasks lists
|
||||||
|
* ([#120](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/120)) Adding OrderFilter to the list of social actions.
|
||||||
|
* ([#125](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/125)) [export] Add a list for people with their associated course
|
||||||
|
* [export] Add ordering by person's lastname or course opening date in list which concerns accompanying course or peoples
|
||||||
|
* ([#128](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/128)) [Export] allow to group activities by localisation
|
||||||
|
* ([#129](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/129)) [export] Add a filter "filter course having an activity between two dates"
|
||||||
|
* ([#112](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/112)) [addresses] Add a cronjob to re-associate addresses with addresses reference every 6 hours
|
||||||
|
* Improve filtering layout
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
* reimplement the visualization of all calculator results
|
||||||
|
* ([#117](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/117)) Repair my unread notification list with actions and evaluations documents
|
||||||
|
* ([#126](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/126)) Correct bug in thirdparty API search query: simplify address joins clause for child and parent kind
|
||||||
|
|
||||||
|
### DX
|
||||||
|
* Documentation for database principles
|
||||||
|
* [cronjob] when a cronjob is executed, it may return an array of data that will be passed as argument on the next execution
|
||||||
|
|
||||||
|
### UX
|
||||||
|
* ([#93](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/93)) Better integration of address details button: look, position, title tag
|
||||||
|
* ([#93](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/93)) Show address detail button on person and household banners
|
||||||
|
* Improve residential address position on show onthefly modale
|
||||||
|
|
||||||
|
### Traduction francophone des principaux changements
|
||||||
|
|
||||||
|
* Ajout d'un filtre "par utilisateur" aux pages de tâche
|
||||||
|
* Filtre des actions d'accompagnement par date, type, intervenant
|
||||||
|
* export: liste des usagers concernés avec détail de leurs parcours
|
||||||
|
* export: ajout d'un regroupement des échanges par localisation
|
||||||
|
* export: ajout d'un filtre "parcours ayant reçu un échange entre deux dates"
|
||||||
|
* ajout d'une tâche cron pour associer les adresses à une adresse de référence
|
||||||
|
* correction: réparation de la liste des notifications sur la page d'accueil, dans le cas où une notification concerne une action ou un document dans une évaluation
|
||||||
|
* correction: réparation de la recherche des tiers ayant des codes postaux similaires entre les parents et enfants
|
||||||
|
* meilleure intégration du bouton "détail d'une adresse": améliration de la taille et de la position
|
||||||
|
* bouton permettant de visualiser les détails d'une adresse (modale avec carte) dans la bannière "Usager" et "Ménage"
|
||||||
|
* amélioration de la modale permettant de voir les détails d'un usager: les adresses de résidence sont dans la continuité des autres adresses, et non plus dans une colonne séparée
|
||||||
|
* améliore le design et l'expérience utilisateur des filtres
|
||||||
|
|
||||||
## v2.4.0 - 2023-07-07
|
## v2.4.0 - 2023-07-07
|
||||||
|
|
||||||
### Feature
|
### Feature
|
||||||
|
80
CONTRIBUTING.md
Normal file
80
CONTRIBUTING.md
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
Chill is an open source, community-driven project.
|
||||||
|
|
||||||
|
If you'd like to contribute, please read the following.
|
||||||
|
|
||||||
|
## What can you do ?
|
||||||
|
|
||||||
|
Chill is an open-source project driven by a community of developers, users and social workers. If you don't feel ready to contribute code or patches, reviewing issues and pull requests (PRs) can be a great start to get involved and give back.
|
||||||
|
|
||||||
|
If you don't have your own instance or don't want to use it, you can try to reproduce bugs using the instance https://demo.chill.social
|
||||||
|
|
||||||
|
## Core team
|
||||||
|
|
||||||
|
The core team is the group of developers that determine the direction and evolution of the Chill project. Their votes rule if the features and patches proposed by the community are approved or rejected.
|
||||||
|
|
||||||
|
All the Chill Core members are long-time contributors with solid technical expertise and they have demonstrated a strong commitment to drive the project forward.
|
||||||
|
|
||||||
|
The core team:
|
||||||
|
|
||||||
|
- elects his own members;
|
||||||
|
- merge pull requests;
|
||||||
|
|
||||||
|
### members
|
||||||
|
|
||||||
|
Project leader: [julienfastre](https://gitlab.com/julienfastre)
|
||||||
|
|
||||||
|
Core members:
|
||||||
|
|
||||||
|
- [tchama](https://gitlab.com/tchama)
|
||||||
|
- [LenaertsJ](https://gitlab.com/LenaertsJ)
|
||||||
|
- [nobohan](https://gitlab.com/nobohan)
|
||||||
|
|
||||||
|
### Becoming a project member
|
||||||
|
|
||||||
|
About once a year, the core team discusses the opportunity to invite new members. To become a core team member, you must:
|
||||||
|
|
||||||
|
- take part on the development for at least 6 month: propose multiple merge requests and participate to the peer review process;
|
||||||
|
- through this participation, demonstrate your technical skills and your knowledge of the software and any of their dependencies;
|
||||||
|
|
||||||
|
### Core Membership Revocation
|
||||||
|
|
||||||
|
A Chill Core membership can be revoked for any of the following reasons:
|
||||||
|
|
||||||
|
- Refusal to follow the rules and policies stated in this document;
|
||||||
|
- Lack of activity for the past six months;
|
||||||
|
- Willful negligence or intent to harm the Chill project;
|
||||||
|
|
||||||
|
The decision is taken by the majority of project members.
|
||||||
|
|
||||||
|
## Code development rules
|
||||||
|
|
||||||
|
### Merge requests
|
||||||
|
|
||||||
|
Every merge request must contains:
|
||||||
|
|
||||||
|
- one more entries suitable for generating a changelog. This is done using the [changie utility](https://changie.dev);
|
||||||
|
- a comprehensible description of the changes;
|
||||||
|
- if applicable, automated tests should be adapted or created;
|
||||||
|
- the code style must pass the project's rules, and non phpstan errors must be raised nor rector refactoring suggestion.
|
||||||
|
|
||||||
|
The pipelines must pass.
|
||||||
|
|
||||||
|
In case of emergency, some rules may be temporarily ignored.
|
||||||
|
|
||||||
|
### Merge Request Voting Policy
|
||||||
|
|
||||||
|
- -1 votes must always be justified by technical and objective reasons;
|
||||||
|
- +1 (technically: approbation on the merge request) votes do not require justification, unless there is at least one -1 vote;
|
||||||
|
- Core members can change their votes as many times as they desire during the course of a merge request discussion;
|
||||||
|
- Core members are not allowed to vote on their own merge requests.
|
||||||
|
|
||||||
|
### Merge Request Merging Process
|
||||||
|
|
||||||
|
All code must be committed to the repository through merge requests, except for minor changes which can be committed directly to the repository.
|
||||||
|
|
||||||
|
### Release Policy
|
||||||
|
|
||||||
|
The Core members are also the release manager for every Chill version.
|
||||||
|
|
@ -8,7 +8,8 @@
|
|||||||
"social worker"
|
"social worker"
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.4|^8.2",
|
"php": "^8.2",
|
||||||
|
"ext-dom": "*",
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"ext-openssl": "*",
|
"ext-openssl": "*",
|
||||||
"ext-redis": "*",
|
"ext-redis": "*",
|
||||||
@ -48,7 +49,6 @@
|
|||||||
"symfony/monolog-bundle": "^3.5",
|
"symfony/monolog-bundle": "^3.5",
|
||||||
"symfony/security-bundle": "^4.4",
|
"symfony/security-bundle": "^4.4",
|
||||||
"symfony/serializer": "^5.3",
|
"symfony/serializer": "^5.3",
|
||||||
"symfony/templating": "^4.4",
|
|
||||||
"symfony/translation": "^4.4",
|
"symfony/translation": "^4.4",
|
||||||
"symfony/twig-bundle": "^4.4",
|
"symfony/twig-bundle": "^4.4",
|
||||||
"symfony/validator": "^4.4",
|
"symfony/validator": "^4.4",
|
||||||
@ -76,7 +76,7 @@
|
|||||||
"phpunit/phpunit": ">= 7.5",
|
"phpunit/phpunit": ">= 7.5",
|
||||||
"psalm/plugin-phpunit": "^0.18.4",
|
"psalm/plugin-phpunit": "^0.18.4",
|
||||||
"psalm/plugin-symfony": "^4.0.2",
|
"psalm/plugin-symfony": "^4.0.2",
|
||||||
"rector/rector": "^0.15.23",
|
"rector/rector": "^1.1.0",
|
||||||
"symfony/debug-bundle": "^5.1",
|
"symfony/debug-bundle": "^5.1",
|
||||||
"symfony/dotenv": "^4.4",
|
"symfony/dotenv": "^4.4",
|
||||||
"symfony/maker-bundle": "^1.20",
|
"symfony/maker-bundle": "^1.20",
|
||||||
@ -98,7 +98,6 @@
|
|||||||
"Chill\\DocGeneratorBundle\\": "src/Bundle/ChillDocGeneratorBundle",
|
"Chill\\DocGeneratorBundle\\": "src/Bundle/ChillDocGeneratorBundle",
|
||||||
"Chill\\DocStoreBundle\\": "src/Bundle/ChillDocStoreBundle",
|
"Chill\\DocStoreBundle\\": "src/Bundle/ChillDocStoreBundle",
|
||||||
"Chill\\EventBundle\\": "src/Bundle/ChillEventBundle",
|
"Chill\\EventBundle\\": "src/Bundle/ChillEventBundle",
|
||||||
"Chill\\FamilyMemberBundle\\": "src/Bundle/ChillFamilyMemberBundle",
|
|
||||||
"Chill\\MainBundle\\": "src/Bundle/ChillMainBundle",
|
"Chill\\MainBundle\\": "src/Bundle/ChillMainBundle",
|
||||||
"Chill\\PersonBundle\\": "src/Bundle/ChillPersonBundle",
|
"Chill\\PersonBundle\\": "src/Bundle/ChillPersonBundle",
|
||||||
"Chill\\ReportBundle\\": "src/Bundle/ChillReportBundle",
|
"Chill\\ReportBundle\\": "src/Bundle/ChillReportBundle",
|
||||||
@ -110,7 +109,7 @@
|
|||||||
},
|
},
|
||||||
"autoload-dev": {
|
"autoload-dev": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"App\\": "tests/app/src/",
|
"App\\": "tests/",
|
||||||
"Chill\\DocGeneratorBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests",
|
"Chill\\DocGeneratorBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests",
|
||||||
"Chill\\WopiBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests",
|
"Chill\\WopiBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests",
|
||||||
"Chill\\Utils\\Rector\\Tests\\": "utils/rector/tests"
|
"Chill\\Utils\\Rector\\Tests\\": "utils/rector/tests"
|
||||||
@ -123,16 +122,15 @@
|
|||||||
"ocramius/package-versions": true,
|
"ocramius/package-versions": true,
|
||||||
"phpro/grumphp": true,
|
"phpro/grumphp": true,
|
||||||
"phpstan/extension-installer": true,
|
"phpstan/extension-installer": true,
|
||||||
"roave/you-are-using-it-wrong": true
|
"roave/you-are-using-it-wrong": true,
|
||||||
|
"symfony/runtime": true
|
||||||
},
|
},
|
||||||
"bin-dir": "bin",
|
"bin-dir": "bin",
|
||||||
"optimize-autoloader": true,
|
"optimize-autoloader": true,
|
||||||
"sort-packages": true,
|
"sort-packages": true
|
||||||
"vendor-dir": "tests/app/vendor"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"auto-scripts": {
|
"auto-scripts": {
|
||||||
"assets:install %PUBLIC_DIR%": "symfony-cmd",
|
|
||||||
"cache:clear": "symfony-cmd"
|
"cache:clear": "symfony-cmd"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ To compile this documentation :
|
|||||||
Contribute
|
Contribute
|
||||||
===========
|
===========
|
||||||
|
|
||||||
Issue tracker : https://git.framasoft.org/groups/Chill-project/issues
|
Issue tracker : https://gitlab.com/Chill-Projet/chill-bundles/-/issues
|
||||||
|
|
||||||
Licence
|
Licence
|
||||||
=======
|
=======
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
docutils==0.13.1
|
docutils==0.13.1
|
||||||
Pygments==2.2.0
|
Pygments==2.2.0
|
||||||
sphinx==1.8.5
|
sphinx==1.8.5
|
||||||
|
Jinja2<3.1
|
||||||
git+https://github.com/fabpot/sphinx-php.git@v2.0.2#egg_name=sphinx-php
|
git+https://github.com/fabpot/sphinx-php.git@v2.0.2#egg_name=sphinx-php
|
||||||
jsx-lexer===0.0.8
|
jsx-lexer===0.0.8
|
||||||
sphinx_rtd_theme==0.5.0
|
sphinx_rtd_theme==0.5.0
|
||||||
|
@ -54,18 +54,9 @@ class CountPerson implements ExportInterface
|
|||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
// the Closure which will be executed by the formatter.
|
// the Closure which will be executed by the formatter.
|
||||||
return function ($value) {
|
return fn($value) => match ($value) {
|
||||||
switch ($value) {
|
'_header' => $this->getTitle(),
|
||||||
case '_header':
|
default => $value,
|
||||||
// we have to process specifically the '_header' string,
|
|
||||||
// which will be used by the formatter to show a column title
|
|
||||||
return $this->getTitle();
|
|
||||||
|
|
||||||
default:
|
|
||||||
// for all value, we do not process them and return them
|
|
||||||
// immediatly
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
36
docs/source/development/FAQ.rst
Normal file
36
docs/source/development/FAQ.rst
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
.. Copyright (C) 2014 Champs Libres Cooperative SCRLFS
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
.. _faq:
|
||||||
|
|
||||||
|
|
||||||
|
Frequently asked questions
|
||||||
|
####################
|
||||||
|
|
||||||
|
Continuous integration
|
||||||
|
***********
|
||||||
|
|
||||||
|
Pipeline fails, but php-cs-fixer doesn't alert me when running it locally ?
|
||||||
|
========================================
|
||||||
|
|
||||||
|
It is possible that you run php-cs-fixer on your local instance of chill and no fixes are made.
|
||||||
|
Everything seems fine, so you push. However once the pipeline is run in gitlab, you're notified that it failed due to php
|
||||||
|
cs errors.
|
||||||
|
|
||||||
|
In this case it's likely that you have to update your version of php-cs-fixer.
|
||||||
|
php-cs-fixer is installed when building the docker image: https://gitea.champs-libres.be/Chill-project/chill-skeleton-basic/src/branch/main/Dockerfile#L50
|
||||||
|
|
||||||
|
Consequently, to update php-cs-fixer we have to update the image by building it again.
|
||||||
|
|
||||||
|
For this the following commands can be used,
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
docker compose build --pull php
|
||||||
|
# replace existing containers
|
||||||
|
docker compose up -d --force-recreate php
|
84
docs/source/development/database-principles.rst
Normal file
84
docs/source/development/database-principles.rst
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
|
||||||
|
.. database-principles:
|
||||||
|
|
||||||
|
Principes de la base de données
|
||||||
|
###############################
|
||||||
|
|
||||||
|
Cette page donne une compréhension globale de la base de donnée de Chill, et explique quelques détails d'implémentations qui permettent d'accélérer les traitements à partir de la base de donnée, ou de l'exploiter plus aisément.
|
||||||
|
|
||||||
|
Cette page est rédigée en français.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
La stabilité du schéma de la base de donnée n'est pas garantie.
|
||||||
|
|
||||||
|
Toutefois, ce dernier évolue relativement peu. Il est rare que des tables ou des colonnes soient supprimées ou renommées. Mais il n'est pas garanti que cela puisse arriver.
|
||||||
|
|
||||||
|
Généralités
|
||||||
|
===========
|
||||||
|
|
||||||
|
Une liste commentée de toutes les tables :download:`est disponible au format CSV <./database/table_list.csv`.
|
||||||
|
|
||||||
|
Schéma et conventions de nommage
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
Au début de l'histoire de Chill, les schémas postgresql n'étaient pas exploités. Les données étaient stockées dans le schéma :code:`public`.
|
||||||
|
|
||||||
|
Par la suite, des nouveaux bundles sont apparus, et les tables ont été classées dans des schémas dédiés.
|
||||||
|
|
||||||
|
A l'heure actuelle:
|
||||||
|
|
||||||
|
- pour les anciens bundle, ceux qui ont déjà des tables dans le schéma public, les nouvelles tables sont ajoutées à ce schéma. Elles sont préfixées par :code:`chill_<nom du bundle>_`;
|
||||||
|
- pour les bundles plus récents, les tables sont créées dans le schéma dédié
|
||||||
|
|
||||||
|
Données avec de l'historicité
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
Certaines données sont historisées:
|
||||||
|
|
||||||
|
- les référents d'un parcours;
|
||||||
|
- les statuts d'un parcours;
|
||||||
|
- la liaison entre les centres et les usagers;
|
||||||
|
- 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 certains cas, la donnée actuelle (référent d'un parcours, par exemple) est également répétée au niveau de la table en elle-même. Par exemple, la table des parcours :code:`chill_person_accompanying_period` comporte une colonne :code:`step` (le statut du parcours) et :code:`user_id` (id du référent) en plus de l'historique. Bien que redondant, cela simplifie les traitements.
|
||||||
|
|
||||||
|
Relations particulières
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Usagers, ménages, adresses
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Les usagers ont une adresse au travers des ménages: dans l'interface, l'adresse est inscrite dans le dossier du ménage, et elle est "donnée" aux usagers membres du ménage, **et** qui partagent l'adresse de ce ménage. En effet, il est possible que des usagers "appartiennent" à un ménage sans y être domicilié: c'est le cas, par exemple, des enfants en garde alternée.
|
||||||
|
|
||||||
|
L'historique de l'appartenance des usagers au ménage est conservée, de même que l'historique des adresses pour un même ménage.
|
||||||
|
|
||||||
|
Les tables en jeu sont les suivantes:
|
||||||
|
|
||||||
|
- la table :code:`chill_person_person` liste les usagers;
|
||||||
|
- la table :code:`chill_person_household_members` liste les appartenances au ménage: il s'agit de la jointure entre les usagers et les ménages:
|
||||||
|
- les colonnes :code:`startDate` et :code:`endDate` indiquent la date de début et la date de fin de l'appartenance;
|
||||||
|
- la colonne :code:`shareHousehold` indique si l'utilisateur partage l'adresse du ménage (si oui, sa valeur est :code:`TRUE`)
|
||||||
|
- la table :code:`chill_person_household` liste les ménages
|
||||||
|
- la table :code:`chill_person_household_to_addresses` associe les ménages aux adresses;
|
||||||
|
- la table :code:`chill_main_address` contient les adresses, en indiquant la date de début de validité (:code:`validFrom`) et la fin de validité (:code:`validTo`).
|
||||||
|
|
||||||
|
Pour simplifier la résolution des adresses et des usagers, deux vues ont été mises en œuvre:
|
||||||
|
|
||||||
|
- la vue :code:`view_chill_person_household_address` reprend, pour chaque usager, l'historique des appartenances au ménage découpée par l'historique des adresses d'un ménage.
|
||||||
|
Autrement dit, une ligne est créée à chaque fois qu'un usager change de ménage, ou qu'un ménage change d'adresse. Il est donc possible de retrouver l'historique complet des adresses pour un usager donné via cette table.
|
||||||
|
- la vue :code:`view_chill_person_current_address` reprend l'adresse actuelle des usagers.
|
||||||
|
|
||||||
|
Adresses et unités géographiques
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
Chill propose des statistiques sur la localisation des adresses par rapport à des zones géographiques (:code:`chill_main_geographical_unit`).
|
||||||
|
|
||||||
|
Comme la résolution géographique des adresses est coûteuse en CPU et en temps de traitement, une vue matérialisée a été créée: :code:`view_chill_main_address_geographical_unit`. Elle est rafraichie quotidiennement dans la base de donnée de production.
|
||||||
|
|
||||||
|
Liste des tables et commentaires
|
||||||
|
================================
|
||||||
|
|
||||||
|
Une liste commentée de toutes les tables :download:`est disponible au format CSV <./database/table_list.csv`.
|
155
docs/source/development/database/table_list.csv
Normal file
155
docs/source/development/database/table_list.csv
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
order,table_schema,table_name,commentaire
|
||||||
|
1,chill_3party,party_category,Catégorie de tiers
|
||||||
|
2,chill_3party,party_center,Association entre les tiers et les centres (déprécié)
|
||||||
|
3,chill_3party,party_profession,Profession du tiers (déprécié)
|
||||||
|
4,chill_3party,third_party,Tiers
|
||||||
|
5,chill_3party,thirdparty_category,association tiers - catégories
|
||||||
|
6,chill_asideactivity,asideactivity,Activités annexes
|
||||||
|
7,chill_asideactivity,asideactivitycategory,Catégories d'activités annexes
|
||||||
|
8,chill_budget,charge,Charges du budget
|
||||||
|
9,chill_budget,charge_type,Types de charges
|
||||||
|
10,chill_budget,resource,Ressources du budget
|
||||||
|
11,chill_budget,resource_type,Types de ressources
|
||||||
|
12,chill_calendar,calendar,Rendez-vous
|
||||||
|
13,chill_calendar,calendar_doc,Document du rendez-vous
|
||||||
|
14,chill_calendar,calendar_range,Plage de disponibilité
|
||||||
|
15,chill_calendar,calendar_to_persons,association rendez-vous - usagers
|
||||||
|
16,chill_calendar,calendar_to_thirdparties,association rendez-vous - tiers
|
||||||
|
17,chill_calendar,cancel_reason,Motifs d'annulations
|
||||||
|
18,chill_calendar,invite,Invitation aux rendez-vous
|
||||||
|
19,chill_doc,accompanyingcourse_document,Documents associés aux parcours
|
||||||
|
20,chill_doc,document_category,Catégories de documents
|
||||||
|
21,chill_doc,person_document,Documents associés à l'usagers
|
||||||
|
22,chill_doc,stored_object,Documents
|
||||||
|
23,chill_task,recurring_task,Tâches récurrentes (non utilisé)
|
||||||
|
24,chill_task,single_task,Tâches
|
||||||
|
25,chill_task,single_task_place_event,Historique des transitions des tâches
|
||||||
|
26,chill_vendee,adressederelais,
|
||||||
|
27,chill_vendee,center_polygon
|
||||||
|
28,chill_vendee,entourage,
|
||||||
|
29,chill_vendee,geographical_unit
|
||||||
|
30,chill_vendee,geographical_unit_association
|
||||||
|
31,chill_vendee,mobilite
|
||||||
|
32,chill_vendee,niveauetude
|
||||||
|
33,chill_vendee,security_profile
|
||||||
|
34,chill_vendee,security_profile_action
|
||||||
|
35,chill_vendee,security_profile_jobs
|
||||||
|
36,chill_vendee,situationprofessionelle
|
||||||
|
37,chill_vendee,statutlogement
|
||||||
|
38,chill_vendee,tempsdetravail
|
||||||
|
39,chill_vendee,titredesejour
|
||||||
|
40,chill_vendee,vendee_person
|
||||||
|
41,chill_vendee,vendee_person_mineur
|
||||||
|
42,chill_vendee,vendeeperson_entourage
|
||||||
|
43,chill_vendee,vendeepersonmineur_adressederelais
|
||||||
|
44,public,accompanying_periods_scopes,Services associés aux parcours
|
||||||
|
45,public,activity,Échanges
|
||||||
|
46,public,activity_activityreason,s
|
||||||
|
47,public,activity_person,
|
||||||
|
48,public,activity_storedobject,
|
||||||
|
49,public,activity_thirdparty,
|
||||||
|
50,public,activity_user,
|
||||||
|
51,public,activityreason,Sujets d'échange
|
||||||
|
52,public,activityreasoncategory,Catégories de sujets
|
||||||
|
53,public,activitytpresence,Présence aux échanges
|
||||||
|
54,public,activitytype,Types d'échanges
|
||||||
|
55,public,activitytypecategory,Catégories de types d'échanges
|
||||||
|
56,public,centers,"Centres (territoires, agences, etc.)"
|
||||||
|
57,public,chill_activity_activity_chill_person_socialaction,
|
||||||
|
58,public,chill_activity_activity_chill_person_socialissue
|
||||||
|
59,public,chill_docgen_template,Gabarits de documents
|
||||||
|
60,public,chill_main_address,Adresses
|
||||||
|
61,public,chill_main_address_legacy,Anciennes adresses (dépréciés)
|
||||||
|
62,public,chill_main_address_reference,Adresses de référence
|
||||||
|
63,public,chill_main_civility,Civilités
|
||||||
|
64,public,chill_main_cronjob_execution,Dernière exécution des tâche cron
|
||||||
|
65,public,chill_main_geographical_unit,Unités géographiques
|
||||||
|
66,public,chill_main_geographical_unit_layer,Couches d'unités géographiques
|
||||||
|
67,public,chill_main_location,Localisations
|
||||||
|
68,public,chill_main_location_type,Types de localisations
|
||||||
|
69,public,chill_main_notification,Notifications
|
||||||
|
70,public,chill_main_notification_addresses_unread
|
||||||
|
71,public,chill_main_notification_addresses_user
|
||||||
|
72,public,chill_main_notification_comment,
|
||||||
|
73,public,chill_main_postal_code,Code postaux
|
||||||
|
74,public,chill_main_saved_export,Exports enregistrés
|
||||||
|
75,public,chill_main_user_job,Métiers
|
||||||
|
76,public,chill_main_workflow_entity,Workflows
|
||||||
|
77,public,chill_main_workflow_entity_comment
|
||||||
|
78,public,chill_main_workflow_entity_step,Etapes du workflow
|
||||||
|
79,public,chill_main_workflow_entity_step_cc_user,
|
||||||
|
80,public,chill_main_workflow_entity_step_user
|
||||||
|
81,public,chill_main_workflow_entity_step_user_by_accesskey,
|
||||||
|
82,public,chill_main_workflow_entity_subscriber_to_final,
|
||||||
|
83,public,chill_main_workflow_entity_subscriber_to_step
|
||||||
|
84,public,chill_person_accompanying_period,Parcours d'accompagnement
|
||||||
|
85,public,chill_person_accompanying_period_closingmotive,Motifs de cloture des parcours
|
||||||
|
86,public,chill_person_accompanying_period_comment,Commentaires des parcours
|
||||||
|
87,public,chill_person_accompanying_period_location_history,Historique de la localisatio ndes parcours
|
||||||
|
88,public,chill_person_accompanying_period_origin,Origine des parcours
|
||||||
|
89,public,chill_person_accompanying_period_participation,Appartenance des usagers au parcours
|
||||||
|
90,public,chill_person_accompanying_period_resource,Personnes ressources d'un parcours
|
||||||
|
91,public,chill_person_accompanying_period_social_issues,
|
||||||
|
92,public,chill_person_accompanying_period_step_history
|
||||||
|
93,public,chill_person_accompanying_period_user_history
|
||||||
|
94,public,chill_person_accompanying_period_work,Actions d'accompagnements
|
||||||
|
95,public,chill_person_accompanying_period_work_evaluation,Évaluations (dans les actions d'accompagnements)
|
||||||
|
96,public,chill_person_accompanying_period_work_evaluation_document,Documents des évaluations
|
||||||
|
97,public,chill_person_accompanying_period_work_goal,Objectifs d'une actions
|
||||||
|
98,public,chill_person_accompanying_period_work_goal_result,Objectifs et résultats d'une action
|
||||||
|
99,public,chill_person_accompanying_period_work_person,Usagers associés à une actions
|
||||||
|
100,public,chill_person_accompanying_period_work_referrer,Référents d'une actions
|
||||||
|
101,public,chill_person_accompanying_period_work_result,Résultats d'une action
|
||||||
|
102,public,chill_person_accompanying_period_work_third_party,Tiers traitants d'une action
|
||||||
|
103,public,chill_person_alt_name,"Noms supplémentaires d'un usager (nom marital, etc.)"
|
||||||
|
104,public,chill_person_household,Ménages
|
||||||
|
105,public,chill_person_household_composition,
|
||||||
|
106,public,chill_person_household_composition_type,Types de composition de ménage
|
||||||
|
107,public,chill_person_household_members,Membres du ménages
|
||||||
|
108,public,chill_person_household_position,Positions dans le ménage
|
||||||
|
109,public,chill_person_household_to_addresses,Association adresses - ménages
|
||||||
|
110,public,chill_person_marital_status,Etats civils
|
||||||
|
111,public,chill_person_not_duplicate,
|
||||||
|
112,public,chill_person_person,Usagers
|
||||||
|
113,public,chill_person_person_center_history,Historique des centres d'un usagers
|
||||||
|
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
|
||||||
|
116,public,chill_person_relations,Types de relations de filiation
|
||||||
|
117,public,chill_person_relationships,Relations de filiations
|
||||||
|
118,public,chill_person_residential_address,Adresses de résidences
|
||||||
|
119,public,chill_person_resource,Personnes ressources (pour les personnes)
|
||||||
|
120,public,chill_person_resource_kind,Type de personnes ressources
|
||||||
|
121,public,chill_person_social_action,Liste des actions d'accompagnement
|
||||||
|
122,public,chill_person_social_action_goal,Objectifs associés à une action
|
||||||
|
123,public,chill_person_social_action_result,Résultats associés à une action
|
||||||
|
124,public,chill_person_social_issue,Problématiques sociales
|
||||||
|
125,public,chill_person_social_work_evaluation,Evaluations disponibles
|
||||||
|
126,public,chill_person_social_work_evaluation_action,Associations entre les évaluations et les actions
|
||||||
|
127,public,chill_person_social_work_goal,Objectifs disponibles pour une actions
|
||||||
|
128,public,chill_person_social_work_goal_result,Objectifs et résultats disponible pour une action
|
||||||
|
129,public,chill_person_social_work_result,Résultats disponibles pour une action
|
||||||
|
130,public,country,Pays
|
||||||
|
131,public,custom_field_long_choice_options,
|
||||||
|
132,public,customfield
|
||||||
|
133,public,customfieldsdefaultgroup
|
||||||
|
134,public,customfieldsgroup
|
||||||
|
135,public,geography_columns,Table liée à postgis
|
||||||
|
136,public,geometry_columns,Table liée à postgis
|
||||||
|
137,public,group_centers,
|
||||||
|
138,public,language,Langues
|
||||||
|
139,public,messenger_messages,Table système
|
||||||
|
140,public,migration_versions,Table système
|
||||||
|
141,public,permission_groups
|
||||||
|
142,public,permissionsgroup_rolescope
|
||||||
|
143,public,persons_spoken_languages
|
||||||
|
144,public,regroupment,Regroupement de centres
|
||||||
|
145,public,regroupment_center,
|
||||||
|
146,public,role_scopes,
|
||||||
|
147,public,scopes,Services
|
||||||
|
148,public,spatial_ref_sys,Table système (postgis)
|
||||||
|
149,public,user_groupcenter,
|
||||||
|
150,public,users,Utilisateurs
|
||||||
|
151,public,view_chill_person_accompanying_period_info,
|
||||||
|
152,public,view_chill_person_current_address
|
||||||
|
153,public,view_chill_person_household_address
|
||||||
|
154,public,view_chill_person_person_center_history_current
|
Can't render this file because it has a wrong number of fields in line 28.
|
@ -242,3 +242,129 @@ This is an example of the *filter by birthdate*. This filter asks some informati
|
|||||||
Continue to explain the export framework
|
Continue to explain the export framework
|
||||||
|
|
||||||
.. _main bundle: https://git.framasoft.org/Chill-project/Chill-Main
|
.. _main bundle: https://git.framasoft.org/Chill-project/Chill-Main
|
||||||
|
|
||||||
|
|
||||||
|
With many-to-* relationship, why should we set WHERE clauses in an EXISTS subquery instead of a JOIN ?
|
||||||
|
``````````````````````````````````````````````````````````````````````````````````````````````````````
|
||||||
|
|
||||||
|
As we described above, the doctrine builder is converted into a sql query. Let's see how to compute the "number of course
|
||||||
|
which count at least one activity type with the id 7". For the purpose of this demonstration, we will restrict this on
|
||||||
|
two accompanying period only: the ones with id 329 and 334.
|
||||||
|
|
||||||
|
Let's see the list of activities associated with those accompanying period:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
SELECT id, accompanyingperiod_id, type_id FROM activity WHERE accompanyingperiod_id IN (329, 334) AND type_id = 7
|
||||||
|
ORDER BY accompanyingperiod_id;
|
||||||
|
|
||||||
|
We see that we have 6 activities for the accompanying period with id 329, and only one for the 334's one.
|
||||||
|
|
||||||
|
.. csv-table::
|
||||||
|
:header: id, accompanyingperiod_id, type_id
|
||||||
|
|
||||||
|
990,329,7
|
||||||
|
986,329,7
|
||||||
|
987,329,7
|
||||||
|
993,329,7
|
||||||
|
991,329,7
|
||||||
|
992,329,7
|
||||||
|
1000,334,7
|
||||||
|
|
||||||
|
Let's calculate the average duration for those accompanying periods, and the number of period:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
SELECT AVG(age(COALESCE(closingdate, CURRENT_DATE), openingdate)), COUNT(id) from chill_person_accompanying_period WHERE id IN (329, 334);
|
||||||
|
|
||||||
|
The result of this query is:
|
||||||
|
|
||||||
|
.. csv-table::
|
||||||
|
:header: AVG, COUNT
|
||||||
|
|
||||||
|
2 years 2 mons 21 days 12 hours 0 mins 0.0 secs,2
|
||||||
|
|
||||||
|
Now, we count the number of accompanying period, adding a :code:`JOIN` clause which make a link to the :code:`activity` table, and add a :code:`WHERE` clause to keep
|
||||||
|
only the accompanying period which contains the given activity type:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
SELECT COUNT(chill_person_accompanying_period.id) from chill_person_accompanying_period
|
||||||
|
JOIN activity ON chill_person_accompanying_period.id = activity.accompanyingperiod_id
|
||||||
|
WHERE chill_person_accompanying_period.id IN (329, 334) AND activity.type_id = 7;
|
||||||
|
|
||||||
|
What are the results here ?
|
||||||
|
|
||||||
|
.. csv-table::
|
||||||
|
:header: COUNT
|
||||||
|
|
||||||
|
7
|
||||||
|
|
||||||
|
:code:`7` ! Why this result ? Because the number of lines is duplicated for each activity. Let's see the list of rows which
|
||||||
|
are taken into account for the computation:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
SELECT chill_person_accompanying_period.id, activity.id from chill_person_accompanying_period
|
||||||
|
JOIN activity ON chill_person_accompanying_period.id = activity.accompanyingperiod_id
|
||||||
|
WHERE chill_person_accompanying_period.id IN (329, 334) AND activity.type_id = 7;
|
||||||
|
|
||||||
|
.. csv-table::
|
||||||
|
:header: accompanyingperiod.id, activity.id
|
||||||
|
|
||||||
|
329,993
|
||||||
|
334,1000
|
||||||
|
329,987
|
||||||
|
329,990
|
||||||
|
329,991
|
||||||
|
329,992
|
||||||
|
329,986
|
||||||
|
|
||||||
|
For each activity, a row is created and, as we count the number of non-null :code:`accompanyingperiod.id` columns, we
|
||||||
|
count one entry for each activity (actually, we count the number of activities).
|
||||||
|
|
||||||
|
So, let's use the :code:`DISTINCT` keyword to count only once the equal ids:
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
SELECT COUNT(DISTINCT chill_person_accompanying_period.id) from chill_person_accompanying_period
|
||||||
|
JOIN activity ON chill_person_accompanying_period.id = activity.accompanyingperiod_id
|
||||||
|
WHERE chill_person_accompanying_period.id IN (329, 334) AND activity.type_id = 7;
|
||||||
|
|
||||||
|
Now, it works again...
|
||||||
|
|
||||||
|
.. csv-table::
|
||||||
|
:header: COUNT
|
||||||
|
|
||||||
|
2
|
||||||
|
|
||||||
|
But, for the average duration, this won't work: the duration which are equals (because the :code:`openingdate` is the same and
|
||||||
|
:code:`closingdate` is still :code:`NULL`, for instance) will be counted only once, which will give unexpected result.
|
||||||
|
|
||||||
|
The solution is to move the condition "having an activity with activity type with id 7" in a :code:`EXISTS` clause:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
SELECT COUNT(chill_person_accompanying_period.id) from chill_person_accompanying_period
|
||||||
|
WHERE chill_person_accompanying_period.id IN (329, 334) AND EXISTS (SELECT 1 FROM activity WHERE type_id = 7 AND accompanyingperiod_id = chill_person_accompanying_period.id);
|
||||||
|
|
||||||
|
The result is correct without :code:`DISTINCT` keyword:
|
||||||
|
|
||||||
|
.. csv-table::
|
||||||
|
:header: COUNT
|
||||||
|
|
||||||
|
2
|
||||||
|
|
||||||
|
And we can now compute the average duration without fear:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
SELECT AVG(age(COALESCE(closingdate, CURRENT_DATE), openingdate)) from chill_person_accompanying_period
|
||||||
|
WHERE chill_person_accompanying_period.id IN (329, 334) AND EXISTS (SELECT 1 FROM activity WHERE type_id = 7 AND accompanyingperiod_id = chill_person_accompanying_period.id);
|
||||||
|
|
||||||
|
Give the result:
|
||||||
|
|
||||||
|
.. csv-table::
|
||||||
|
:header: AVG
|
||||||
|
|
||||||
|
2 years 2 mons 21 days 12 hours 0 mins 0.0 secs
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
Development
|
Development
|
||||||
###########
|
###########
|
||||||
|
|
||||||
As Chill rely on the `symfony <http://symfony.com>`_ framework, reading the framework's documentation should answer most of your questions. We are explaining here some tips to work with Chill, and things we provide to encounter our needs.
|
As Chill relies on the `symfony <http://symfony.com>`_ framework, reading the framework's documentation should answer most of your questions. We are explaining here some tips to work with Chill, and help with things we've encountered.
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
@ -36,6 +36,8 @@ As Chill rely on the `symfony <http://symfony.com>`_ framework, reading the fram
|
|||||||
Assets <assets.rst>
|
Assets <assets.rst>
|
||||||
Cron Jobs <cronjob.rst>
|
Cron Jobs <cronjob.rst>
|
||||||
Info about entities <entity-info.rst>
|
Info about entities <entity-info.rst>
|
||||||
|
Info about database (in French) <database-principles.rst>
|
||||||
|
Developer FAQ <FAQ.rst>
|
||||||
|
|
||||||
Layout and UI
|
Layout and UI
|
||||||
**************
|
**************
|
||||||
|
@ -13,7 +13,7 @@ namespace Chill\MyBundle\Controller;
|
|||||||
|
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||||
|
|
||||||
class example extends Controller
|
class example extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController
|
||||||
{
|
{
|
||||||
public function yourAction()
|
public function yourAction()
|
||||||
{
|
{
|
||||||
|
@ -16,7 +16,7 @@ use Chill\PersonBundle\Security\Authorization\PersonVoter;
|
|||||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||||
use Symfony\Component\Security\Core\Role\Role;
|
use Symfony\Component\Security\Core\Role\Role;
|
||||||
|
|
||||||
class ConsultationController extends Controller
|
class ConsultationController extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param int $id personId
|
* @param int $id personId
|
||||||
@ -43,7 +43,7 @@ class ConsultationController extends Controller
|
|||||||
|
|
||||||
$circles = $authorizationHelper->getReachableCircles(
|
$circles = $authorizationHelper->getReachableCircles(
|
||||||
$this->getUser(),
|
$this->getUser(),
|
||||||
new Role(ConsultationVoter::SEE),
|
ConsultationVoter::SEE,
|
||||||
$person->getCenter()
|
$person->getCenter()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -23,25 +23,18 @@ class ChillMainConfiguration implements ConfigurationInterface
|
|||||||
{
|
{
|
||||||
use AddWidgetConfigurationTrait;
|
use AddWidgetConfigurationTrait;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var ContainerBuilder
|
|
||||||
*/
|
|
||||||
private $containerBuilder;
|
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
array $widgetFactories,
|
array $widgetFactories,
|
||||||
ContainerBuilder $containerBuilder
|
private readonly ContainerBuilder $containerBuilder
|
||||||
) {
|
) {
|
||||||
// we register here widget factories (see below)
|
// we register here widget factories (see below)
|
||||||
$this->setWidgetFactories($widgetFactories);
|
$this->setWidgetFactories($widgetFactories);
|
||||||
// we will need the container builder later...
|
|
||||||
$this->containerBuilder = $containerBuilder;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getConfigTreeBuilder()
|
public function getConfigTreeBuilder()
|
||||||
{
|
{
|
||||||
$treeBuilder = new TreeBuilder();
|
$treeBuilder = new TreeBuilder('chill_main');
|
||||||
$rootNode = $treeBuilder->root('chill_main');
|
$rootNode = $treeBuilder->getRootNode();
|
||||||
|
|
||||||
$rootNode
|
$rootNode
|
||||||
->children()
|
->children()
|
||||||
|
@ -87,7 +87,7 @@ class ChillPersonAddAPersonWidget implements WidgetInterface
|
|||||||
// show only the person from the authorized centers
|
// show only the person from the authorized centers
|
||||||
$and = $qb->expr()->andX();
|
$and = $qb->expr()->andX();
|
||||||
$centers = $this->authorizationHelper
|
$centers = $this->authorizationHelper
|
||||||
->getReachableCenters($this->getUser(), new Role(PersonVoter::SEE));
|
->getReachableCenters($this->getUser(), PersonVoter::SEE);
|
||||||
$and->add($qb->expr()->in('person.center', ':centers'));
|
$and->add($qb->expr()->in('person.center', ':centers'));
|
||||||
$qb->setParameter('centers', $centers);
|
$qb->setParameter('centers', $centers);
|
||||||
|
|
||||||
|
@ -48,8 +48,8 @@ Clone or download the chill-skeleton project and `cd` into the main directory.
|
|||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
git clone https://gitlab.com/Chill-Projet/chill-skeleton-basic.git
|
git clone https://gitea.champs-libres.be/Chill-project/chill-skeleton-basic.git
|
||||||
cd chill-app
|
cd chill-skeleton-basic
|
||||||
|
|
||||||
|
|
||||||
As a developer, the code will stay on your computer and will be executed in docker container. To avoid permission problem, the code should be run with the same uid/gid from your current user. This is why we get your current user id with the command ``id -u`` in each following scripts.
|
As a developer, the code will stay on your computer and will be executed in docker container. To avoid permission problem, the code should be run with the same uid/gid from your current user. This is why we get your current user id with the command ``id -u`` in each following scripts.
|
||||||
|
@ -8,6 +8,16 @@ Chill can store a list of geolocated address references, which are used to sugge
|
|||||||
|
|
||||||
Those addresses may be load from a dedicated source.
|
Those addresses may be load from a dedicated source.
|
||||||
|
|
||||||
|
Countries
|
||||||
|
=========
|
||||||
|
|
||||||
|
In order to load addresses into the chill application we first have to make sure that a list of countries is present.
|
||||||
|
To import the countries run the following command.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
bin/console chill:main:countries:populate
|
||||||
|
|
||||||
In France
|
In France
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
|
|
||||||
Configure Chill for calendar sync and SSO with Microsoft Graph (Outlook)
|
Configure Chill for calendar and absence synchronisation and SSO with Microsoft Graph (Outlook)
|
||||||
========================================================================
|
===============================================================================================
|
||||||
|
|
||||||
Chill offers the possibility to:
|
Chill offers the possibility to:
|
||||||
|
|
||||||
* authenticate users using Microsoft Graph, with relatively small adaptations;
|
* authenticate users using Microsoft Graph, with relatively small adaptations;
|
||||||
* synchronize calendar in both ways (`see the user manual for a large description of the feature <https://gitea.champs-libres.be/Chill-project/manuals>`_).
|
* synchronize calendar in both ways (`see the user manual for a large description of the feature <https://gitea.champs-libres.be/Chill-project/manuals>`_).
|
||||||
|
|
||||||
Both can be configured separately (synchronising calendars without SSO, or SSO without calendar). When calendar sync is configured without SSL, the user's email address is the key to associate Chill's users with Microsoft's ones.
|
Both can be configured separately (synchronising calendars without SSO, or SSO without calendar).
|
||||||
|
|
||||||
|
Please note that the user's email address is the key to associate Chill's users with Microsoft's ones.
|
||||||
|
|
||||||
Configure SSO
|
Configure SSO
|
||||||
-------------
|
-------------
|
||||||
@ -186,12 +188,19 @@ Configure chill app
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Configure sync
|
Configure sync and calendar access
|
||||||
--------------
|
----------------------------------
|
||||||
|
|
||||||
The sync processe might be configured in the same app, or into a different app.
|
The purpose of this configuration is the following:
|
||||||
|
|
||||||
The synchronization processes use Oauth2.0 for authentication and authorization.
|
- let user read their calendar and shared calendar within Chill (with the same permissions as the one configured in Outlook / Azure);
|
||||||
|
- allow chill instance to write appointment ("Rendez-vous") into their calendar, and invite other users to their appointment;
|
||||||
|
- allow chill instance to be notified if an appoint is added or removed by the user within another interface than Chill: if the appointment match another one created in the Chill interface, the date and time are updated in Chill;
|
||||||
|
- allow chill instance to read the absence of the user and, if set, mark the user as absent in Chill;
|
||||||
|
|
||||||
|
The sync processe might be configured in the same app, or into a different app on the Azure side.
|
||||||
|
|
||||||
|
The synchronization processes use Oauth 2.0 / OpenID Connect for authentication and authorization.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
@ -229,8 +238,9 @@ Some explanation:
|
|||||||
The sync daemon must have write access:
|
The sync daemon must have write access:
|
||||||
|
|
||||||
* the daemon must be allowed to read all users and their profile, to establish a link between them and the Chill's users: (:code:`Users.Read.All`);
|
* the daemon must be allowed to read all users and their profile, to establish a link between them and the Chill's users: (:code:`Users.Read.All`);
|
||||||
* it must also be allowed to read and write into the calendars (:code:`Calendars.ReadWrite.All`)
|
* it must also be allowed to read and write into the calendars (:code:`Calendars.ReadWrite.All`);
|
||||||
* for sending invitation to other users, the permission (:code:`Mail.Send`) must be granted.
|
* for sending invitation to other users, the permission (:code:`Mail.Send`) must be granted;
|
||||||
|
* and, for reading the absence status of the user and sync it with chill, it must be able to read the mailboxSettings (:code:`MailboxSettings.Read`).
|
||||||
|
|
||||||
At this step, you might choose to accept those permissions for all users, or let them do it by yourself.
|
At this step, you might choose to accept those permissions for all users, or let them do it by yourself.
|
||||||
|
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 166 KiB |
@ -1,63 +0,0 @@
|
|||||||
Entity,Join,Attribute,Alias
|
|
||||||
AccompanyingPeriod::class,,,acp
|
|
||||||
,AccompanyingPeriodWork::class,acp.works,acpw
|
|
||||||
,AccompanyingPeriodParticipation::class,acp.participations,acppart
|
|
||||||
,Location::class,acp.administrativeLocation,acploc
|
|
||||||
,ClosingMotive::class,acp.closingMotive,acpmotive
|
|
||||||
,UserJob::class,acp.job,acpjob
|
|
||||||
,Origin::class,acp.origin,acporigin
|
|
||||||
,Scope::class,acp.scopes,acpscope
|
|
||||||
,SocialIssue::class,acp.socialIssues,acpsocialissue
|
|
||||||
,User::class,acp.user,acpuser
|
|
||||||
AccompanyingPeriodWork::class,,,acpw
|
|
||||||
,AccompanyingPeriodWorkEvaluation::class,acpw.accompanyingPeriodWorkEvaluations,workeval
|
|
||||||
,User::class,acpw.referrers,acpwuser
|
|
||||||
,SocialAction::class,acpw.socialAction,acpwsocialaction
|
|
||||||
,Goal::class,acpw.goals,goal
|
|
||||||
,Result::class,acpw.results,result
|
|
||||||
AccompanyingPeriodParticipation::class,,,acppart
|
|
||||||
,Person::class,acppart.person,partperson
|
|
||||||
AccompanyingPeriodWorkEvaluation::class,,,workeval
|
|
||||||
,Evaluation::class,workeval.evaluation,eval
|
|
||||||
Goal::class,,,goal
|
|
||||||
,Result::class,goal.results,goalresult
|
|
||||||
Person::class,,,person
|
|
||||||
,Center::class,person.center,center
|
|
||||||
,HouseholdMember::class,partperson.householdParticipations,householdmember
|
|
||||||
,MaritalStatus::class,person.maritalStatus,personmarital
|
|
||||||
,VendeePerson::class,,vp
|
|
||||||
,VendeePersonMineur::class,,vpm
|
|
||||||
ResidentialAddress::class,,,resaddr
|
|
||||||
,ThirdParty::class,resaddr.hostThirdParty,tparty
|
|
||||||
ThirdParty::class,,,tparty
|
|
||||||
,ThirdPartyCategory::class,tparty.categories,tpartycat
|
|
||||||
HouseholdMember::class,,,householdmember
|
|
||||||
,Household::class,householdmember.household,household
|
|
||||||
,Person::class,householdmember.person,memberperson
|
|
||||||
,,memberperson.center,membercenter
|
|
||||||
Household::class,,,household
|
|
||||||
,HouseholdComposition::class,household.compositions,composition
|
|
||||||
Activity::class,,,activity
|
|
||||||
,Person::class,activity.person,actperson
|
|
||||||
,AccompanyingPeriod::class,activity.accompanyingPeriod,acp
|
|
||||||
,Person::class,activity_person_having_activity.person,person_person_having_activity
|
|
||||||
,ActivityReason::class,activity_person_having_activity.reasons,reasons_person_having_activity
|
|
||||||
,ActivityType::class,activity.activityType,acttype
|
|
||||||
,Location::class,activity.location,actloc
|
|
||||||
,SocialAction::class,activity.socialActions,actsocialaction
|
|
||||||
,SocialIssue::class,activity.socialIssues,actsocialssue
|
|
||||||
,ThirdParty::class,activity.thirdParties,acttparty
|
|
||||||
,User::class,activity.user,actuser
|
|
||||||
,User::class,activity.users,actusers
|
|
||||||
,ActivityReason::class,activity.reasons,actreasons
|
|
||||||
,Center::class,actperson.center,actcenter
|
|
||||||
ActivityReason::class,,,actreasons
|
|
||||||
,ActivityReasonCategory::class,actreason.category,actreasoncat
|
|
||||||
Calendar::class,,,cal
|
|
||||||
,CancelReason::class,cal.cancelReason,calcancel
|
|
||||||
,Location::class,cal.location,calloc
|
|
||||||
,User::class,cal.user,caluser
|
|
||||||
VendeePerson::class,,,vp
|
|
||||||
,SituationProfessionelle::class,vp.situationProfessionelle,vpprof
|
|
||||||
,StatutLogement::class,vp.statutLogement,vplog
|
|
||||||
,TempsDeTravail::class,vp.tempsDeTravail,vptt
|
|
|
@ -6,7 +6,9 @@ Add condition with distinct alias on each export join clauses (Indicators + Filt
|
|||||||
These are alias conventions :
|
These are alias conventions :
|
||||||
|
|
||||||
| Entity | Join | Attribute | Alias |
|
| Entity | Join | Attribute | Alias |
|
||||||
|:----------------------------------------|:----------------------------------------|:-------------------------------------------|:---------------------------------------|
|
|:----------------------------------------|:----------------------------------------|:-------------------------------------------|:-------------------------------------------|
|
||||||
|
| AccompanyingPeriodStepHistory::class | | | acpstephistory (contexte ACP_STEP_HISTORY) |
|
||||||
|
| | AccompanyingPeriod::class | acpstephistory.period | acp |
|
||||||
| AccompanyingPeriod::class | | | acp |
|
| AccompanyingPeriod::class | | | acp |
|
||||||
| | AccompanyingPeriodWork::class | acp.works | acpw |
|
| | AccompanyingPeriodWork::class | acp.works | acpw |
|
||||||
| | AccompanyingPeriodParticipation::class | acp.participations | acppart |
|
| | AccompanyingPeriodParticipation::class | acp.participations | acppart |
|
||||||
@ -21,7 +23,6 @@ These are alias conventions :
|
|||||||
| | AccompanyingPeriodInfo::class | not existing (using custom WITH clause) | acpinfo |
|
| | AccompanyingPeriodInfo::class | not existing (using custom WITH clause) | acpinfo |
|
||||||
| AccompanyingPeriodWork::class | | | acpw |
|
| AccompanyingPeriodWork::class | | | acpw |
|
||||||
| | AccompanyingPeriodWorkEvaluation::class | acpw.accompanyingPeriodWorkEvaluations | workeval |
|
| | AccompanyingPeriodWorkEvaluation::class | acpw.accompanyingPeriodWorkEvaluations | workeval |
|
||||||
| | User::class | acpw.referrers | acpwuser |
|
|
||||||
| | SocialAction::class | acpw.socialAction | acpwsocialaction |
|
| | SocialAction::class | acpw.socialAction | acpwsocialaction |
|
||||||
| | Goal::class | acpw.goals | goal |
|
| | Goal::class | acpw.goals | goal |
|
||||||
| | Result::class | acpw.results | result |
|
| | Result::class | acpw.results | result |
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
"@symfony/webpack-encore": "^4.1.0",
|
"@symfony/webpack-encore": "^4.1.0",
|
||||||
"@tsconfig/node14": "^1.0.1",
|
"@tsconfig/node14": "^1.0.1",
|
||||||
"bindings": "^1.5.0",
|
"bindings": "^1.5.0",
|
||||||
"bootstrap": "^5.0.1",
|
"bootstrap": "5.2.3",
|
||||||
"chokidar": "^3.5.1",
|
"chokidar": "^3.5.1",
|
||||||
"fork-awesome": "^1.1.7",
|
"fork-awesome": "^1.1.7",
|
||||||
"jquery": "^3.6.0",
|
"jquery": "^3.6.0",
|
||||||
|
6
phpstan-baseline-2024-05.neon
Normal file
6
phpstan-baseline-2024-05.neon
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
parameters:
|
||||||
|
ignoreErrors:
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$records of method League\\\\Csv\\\\Writer\\:\\:insertAll\\(\\) expects iterable\\<array\\<float\\|int\\|string\\|Stringable\\|null\\>\\>, iterable\\<array\\<string, bool\\|int\\|string\\>\\> given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: src/Bundle/ChillMainBundle/Controller/UserExportController.php
|
@ -31,4 +31,5 @@ includes:
|
|||||||
- phpstan-baseline-level-3.neon
|
- phpstan-baseline-level-3.neon
|
||||||
- phpstan-baseline-level-4.neon
|
- phpstan-baseline-level-4.neon
|
||||||
- phpstan-baseline-level-5.neon
|
- phpstan-baseline-level-5.neon
|
||||||
|
- phpstan-baseline-2024-05.neon
|
||||||
|
|
||||||
|
@ -2,26 +2,51 @@
|
|||||||
|
|
||||||
<!-- 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="tests/app/vendor/phpunit/phpunit/phpunit.xsd"
|
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
||||||
backupGlobals="false"
|
backupGlobals="false"
|
||||||
colors="true"
|
colors="true"
|
||||||
bootstrap="tests/app/tests/bootstrap.php"
|
bootstrap="tests/bootstrap.php"
|
||||||
>
|
>
|
||||||
<php>
|
<php>
|
||||||
<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="weak" />
|
<env name="SYMFONY_DEPRECATIONS_HELPER" value="max[direct]=0&max[indirect]=999999" />
|
||||||
<server name="SHELL_VERBOSITY" value="-1" />
|
<server name="SHELL_VERBOSITY" value="-1" />
|
||||||
|
<env name="KERNEL_CLASS" value="\App\Kernel" />
|
||||||
</php>
|
</php>
|
||||||
|
|
||||||
<testsuites>
|
<testsuites>
|
||||||
|
<!--
|
||||||
|
<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">
|
<testsuite name="MainBundle">
|
||||||
<directory suffix="Test.php">src/Bundle/ChillMainBundle/Tests/</directory>
|
<directory suffix="Test.php">src/Bundle/ChillMainBundle/Tests/</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="PersonBundle">
|
<testsuite name="PersonBundle">
|
||||||
<directory suffix="Test.php">src/Bundle/ChillPersonBundle/Tests/</directory>
|
<directory suffix="Test.php">src/Bundle/ChillPersonBundle/Tests/</directory>
|
||||||
<!-- test for export will be runned later -->
|
|
||||||
<exclude>src/Bundle/ChillPersonBundle/Tests/Export/*</exclude>
|
|
||||||
<!-- we are rewriting accompanying periods... Work in progress -->
|
<!-- we are rewriting accompanying periods... Work in progress -->
|
||||||
<exclude>src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingPeriodControllerTest.php</exclude>
|
<exclude>src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingPeriodControllerTest.php</exclude>
|
||||||
<!-- we are rewriting address, Work in progress -->
|
<!-- we are rewriting address, Work in progress -->
|
||||||
@ -31,14 +56,18 @@
|
|||||||
<!-- temporarily removed, the time to find a fix -->
|
<!-- temporarily removed, the time to find a fix -->
|
||||||
<exclude>src/Bundle/ChillPersonBundle/Tests/Controller/PersonDuplicateControllerViewTest.php</exclude>
|
<exclude>src/Bundle/ChillPersonBundle/Tests/Controller/PersonDuplicateControllerViewTest.php</exclude>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="AsideActivityBundle">
|
<!--
|
||||||
<directory suffix="Test.php">src/Bundle/ChillAsideActivityBundle/src/Tests/</directory>
|
<testsuite name="ReportBundle">
|
||||||
|
<directory suffix="Test.php">src/Bundle/ChillReportBundle/Tests/</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="CalendarBundle">
|
-->
|
||||||
<directory suffix="Test.php">src/Bundle/ChillCalendarBundle/Tests/</directory>
|
<!--
|
||||||
|
<testsuite name="TaskBundle">
|
||||||
|
<directory suffix="Test.php">src/Bundle/ChillTaskBundle/Tests</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="DocGeneratorBundle">
|
-->
|
||||||
<directory suffix="Test.php">src/Bundle/ChillDocGeneratorBundle/tests/</directory>
|
<testsuite name="ThirdPartyBundle">
|
||||||
|
<directory suffix="Test.php">src/Bundle/ChillThirdPartyBundle/Tests</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="WopiBundle">
|
<testsuite name="WopiBundle">
|
||||||
<directory suffix="Test.php">src/Bundle/ChillWopiBundle/tests/</directory>
|
<directory suffix="Test.php">src/Bundle/ChillWopiBundle/tests/</directory>
|
||||||
|
53
rector.php
53
rector.php
@ -2,6 +2,13 @@
|
|||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
use Rector\CodeQuality\Rector\Class_\InlineConstructorDefaultToPropertyRector;
|
use Rector\CodeQuality\Rector\Class_\InlineConstructorDefaultToPropertyRector;
|
||||||
use Rector\Config\RectorConfig;
|
use Rector\Config\RectorConfig;
|
||||||
use Rector\Set\ValueObject\LevelSetList;
|
use Rector\Set\ValueObject\LevelSetList;
|
||||||
@ -12,6 +19,9 @@ return static function (RectorConfig $rectorConfig): void {
|
|||||||
__DIR__ . '/src',
|
__DIR__ . '/src',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$rectorConfig->symfonyContainerXml(__DIR__ . '/var/cache/dev/testsApp_KernelDevDebugContainer.xml');
|
||||||
|
$rectorConfig->symfonyContainerPhp(__DIR__ . '/tests/symfony-container.php');
|
||||||
|
|
||||||
//$rectorConfig->cacheClass(\Rector\Caching\ValueObject\Storage\FileCacheStorage::class);
|
//$rectorConfig->cacheClass(\Rector\Caching\ValueObject\Storage\FileCacheStorage::class);
|
||||||
//$rectorConfig->cacheDirectory(__DIR__ . '/.cache/rector');
|
//$rectorConfig->cacheDirectory(__DIR__ . '/.cache/rector');
|
||||||
|
|
||||||
@ -21,43 +31,22 @@ return static function (RectorConfig $rectorConfig): void {
|
|||||||
|
|
||||||
//define sets of rules
|
//define sets of rules
|
||||||
$rectorConfig->sets([
|
$rectorConfig->sets([
|
||||||
LevelSetList::UP_TO_PHP_74
|
LevelSetList::UP_TO_PHP_82,
|
||||||
|
\Rector\Symfony\Set\SymfonyLevelSetList::UP_TO_SYMFONY_44,
|
||||||
|
\Rector\Doctrine\Set\DoctrineSetList::DOCTRINE_CODE_QUALITY,
|
||||||
|
\Rector\PHPUnit\Set\PHPUnitLevelSetList::UP_TO_PHPUNIT_90,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// some routes are added twice if it remains activated
|
||||||
|
// $rectorConfig->rule(\Rector\Symfony\Configs\Rector\ClassMethod\AddRouteAnnotationRector::class);
|
||||||
|
|
||||||
// chill rules
|
// chill rules
|
||||||
$rectorConfig->rule(\Chill\Utils\Rector\Rector\ChillBundleAddFormDefaultDataOnExportFilterAggregatorRector::class);
|
//$rectorConfig->rule(\Chill\Utils\Rector\Rector\ChillBundleAddFormDefaultDataOnExportFilterAggregatorRector::class);
|
||||||
|
|
||||||
// skip some path...
|
// skip some path...
|
||||||
$rectorConfig->skip([
|
$rectorConfig->skip([
|
||||||
// make rector stuck for some files
|
// we must adapt service definition
|
||||||
\Rector\Php56\Rector\FunctionLike\AddDefaultValueForUndefinedVariableRector::class,
|
\Rector\Symfony\Symfony28\Rector\MethodCall\GetToConstructorInjectionRector::class,
|
||||||
|
\Rector\Symfony\Symfony34\Rector\Closure\ContainerGetNameToTypeInTestsRector::class,
|
||||||
// we need to discuss this: are we going to have FALSE in tests instead of an error ?
|
|
||||||
\Rector\Php71\Rector\FuncCall\CountOnNullRector::class,
|
|
||||||
|
|
||||||
// must merge MR500 and review a typing of "ArrayCollection" in entities
|
|
||||||
\Rector\TypeDeclaration\Rector\Property\TypedPropertyFromAssignsRector::class,
|
|
||||||
|
|
||||||
// remove all PHP80 rules, in order to activate them one by one
|
|
||||||
\Rector\Php80\Rector\ClassMethod\AddParamBasedOnParentClassMethodRector::class,
|
|
||||||
\Rector\Php80\Rector\Class_\AnnotationToAttributeRector::class,
|
|
||||||
\Rector\Php80\Rector\Switch_\ChangeSwitchToMatchRector::class,
|
|
||||||
\Rector\Php80\Rector\FuncCall\ClassOnObjectRector::class,
|
|
||||||
\Rector\Php80\Rector\ClassConstFetch\ClassOnThisVariableObjectRector::class,
|
|
||||||
\Rector\Php80\Rector\Class_\ClassPropertyAssignToConstructorPromotionRector::class,
|
|
||||||
\Rector\Php80\Rector\Class_\DoctrineAnnotationClassToAttributeRector::class,
|
|
||||||
\Rector\Php80\Rector\ClassMethod\FinalPrivateToPrivateVisibilityRector::class,
|
|
||||||
\Rector\Php80\Rector\Ternary\GetDebugTypeRector::class,
|
|
||||||
\Rector\Php80\Rector\FunctionLike\MixedTypeRector::class,
|
|
||||||
\Rector\Php80\Rector\Property\NestedAnnotationToAttributeRector::class,
|
|
||||||
\Rector\Php80\Rector\FuncCall\Php8ResourceReturnToObjectRector::class,
|
|
||||||
\Rector\Php80\Rector\Catch_\RemoveUnusedVariableInCatchRector::class,
|
|
||||||
\Rector\Php80\Rector\ClassMethod\SetStateToStaticRector::class,
|
|
||||||
\Rector\Php80\Rector\NotIdentical\StrContainsRector::class,
|
|
||||||
\Rector\Php80\Rector\Identical\StrEndsWithRector::class,
|
|
||||||
\Rector\Php80\Rector\Identical\StrStartsWithRector::class,
|
|
||||||
\Rector\Php80\Rector\Class_\StringableForToStringRector::class,
|
|
||||||
\Rector\Php80\Rector\FuncCall\TokenGetAllToObjectRector::class,
|
|
||||||
\Rector\Php80\Rector\FunctionLike\UnionTypesRector::class
|
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
@ -28,3 +28,4 @@ Version 1.5.5
|
|||||||
|
|
||||||
- [activity] replace dropdown for selecting reasons and use chillEntity for reason rendering
|
- [activity] replace dropdown for selecting reasons and use chillEntity for reason rendering
|
||||||
- fix bug: error when trying to edit activity of which the type has been deactivated
|
- fix bug: error when trying to edit activity of which the type has been deactivated
|
||||||
|
|
||||||
|
@ -20,20 +20,22 @@ use Chill\ActivityBundle\Repository\ActivityTypeCategoryRepository;
|
|||||||
use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface;
|
use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface;
|
||||||
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
|
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
|
||||||
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
|
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
|
||||||
|
use Chill\MainBundle\Entity\UserJob;
|
||||||
|
use Chill\MainBundle\Pagination\PaginatorFactory;
|
||||||
use Chill\MainBundle\Repository\LocationRepository;
|
use Chill\MainBundle\Repository\LocationRepository;
|
||||||
use Chill\MainBundle\Repository\UserRepositoryInterface;
|
use Chill\MainBundle\Repository\UserRepositoryInterface;
|
||||||
use Chill\MainBundle\Security\Resolver\CenterResolverManagerInterface;
|
use Chill\MainBundle\Security\Resolver\CenterResolverManagerInterface;
|
||||||
|
use Chill\MainBundle\Templating\Listing\FilterOrderHelper;
|
||||||
|
use Chill\MainBundle\Templating\Listing\FilterOrderHelperFactoryInterface;
|
||||||
|
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
use Chill\PersonBundle\Privacy\PrivacyEvent;
|
use Chill\PersonBundle\Privacy\PrivacyEvent;
|
||||||
use Chill\PersonBundle\Repository\AccompanyingPeriodRepository;
|
use Chill\PersonBundle\Repository\AccompanyingPeriodRepository;
|
||||||
use Chill\PersonBundle\Repository\PersonRepository;
|
use Chill\PersonBundle\Repository\PersonRepository;
|
||||||
use Chill\ThirdPartyBundle\Repository\ThirdPartyRepository;
|
use Chill\ThirdPartyBundle\Repository\ThirdPartyRepository;
|
||||||
use DateTime;
|
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use InvalidArgumentException;
|
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
use RuntimeException;
|
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
|
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
|
||||||
@ -43,80 +45,37 @@ use Symfony\Component\HttpFoundation\Request;
|
|||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\Serializer\SerializerInterface;
|
use Symfony\Component\Serializer\SerializerInterface;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
use function array_key_exists;
|
|
||||||
|
|
||||||
final class ActivityController extends AbstractController
|
final class ActivityController extends AbstractController
|
||||||
{
|
{
|
||||||
private AccompanyingPeriodRepository $accompanyingPeriodRepository;
|
|
||||||
|
|
||||||
private ActivityACLAwareRepositoryInterface $activityACLAwareRepository;
|
|
||||||
|
|
||||||
private ActivityRepository $activityRepository;
|
|
||||||
|
|
||||||
private ActivityTypeCategoryRepository $activityTypeCategoryRepository;
|
|
||||||
|
|
||||||
private ActivityTypeRepositoryInterface $activityTypeRepository;
|
|
||||||
|
|
||||||
private CenterResolverManagerInterface $centerResolver;
|
|
||||||
|
|
||||||
private EntityManagerInterface $entityManager;
|
|
||||||
|
|
||||||
private EventDispatcherInterface $eventDispatcher;
|
|
||||||
|
|
||||||
private LocationRepository $locationRepository;
|
|
||||||
|
|
||||||
private LoggerInterface $logger;
|
|
||||||
|
|
||||||
private PersonRepository $personRepository;
|
|
||||||
|
|
||||||
private SerializerInterface $serializer;
|
|
||||||
|
|
||||||
private ThirdPartyRepository $thirdPartyRepository;
|
|
||||||
|
|
||||||
private TranslatorInterface $translator;
|
|
||||||
|
|
||||||
private UserRepositoryInterface $userRepository;
|
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
ActivityACLAwareRepositoryInterface $activityACLAwareRepository,
|
private readonly ActivityACLAwareRepositoryInterface $activityACLAwareRepository,
|
||||||
ActivityTypeRepositoryInterface $activityTypeRepository,
|
private readonly ActivityTypeRepositoryInterface $activityTypeRepository,
|
||||||
ActivityTypeCategoryRepository $activityTypeCategoryRepository,
|
private readonly ActivityTypeCategoryRepository $activityTypeCategoryRepository,
|
||||||
PersonRepository $personRepository,
|
private readonly PersonRepository $personRepository,
|
||||||
ThirdPartyRepository $thirdPartyRepository,
|
private readonly ThirdPartyRepository $thirdPartyRepository,
|
||||||
LocationRepository $locationRepository,
|
private readonly LocationRepository $locationRepository,
|
||||||
ActivityRepository $activityRepository,
|
private readonly ActivityRepository $activityRepository,
|
||||||
AccompanyingPeriodRepository $accompanyingPeriodRepository,
|
private readonly AccompanyingPeriodRepository $accompanyingPeriodRepository,
|
||||||
EntityManagerInterface $entityManager,
|
private readonly EntityManagerInterface $entityManager,
|
||||||
EventDispatcherInterface $eventDispatcher,
|
private readonly EventDispatcherInterface $eventDispatcher,
|
||||||
LoggerInterface $logger,
|
private readonly LoggerInterface $logger,
|
||||||
SerializerInterface $serializer,
|
private readonly SerializerInterface $serializer,
|
||||||
UserRepositoryInterface $userRepository,
|
private readonly UserRepositoryInterface $userRepository,
|
||||||
CenterResolverManagerInterface $centerResolver,
|
private readonly CenterResolverManagerInterface $centerResolver,
|
||||||
TranslatorInterface $translator
|
private readonly TranslatorInterface $translator,
|
||||||
|
private readonly FilterOrderHelperFactoryInterface $filterOrderHelperFactory,
|
||||||
|
private readonly TranslatableStringHelperInterface $translatableStringHelper,
|
||||||
|
private readonly PaginatorFactory $paginatorFactory,
|
||||||
) {
|
) {
|
||||||
$this->activityACLAwareRepository = $activityACLAwareRepository;
|
|
||||||
$this->activityTypeRepository = $activityTypeRepository;
|
|
||||||
$this->activityTypeCategoryRepository = $activityTypeCategoryRepository;
|
|
||||||
$this->personRepository = $personRepository;
|
|
||||||
$this->thirdPartyRepository = $thirdPartyRepository;
|
|
||||||
$this->locationRepository = $locationRepository;
|
|
||||||
$this->activityRepository = $activityRepository;
|
|
||||||
$this->accompanyingPeriodRepository = $accompanyingPeriodRepository;
|
|
||||||
$this->entityManager = $entityManager;
|
|
||||||
$this->eventDispatcher = $eventDispatcher;
|
|
||||||
$this->logger = $logger;
|
|
||||||
$this->serializer = $serializer;
|
|
||||||
$this->userRepository = $userRepository;
|
|
||||||
$this->centerResolver = $centerResolver;
|
|
||||||
$this->translator = $translator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes a Activity entity.
|
* Deletes a Activity entity.
|
||||||
*
|
*
|
||||||
* @param mixed $id
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/activity/{id}/delete", name="chill_activity_activity_delete", methods={"GET", "POST", "DELETE"})
|
||||||
*/
|
*/
|
||||||
public function deleteAction(Request $request, $id)
|
public function deleteAction(Request $request, mixed $id)
|
||||||
{
|
{
|
||||||
$view = null;
|
$view = null;
|
||||||
|
|
||||||
@ -129,10 +88,10 @@ final class ActivityController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($activity->getAccompanyingPeriod() instanceof AccompanyingPeriod) {
|
if ($activity->getAccompanyingPeriod() instanceof AccompanyingPeriod) {
|
||||||
$view = 'ChillActivityBundle:Activity:confirm_deleteAccompanyingCourse.html.twig';
|
$view = '@ChillActivity/Activity/confirm_deleteAccompanyingCourse.html.twig';
|
||||||
$accompanyingPeriod = $activity->getAccompanyingPeriod();
|
$accompanyingPeriod = $activity->getAccompanyingPeriod();
|
||||||
} else {
|
} else {
|
||||||
$view = 'ChillActivityBundle:Activity:confirm_deletePerson.html.twig';
|
$view = '@ChillActivity/Activity/confirm_deletePerson.html.twig';
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
@ -140,7 +99,7 @@ final class ActivityController extends AbstractController
|
|||||||
|
|
||||||
$form = $this->createDeleteForm($activity->getId(), $person, $accompanyingPeriod);
|
$form = $this->createDeleteForm($activity->getId(), $person, $accompanyingPeriod);
|
||||||
|
|
||||||
if ($request->getMethod() === Request::METHOD_DELETE) {
|
if (Request::METHOD_DELETE === $request->getMethod()) {
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isValid()) {
|
if ($form->isValid()) {
|
||||||
@ -173,10 +132,6 @@ final class ActivityController extends AbstractController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $view) {
|
|
||||||
throw $this->createNotFoundException('Template not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->render($view, [
|
return $this->render($view, [
|
||||||
'activity' => $activity,
|
'activity' => $activity,
|
||||||
'delete_form' => $form->createView(),
|
'delete_form' => $form->createView(),
|
||||||
@ -187,6 +142,8 @@ 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\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
|
||||||
{
|
{
|
||||||
@ -202,10 +159,10 @@ final class ActivityController extends AbstractController
|
|||||||
$person = $entity->getPerson();
|
$person = $entity->getPerson();
|
||||||
|
|
||||||
if ($entity->getAccompanyingPeriod() instanceof AccompanyingPeriod) {
|
if ($entity->getAccompanyingPeriod() instanceof AccompanyingPeriod) {
|
||||||
$view = 'ChillActivityBundle:Activity:editAccompanyingCourse.html.twig';
|
$view = '@ChillActivity/Activity/editAccompanyingCourse.html.twig';
|
||||||
$accompanyingPeriod = $entity->getAccompanyingPeriod();
|
$accompanyingPeriod = $entity->getAccompanyingPeriod();
|
||||||
} else {
|
} else {
|
||||||
$view = 'ChillActivityBundle:Activity:editPerson.html.twig';
|
$view = '@ChillActivity/Activity/editPerson.html.twig';
|
||||||
}
|
}
|
||||||
// TODO
|
// TODO
|
||||||
// $this->denyAccessUnlessGranted('CHILL_ACTIVITY_UPDATE', $entity);
|
// $this->denyAccessUnlessGranted('CHILL_ACTIVITY_UPDATE', $entity);
|
||||||
@ -266,10 +223,6 @@ final class ActivityController extends AbstractController
|
|||||||
$this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
|
$this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (null === $view) {
|
|
||||||
throw $this->createNotFoundException('Template not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
$activity_array = $this->serializer->normalize($entity, 'json', ['groups' => 'read']);
|
$activity_array = $this->serializer->normalize($entity, 'json', ['groups' => 'read']);
|
||||||
|
|
||||||
return $this->render($view, [
|
return $this->render($view, [
|
||||||
@ -284,34 +237,64 @@ final class ActivityController extends AbstractController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists all Activity entities.
|
* Lists all Activity entities.
|
||||||
|
*
|
||||||
|
* @\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;
|
||||||
$activities = [];
|
$activities = [];
|
||||||
// TODO: add pagination
|
|
||||||
|
|
||||||
[$person, $accompanyingPeriod] = $this->getEntity($request);
|
[$person, $accompanyingPeriod] = $this->getEntity($request);
|
||||||
|
$filter = $this->buildFilterOrder($person ?? $accompanyingPeriod);
|
||||||
|
|
||||||
|
$filterArgs = [
|
||||||
|
'my_activities' => $filter->getSingleCheckboxData('my_activities'),
|
||||||
|
'types' => $filter->hasEntityChoice('activity_types') ? $filter->getEntityChoiceData('activity_types') : [],
|
||||||
|
'jobs' => $filter->hasEntityChoice('jobs') ? $filter->getEntityChoiceData('jobs') : [],
|
||||||
|
'before' => $filter->getDateRangeData('activity_date')['to'],
|
||||||
|
'after' => $filter->getDateRangeData('activity_date')['from'],
|
||||||
|
];
|
||||||
|
|
||||||
if ($person instanceof Person) {
|
if ($person instanceof Person) {
|
||||||
$this->denyAccessUnlessGranted(ActivityVoter::SEE, $person);
|
$this->denyAccessUnlessGranted(ActivityVoter::SEE, $person);
|
||||||
|
$count = $this->activityACLAwareRepository->countByPerson($person, ActivityVoter::SEE, $filterArgs);
|
||||||
|
$paginator = $this->paginatorFactory->create($count);
|
||||||
$activities = $this->activityACLAwareRepository
|
$activities = $this->activityACLAwareRepository
|
||||||
->findByPerson($person, ActivityVoter::SEE, 0, null, ['date' => 'DESC', 'id' => 'DESC']);
|
->findByPerson(
|
||||||
|
$person,
|
||||||
|
ActivityVoter::SEE,
|
||||||
|
$paginator->getCurrentPageFirstItemNumber(),
|
||||||
|
$paginator->getItemsPerPage(),
|
||||||
|
['date' => 'DESC', 'id' => 'DESC'],
|
||||||
|
$filterArgs
|
||||||
|
);
|
||||||
|
|
||||||
$event = new PrivacyEvent($person, [
|
$event = new PrivacyEvent($person, [
|
||||||
'element_class' => Activity::class,
|
'element_class' => Activity::class,
|
||||||
'action' => 'list',
|
'action' => 'list',
|
||||||
]);
|
]);
|
||||||
$this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
|
$this->eventDispatcher->dispatch($event, PrivacyEvent::PERSON_PRIVACY_EVENT);
|
||||||
|
|
||||||
$view = 'ChillActivityBundle:Activity:listPerson.html.twig';
|
$view = '@ChillActivity/Activity/listPerson.html.twig';
|
||||||
} elseif ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
} elseif ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
||||||
$this->denyAccessUnlessGranted(ActivityVoter::SEE, $accompanyingPeriod);
|
$this->denyAccessUnlessGranted(ActivityVoter::SEE, $accompanyingPeriod);
|
||||||
|
|
||||||
|
$count = $this->activityACLAwareRepository->countByAccompanyingPeriod($accompanyingPeriod, ActivityVoter::SEE, $filterArgs);
|
||||||
|
$paginator = $this->paginatorFactory->create($count);
|
||||||
$activities = $this->activityACLAwareRepository
|
$activities = $this->activityACLAwareRepository
|
||||||
->findByAccompanyingPeriod($accompanyingPeriod, ActivityVoter::SEE, 0, null, ['date' => 'DESC', 'id' => 'DESC']);
|
->findByAccompanyingPeriod(
|
||||||
|
$accompanyingPeriod,
|
||||||
|
ActivityVoter::SEE,
|
||||||
|
$paginator->getCurrentPageFirstItemNumber(),
|
||||||
|
$paginator->getItemsPerPage(),
|
||||||
|
['date' => 'DESC', 'id' => 'DESC'],
|
||||||
|
$filterArgs
|
||||||
|
);
|
||||||
|
|
||||||
$view = 'ChillActivityBundle:Activity:listAccompanyingCourse.html.twig';
|
$view = '@ChillActivity/Activity/listAccompanyingCourse.html.twig';
|
||||||
|
} else {
|
||||||
|
throw new \LogicException('Unsupported');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render(
|
return $this->render(
|
||||||
@ -320,10 +303,49 @@ final class ActivityController extends AbstractController
|
|||||||
'activities' => $activities,
|
'activities' => $activities,
|
||||||
'person' => $person,
|
'person' => $person,
|
||||||
'accompanyingCourse' => $accompanyingPeriod,
|
'accompanyingCourse' => $accompanyingPeriod,
|
||||||
|
'filter' => $filter,
|
||||||
|
'paginator' => $paginator,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function buildFilterOrder(AccompanyingPeriod|Person $associated): FilterOrderHelper
|
||||||
|
{
|
||||||
|
$filterBuilder = $this->filterOrderHelperFactory->create(self::class);
|
||||||
|
$types = $this->activityACLAwareRepository->findActivityTypeByAssociated($associated);
|
||||||
|
$jobs = $this->activityACLAwareRepository->findUserJobByAssociated($associated);
|
||||||
|
|
||||||
|
$filterBuilder
|
||||||
|
->addDateRange('activity_date', 'activity.date')
|
||||||
|
->addSingleCheckbox('my_activities', 'activity_filter.My activities');
|
||||||
|
|
||||||
|
if (1 < count($types)) {
|
||||||
|
$filterBuilder
|
||||||
|
->addEntityChoice('activity_types', 'activity_filter.Types', \Chill\ActivityBundle\Entity\ActivityType::class, $types, [
|
||||||
|
'choice_label' => function (\Chill\ActivityBundle\Entity\ActivityType $activityType) {
|
||||||
|
$text = match ($activityType->hasCategory()) {
|
||||||
|
true => $this->translatableStringHelper->localize($activityType->getCategory()->getName()).' > ',
|
||||||
|
false => '',
|
||||||
|
};
|
||||||
|
|
||||||
|
return $text.$this->translatableStringHelper->localize($activityType->getName());
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (1 < count($jobs)) {
|
||||||
|
$filterBuilder
|
||||||
|
->addEntityChoice('jobs', 'activity_filter.Jobs', UserJob::class, $jobs, [
|
||||||
|
'choice_label' => fn (UserJob $u) => $this->translatableStringHelper->localize($u->getLabel()),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filterBuilder->build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @\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;
|
||||||
@ -331,16 +353,16 @@ final class ActivityController extends AbstractController
|
|||||||
[$person, $accompanyingPeriod] = $this->getEntity($request);
|
[$person, $accompanyingPeriod] = $this->getEntity($request);
|
||||||
|
|
||||||
if ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
if ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
||||||
$view = 'ChillActivityBundle:Activity:newAccompanyingCourse.html.twig';
|
$view = '@ChillActivity/Activity/newAccompanyingCourse.html.twig';
|
||||||
} elseif ($person instanceof Person) {
|
} elseif ($person instanceof Person) {
|
||||||
$view = 'ChillActivityBundle:Activity:newPerson.html.twig';
|
$view = '@ChillActivity/Activity/newPerson.html.twig';
|
||||||
}
|
}
|
||||||
|
|
||||||
$activityType_id = $request->get('activityType_id', 0);
|
$activityType_id = $request->get('activityType_id', 0);
|
||||||
$activityType = $this->activityTypeRepository->find($activityType_id);
|
$activityType = $this->activityTypeRepository->find($activityType_id);
|
||||||
|
|
||||||
if (isset($activityType) && !$activityType->isActive()) {
|
if (isset($activityType) && !$activityType->isActive()) {
|
||||||
throw new InvalidArgumentException('Activity type must be active');
|
throw new \InvalidArgumentException('Activity type must be active');
|
||||||
}
|
}
|
||||||
|
|
||||||
$activityData = null;
|
$activityData = null;
|
||||||
@ -375,45 +397,45 @@ final class ActivityController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
$entity->setActivityType($activityType);
|
$entity->setActivityType($activityType);
|
||||||
$entity->setDate(new DateTime('now'));
|
$entity->setDate(new \DateTime('now'));
|
||||||
|
|
||||||
if ($request->query->has('activityData')) {
|
if ($request->query->has('activityData')) {
|
||||||
$activityData = $request->query->get('activityData');
|
$activityData = $request->query->get('activityData');
|
||||||
|
|
||||||
if (array_key_exists('durationTime', $activityData) && $activityType->getDurationTimeVisible() > 0) {
|
if (\array_key_exists('durationTime', $activityData) && $activityType->getDurationTimeVisible() > 0) {
|
||||||
$durationTimeInMinutes = $activityData['durationTime'];
|
$durationTimeInMinutes = $activityData['durationTime'];
|
||||||
$hours = floor($durationTimeInMinutes / 60);
|
$hours = floor($durationTimeInMinutes / 60);
|
||||||
$minutes = $durationTimeInMinutes % 60;
|
$minutes = $durationTimeInMinutes % 60;
|
||||||
$duration = DateTime::createFromFormat('H:i', $hours . ':' . $minutes);
|
$duration = \DateTime::createFromFormat('H:i', $hours.':'.$minutes);
|
||||||
|
|
||||||
if ($duration) {
|
if ($duration) {
|
||||||
$entity->setDurationTime($duration);
|
$entity->setDurationTime($duration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array_key_exists('date', $activityData)) {
|
if (\array_key_exists('date', $activityData)) {
|
||||||
$date = DateTime::createFromFormat('Y-m-d', $activityData['date']);
|
$date = \DateTime::createFromFormat('Y-m-d', $activityData['date']);
|
||||||
|
|
||||||
if ($date) {
|
if ($date) {
|
||||||
$entity->setDate($date);
|
$entity->setDate($date);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array_key_exists('personsId', $activityData) && $activityType->getPersonsVisible() > 0) {
|
if (\array_key_exists('personsId', $activityData) && $activityType->getPersonsVisible() > 0) {
|
||||||
foreach ($activityData['personsId'] as $personId) {
|
foreach ($activityData['personsId'] as $personId) {
|
||||||
$concernedPerson = $this->personRepository->find($personId);
|
$concernedPerson = $this->personRepository->find($personId);
|
||||||
$entity->addPerson($concernedPerson);
|
$entity->addPerson($concernedPerson);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array_key_exists('professionalsId', $activityData) && $activityType->getThirdPartiesVisible() > 0) {
|
if (\array_key_exists('professionalsId', $activityData) && $activityType->getThirdPartiesVisible() > 0) {
|
||||||
foreach ($activityData['professionalsId'] as $professionalsId) {
|
foreach ($activityData['professionalsId'] as $professionalsId) {
|
||||||
$professional = $this->thirdPartyRepository->find($professionalsId);
|
$professional = $this->thirdPartyRepository->find($professionalsId);
|
||||||
$entity->addThirdParty($professional);
|
$entity->addThirdParty($professional);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array_key_exists('usersId', $activityData) && $activityType->getUsersVisible() > 0) {
|
if (\array_key_exists('usersId', $activityData) && $activityType->getUsersVisible() > 0) {
|
||||||
foreach ($activityData['usersId'] as $userId) {
|
foreach ($activityData['usersId'] as $userId) {
|
||||||
$user = $this->userRepository->find($userId);
|
$user = $this->userRepository->find($userId);
|
||||||
|
|
||||||
@ -423,16 +445,16 @@ final class ActivityController extends AbstractController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array_key_exists('location', $activityData) && $activityType->getLocationVisible() > 0) {
|
if (\array_key_exists('location', $activityData) && $activityType->getLocationVisible() > 0) {
|
||||||
$location = $this->locationRepository->find($activityData['location']);
|
$location = $this->locationRepository->find($activityData['location']);
|
||||||
$entity->setLocation($location);
|
$entity->setLocation($location);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array_key_exists('comment', $activityData) && $activityType->getCommentVisible() > 0) {
|
if (\array_key_exists('comment', $activityData) && $activityType->getCommentVisible() > 0) {
|
||||||
$comment = new CommentEmbeddable();
|
$comment = new CommentEmbeddable();
|
||||||
$comment->setComment($activityData['comment']);
|
$comment->setComment($activityData['comment']);
|
||||||
$comment->setUserId($this->getUser()->getid());
|
$comment->setUserId($this->getUser()->getid());
|
||||||
$comment->setDate(new DateTime('now'));
|
$comment->setDate(new \DateTime('now'));
|
||||||
$entity->setComment($comment);
|
$entity->setComment($comment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -504,6 +526,9 @@ final class ActivityController extends AbstractController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @\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;
|
||||||
@ -511,9 +536,9 @@ final class ActivityController extends AbstractController
|
|||||||
[$person, $accompanyingPeriod] = $this->getEntity($request);
|
[$person, $accompanyingPeriod] = $this->getEntity($request);
|
||||||
|
|
||||||
if ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
if ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
||||||
$view = 'ChillActivityBundle:Activity:selectTypeAccompanyingCourse.html.twig';
|
$view = '@ChillActivity/Activity/selectTypeAccompanyingCourse.html.twig';
|
||||||
} elseif ($person instanceof Person) {
|
} elseif ($person instanceof Person) {
|
||||||
$view = 'ChillActivityBundle:Activity:selectTypePerson.html.twig';
|
$view = '@ChillActivity/Activity/selectTypePerson.html.twig';
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = [];
|
$data = [];
|
||||||
@ -548,6 +573,9 @@ final class ActivityController extends AbstractController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @\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);
|
||||||
@ -560,11 +588,11 @@ final class ActivityController extends AbstractController
|
|||||||
$person = $entity->getPerson();
|
$person = $entity->getPerson();
|
||||||
|
|
||||||
if ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
if ($accompanyingPeriod instanceof AccompanyingPeriod) {
|
||||||
$view = 'ChillActivityBundle:Activity:showAccompanyingCourse.html.twig';
|
$view = '@ChillActivity/Activity/showAccompanyingCourse.html.twig';
|
||||||
} elseif ($person instanceof Person) {
|
} elseif ($person instanceof Person) {
|
||||||
$view = 'ChillActivityBundle:Activity:showPerson.html.twig';
|
$view = '@ChillActivity/Activity/showPerson.html.twig';
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException('the activity should be linked with a period or person');
|
throw new \RuntimeException('the activity should be linked with a period or person');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null !== $accompanyingPeriod) {
|
if (null !== $accompanyingPeriod) {
|
||||||
@ -587,10 +615,6 @@ final class ActivityController extends AbstractController
|
|||||||
$this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
|
$this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (null === $view) {
|
|
||||||
throw $this->createNotFoundException('Template not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->render($view, [
|
return $this->render($view, [
|
||||||
'person' => $person,
|
'person' => $person,
|
||||||
'accompanyingCourse' => $accompanyingPeriod,
|
'accompanyingCourse' => $accompanyingPeriod,
|
||||||
|
@ -24,6 +24,8 @@ class ActivityReasonCategoryController extends AbstractController
|
|||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates a new ActivityReasonCategory entity.
|
* Creates a new ActivityReasonCategory entity.
|
||||||
|
*
|
||||||
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreasoncategory/create", name="chill_activity_activityreasoncategory_create", methods={"POST"})
|
||||||
*/
|
*/
|
||||||
public function createAction(Request $request)
|
public function createAction(Request $request)
|
||||||
{
|
{
|
||||||
@ -31,15 +33,15 @@ class ActivityReasonCategoryController extends AbstractController
|
|||||||
$form = $this->createCreateForm($entity);
|
$form = $this->createCreateForm($entity);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
$em->persist($entity);
|
$em->persist($entity);
|
||||||
$em->flush();
|
$em->flush();
|
||||||
|
|
||||||
return $this->redirect($this->generateUrl('chill_activity_activityreasoncategory_show', ['id' => $entity->getId()]));
|
return $this->redirectToRoute('chill_activity_activityreasoncategory_show', ['id' => $entity->getId()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReasonCategory:new.html.twig', [
|
return $this->render('@ChillActivity/ActivityReasonCategory/new.html.twig', [
|
||||||
'entity' => $entity,
|
'entity' => $entity,
|
||||||
'form' => $form->createView(),
|
'form' => $form->createView(),
|
||||||
]);
|
]);
|
||||||
@ -48,13 +50,13 @@ class ActivityReasonCategoryController extends AbstractController
|
|||||||
/**
|
/**
|
||||||
* Displays a form to edit an existing ActivityReasonCategory entity.
|
* Displays a form to edit an existing ActivityReasonCategory entity.
|
||||||
*
|
*
|
||||||
* @param mixed $id
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreasoncategory/{id}/edit", name="chill_activity_activityreasoncategory_edit")
|
||||||
*/
|
*/
|
||||||
public function editAction($id)
|
public function editAction(mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
$entity = $em->getRepository(\Chill\ActivityBundle\Entity\ActivityReasonCategory::class)->find($id);
|
$entity = $em->getRepository(ActivityReasonCategory::class)->find($id);
|
||||||
|
|
||||||
if (!$entity) {
|
if (!$entity) {
|
||||||
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
|
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
|
||||||
@ -62,7 +64,7 @@ class ActivityReasonCategoryController extends AbstractController
|
|||||||
|
|
||||||
$editForm = $this->createEditForm($entity);
|
$editForm = $this->createEditForm($entity);
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReasonCategory:edit.html.twig', [
|
return $this->render('@ChillActivity/ActivityReasonCategory/edit.html.twig', [
|
||||||
'entity' => $entity,
|
'entity' => $entity,
|
||||||
'edit_form' => $editForm->createView(),
|
'edit_form' => $editForm->createView(),
|
||||||
]);
|
]);
|
||||||
@ -70,27 +72,31 @@ class ActivityReasonCategoryController extends AbstractController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists all ActivityReasonCategory entities.
|
* Lists all ActivityReasonCategory entities.
|
||||||
|
*
|
||||||
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreasoncategory/", name="chill_activity_activityreasoncategory")
|
||||||
*/
|
*/
|
||||||
public function indexAction()
|
public function indexAction()
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
$entities = $em->getRepository(\Chill\ActivityBundle\Entity\ActivityReasonCategory::class)->findAll();
|
$entities = $em->getRepository(ActivityReasonCategory::class)->findAll();
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReasonCategory:index.html.twig', [
|
return $this->render('@ChillActivity/ActivityReasonCategory/index.html.twig', [
|
||||||
'entities' => $entities,
|
'entities' => $entities,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays a form to create a new ActivityReasonCategory entity.
|
* Displays a form to create a new ActivityReasonCategory entity.
|
||||||
|
*
|
||||||
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreasoncategory/new", name="chill_activity_activityreasoncategory_new")
|
||||||
*/
|
*/
|
||||||
public function newAction()
|
public function newAction()
|
||||||
{
|
{
|
||||||
$entity = new ActivityReasonCategory();
|
$entity = new ActivityReasonCategory();
|
||||||
$form = $this->createCreateForm($entity);
|
$form = $this->createCreateForm($entity);
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReasonCategory:new.html.twig', [
|
return $this->render('@ChillActivity/ActivityReasonCategory/new.html.twig', [
|
||||||
'entity' => $entity,
|
'entity' => $entity,
|
||||||
'form' => $form->createView(),
|
'form' => $form->createView(),
|
||||||
]);
|
]);
|
||||||
@ -99,19 +105,19 @@ class ActivityReasonCategoryController extends AbstractController
|
|||||||
/**
|
/**
|
||||||
* Finds and displays a ActivityReasonCategory entity.
|
* Finds and displays a ActivityReasonCategory entity.
|
||||||
*
|
*
|
||||||
* @param mixed $id
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreasoncategory/{id}/show", name="chill_activity_activityreasoncategory_show")
|
||||||
*/
|
*/
|
||||||
public function showAction($id)
|
public function showAction(mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
$entity = $em->getRepository(\Chill\ActivityBundle\Entity\ActivityReasonCategory::class)->find($id);
|
$entity = $em->getRepository(ActivityReasonCategory::class)->find($id);
|
||||||
|
|
||||||
if (!$entity) {
|
if (!$entity) {
|
||||||
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
|
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReasonCategory:show.html.twig', [
|
return $this->render('@ChillActivity/ActivityReasonCategory/show.html.twig', [
|
||||||
'entity' => $entity,
|
'entity' => $entity,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@ -119,13 +125,13 @@ class ActivityReasonCategoryController extends AbstractController
|
|||||||
/**
|
/**
|
||||||
* Edits an existing ActivityReasonCategory entity.
|
* Edits an existing ActivityReasonCategory entity.
|
||||||
*
|
*
|
||||||
* @param mixed $id
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreasoncategory/{id}/update", name="chill_activity_activityreasoncategory_update", methods={"POST", "PUT"})
|
||||||
*/
|
*/
|
||||||
public function updateAction(Request $request, $id)
|
public function updateAction(Request $request, mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
$entity = $em->getRepository(\Chill\ActivityBundle\Entity\ActivityReasonCategory::class)->find($id);
|
$entity = $em->getRepository(ActivityReasonCategory::class)->find($id);
|
||||||
|
|
||||||
if (!$entity) {
|
if (!$entity) {
|
||||||
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
|
throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
|
||||||
@ -134,13 +140,13 @@ class ActivityReasonCategoryController extends AbstractController
|
|||||||
$editForm = $this->createEditForm($entity);
|
$editForm = $this->createEditForm($entity);
|
||||||
$editForm->handleRequest($request);
|
$editForm->handleRequest($request);
|
||||||
|
|
||||||
if ($editForm->isValid()) {
|
if ($editForm->isSubmitted() && $editForm->isValid()) {
|
||||||
$em->flush();
|
$em->flush();
|
||||||
|
|
||||||
return $this->redirect($this->generateUrl('chill_activity_activityreasoncategory_edit', ['id' => $id]));
|
return $this->redirectToRoute('chill_activity_activityreasoncategory_edit', ['id' => $id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReasonCategory:edit.html.twig', [
|
return $this->render('@ChillActivity/ActivityReasonCategory/edit.html.twig', [
|
||||||
'entity' => $entity,
|
'entity' => $entity,
|
||||||
'edit_form' => $editForm->createView(),
|
'edit_form' => $editForm->createView(),
|
||||||
]);
|
]);
|
||||||
|
@ -24,15 +24,14 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
|||||||
*/
|
*/
|
||||||
class ActivityReasonController extends AbstractController
|
class ActivityReasonController extends AbstractController
|
||||||
{
|
{
|
||||||
private ActivityReasonRepository $activityReasonRepository;
|
public function __construct(private readonly ActivityReasonRepository $activityReasonRepository)
|
||||||
|
|
||||||
public function __construct(ActivityReasonRepository $activityReasonRepository)
|
|
||||||
{
|
{
|
||||||
$this->activityReasonRepository = $activityReasonRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new ActivityReason entity.
|
* Creates a new ActivityReason entity.
|
||||||
|
*
|
||||||
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreason/create", name="chill_activity_activityreason_create", methods={"POST"})
|
||||||
*/
|
*/
|
||||||
public function createAction(Request $request)
|
public function createAction(Request $request)
|
||||||
{
|
{
|
||||||
@ -40,15 +39,15 @@ class ActivityReasonController extends AbstractController
|
|||||||
$form = $this->createCreateForm($entity);
|
$form = $this->createCreateForm($entity);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
$em->persist($entity);
|
$em->persist($entity);
|
||||||
$em->flush();
|
$em->flush();
|
||||||
|
|
||||||
return $this->redirect($this->generateUrl('chill_activity_activityreason', ['id' => $entity->getId()]));
|
return $this->redirectToRoute('chill_activity_activityreason', ['id' => $entity->getId()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReason:new.html.twig', [
|
return $this->render('@ChillActivity/ActivityReason/new.html.twig', [
|
||||||
'entity' => $entity,
|
'entity' => $entity,
|
||||||
'form' => $form->createView(),
|
'form' => $form->createView(),
|
||||||
]);
|
]);
|
||||||
@ -57,13 +56,13 @@ class ActivityReasonController extends AbstractController
|
|||||||
/**
|
/**
|
||||||
* Displays a form to edit an existing ActivityReason entity.
|
* Displays a form to edit an existing ActivityReason entity.
|
||||||
*
|
*
|
||||||
* @param mixed $id
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreason/{id}/edit", name="chill_activity_activityreason_edit")
|
||||||
*/
|
*/
|
||||||
public function editAction($id)
|
public function editAction(mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
$entity = $em->getRepository(\Chill\ActivityBundle\Entity\ActivityReason::class)->find($id);
|
$entity = $em->getRepository(ActivityReason::class)->find($id);
|
||||||
|
|
||||||
if (null === $entity) {
|
if (null === $entity) {
|
||||||
throw new NotFoundHttpException('Unable to find ActivityReason entity.');
|
throw new NotFoundHttpException('Unable to find ActivityReason entity.');
|
||||||
@ -71,7 +70,7 @@ class ActivityReasonController extends AbstractController
|
|||||||
|
|
||||||
$editForm = $this->createEditForm($entity);
|
$editForm = $this->createEditForm($entity);
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReason:edit.html.twig', [
|
return $this->render('@ChillActivity/ActivityReason/edit.html.twig', [
|
||||||
'entity' => $entity,
|
'entity' => $entity,
|
||||||
'edit_form' => $editForm->createView(),
|
'edit_form' => $editForm->createView(),
|
||||||
]);
|
]);
|
||||||
@ -79,6 +78,8 @@ class ActivityReasonController extends AbstractController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists all ActivityReason entities.
|
* Lists all ActivityReason entities.
|
||||||
|
*
|
||||||
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreason/", name="chill_activity_activityreason")
|
||||||
*/
|
*/
|
||||||
public function indexAction()
|
public function indexAction()
|
||||||
{
|
{
|
||||||
@ -86,20 +87,22 @@ class ActivityReasonController extends AbstractController
|
|||||||
|
|
||||||
$entities = $this->activityReasonRepository->findAll();
|
$entities = $this->activityReasonRepository->findAll();
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReason:index.html.twig', [
|
return $this->render('@ChillActivity/ActivityReason/index.html.twig', [
|
||||||
'entities' => $entities,
|
'entities' => $entities,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays a form to create a new ActivityReason entity.
|
* Displays a form to create a new ActivityReason entity.
|
||||||
|
*
|
||||||
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreason/new", name="chill_activity_activityreason_new")
|
||||||
*/
|
*/
|
||||||
public function newAction()
|
public function newAction()
|
||||||
{
|
{
|
||||||
$entity = new ActivityReason();
|
$entity = new ActivityReason();
|
||||||
$form = $this->createCreateForm($entity);
|
$form = $this->createCreateForm($entity);
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReason:new.html.twig', [
|
return $this->render('@ChillActivity/ActivityReason/new.html.twig', [
|
||||||
'entity' => $entity,
|
'entity' => $entity,
|
||||||
'form' => $form->createView(),
|
'form' => $form->createView(),
|
||||||
]);
|
]);
|
||||||
@ -108,19 +111,19 @@ class ActivityReasonController extends AbstractController
|
|||||||
/**
|
/**
|
||||||
* Finds and displays a ActivityReason entity.
|
* Finds and displays a ActivityReason entity.
|
||||||
*
|
*
|
||||||
* @param mixed $id
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreason/{id}/show", name="chill_activity_activityreason_show")
|
||||||
*/
|
*/
|
||||||
public function showAction($id)
|
public function showAction(mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
$entity = $em->getRepository(\Chill\ActivityBundle\Entity\ActivityReason::class)->find($id);
|
$entity = $em->getRepository(ActivityReason::class)->find($id);
|
||||||
|
|
||||||
if (!$entity) {
|
if (!$entity) {
|
||||||
throw $this->createNotFoundException('Unable to find ActivityReason entity.');
|
throw $this->createNotFoundException('Unable to find ActivityReason entity.');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReason:show.html.twig', [
|
return $this->render('@ChillActivity/ActivityReason/show.html.twig', [
|
||||||
'entity' => $entity,
|
'entity' => $entity,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@ -128,13 +131,13 @@ class ActivityReasonController extends AbstractController
|
|||||||
/**
|
/**
|
||||||
* Edits an existing ActivityReason entity.
|
* Edits an existing ActivityReason entity.
|
||||||
*
|
*
|
||||||
* @param mixed $id
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activityreason/{id}/update", name="chill_activity_activityreason_update", methods={"POST", "PUT"})
|
||||||
*/
|
*/
|
||||||
public function updateAction(Request $request, $id)
|
public function updateAction(Request $request, mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
$entity = $em->getRepository(\Chill\ActivityBundle\Entity\ActivityReason::class)->find($id);
|
$entity = $em->getRepository(ActivityReason::class)->find($id);
|
||||||
|
|
||||||
if (!$entity) {
|
if (!$entity) {
|
||||||
throw $this->createNotFoundException('Unable to find ActivityReason entity.');
|
throw $this->createNotFoundException('Unable to find ActivityReason entity.');
|
||||||
@ -143,13 +146,13 @@ class ActivityReasonController extends AbstractController
|
|||||||
$editForm = $this->createEditForm($entity);
|
$editForm = $this->createEditForm($entity);
|
||||||
$editForm->handleRequest($request);
|
$editForm->handleRequest($request);
|
||||||
|
|
||||||
if ($editForm->isValid()) {
|
if ($editForm->isSubmitted() && $editForm->isValid()) {
|
||||||
$em->flush();
|
$em->flush();
|
||||||
|
|
||||||
return $this->redirect($this->generateUrl('chill_activity_activityreason', ['id' => $id]));
|
return $this->redirectToRoute('chill_activity_activityreason', ['id' => $id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('ChillActivityBundle:ActivityReason:edit.html.twig', [
|
return $this->render('@ChillActivity/ActivityReason/edit.html.twig', [
|
||||||
'entity' => $entity,
|
'entity' => $entity,
|
||||||
'edit_form' => $editForm->createView(),
|
'edit_form' => $editForm->createView(),
|
||||||
]);
|
]);
|
||||||
|
@ -24,7 +24,7 @@ class AdminActivityPresenceController extends CRUDController
|
|||||||
*/
|
*/
|
||||||
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 */
|
||||||
return $query->orderBy('e.id', 'ASC');
|
return $query->orderBy('e.id', 'ASC');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ class AdminActivityTypeCategoryController extends CRUDController
|
|||||||
*/
|
*/
|
||||||
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 */
|
||||||
return $query->orderBy('e.ordering', 'ASC');
|
return $query->orderBy('e.ordering', 'ASC');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ class AdminActivityTypeController extends CRUDController
|
|||||||
*/
|
*/
|
||||||
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 */
|
||||||
return $query->orderBy('e.ordering', 'ASC')
|
return $query->orderBy('e.ordering', 'ASC')
|
||||||
->addOrderBy('e.id', 'ASC');
|
->addOrderBy('e.id', 'ASC');
|
||||||
}
|
}
|
||||||
|
@ -18,11 +18,18 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|||||||
*/
|
*/
|
||||||
class AdminController extends AbstractController
|
class AdminController extends AbstractController
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @\Symfony\Component\Routing\Annotation\Route(path="/{_locale}/admin/activity", name="chill_activity_admin_index")
|
||||||
|
*/
|
||||||
public function indexActivityAction()
|
public function indexActivityAction()
|
||||||
{
|
{
|
||||||
return $this->render('ChillActivityBundle:Admin:layout_activity.html.twig');
|
return $this->render('@ChillActivity/Admin/layout_activity.html.twig');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @\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\Annotation\Route(path="/{_locale}/admin/activity_redirect_to_main", name="chill_admin_activity_redirect_to_admin_index")
|
||||||
|
*/
|
||||||
public function redirectToAdminIndexAction()
|
public function redirectToAdminIndexAction()
|
||||||
{
|
{
|
||||||
return $this->redirectToRoute('chill_main_admin_central');
|
return $this->redirectToRoute('chill_main_admin_central');
|
||||||
|
@ -25,17 +25,11 @@ class LoadActivity extends AbstractFixture implements OrderedFixtureInterface
|
|||||||
{
|
{
|
||||||
use \Symfony\Component\DependencyInjection\ContainerAwareTrait;
|
use \Symfony\Component\DependencyInjection\ContainerAwareTrait;
|
||||||
|
|
||||||
private EntityManagerInterface $em;
|
private readonly \Faker\Generator $faker;
|
||||||
|
|
||||||
/**
|
public function __construct(private readonly EntityManagerInterface $em)
|
||||||
* @var \Faker\Generator
|
|
||||||
*/
|
|
||||||
private $faker;
|
|
||||||
|
|
||||||
public function __construct(EntityManagerInterface $em)
|
|
||||||
{
|
{
|
||||||
$this->faker = FakerFactory::create('fr_FR');
|
$this->faker = FakerFactory::create('fr_FR');
|
||||||
$this->em = $em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOrder()
|
public function getOrder()
|
||||||
|
@ -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']));
|
->setCategory($this->getReference($r['category']));
|
||||||
$manager->persist($activityReason);
|
$manager->persist($activityReason);
|
||||||
|
@ -36,7 +36,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);
|
||||||
$this->addReference(
|
$this->addReference(
|
||||||
|
@ -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']))
|
->setCategory($this->getReference('activity_type_cat_'.$t['category']))
|
||||||
->setSocialIssuesVisible(1)
|
->setSocialIssuesVisible(1)
|
||||||
->setSocialActionsVisible(1);
|
->setSocialActionsVisible(1);
|
||||||
|
@ -45,7 +45,7 @@ class LoadActivityTypeCategory extends Fixture implements OrderedFixtureInterfac
|
|||||||
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);
|
||||||
$reference = 'activity_type_cat_'.$cat['ref'];
|
$reference = 'activity_type_cat_'.$cat['ref'];
|
||||||
|
@ -20,8 +20,6 @@ use Doctrine\Common\DataFixtures\AbstractFixture;
|
|||||||
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
|
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
|
||||||
use Doctrine\Persistence\ObjectManager;
|
use Doctrine\Persistence\ObjectManager;
|
||||||
|
|
||||||
use function in_array;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a role CHILL_ACTIVITY_UPDATE & CHILL_ACTIVITY_CREATE for all groups except administrative,
|
* Add a role CHILL_ACTIVITY_UPDATE & CHILL_ACTIVITY_CREATE for all groups except administrative,
|
||||||
* and a role CHILL_ACTIVITY_SEE for administrative.
|
* and a role CHILL_ACTIVITY_SEE for administrative.
|
||||||
@ -43,7 +41,7 @@ class LoadActivitytACL extends AbstractFixture implements OrderedFixtureInterfac
|
|||||||
// create permission group
|
// create permission group
|
||||||
switch ($permissionsGroup->getName()) {
|
switch ($permissionsGroup->getName()) {
|
||||||
case 'social':
|
case 'social':
|
||||||
if ($scope->getName()['en'] === 'administrative') {
|
if ('administrative' === $scope->getName()['en']) {
|
||||||
break 2; // we do not want any power on administrative
|
break 2; // we do not want any power on administrative
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,7 +49,7 @@ class LoadActivitytACL extends AbstractFixture implements OrderedFixtureInterfac
|
|||||||
|
|
||||||
case 'administrative':
|
case 'administrative':
|
||||||
case 'direction':
|
case 'direction':
|
||||||
if (in_array($scope->getName()['en'], ['administrative', 'social'], true)) {
|
if (\in_array($scope->getName()['en'], ['administrative', 'social'], true)) {
|
||||||
break 2; // we do not want any power on social or administrative
|
break 2; // we do not want any power on social or administrative
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,6 @@ namespace Chill\ActivityBundle\DependencyInjection;
|
|||||||
|
|
||||||
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
|
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
|
||||||
use Symfony\Component\Config\Definition\ConfigurationInterface;
|
use Symfony\Component\Config\Definition\ConfigurationInterface;
|
||||||
|
|
||||||
use function is_int;
|
use function is_int;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,7 +58,7 @@ class Configuration implements ConfigurationInterface
|
|||||||
->info('The number of seconds of this duration. Must be an integer.')
|
->info('The number of seconds of this duration. Must be an integer.')
|
||||||
->cannotBeEmpty()
|
->cannotBeEmpty()
|
||||||
->validate()
|
->validate()
|
||||||
->ifTrue(static fn ($data) => !is_int($data))->thenInvalid('The value %s is not a valid integer')
|
->ifTrue(static fn ($data) => !\is_int($data))->thenInvalid('The value %s is not a valid integer')
|
||||||
->end()
|
->end()
|
||||||
->end()
|
->end()
|
||||||
->scalarNode('label')
|
->scalarNode('label')
|
||||||
|
@ -36,7 +36,6 @@ use DateTime;
|
|||||||
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\Security\Core\User\UserInterface;
|
|
||||||
use Symfony\Component\Serializer\Annotation\DiscriminatorMap;
|
use Symfony\Component\Serializer\Annotation\DiscriminatorMap;
|
||||||
use Symfony\Component\Serializer\Annotation\Groups;
|
use Symfony\Component\Serializer\Annotation\Groups;
|
||||||
use Symfony\Component\Serializer\Annotation\SerializedName;
|
use Symfony\Component\Serializer\Annotation\SerializedName;
|
||||||
@ -46,11 +45,15 @@ use Symfony\Component\Validator\Constraints as Assert;
|
|||||||
* Class Activity.
|
* Class Activity.
|
||||||
*
|
*
|
||||||
* @ORM\Entity(repositoryClass="Chill\ActivityBundle\Repository\ActivityRepository")
|
* @ORM\Entity(repositoryClass="Chill\ActivityBundle\Repository\ActivityRepository")
|
||||||
|
*
|
||||||
* @ORM\Table(name="activity")
|
* @ORM\Table(name="activity")
|
||||||
|
*
|
||||||
* @ORM\HasLifecycleCallbacks
|
* @ORM\HasLifecycleCallbacks
|
||||||
|
*
|
||||||
* @DiscriminatorMap(typeProperty="type", mapping={
|
* @DiscriminatorMap(typeProperty="type", mapping={
|
||||||
* "activity": Activity::class
|
* "activity": Activity::class
|
||||||
* })
|
* })
|
||||||
|
*
|
||||||
* @ActivityValidator\ActivityValidity
|
* @ActivityValidator\ActivityValidity
|
||||||
*
|
*
|
||||||
* TODO see if necessary
|
* TODO see if necessary
|
||||||
@ -65,69 +68,84 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
|
|
||||||
use TrackUpdateTrait;
|
use TrackUpdateTrait;
|
||||||
|
|
||||||
public const SENTRECEIVED_RECEIVED = 'received';
|
final public const SENTRECEIVED_RECEIVED = 'received';
|
||||||
|
|
||||||
public const SENTRECEIVED_SENT = 'sent';
|
final public const SENTRECEIVED_SENT = 'sent';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\PersonBundle\Entity\AccompanyingPeriod")
|
* @ORM\ManyToOne(targetEntity="Chill\PersonBundle\Entity\AccompanyingPeriod")
|
||||||
|
*
|
||||||
* @Groups({"read"})
|
* @Groups({"read"})
|
||||||
*/
|
*/
|
||||||
private ?AccompanyingPeriod $accompanyingPeriod = null;
|
private ?AccompanyingPeriod $accompanyingPeriod = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityType")
|
* @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityType")
|
||||||
|
*
|
||||||
* @Groups({"read", "docgen:read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
|
*
|
||||||
* @SerializedName("activityType")
|
* @SerializedName("activityType")
|
||||||
|
*
|
||||||
* @ORM\JoinColumn(name="type_id")
|
* @ORM\JoinColumn(name="type_id")
|
||||||
*/
|
*/
|
||||||
private ActivityType $activityType;
|
private ActivityType $activityType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityPresence")
|
* @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityPresence")
|
||||||
|
*
|
||||||
* @Groups({"docgen:read"})
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?ActivityPresence $attendee = null;
|
private ?ActivityPresence $attendee = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\CommentEmbeddable", columnPrefix="comment_")
|
* @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\CommentEmbeddable", columnPrefix="comment_")
|
||||||
|
*
|
||||||
* @Groups({"docgen:read"})
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private CommentEmbeddable $comment;
|
private CommentEmbeddable $comment;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="datetime")
|
* @ORM\Column(type="datetime")
|
||||||
|
*
|
||||||
* @Groups({"docgen:read"})
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private DateTime $date;
|
private \DateTime $date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\DocStoreBundle\Entity\StoredObject", cascade={"persist"})
|
* @ORM\ManyToMany(targetEntity="Chill\DocStoreBundle\Entity\StoredObject", cascade={"persist"})
|
||||||
|
*
|
||||||
* @Assert\Valid(traverse=true)
|
* @Assert\Valid(traverse=true)
|
||||||
|
*
|
||||||
|
* @var Collection<StoredObject>
|
||||||
*/
|
*/
|
||||||
private Collection $documents;
|
private Collection $documents;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="time", nullable=true)
|
* @ORM\Column(type="time", nullable=true)
|
||||||
*/
|
*/
|
||||||
private ?DateTime $durationTime = null;
|
private ?\DateTime $durationTime = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="boolean", options={"default": false})
|
* @ORM\Column(type="boolean", options={"default": false})
|
||||||
|
*
|
||||||
* @Groups({"docgen:read"})
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private bool $emergency = false;
|
private bool $emergency = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Id
|
* @ORM\Id
|
||||||
|
*
|
||||||
* @ORM\Column(name="id", type="integer")
|
* @ORM\Column(name="id", type="integer")
|
||||||
|
*
|
||||||
* @ORM\GeneratedValue(strategy="AUTO")
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
|
*
|
||||||
* @Groups({"read", "docgen:read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?int $id = null;
|
private ?int $id = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Location")
|
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Location")
|
||||||
|
*
|
||||||
* @groups({"read", "docgen:read"})
|
* @groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?Location $location = null;
|
private ?Location $location = null;
|
||||||
@ -139,9 +157,12 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\Person")
|
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\Person")
|
||||||
|
*
|
||||||
* @Groups({"read", "docgen:read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
|
*
|
||||||
|
* @var Collection<Person>
|
||||||
*/
|
*/
|
||||||
private ?Collection $persons = null;
|
private Collection $persons;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable", columnPrefix="privateComment_")
|
* @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable", columnPrefix="privateComment_")
|
||||||
@ -150,58 +171,78 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\ActivityBundle\Entity\ActivityReason")
|
* @ORM\ManyToMany(targetEntity="Chill\ActivityBundle\Entity\ActivityReason")
|
||||||
|
*
|
||||||
* @Groups({"docgen:read"})
|
* @Groups({"docgen:read"})
|
||||||
|
*
|
||||||
|
* @var Collection<ActivityReason>
|
||||||
*/
|
*/
|
||||||
private Collection $reasons;
|
private Collection $reasons;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Scope")
|
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Scope")
|
||||||
|
*
|
||||||
* @Groups({"docgen:read"})
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?Scope $scope = null;
|
private ?Scope $scope = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="string", options={"default": ""})
|
* @ORM\Column(type="string", options={"default": ""})
|
||||||
|
*
|
||||||
* @Groups({"docgen:read"})
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private string $sentReceived = '';
|
private string $sentReceived = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\SocialWork\SocialAction")
|
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\SocialWork\SocialAction")
|
||||||
|
*
|
||||||
* @ORM\JoinTable(name="chill_activity_activity_chill_person_socialaction")
|
* @ORM\JoinTable(name="chill_activity_activity_chill_person_socialaction")
|
||||||
|
*
|
||||||
* @Groups({"read", "docgen:read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
|
*
|
||||||
|
* @var Collection<SocialAction>
|
||||||
*/
|
*/
|
||||||
private Collection $socialActions;
|
private Collection $socialActions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\SocialWork\SocialIssue")
|
* @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\SocialWork\SocialIssue")
|
||||||
|
*
|
||||||
* @ORM\JoinTable(name="chill_activity_activity_chill_person_socialissue")
|
* @ORM\JoinTable(name="chill_activity_activity_chill_person_socialissue")
|
||||||
|
*
|
||||||
* @Groups({"read", "docgen:read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
|
*
|
||||||
|
* @var Collection<SocialIssue>
|
||||||
*/
|
*/
|
||||||
private Collection $socialIssues;
|
private Collection $socialIssues;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\ThirdPartyBundle\Entity\ThirdParty")
|
* @ORM\ManyToMany(targetEntity="Chill\ThirdPartyBundle\Entity\ThirdParty")
|
||||||
|
*
|
||||||
* @Groups({"read", "docgen:read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
|
*
|
||||||
|
* @var Collection<ThirdParty>
|
||||||
*/
|
*/
|
||||||
private ?Collection $thirdParties = null;
|
private Collection $thirdParties;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="time", nullable=true)
|
* @ORM\Column(type="time", nullable=true)
|
||||||
*/
|
*/
|
||||||
private ?DateTime $travelTime = null;
|
private ?\DateTime $travelTime = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User")
|
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User")
|
||||||
|
*
|
||||||
* @Groups({"docgen:read"})
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?User $user = null;
|
private ?User $user = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="Chill\MainBundle\Entity\User")
|
* @ORM\ManyToMany(targetEntity="Chill\MainBundle\Entity\User")
|
||||||
|
*
|
||||||
* @Groups({"read", "docgen:read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
|
*
|
||||||
|
* @var Collection<User>
|
||||||
*/
|
*/
|
||||||
private ?Collection $users = null;
|
private Collection $users;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@ -268,7 +309,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
$this->socialIssues[] = $socialIssue;
|
$this->socialIssues[] = $socialIssue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->getAccompanyingPeriod() !== null) {
|
if (null !== $this->getAccompanyingPeriod()) {
|
||||||
$this->getAccompanyingPeriod()->addSocialIssue($socialIssue);
|
$this->getAccompanyingPeriod()->addSocialIssue($socialIssue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,7 +375,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
return $this->comment;
|
return $this->comment;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDate(): DateTime
|
public function getDate(): \DateTime
|
||||||
{
|
{
|
||||||
return $this->date;
|
return $this->date;
|
||||||
}
|
}
|
||||||
@ -356,7 +397,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
return (int) round(($this->durationTime->getTimestamp() + $this->durationTime->getOffset()) / 60.0, 0);
|
return (int) round(($this->durationTime->getTimestamp() + $this->durationTime->getOffset()) / 60.0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDurationTime(): ?DateTime
|
public function getDurationTime(): ?\DateTime
|
||||||
{
|
{
|
||||||
return $this->durationTime;
|
return $this->durationTime;
|
||||||
}
|
}
|
||||||
@ -410,7 +451,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
|
|
||||||
// TODO better semantic with: return $this->persons->filter(...);
|
// TODO better semantic with: return $this->persons->filter(...);
|
||||||
foreach ($this->persons as $person) {
|
foreach ($this->persons as $person) {
|
||||||
if ($this->accompanyingPeriod->getOpenParticipationContainsPerson($person) === null) {
|
if (null === $this->accompanyingPeriod->getOpenParticipationContainsPerson($person)) {
|
||||||
$personsNotAssociated[] = $person;
|
$personsNotAssociated[] = $person;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -469,7 +510,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
return $this->thirdParties;
|
return $this->thirdParties;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTravelTime(): ?DateTime
|
public function getTravelTime(): ?\DateTime
|
||||||
{
|
{
|
||||||
return $this->travelTime;
|
return $this->travelTime;
|
||||||
}
|
}
|
||||||
@ -580,7 +621,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setDate(DateTime $date): self
|
public function setDate(\DateTime $date): self
|
||||||
{
|
{
|
||||||
$this->date = $date;
|
$this->date = $date;
|
||||||
|
|
||||||
@ -594,7 +635,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setDurationTime(?DateTime $durationTime): self
|
public function setDurationTime(?\DateTime $durationTime): self
|
||||||
{
|
{
|
||||||
$this->durationTime = $durationTime;
|
$this->durationTime = $durationTime;
|
||||||
|
|
||||||
@ -664,7 +705,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setTravelTime(DateTime $travelTime): self
|
public function setTravelTime(\DateTime $travelTime): self
|
||||||
{
|
{
|
||||||
$this->travelTime = $travelTime;
|
$this->travelTime = $travelTime;
|
||||||
|
|
||||||
|
@ -18,7 +18,9 @@ use Symfony\Component\Serializer\Annotation as Serializer;
|
|||||||
* Class ActivityPresence.
|
* Class ActivityPresence.
|
||||||
*
|
*
|
||||||
* @ORM\Entity
|
* @ORM\Entity
|
||||||
|
*
|
||||||
* @ORM\Table(name="activitytpresence")
|
* @ORM\Table(name="activitytpresence")
|
||||||
|
*
|
||||||
* @ORM\HasLifecycleCallbacks
|
* @ORM\HasLifecycleCallbacks
|
||||||
*/
|
*/
|
||||||
class ActivityPresence
|
class ActivityPresence
|
||||||
@ -30,15 +32,20 @@ class ActivityPresence
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Id
|
* @ORM\Id
|
||||||
|
*
|
||||||
* @ORM\Column(name="id", type="integer")
|
* @ORM\Column(name="id", type="integer")
|
||||||
|
*
|
||||||
* @ORM\GeneratedValue(strategy="AUTO")
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
|
*
|
||||||
* @Serializer\Groups({"docgen:read"})
|
* @Serializer\Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?int $id = null;
|
private ?int $id = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="json")
|
* @ORM\Column(type="json")
|
||||||
|
*
|
||||||
* @Serializer\Groups({"docgen:read"})
|
* @Serializer\Groups({"docgen:read"})
|
||||||
|
*
|
||||||
* @Serializer\Context({"is-translatable": true}, groups={"docgen:read"})
|
* @Serializer\Context({"is-translatable": true}, groups={"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private array $name = [];
|
private array $name = [];
|
||||||
|
@ -17,39 +17,38 @@ use Doctrine\ORM\Mapping as ORM;
|
|||||||
* Class ActivityReason.
|
* Class ActivityReason.
|
||||||
*
|
*
|
||||||
* @ORM\Entity
|
* @ORM\Entity
|
||||||
|
*
|
||||||
* @ORM\Table(name="activityreason")
|
* @ORM\Table(name="activityreason")
|
||||||
|
*
|
||||||
* @ORM\HasLifecycleCallbacks
|
* @ORM\HasLifecycleCallbacks
|
||||||
*/
|
*/
|
||||||
class ActivityReason
|
class ActivityReason
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var bool
|
|
||||||
* @ORM\Column(type="boolean")
|
* @ORM\Column(type="boolean")
|
||||||
*/
|
*/
|
||||||
private $active = true;
|
private bool $active = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var ActivityReasonCategory
|
|
||||||
* @ORM\ManyToOne(
|
* @ORM\ManyToOne(
|
||||||
* targetEntity="Chill\ActivityBundle\Entity\ActivityReasonCategory",
|
* targetEntity="Chill\ActivityBundle\Entity\ActivityReasonCategory",
|
||||||
* inversedBy="reasons")
|
* inversedBy="reasons")
|
||||||
*/
|
*/
|
||||||
private $category;
|
private ?ActivityReasonCategory $category = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int
|
|
||||||
*
|
|
||||||
* @ORM\Id
|
* @ORM\Id
|
||||||
|
*
|
||||||
* @ORM\Column(name="id", type="integer")
|
* @ORM\Column(name="id", type="integer")
|
||||||
|
*
|
||||||
* @ORM\GeneratedValue(strategy="AUTO")
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
*/
|
*/
|
||||||
private $id;
|
private ?int $id = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array
|
|
||||||
* @ORM\Column(type="json")
|
* @ORM\Column(type="json")
|
||||||
*/
|
*/
|
||||||
private $name;
|
private array $name;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get active.
|
* Get active.
|
||||||
@ -81,27 +80,9 @@ class ActivityReason
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get name.
|
* Get name.
|
||||||
*
|
|
||||||
* @param mixed|null $locale
|
|
||||||
*
|
|
||||||
* @return array | string
|
|
||||||
*/
|
*/
|
||||||
public function getName($locale = null)
|
public function getName(): array
|
||||||
{
|
{
|
||||||
if ($locale) {
|
|
||||||
if (isset($this->name[$locale])) {
|
|
||||||
return $this->name[$locale];
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($this->name as $name) {
|
|
||||||
if (!empty($name)) {
|
|
||||||
return $name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->name;
|
return $this->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,34 +12,37 @@ declare(strict_types=1);
|
|||||||
namespace Chill\ActivityBundle\Entity;
|
namespace Chill\ActivityBundle\Entity;
|
||||||
|
|
||||||
use Doctrine\Common\Collections\ArrayCollection;
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ActivityReasonCategory.
|
* Class ActivityReasonCategory.
|
||||||
*
|
*
|
||||||
* @ORM\Entity
|
* @ORM\Entity
|
||||||
|
*
|
||||||
* @ORM\Table(name="activityreasoncategory")
|
* @ORM\Table(name="activityreasoncategory")
|
||||||
|
*
|
||||||
* @ORM\HasLifecycleCallbacks
|
* @ORM\HasLifecycleCallbacks
|
||||||
*/
|
*/
|
||||||
class ActivityReasonCategory
|
class ActivityReasonCategory implements \Stringable
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var bool
|
|
||||||
* @ORM\Column(type="boolean")
|
* @ORM\Column(type="boolean")
|
||||||
*/
|
*/
|
||||||
private $active = true;
|
private bool $active = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int
|
|
||||||
*
|
|
||||||
* @ORM\Id
|
* @ORM\Id
|
||||||
|
*
|
||||||
* @ORM\Column(name="id", type="integer")
|
* @ORM\Column(name="id", type="integer")
|
||||||
|
*
|
||||||
* @ORM\GeneratedValue(strategy="AUTO")
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
*/
|
*/
|
||||||
private $id;
|
private ?int $id = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
|
*
|
||||||
* @ORM\Column(type="json")
|
* @ORM\Column(type="json")
|
||||||
*/
|
*/
|
||||||
private $name;
|
private $name;
|
||||||
@ -47,12 +50,13 @@ class ActivityReasonCategory
|
|||||||
/**
|
/**
|
||||||
* Array of ActivityReason.
|
* Array of ActivityReason.
|
||||||
*
|
*
|
||||||
* @var ArrayCollection
|
* @var Collection<ActivityReason>
|
||||||
|
*
|
||||||
* @ORM\OneToMany(
|
* @ORM\OneToMany(
|
||||||
* targetEntity="Chill\ActivityBundle\Entity\ActivityReason",
|
* targetEntity="Chill\ActivityBundle\Entity\ActivityReason",
|
||||||
* mappedBy="category")
|
* mappedBy="category")
|
||||||
*/
|
*/
|
||||||
private $reasons;
|
private Collection $reasons;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ActivityReasonCategory constructor.
|
* ActivityReasonCategory constructor.
|
||||||
@ -62,10 +66,7 @@ class ActivityReasonCategory
|
|||||||
$this->reasons = new ArrayCollection();
|
$this->reasons = new ArrayCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function __toString(): string
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
{
|
||||||
return 'ActivityReasonCategory('.$this->getName('x').')';
|
return 'ActivityReasonCategory('.$this->getName('x').')';
|
||||||
}
|
}
|
||||||
@ -121,11 +122,9 @@ class ActivityReasonCategory
|
|||||||
* as unactive, all the reason have this entity as category is also
|
* as unactive, all the reason have this entity as category is also
|
||||||
* set as unactive.
|
* set as unactive.
|
||||||
*
|
*
|
||||||
* @param bool $active
|
|
||||||
*
|
|
||||||
* @return ActivityReasonCategory
|
* @return ActivityReasonCategory
|
||||||
*/
|
*/
|
||||||
public function setActive($active)
|
public function setActive(bool $active)
|
||||||
{
|
{
|
||||||
if ($this->active !== $active && !$active) {
|
if ($this->active !== $active && !$active) {
|
||||||
foreach ($this->reasons as $reason) {
|
foreach ($this->reasons as $reason) {
|
||||||
|
@ -12,7 +12,6 @@ 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 InvalidArgumentException;
|
|
||||||
use Symfony\Component\Serializer\Annotation as Serializer;
|
use Symfony\Component\Serializer\Annotation as Serializer;
|
||||||
use Symfony\Component\Serializer\Annotation\Groups;
|
use Symfony\Component\Serializer\Annotation\Groups;
|
||||||
use Symfony\Component\Validator\Constraints as Assert;
|
use Symfony\Component\Validator\Constraints as Assert;
|
||||||
@ -22,31 +21,36 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
|||||||
* Class ActivityType.
|
* Class ActivityType.
|
||||||
*
|
*
|
||||||
* @ORM\Entity
|
* @ORM\Entity
|
||||||
|
*
|
||||||
* @ORM\Table(name="activitytype")
|
* @ORM\Table(name="activitytype")
|
||||||
|
*
|
||||||
* @ORM\HasLifecycleCallbacks
|
* @ORM\HasLifecycleCallbacks
|
||||||
*/
|
*/
|
||||||
class ActivityType
|
class ActivityType
|
||||||
{
|
{
|
||||||
public const FIELD_INVISIBLE = 0;
|
final public const FIELD_INVISIBLE = 0;
|
||||||
|
|
||||||
public const FIELD_OPTIONAL = 1;
|
final public const FIELD_OPTIONAL = 1;
|
||||||
|
|
||||||
public const FIELD_REQUIRED = 2;
|
final public const FIELD_REQUIRED = 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated not in use
|
* @deprecated not in use
|
||||||
|
*
|
||||||
* @ORM\Column(type="string", nullable=false, options={"default": ""})
|
* @ORM\Column(type="string", nullable=false, options={"default": ""})
|
||||||
*/
|
*/
|
||||||
private string $accompanyingPeriodLabel = '';
|
private string $accompanyingPeriodLabel = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated not in use
|
* @deprecated not in use
|
||||||
|
*
|
||||||
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
||||||
*/
|
*/
|
||||||
private int $accompanyingPeriodVisible = self::FIELD_INVISIBLE;
|
private int $accompanyingPeriodVisible = self::FIELD_INVISIBLE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="boolean")
|
* @ORM\Column(type="boolean")
|
||||||
|
*
|
||||||
* @Groups({"read"})
|
* @Groups({"read"})
|
||||||
*/
|
*/
|
||||||
private bool $active = true;
|
private bool $active = true;
|
||||||
@ -118,8 +122,11 @@ class ActivityType
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Id
|
* @ORM\Id
|
||||||
|
*
|
||||||
* @ORM\Column(name="id", type="integer")
|
* @ORM\Column(name="id", type="integer")
|
||||||
|
*
|
||||||
* @ORM\GeneratedValue(strategy="AUTO")
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
|
*
|
||||||
* @Groups({"docgen:read"})
|
* @Groups({"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private ?int $id = null;
|
private ?int $id = null;
|
||||||
@ -136,7 +143,9 @@ class ActivityType
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="json")
|
* @ORM\Column(type="json")
|
||||||
|
*
|
||||||
* @Groups({"read", "docgen:read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
|
*
|
||||||
* @Serializer\Context({"is-translatable": true}, groups={"docgen:read"})
|
* @Serializer\Context({"is-translatable": true}, groups={"docgen:read"})
|
||||||
*/
|
*/
|
||||||
private array $name = [];
|
private array $name = [];
|
||||||
@ -158,6 +167,7 @@ class ActivityType
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
||||||
|
*
|
||||||
* @Groups({"read"})
|
* @Groups({"read"})
|
||||||
*/
|
*/
|
||||||
private int $personsVisible = self::FIELD_OPTIONAL;
|
private int $personsVisible = self::FIELD_OPTIONAL;
|
||||||
@ -238,6 +248,7 @@ class ActivityType
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
||||||
|
*
|
||||||
* @Groups({"read"})
|
* @Groups({"read"})
|
||||||
*/
|
*/
|
||||||
private int $thirdPartiesVisible = self::FIELD_INVISIBLE;
|
private int $thirdPartiesVisible = self::FIELD_INVISIBLE;
|
||||||
@ -264,6 +275,7 @@ class ActivityType
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
* @ORM\Column(type="smallint", nullable=false, options={"default": 1})
|
||||||
|
*
|
||||||
* @Groups({"read"})
|
* @Groups({"read"})
|
||||||
*/
|
*/
|
||||||
private int $usersVisible = self::FIELD_OPTIONAL;
|
private int $usersVisible = self::FIELD_OPTIONAL;
|
||||||
@ -275,13 +287,15 @@ class ActivityType
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @Assert\Callback
|
* @Assert\Callback
|
||||||
*
|
|
||||||
* @param mixed $payload
|
|
||||||
*/
|
*/
|
||||||
public function checkSocialActionsVisibility(ExecutionContextInterface $context, $payload)
|
public function checkSocialActionsVisibility(ExecutionContextInterface $context, mixed $payload)
|
||||||
{
|
{
|
||||||
if ($this->socialIssuesVisible !== $this->socialActionsVisible) {
|
if ($this->socialIssuesVisible !== $this->socialActionsVisible) {
|
||||||
if (!(2 === $this->socialIssuesVisible && 1 === $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 (
|
||||||
|
(0 === $this->socialIssuesVisible && (1 === $this->socialActionsVisible || 2 === $this->socialActionsVisible))
|
||||||
|
|| (1 === $this->socialIssuesVisible && 2 === $this->socialActionsVisible)
|
||||||
|
) {
|
||||||
$context
|
$context
|
||||||
->buildViolation('The socialActionsVisible value is not compatible with the socialIssuesVisible value')
|
->buildViolation('The socialActionsVisible value is not compatible with the socialIssuesVisible value')
|
||||||
->atPath('socialActionsVisible')
|
->atPath('socialActionsVisible')
|
||||||
@ -377,10 +391,10 @@ class ActivityType
|
|||||||
$property = $field.'Label';
|
$property = $field.'Label';
|
||||||
|
|
||||||
if (!property_exists($this, $property)) {
|
if (!property_exists($this, $property)) {
|
||||||
throw new InvalidArgumentException('Field "' . $field . '" not found');
|
throw new \InvalidArgumentException('Field "'.$field.'" not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @phpstan-ignore-next-line */
|
/* @phpstan-ignore-next-line */
|
||||||
return $this->{$property};
|
return $this->{$property};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -536,10 +550,10 @@ class ActivityType
|
|||||||
$property = $field.'Visible';
|
$property = $field.'Visible';
|
||||||
|
|
||||||
if (!property_exists($this, $property)) {
|
if (!property_exists($this, $property)) {
|
||||||
throw new InvalidArgumentException('Field "' . $field . '" not found');
|
throw new \InvalidArgumentException('Field "'.$field.'" not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @phpstan-ignore-next-line */
|
/* @phpstan-ignore-next-line */
|
||||||
return self::FIELD_REQUIRED === $this->{$property};
|
return self::FIELD_REQUIRED === $this->{$property};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -548,10 +562,10 @@ class ActivityType
|
|||||||
$property = $field.'Visible';
|
$property = $field.'Visible';
|
||||||
|
|
||||||
if (!property_exists($this, $property)) {
|
if (!property_exists($this, $property)) {
|
||||||
throw new InvalidArgumentException('Field "' . $field . '" not found');
|
throw new \InvalidArgumentException('Field "'.$field.'" not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @phpstan-ignore-next-line */
|
/* @phpstan-ignore-next-line */
|
||||||
return self::FIELD_INVISIBLE !== $this->{$property};
|
return self::FIELD_INVISIBLE !== $this->{$property};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,9 @@ use Doctrine\ORM\Mapping as ORM;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Entity
|
* @ORM\Entity
|
||||||
|
*
|
||||||
* @ORM\Table(name="activitytypecategory")
|
* @ORM\Table(name="activitytypecategory")
|
||||||
|
*
|
||||||
* @ORM\HasLifecycleCallbacks
|
* @ORM\HasLifecycleCallbacks
|
||||||
*/
|
*/
|
||||||
class ActivityTypeCategory
|
class ActivityTypeCategory
|
||||||
@ -27,7 +29,9 @@ class ActivityTypeCategory
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Id
|
* @ORM\Id
|
||||||
|
*
|
||||||
* @ORM\Column(name="id", type="integer")
|
* @ORM\Column(name="id", type="integer")
|
||||||
|
*
|
||||||
* @ORM\GeneratedValue(strategy="AUTO")
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
*/
|
*/
|
||||||
private ?int $id = null;
|
private ?int $id = null;
|
||||||
|
@ -15,21 +15,12 @@ use Chill\ActivityBundle\Entity\Activity;
|
|||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork;
|
||||||
use Chill\PersonBundle\Repository\AccompanyingPeriod\AccompanyingPeriodWorkRepository;
|
use Chill\PersonBundle\Repository\AccompanyingPeriod\AccompanyingPeriodWorkRepository;
|
||||||
use DateTimeImmutable;
|
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
use function in_array;
|
|
||||||
|
|
||||||
class ActivityEntityListener
|
class ActivityEntityListener
|
||||||
{
|
{
|
||||||
private EntityManagerInterface $em;
|
public function __construct(private readonly EntityManagerInterface $em, private readonly AccompanyingPeriodWorkRepository $workRepository)
|
||||||
|
|
||||||
private AccompanyingPeriodWorkRepository $workRepository;
|
|
||||||
|
|
||||||
public function __construct(EntityManagerInterface $em, AccompanyingPeriodWorkRepository $workRepository)
|
|
||||||
{
|
{
|
||||||
$this->em = $em;
|
|
||||||
$this->workRepository = $workRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function persistActionToCourse(Activity $activity)
|
public function persistActionToCourse(Activity $activity)
|
||||||
@ -39,11 +30,11 @@ class ActivityEntityListener
|
|||||||
|
|
||||||
$accompanyingCourseWorks = $this->workRepository->findByAccompanyingPeriod($period);
|
$accompanyingCourseWorks = $this->workRepository->findByAccompanyingPeriod($period);
|
||||||
$periodActions = [];
|
$periodActions = [];
|
||||||
$now = new DateTimeImmutable();
|
$now = new \DateTimeImmutable();
|
||||||
|
|
||||||
foreach ($accompanyingCourseWorks as $key => $work) {
|
foreach ($accompanyingCourseWorks as $key => $work) {
|
||||||
// take only the actions which are still opened
|
// take only the actions which are still opened
|
||||||
if ($work->getEndDate() === null || $work->getEndDate() > ($activity->getDate() ?? $now)) {
|
if (null === $work->getEndDate() || $work->getEndDate() > ($activity->getDate() ?? $now)) {
|
||||||
$periodActions[$key] = spl_object_hash($work->getSocialAction());
|
$periodActions[$key] = spl_object_hash($work->getSocialAction());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -52,14 +43,14 @@ class ActivityEntityListener
|
|||||||
$associatedThirdparties = $activity->getThirdParties();
|
$associatedThirdparties = $activity->getThirdParties();
|
||||||
|
|
||||||
foreach ($activity->getSocialActions() as $action) {
|
foreach ($activity->getSocialActions() as $action) {
|
||||||
if (in_array(spl_object_hash($action), $periodActions, true)) {
|
if (\in_array(spl_object_hash($action), $periodActions, true)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$newAction = new AccompanyingPeriodWork();
|
$newAction = new AccompanyingPeriodWork();
|
||||||
$newAction->setSocialAction($action);
|
$newAction->setSocialAction($action);
|
||||||
$period->addWork($newAction);
|
$period->addWork($newAction);
|
||||||
|
|
||||||
$date = DateTimeImmutable::createFromMutable($activity->getDate());
|
$date = \DateTimeImmutable::createFromMutable($activity->getDate());
|
||||||
$newAction->setStartDate($date);
|
$newAction->setStartDate($date);
|
||||||
|
|
||||||
foreach ($associatedPersons as $person) {
|
foreach ($associatedPersons as $person) {
|
||||||
|
@ -40,6 +40,7 @@ class ByActivityNumberAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// No form needed
|
// No form needed
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFormDefaultData(): array
|
public function getFormDefaultData(): array
|
||||||
{
|
{
|
||||||
return [];
|
return [];
|
||||||
|
@ -0,0 +1,123 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\ActivityBundle\Export\Aggregator\ACPAggregators;
|
||||||
|
|
||||||
|
use Chill\ActivityBundle\Entity\Activity;
|
||||||
|
use Chill\ActivityBundle\Entity\ActivityType;
|
||||||
|
use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface;
|
||||||
|
use Chill\MainBundle\Export\AggregatorInterface;
|
||||||
|
use Chill\MainBundle\Form\Type\PickRollingDateType;
|
||||||
|
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
|
||||||
|
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||||
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
|
use Doctrine\ORM\Query\Expr\Join;
|
||||||
|
use Doctrine\ORM\QueryBuilder;
|
||||||
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
|
||||||
|
final readonly class ByActivityTypeAggregator implements AggregatorInterface
|
||||||
|
{
|
||||||
|
private const PREFIX = 'acp_by_activity_type_agg';
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
private RollingDateConverterInterface $rollingDateConverter,
|
||||||
|
private ActivityTypeRepositoryInterface $activityTypeRepository,
|
||||||
|
private TranslatableStringHelperInterface $translatableStringHelper,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function buildForm(FormBuilderInterface $builder)
|
||||||
|
{
|
||||||
|
$builder
|
||||||
|
->add('after_date', PickRollingDateType::class, [
|
||||||
|
'required' => false,
|
||||||
|
'label' => 'export.aggregator.acp.by_activity_type.after_date',
|
||||||
|
])
|
||||||
|
->add('before_date', PickRollingDateType::class, [
|
||||||
|
'required' => false,
|
||||||
|
'label' => 'export.aggregator.acp.by_activity_type.before_date',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFormDefaultData(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'before_date' => null,
|
||||||
|
'after_date' => null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLabels($key, array $values, mixed $data)
|
||||||
|
{
|
||||||
|
return function (int|string|null $value): string {
|
||||||
|
if ('_header' === $value) {
|
||||||
|
return 'export.aggregator.acp.by_activity_type.activity_type';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('' === $value || null === $value || null === $activityType = $this->activityTypeRepository->find($value)) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->translatableStringHelper->localize($activityType->getName());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getQueryKeys($data)
|
||||||
|
{
|
||||||
|
return [self::PREFIX.'_actype_id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTitle()
|
||||||
|
{
|
||||||
|
return 'export.aggregator.acp.by_activity_type.title';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addRole(): ?string
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function alterQuery(QueryBuilder $qb, $data)
|
||||||
|
{
|
||||||
|
$p = self::PREFIX;
|
||||||
|
|
||||||
|
// we make a left join, with acp having at least one activity of the given type
|
||||||
|
$exists = 'EXISTS (SELECT 1 FROM '.Activity::class." {$p}_activity WHERE {$p}_activity.accompanyingPeriod = acp AND {$p}_activity.activityType = {$p}_activity_type";
|
||||||
|
|
||||||
|
if (null !== $data['after_date']) {
|
||||||
|
$exists .= " AND {$p}_activity.date > :{$p}_after_date";
|
||||||
|
$qb->setParameter("{$p}_after_date", $this->rollingDateConverter->convert($data['after_date']));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null !== $data['before_date']) {
|
||||||
|
$exists .= " AND {$p}_activity.date < :{$p}_before_date";
|
||||||
|
$qb->setParameter("{$p}_before_date", $this->rollingDateConverter->convert($data['before_date']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$exists .= ')';
|
||||||
|
|
||||||
|
$qb->leftJoin(
|
||||||
|
ActivityType::class,
|
||||||
|
"{$p}_activity_type",
|
||||||
|
Join::WITH,
|
||||||
|
$exists
|
||||||
|
);
|
||||||
|
|
||||||
|
$qb
|
||||||
|
->addSelect("{$p}_activity_type.id AS {$p}_actype_id")
|
||||||
|
->addGroupBy("{$p}_actype_id");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function applyOn()
|
||||||
|
{
|
||||||
|
return Declarations::ACP_TYPE;
|
||||||
|
}
|
||||||
|
}
|
@ -17,20 +17,11 @@ use Chill\PersonBundle\Repository\SocialWork\SocialActionRepository;
|
|||||||
use Chill\PersonBundle\Templating\Entity\SocialActionRender;
|
use Chill\PersonBundle\Templating\Entity\SocialActionRender;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use function in_array;
|
|
||||||
|
|
||||||
class BySocialActionAggregator implements AggregatorInterface
|
class BySocialActionAggregator implements AggregatorInterface
|
||||||
{
|
{
|
||||||
private SocialActionRender $actionRender;
|
public function __construct(private readonly SocialActionRender $actionRender, private readonly SocialActionRepository $actionRepository)
|
||||||
|
{
|
||||||
private SocialActionRepository $actionRepository;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
SocialActionRender $actionRender,
|
|
||||||
SocialActionRepository $actionRepository
|
|
||||||
) {
|
|
||||||
$this->actionRender = $actionRender;
|
|
||||||
$this->actionRepository = $actionRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@ -40,7 +31,7 @@ class BySocialActionAggregator implements AggregatorInterface
|
|||||||
|
|
||||||
public function alterQuery(QueryBuilder $qb, $data)
|
public function alterQuery(QueryBuilder $qb, $data)
|
||||||
{
|
{
|
||||||
if (!in_array('actsocialaction', $qb->getAllAliases(), true)) {
|
if (!\in_array('actsocialaction', $qb->getAllAliases(), true)) {
|
||||||
$qb->leftJoin('activity.socialActions', 'actsocialaction');
|
$qb->leftJoin('activity.socialActions', 'actsocialaction');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,6 +48,7 @@ class BySocialActionAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// no form
|
// no form
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFormDefaultData(): array
|
public function getFormDefaultData(): array
|
||||||
{
|
{
|
||||||
return [];
|
return [];
|
||||||
|
@ -17,20 +17,11 @@ use Chill\PersonBundle\Repository\SocialWork\SocialIssueRepository;
|
|||||||
use Chill\PersonBundle\Templating\Entity\SocialIssueRender;
|
use Chill\PersonBundle\Templating\Entity\SocialIssueRender;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use function in_array;
|
|
||||||
|
|
||||||
class BySocialIssueAggregator implements AggregatorInterface
|
class BySocialIssueAggregator implements AggregatorInterface
|
||||||
{
|
{
|
||||||
private SocialIssueRender $issueRender;
|
public function __construct(private readonly SocialIssueRepository $issueRepository, private readonly SocialIssueRender $issueRender)
|
||||||
|
{
|
||||||
private SocialIssueRepository $issueRepository;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
SocialIssueRepository $issueRepository,
|
|
||||||
SocialIssueRender $issueRender
|
|
||||||
) {
|
|
||||||
$this->issueRepository = $issueRepository;
|
|
||||||
$this->issueRender = $issueRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@ -40,7 +31,7 @@ class BySocialIssueAggregator implements AggregatorInterface
|
|||||||
|
|
||||||
public function alterQuery(QueryBuilder $qb, $data)
|
public function alterQuery(QueryBuilder $qb, $data)
|
||||||
{
|
{
|
||||||
if (!in_array('actsocialissue', $qb->getAllAliases(), true)) {
|
if (!\in_array('actsocialissue', $qb->getAllAliases(), true)) {
|
||||||
$qb->leftJoin('activity.socialIssues', 'actsocialissue');
|
$qb->leftJoin('activity.socialIssues', 'actsocialissue');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,6 +48,7 @@ class BySocialIssueAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// no form
|
// no form
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFormDefaultData(): array
|
public function getFormDefaultData(): array
|
||||||
{
|
{
|
||||||
return [];
|
return [];
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\ActivityBundle\Export\Aggregator;
|
||||||
|
|
||||||
|
use Chill\ActivityBundle\Export\Declarations;
|
||||||
|
use Chill\MainBundle\Export\AggregatorInterface;
|
||||||
|
use Doctrine\ORM\QueryBuilder;
|
||||||
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
|
||||||
|
final readonly class ActivityLocationAggregator implements AggregatorInterface
|
||||||
|
{
|
||||||
|
public const KEY = 'activity_location_aggregator';
|
||||||
|
|
||||||
|
public function addRole(): ?string
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function alterQuery(QueryBuilder $qb, $data)
|
||||||
|
{
|
||||||
|
if (!\in_array('actloc', $qb->getAllAliases(), true)) {
|
||||||
|
$qb->leftJoin('activity.location', 'actloc');
|
||||||
|
}
|
||||||
|
$qb->addSelect(sprintf('actloc.name AS %s', self::KEY));
|
||||||
|
$qb->addGroupBy(self::KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function applyOn(): string
|
||||||
|
{
|
||||||
|
return Declarations::ACTIVITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function buildForm(FormBuilderInterface $builder)
|
||||||
|
{
|
||||||
|
// no form required for this aggregator
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFormDefaultData(): array
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLabels($key, array $values, $data): \Closure
|
||||||
|
{
|
||||||
|
return function ($value): string {
|
||||||
|
if ('_header' === $value) {
|
||||||
|
return 'export.aggregator.activity.by_location.Activity Location';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === $value || '' === $value) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getQueryKeys($data): array
|
||||||
|
{
|
||||||
|
return [self::KEY];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTitle()
|
||||||
|
{
|
||||||
|
return 'export.aggregator.activity.by_location.Title';
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user