mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-09-11 09:14:59 +00:00
Compare commits
19 Commits
2.5.1
...
upgrade/sy
Author | SHA1 | Date | |
---|---|---|---|
13bc9683fb
|
|||
958e2b5cf2
|
|||
f7ed390c96
|
|||
217ce99851
|
|||
efaa01f4f6
|
|||
f04ef9c931
|
|||
9252e92da0
|
|||
4ab4554e63
|
|||
6d63177ff4
|
|||
81e8928344
|
|||
737f5f9275
|
|||
07c681fcec
|
|||
1c7d90a6ef
|
|||
24c33b306b
|
|||
7e19419861
|
|||
c35994203d
|
|||
9027cbd196
|
|||
dde3002100
|
|||
d8870e906f
|
@@ -1,6 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
All notable changes to this project will be documented in this file.
|
|
||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
||||||
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
|
||||||
and is generated by [Changie](https://github.com/miniscruff/changie).
|
|
@@ -1,677 +0,0 @@
|
|||||||
## 2.0.0
|
|
||||||
|
|
||||||
* this is a release to relaunch our proceess of release with semantic versioning
|
|
||||||
|
|
||||||
## Test releases
|
|
||||||
|
|
||||||
### 2.0.0-beta3
|
|
||||||
|
|
||||||
* [person][export] Fixed: rename the alias for `accompanying_period` to `acp` in filter associated with person
|
|
||||||
* [activity][export] Feature: improve label for aliases in "Filter by activity type"
|
|
||||||
* [activity][export] DX/Feature: use of an `ActivityTypeRepositoryInterface` instead of the old-style EntityRepository
|
|
||||||
* [person][export] Fixed: some inconsistency with date filter on accompanying courses
|
|
||||||
* [person][export] Fixed: use left join for related entities in accompanying course aggregators
|
|
||||||
* [workflow] Feature: allow user to copy and send manually the access link for the workflow
|
|
||||||
* [workflow] Feature: show the email addresses that received an access link for the workflow
|
|
||||||
### 2.0.0-beta2
|
|
||||||
|
|
||||||
* [workflow]: Fixed: the notification is sent when the user is added to the first step.
|
|
||||||
* [budget] Feature: allow to desactivate some charges and resources, adding an `active` key in the configuration
|
|
||||||
* [person] Feature: on Evaluation, allow to configure an URL from the admin
|
|
||||||
|
|
||||||
### 2022-06
|
|
||||||
|
|
||||||
* [workflow]: added pagination to workflow list page
|
|
||||||
* [homepage_widget]: null error on tasks widget fixed
|
|
||||||
* [person-thirdparty]: fix quick-add of names that consist of multiple parts (eg. De Vlieger) within onthefly modal person/thirdparty
|
|
||||||
* [search]: Order of birthdate fields changed in advanced search to avoid confusion.
|
|
||||||
* [workflow]: Constraint added to workflow (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/675)
|
|
||||||
* [social_action]: only show active objectives (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/625)
|
|
||||||
* [household]: Reposition and cut button for enfant hors menage have been deleted (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/620)
|
|
||||||
* [admin]: Add crud for composition type in admin (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/611)
|
|
||||||
* [social_action]: only show active objectives (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/625)
|
|
||||||
|
|
||||||
## Test releases
|
|
||||||
|
|
||||||
### 2022-05-30
|
|
||||||
|
|
||||||
* fix creating a new AccompanyingPeriodWorkEvaluationDocument when replacing the document (the workflow was lost)
|
|
||||||
|
|
||||||
### 2022-05-27
|
|
||||||
|
|
||||||
* [storedobject] add title field on StoredObject entity + use it in activity documents (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/604)
|
|
||||||
* [main] add a "read more..." on comment embeddable when overflown (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/604)
|
|
||||||
* [person] add closing motive to closed acc course (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/603)
|
|
||||||
* [person] household filiation: fetch person info when unfolding person (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/586)
|
|
||||||
* [admin] repair edit of social action in the admin (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/601)
|
|
||||||
* [admin]: add select2 to Goal form type entity fields (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/702)
|
|
||||||
* [main] allow hide permissions group list menu (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/577)
|
|
||||||
* [main] allow hide change user password menu (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/577)
|
|
||||||
* [main] filter user jobs by active jobs (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/577)
|
|
||||||
* [main] add civility to User (entity, migration and form type) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/577)
|
|
||||||
* [admin] refactorisation of the admin section: reorganisation of the menu, translations, form types, new entities (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/592)
|
|
||||||
* [admin] add admin section for languages and countries (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/596)
|
|
||||||
* [activity] activity admin: translations + remove label field for comment on admin activity type (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/587)
|
|
||||||
* [main] admin user_job: improvements (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/588)
|
|
||||||
* [address] can add extra address info even if noAddress (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/576)
|
|
||||||
|
|
||||||
|
|
||||||
### 2022-05-06
|
|
||||||
|
|
||||||
* [person] add civility when creating a person (with the on-the-fly component or in the php form) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/557)
|
|
||||||
* [person] add address when creating a person (with the on-the-fly component or in the php form) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/557)
|
|
||||||
* [person] add household creation API point (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/557)
|
|
||||||
|
|
||||||
### 2021-04-29
|
|
||||||
|
|
||||||
* [person] prevent circular references in PersonDocGenNormalizer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/527)
|
|
||||||
* [person] add maritalStatusComment to PersonDocGenNormalizer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/582)
|
|
||||||
* Load relationships without gender in french fixtures
|
|
||||||
* Add command to remove old draft accompanying periods
|
|
||||||
* [parcours]: If users assings him/herself as referrer and job is not null. Update parcours job (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/578)
|
|
||||||
|
|
||||||
### 2021-04-28
|
|
||||||
|
|
||||||
* [address] fix bug when editing address: update location and addressreferenceId + better update of the map in edition (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/593)
|
|
||||||
* [main] avoid address reference search on undefined post code (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/561)
|
|
||||||
* [person] prevent duplicate relationship in filiation/household graph (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/560)
|
|
||||||
* [Documents] Validate storedObject and allow for null data (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/565)
|
|
||||||
* [parcours]: Comments can be unpinned + edit/delete for all users that are allowed to edit parcours (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/566)
|
|
||||||
|
|
||||||
### 2021-04-26
|
|
||||||
|
|
||||||
* [Datepickers] datepickers fixed when using keyboard to enter date (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/545)
|
|
||||||
* [social_action] Display 'agents traitants' in parcours resumé and social action list (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/568)
|
|
||||||
* [Person_search] Closed parcours shown within an accordeon that can be opened/closed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/574)
|
|
||||||
|
|
||||||
### 2021-04-24
|
|
||||||
|
|
||||||
* [notification email on course designation] allow raw string in email content generation
|
|
||||||
* [Accompanying period work] list evaluations associated to a work by startDate, and then by id, from the most recent to older
|
|
||||||
* [Documents] Change wording 'créer' to 'enregistrer' (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/634)
|
|
||||||
* [Parcours]: The number of 'mes parcours' displayed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/572)
|
|
||||||
* [Hompage_widget]: Renaming of tabs and removal of social actions tab (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/570)
|
|
||||||
* [activity]: Ignore thirdparties when creating a social action via an activity (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/573)
|
|
||||||
* [parcours]: change wording of warning message and button when user is not associated to a household yet (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/590#note_918370943)
|
|
||||||
* [Accompanying period work evaluations] list documents associated to a work by creation date, and then by id, from the most recent to older
|
|
||||||
* [Course comment] add validationConstraint NotNull and NotBlank on comment content, to avoid sql error
|
|
||||||
* [Notifications] delay the sending of notificaiton to kernel.terminate
|
|
||||||
* [Notifications / Period user change] fix the sending of notification when user changes
|
|
||||||
* [Activity form] invert 'incoming' and 'receiving' in Activity form
|
|
||||||
* [Activity form] keep the same order for 'attendee' field in new and edit form
|
|
||||||
* [list with period] use "sameas" test operator to introduce requestor in list
|
|
||||||
* [notification email on course designation] allow raw string in email content generation
|
|
||||||
* [Accompanying period work] list evaluations associated to a work by startDate, and then by id, from the most recent to older
|
|
||||||
* [evaluation_document] changing date to datetime in order to display the time at which document was created (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/569)
|
|
||||||
|
|
||||||
|
|
||||||
### 2021-04-13
|
|
||||||
|
|
||||||
* [person] household address: add a form for editing the validFrom date (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/541)
|
|
||||||
* [person] householdmemberseditor: fix composition type bug in select form (vuejs) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/543)
|
|
||||||
* [docgen] add more persons choices in docgen for course: amongst requestor (if person), resources of course (if person), and PersonResource (if person);
|
|
||||||
* [docgen] add a new context with a list of activities in course
|
|
||||||
* [docgen] add a comment in budget lines
|
|
||||||
* [notifications] allow to send a notification to an email address. The address receive an access link
|
|
||||||
* [adresses] add constraints in database to avoid errors later: postcode not null, and validfrom <= validto
|
|
||||||
* [accompanying work editor] add a label on document title input
|
|
||||||
|
|
||||||
### 2021-04-07
|
|
||||||
|
|
||||||
* notification list: move action buttons outside of the toggle
|
|
||||||
* fix detecting of non-read notification
|
|
||||||
* filter users which are disabled in search user api
|
|
||||||
* order query for location and add pagination in list
|
|
||||||
* allow every person which has part for a workflow to see the workflow page
|
|
||||||
* able to see the workflow if the evaluation document has been deleted
|
|
||||||
* hardcode the list of supported mime types for edition with collabora
|
|
||||||
* list of accompanying course: allow to see the pinned comment in list_item
|
|
||||||
|
|
||||||
### 2021-04-06
|
|
||||||
|
|
||||||
* [main] notification toggle read: correct js syntax for compilation in production (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/548)
|
|
||||||
* [parcours] Display of interlocuteurs changed to flex-table in parcours edit page to prevent cut-off of information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/535)
|
|
||||||
* [activity] espace entre les boutons pour supprimer les documents
|
|
||||||
|
|
||||||
|
|
||||||
### continuous release in February and March
|
|
||||||
|
|
||||||
* Creation of PickCivilityType, and implementation in PersonType and ThirdpartyType
|
|
||||||
* [person] Accompanying course evaluation documents: disable the WOPI edit link if mimetype not supported and if no keyInfos
|
|
||||||
(https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/585)
|
|
||||||
* [activity] display error messages above the form in creating a new location (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/481)
|
|
||||||
* [activity] show required field in activity edit/new by an asterix in the vuejs fields (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/494)
|
|
||||||
* [ACL] fix allow to see the course, event if the scope'course does not contains the scope's user
|
|
||||||
* [search] enforce limit of results for fetching rsults by search api https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/576
|
|
||||||
* [activity] Fix delete button for document (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/554)
|
|
||||||
* [activity] Add return path the document generation (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/553)
|
|
||||||
* [person] add person ressource to person docgen normaliser (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/517)
|
|
||||||
* [person] AccompanyingCourseWorkEdit: fix deleting evaluation documents (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/546)
|
|
||||||
* [person] AccompanyingCourseWorkEdit: download existing documents (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/512)
|
|
||||||
* [person] AccompanyingCourseWorkEdit: replace document by a new one (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/511)
|
|
||||||
* [person] AccompanyingPeriodWork: add referrers to work, add doctrine event listener to add logged user to referrers collection and display a referrers list in work list (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/502)
|
|
||||||
* [person] AccompanyingPeriodWorkEvaluation: fix circular reference when serialising (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/495)
|
|
||||||
* [person] order accompanying period by opening date in search persons, person and household period lists (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/493)
|
|
||||||
* [parcours] autosave of the pinned comment for draft accompanying course (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/477)
|
|
||||||
* [main] filter user job in undispatch acc period to assign (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/472)
|
|
||||||
* [main] filter user job in undispatch acc period to assign (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/472)
|
|
||||||
* [person] Add url in accompanying period work evaluations entity and form (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/476)
|
|
||||||
* [person] Add document generation in admin and in person/{id}/document (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/464)
|
|
||||||
* [activity] do not override location if already exist (when validating new activity) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/470)
|
|
||||||
* [parcours] Toggle emergency/intensity only by referrer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/442)
|
|
||||||
* [docstore] Add an API entrypoint for StoredObject (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/466)
|
|
||||||
* [person] Add the possibility of uploading existing documents to AccPeriodWorkEvaluationDocument (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/466)
|
|
||||||
* [person] Add title to AccPeriodWorkEvaluationDocument (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/466)
|
|
||||||
* [person] Order social issues by the field "ordering" (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/388)
|
|
||||||
* [Person/Household list] when listing other simultaneous members of an household, exclude the members on person, not on members (avoid to show two membersship with the same person)
|
|
||||||
* [draft periods] add a delete button (if acl granted) on each draft period listed on draft period page (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/463)
|
|
||||||
* [Person] Display suffixText in RenderPerson, PersonText.vue, RenderPersonBox.vue (was made for displaying "enfant confie") (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/441)
|
|
||||||
* [budget]: budget enabled for persons and households (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/469)
|
|
||||||
* [person] residential address: show residential address or info in PersonRenderBox, refactor Residential Address (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/439)
|
|
||||||
* [thirdparty] Add a contact to a thirdparty from within onTheFly (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/345)
|
|
||||||
* [documents] Improve flex-table item-col placement when long buttons and long metadata
|
|
||||||
* [thirdparty] Fix display of multiple contact badges so they wrap onto next line (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/482)
|
|
||||||
* [confidential] Fix position of toggle button so it does not cover text nor fall outside of box (no issue)
|
|
||||||
* [parcours] Fix edit of both thirdparty and contact name (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/474)
|
|
||||||
* [template] do not list inactive templates (for doc generator)
|
|
||||||
* [household] bugfix if position of member is null, renderbox no longer throws an error (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/480)
|
|
||||||
* [parcours] location cannot be removed if linked to a user (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/478)
|
|
||||||
* [person] email added to twig personRenderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/490)
|
|
||||||
* [activity] Only youngest descendant is kept for social issues and actions (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/471)
|
|
||||||
* [person] Add link to current household in person banner (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/484)
|
|
||||||
* [address] person badge in address history changed to open OnTheFly with all person info (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/489)
|
|
||||||
* [person] Change 'personne' with 'usager' and '&' with 'ET' (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/499)
|
|
||||||
* [thirdparty] Add parameter condition to display centers or not (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/500)
|
|
||||||
* [phonenumber] Remove placeholder in phonenumber field (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/496)
|
|
||||||
* [person_resource] separate create page created to avoid confusion (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/504)
|
|
||||||
* [contact] add contact button color changed plus the pipe at the side removed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/506)
|
|
||||||
* [thirdparty] For contacts show current civility/profession in edit form + fix saving of edited information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/491)
|
|
||||||
* [household] create-edit household composition placed in separate page to avoid confusion (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/505)
|
|
||||||
* [blur] Improved positioning of toggle icon (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/486)
|
|
||||||
* [thirdparty] add firstname field to thirdparty 'child' or 'contact' types (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/508)
|
|
||||||
* [household] create-edit household composition placed in separate page to avoid confusion (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/505)
|
|
||||||
* [blur] Improved positioning of toggle icon (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/486)
|
|
||||||
* [parcours] List of parcours for a specific user so they can be reassigned in case of absence (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/509)
|
|
||||||
* [thirdparty] Thirdparty view page, english text translated (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/534)
|
|
||||||
* [social_action] Translation changed in evaluation section (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/512)
|
|
||||||
* [filiation] Possible to add person (or create onthefly) to add to filiation graph + add relation (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/519)
|
|
||||||
* [household] Within parcours listing page of household add create button (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/560)
|
|
||||||
* [person_resource] bugfix when adding thirdparty or freetext resource + prevent personOwner themselves to be added. (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/526)
|
|
||||||
* [aside_activity] style correction + sticky-form create button (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/529)
|
|
||||||
* [budget] order within the menu adjusted (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/592)
|
|
||||||
* [onthefly] fix create person. Bug was noticed in filiation (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/591)
|
|
||||||
* [parcours] Create document buttons made sticky (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/532)
|
|
||||||
* [person] Trailing guillemet removed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/530)
|
|
||||||
* [notification] Display of social action within workflow notification set to display block (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/537)
|
|
||||||
* [onthefly] trim trailing whitespace in email of person and thirdparty (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/542)
|
|
||||||
|
|
||||||
* [action] Only youngest descendant is kept for social issues and actions (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/471)
|
|
||||||
## Test releases
|
|
||||||
|
|
||||||
### test release 2022-02-21
|
|
||||||
|
|
||||||
* [notifications] Word 'un' changed to number '1' for notifications in user menu (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/483)
|
|
||||||
* [documents] 'gabarit' changed to 'modèle' (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/405)
|
|
||||||
* [person_resources] Menu name and order changed (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/460)
|
|
||||||
* workflow: fix sending notifications
|
|
||||||
* [thirdparty] Extend the thirdparty search to thirdparty children (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/448)
|
|
||||||
* [person]: AddPersons: allow creation of person or thirdparty only (no users) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/422)
|
|
||||||
* [person]: AddPersons: allow creation of person or thirdparty depending on allowed types (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/422)
|
|
||||||
* [person]: AddPersons: add suggestion of name when creating new person or thirdparty (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/422)
|
|
||||||
* [main] Address: fix small bug: when modifying an address without street (isNoAddress), also check errors if street is an empty string as back-end change null value to empty string for street (and streetNumber)
|
|
||||||
* [main] Address: stronger client-side validation of addresses (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/449)
|
|
||||||
* [person] accompanying course: filter suggested entities by open participations (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/415)
|
|
||||||
[activity] can click through the cross icon for removing person in concerned group (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/476)
|
|
||||||
[activity] correct associated persons by considering only open participations (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/476)
|
|
||||||
* [person_resources]: Renderboxes used to display person/thirdparty info (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/465)
|
|
||||||
* [Household]: Add end date in HouseholdMember form for 'enfant hors menage' (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/434)
|
|
||||||
* [homepage_widget]: If no sender then display as 'notification automatique' (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/435)
|
|
||||||
* [parcours]: Order social activities and only display most recent three in parcours resumé (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/481)
|
|
||||||
* [3party]: 3party: redirect to parent when contact (child) is opened in view page
|
|
||||||
* [parcours / addresses]: launch an event when a person change address (either through changing household or because the household is associated to a new address). If the person is localising a course, the course location go back to a temporarily address.
|
|
||||||
* [thirdparty]: address/phonenumber/email/fonction displayed in thirdpartyrenderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/401)
|
|
||||||
* [thirdparty_contact]: in search results the 'qualité' is displayed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/465)
|
|
||||||
* [bug]: fix confidential toggle of address in thirdpartyrenderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/460)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### test release 2022-02-14
|
|
||||||
|
|
||||||
* AddPersons: remove ul-li html tags from AddPersons (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/419)
|
|
||||||
* [doc-generator] do not set required fields for mainPerson, person1, person2 (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement#456)
|
|
||||||
* [doc-generation] add age and obele in the mainPerson, person1 and person2 list + add obele in person renderString if addAge (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/370)
|
|
||||||
* [person] accompanying course work: fix on-the-fly update of thirdParty
|
|
||||||
* fix normalisation of accompanying course requestor api (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/378)
|
|
||||||
* [person] add a returnPath when clicking on some Person or ThirdParty badge (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/427)
|
|
||||||
* [person] accompanying course work: fix on-the-fly update of thirdParty
|
|
||||||
* [on-the-fly] close modal only after validation
|
|
||||||
* [person] correct thirdparty PATCH url + add email and altnames in AddPerson and serializer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/433)
|
|
||||||
* change order for accompanying course work list
|
|
||||||
* [parcours]: Mes parcours brouillon added to user menu (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/440)
|
|
||||||
* [Documents]: List view adapted to display more information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/414)
|
|
||||||
* [person]: style fix in parcours listing per person. (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/432)
|
|
||||||
* [parcours]: Only the referrer can toggle the intensity of the parcours (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/442)
|
|
||||||
* [household]: display address of current household (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/415)
|
|
||||||
* ajoute un ordre dans les localisation (api)
|
|
||||||
* [pick entity]: fix translations in modal (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/419)
|
|
||||||
* [homepage_widget]: fix translation on emergency badge (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/440)
|
|
||||||
* [person]: create person and household added to button dropdown (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/454)
|
|
||||||
* display full address in address.text in normalization. Adapt AddressRenderBox
|
|
||||||
* [address]: Correction residential address 'depuis le' (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/459)
|
|
||||||
* [Documents]: List view adapted to display more information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/414)
|
|
||||||
* [Thirdparty_contact]: address blurred if confidential in view page (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/450)
|
|
||||||
* [thirdparty] Add a contact to a thirdparty from within onTheFly (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/345)
|
|
||||||
|
|
||||||
|
|
||||||
### test release 2021-02-01
|
|
||||||
|
|
||||||
* renommer "dossier numéro" en "parcours numéro" dans les résultats de recherche
|
|
||||||
* renomme date de début en date d'ouverture dans le formulaire parcours
|
|
||||||
* [homepage widget] improve content tables, improve counter pluralization with style on number
|
|
||||||
* [notification lists] add comments counter information
|
|
||||||
* [workflows] fix popover header with previous transition
|
|
||||||
* [parcours]: validation + message for closing parcours adjusted.
|
|
||||||
* [household]: household composition double edit button replaced by a delete action (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/426)
|
|
||||||
[fast_actions] improve fast-actions buttons override mechanism, fix https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/413
|
|
||||||
[homepage widget] add vue homepage_widget with asynchone loading, give a global view resume of the user concerned actions, notifications, etc.
|
|
||||||
* [person]: Comment on marital status is possible even if marital status is not defined (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/421)
|
|
||||||
* [parcours]: In the list of person results the requestor is not displayed if defined as anonymous (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/424)
|
|
||||||
* [bugfix]: modal closes and newly created person/thirdparty is selected when multiple persons/thirdparties are created through the modal (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/429)
|
|
||||||
* [person_resource]: Onthefly button added to view person/thirdparty and badge differentiation for a contact-thirdparty (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/428)
|
|
||||||
* [workflow][notification] improve how notifications and workflows are 'attached' to entities: contextual list, counter, buttons and vue modal
|
|
||||||
* [AddAddress] disable multiselect search, and rely only on most pertinent Cities and Street computed backend
|
|
||||||
* [fast_actions] improve fast-actions buttons override mechanism, fix https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/413
|
|
||||||
* [homepage widget] add vue homepage_widget with asynchone loading, give a global view resume of the user concerned actions, notifications, etc.
|
|
||||||
* [thirdparty] Add a contact to a thirdparty from within onTheFly (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/345)
|
|
||||||
* [homepage widget] add vue homepage_widget with asynchone loading, give a global view resume of the user concerned actions, notifications, etc.
|
|
||||||
|
|
||||||
|
|
||||||
### test release 2021-01-31
|
|
||||||
|
|
||||||
* [person] accompanying course: optimisation: do not fetch some resources for the banner (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/409)
|
|
||||||
* [person] accompanying course: close modal when edit participation (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/420)
|
|
||||||
* [person] accompanying course: treat validation error when editing on-the-fly entities (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/420)
|
|
||||||
* [activity] show activity attendee (présence) in the activity list (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/412)
|
|
||||||
* [activity] admin: change validation rule for social action visible field (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/413)
|
|
||||||
* [parcours]: component added to change the opening date of a parcours (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/411)
|
|
||||||
* [search]: listing of parcours display changed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/410)
|
|
||||||
* [user]: page with accompanying periods to which is user is referent (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/408)
|
|
||||||
* [person] age added to renderstring + renderbox/ vue component created to display person text (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/389)
|
|
||||||
* [household member editor] allow to push to existing household
|
|
||||||
|
|
||||||
|
|
||||||
### test release 2021-01-28
|
|
||||||
|
|
||||||
* [person] improve filiations vis graph: disable physics, use chill colors for persons-households-course, increase label of relations, remove labels on household arrows and other improvements (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/286, https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/362)
|
|
||||||
* [activity] Order activity by date and by id (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/364)
|
|
||||||
* [main] increase length of 4 Address fields (change to TEXT, no size limits) (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/277)
|
|
||||||
* [main] Add confidential option for address, in edit and view (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/165)
|
|
||||||
* [person] name suggestions within create person form when person is created departing from a search input (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/377)
|
|
||||||
* [person] Add residential address entity, form and list for each person
|
|
||||||
* [aside_activity]: dynamicUserPickerType used (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/399)
|
|
||||||
* dispatching list
|
|
||||||
|
|
||||||
|
|
||||||
### test release 2021-01-26
|
|
||||||
|
|
||||||
* [parcours] comments truncated if too long + link added (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/406)
|
|
||||||
* [person]: possibility to add person resources (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/382)
|
|
||||||
* [person ressources]: module added
|
|
||||||
|
|
||||||
|
|
||||||
### test release 2022-01-24
|
|
||||||
|
|
||||||
* [person] name suggestions within create person form when person is created departing from a search input (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/377)
|
|
||||||
* [notification: formulaire création] descend la box avec la description dans le bas du formulaire
|
|
||||||
* [notification for activity]: fix link to activity
|
|
||||||
* [notification] add "URGENT" before accompanying course with emergency = true
|
|
||||||
* [notification] add a "read more" button on system notification
|
|
||||||
* [notification] add `[Chill]` in the subject of each notification, automatically
|
|
||||||
* [notification] add a counter for notification in activity list and accompanying period list, and search results
|
|
||||||
* [parcours] bugfix if deathdate is not defined (eg. for a thirdparty) parcours is still displayed. Gave error before.
|
|
||||||
* [workflow] add breadcrumb to show steps
|
|
||||||
* [popover] add popover html popup mechanism (used by workflow breadcrumb)
|
|
||||||
* [templates] improve updatedBy macro in item metadatas
|
|
||||||
* [parcours]: bug fix when comment is pinned all other comments remain in the collection (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/385)
|
|
||||||
* [workflow]
|
|
||||||
* add My workflow section with my opened subscriptions
|
|
||||||
* apply workflow on documents, accompanyingCourseWork and Evaluations
|
|
||||||
* [wopi-link] a new vue component allow to open wopi link in a fullscreen chill-themed modal
|
|
||||||
|
|
||||||
### test release 2022-01-19
|
|
||||||
* vuejs: add dead information on all on-the-fly person render boxes, in vis graph and other templates (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/271)
|
|
||||||
* [thirdparty] fix bug in 3rd party view: types was replaced by thirdPartyTypes
|
|
||||||
* [main] location form type: fix unmapped address field (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/246)
|
|
||||||
* [activity] fix wrong import of js assets for adding and viewing documents in activity (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/83 & https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/176)
|
|
||||||
* [person]: space added between deathdate and age in twig renderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/380)
|
|
||||||
* [forms] dynamic picker types for user/person/thirdparty types created (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/386)
|
|
||||||
|
|
||||||
### test release 2022-01-17
|
|
||||||
|
|
||||||
* [main] Add editableByUser field to locationType entity, adapt the admin template and add this condition in the location-type endpoint (see https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/297)
|
|
||||||
* [main] Add mainLocation field to User entity and add it in user form type
|
|
||||||
* rewrite page which allow to select activity
|
|
||||||
* [main] Add mainLocation field to User entity and add it in user form type
|
|
||||||
* [course list in person context] show full username/label for ref
|
|
||||||
* [accompanying period work] remove the possibility to generate document from an accompanying period work
|
|
||||||
* vuejs: add validation on required fields for AddPerson, Address and Location components
|
|
||||||
* vuejs: treat 422 validation errors in locations and AddPerson components
|
|
||||||
* [person]: space added between deathdate and age in twig renderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/380)
|
|
||||||
|
|
||||||
## Test releases
|
|
||||||
* vuejs: add validation on required fields for AddPerson, Address and Location components
|
|
||||||
* vuejs: treat 422 validation errors in locations and AddPerson components
|
|
||||||
* [person]: space added between deathdate and age in twig renderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/380)
|
|
||||||
|
|
||||||
### test release 2022-01-12
|
|
||||||
|
|
||||||
* fix thirdparty normalizer on telephone field: https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/322
|
|
||||||
|
|
||||||
### test release 2022-01-11
|
|
||||||
|
|
||||||
* vuejs: translate in French all multiselect widgets
|
|
||||||
* [address] define address lines according postal standards for France and Belgium (default) and change AddressRender, chill_entity_render_box and AddressRenderBox.vue
|
|
||||||
* [household] change translations (champs-libres/departement-de-la-vendee/accent-suivi-developpement#109)
|
|
||||||
* [household] add address i18n in household component (champs-libres/departement-de-la-vendee/accent-suivi-developpement#158)
|
|
||||||
* [household] add on the fly i18n in household component
|
|
||||||
* [household] redirect to the household page when a household is created from a person (champs-libres/departement-de-la-vendee/accent-suivi-developpement#175)
|
|
||||||
* [household] household member editor: display alert if some members have already an household (champs-libres/departement-de-la-vendee/accent-suivi-developpement#172)
|
|
||||||
* [household] household member editor: do not add in new members if the member is included in the members of household (champs-libres/departement-de-la-vendee/accent-suivi-developpement#123)
|
|
||||||
* [household] household member editor: remove markNoAddress button (champs-libres/departement-de-la-vendee/accent-suivi-developpement#109)
|
|
||||||
* [person]: ordering fields in add person (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/61)
|
|
||||||
* [person]: Add email and alt names in add person (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/61)
|
|
||||||
* [accompanyingCourse] Add a delete action and delete buttons to delete a accompanying course when step = DRAFT (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/64)
|
|
||||||
* [accompanyingCourse] Add a administrative location in the accompanying course, set the user current location as default, allow to select a location in a select field and do not allow to confirm the accompanying course if location is empty.
|
|
||||||
* [accompanyingCourse] Add the administrative location in the available variables for document generation
|
|
||||||
* AddAddress: optimize loading: wait for the user finish typing;
|
|
||||||
* UserPicker: fix bug with deprecated role
|
|
||||||
* docgen: add base context + tests
|
|
||||||
* docgen: add age for person
|
|
||||||
* [household menu] fix filiation order https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/265
|
|
||||||
* [AddAddress]: optimize loading: wait for the user finish typing;
|
|
||||||
* [UserPicker]: fix bug with deprecated role
|
|
||||||
* [docgen]: add base context + tests
|
|
||||||
* [docgen]: add age for person
|
|
||||||
* [task]: fix dropdown menu style + fix bug in singleTaskController (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/338)
|
|
||||||
* Household: fix bug when moving person on the same day (see https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/281)
|
|
||||||
* Household: show date validFrom and validTo when moving
|
|
||||||
* address reference: add index for refid
|
|
||||||
* [accompanyingCourse_work] fix styles conflicts + fix bug with remove goal (remove goals one at a time)
|
|
||||||
* [accompanyingCourse] improve masonry on resume page, add origin
|
|
||||||
* [notification] new notification interface, can be associated to AccompanyingCourse/Period, Activities.
|
|
||||||
* List notifications, show, and comment in User section
|
|
||||||
* Notify button and contextual notification box on associated objects pages
|
|
||||||
* [accompanyingCourse] add a comment for each resource associated. A modal allow to save comment. Comment is displayed in on-the-fly show modal of the accompanyingCourse context (edit page + resume page).
|
|
||||||
|
|
||||||
### test release 2021-12-14
|
|
||||||
|
|
||||||
* [asideactivity] creation of aside activity category fixed (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/262)
|
|
||||||
* [vendee/person] fix typo "situation professionelle" => "situation professionnelle"
|
|
||||||
* [main] add availableForUsers condition from locationType in the location API endpoint (champs-libres/departement-de-la-vendee/accent-suivi-developpement#248)
|
|
||||||
* [main] add the current location of the user as API point + add it in the activity location list (champs-libres/departement-de-la-vendee/accent-suivi-developpement#247)
|
|
||||||
* [activity] improve show/new/edit templates, fix SEE and SEE_DETAILS acl
|
|
||||||
* [badges] create specific badge for TMS, and make person/thirdparty badges clickable with on-the-fly modal in :
|
|
||||||
* concerned groups items (activity, calendar)
|
|
||||||
* accompanyingCourseWork lists
|
|
||||||
* accompanyingCourse lists
|
|
||||||
* [acompanyingCourse] add initial comment on Resume page
|
|
||||||
* [person] create button full width (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/330)
|
|
||||||
|
|
||||||
### test release 2021-12-11
|
|
||||||
|
|
||||||
* [main] add order field to civility
|
|
||||||
* [main] change address format in case the country is France, in Address render box and address normalizer
|
|
||||||
* [person] add validator for accompanying period with a test on social issues (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/76)
|
|
||||||
* [activity] fix visibility for location
|
|
||||||
* [origin] fix origin: use correctly the translatable strings
|
|
||||||
* /!\ everyone must update the origin table. As there is only one row, execute `update chill_person_accompanying_period_origin set label = jsonb_build_object('fr', 'appel téléphonique');`
|
|
||||||
* [person] redirect bug fixed.
|
|
||||||
* [action] add an unrelated issue within action creation.
|
|
||||||
* [origin] fix origin: use correctly the translatable strings
|
|
||||||
* /!\ everyone must update the origin table. As there is only one row, execute `update chill_person_accompanying_period_origin set label = jsonb_build_object('fr', 'appel téléphonique');`
|
|
||||||
* [main] change order of civilities in civility fixtures (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
|
||||||
* [person] set min attr in the minimum of children field (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
|
||||||
* [person] add marital status date in person view (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
|
||||||
* [person] show number of children + allow set number of children to null (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
|
||||||
* [person] show acceptSMS option (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
|
||||||
* [person] add death information in person render box in twig and vue render boxes (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/191)
|
|
||||||
* [asideactivity] creation of aside activity category fixed (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/262)
|
|
||||||
* [vendee/person] fix typo "situation professionelle" => "situation professionnelle"
|
|
||||||
* [accompanyingcourse_work] Changes in layout/behavior of edit form (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/321)
|
|
||||||
* [badge-entity] design coherency between pills badge-person and 3 kinds of badge-thirdparty
|
|
||||||
* [AddPersons] suggestions row are clickable, not only checkbox
|
|
||||||
|
|
||||||
### test release 2021-12-06
|
|
||||||
|
|
||||||
* [main] address: use search API end points for getting postal code and reference address (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/316)
|
|
||||||
* [main] address: in edit mode, select the encoded values in multiselect for address reference and city (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/316)
|
|
||||||
* [person search] fix bug when using birthdate after and birthdate before
|
|
||||||
* [person search] increase pertinence when lastname begins with search pattern
|
|
||||||
* [activity/actions] Améliore la cohérence du design entre
|
|
||||||
* la page résumé d'un parcours (liste d'actions récentes et liste d'activités récentes)
|
|
||||||
* la page liste des actions
|
|
||||||
* la page liste des activités (contexte personne / contexte parcours)
|
|
||||||
* [household] field to edit wheter person is titulaire of household or not removed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/322)
|
|
||||||
* [activity] create work if a work with same social action is not associated to the activity
|
|
||||||
* [visgraph] improve and fix bugs on vis-network relationship graph
|
|
||||||
* [bugfix] posting of birth- and deathdate through api fixed.
|
|
||||||
* [suggestions] improve suggestions lists
|
|
||||||
|
|
||||||
### Test release 2021-11-19 - bis
|
|
||||||
|
|
||||||
* [household] do not allow to create two addresses on the same date
|
|
||||||
* [activity] handle case when there is no social action associated to social issue
|
|
||||||
* [activity] layout for issues / actions
|
|
||||||
* [activity][bugfix] in edit mode, the form will now load the social action list
|
|
||||||
|
|
||||||
|
|
||||||
### Test release 2021-11-29
|
|
||||||
|
|
||||||
* [person] suggest entities (person | thirdparty) when creating/editing the accompanying course (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/119)
|
|
||||||
* [activity] add custom validation on the Activity class, based on what is required from the ActivityType (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/188)
|
|
||||||
* [main] translate multiselect messages when selecting/creating address
|
|
||||||
* [main] set the coordinates of the city when creating a new address OR choosing "pas d'adresse complète"
|
|
||||||
* Use the user.label in accompanying course banner, instead of username;
|
|
||||||
* fix: show validation message when closing accompanying course;
|
|
||||||
* [thirdparty] link from modal to thirdparty detail page fixed (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/228)
|
|
||||||
* [assets] new asset to style suggestions lists (with add/remove item link) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/258)
|
|
||||||
* [accompanyingCourseWorkEdit] improves hyphenation and line breaks for long badges
|
|
||||||
* [acompanyingCourse] improve Resume page
|
|
||||||
* complete all needed informations,
|
|
||||||
* actions and activities are clickables,
|
|
||||||
* better placement with js masonry blocks on top of content area,
|
|
||||||
* https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/101
|
|
||||||
* https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/295
|
|
||||||
* [activity/calendar] on show page, concerned groups of persons table adapt itself to isVisibles options
|
|
||||||
* [activity] remove the "plus" button in activity list
|
|
||||||
* [activity] check ACL on activity list in person context
|
|
||||||
* [list for accompanying course in person] filter list using ACL
|
|
||||||
* [validation] toasts are displayed for errors when modifying accompanying course (generalization required).
|
|
||||||
* [period] only the user can enable confidentiality
|
|
||||||
* add an endpoint for checking permissions. See https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/232
|
|
||||||
* [activity] for a new activity: suggest and create on-the-fly locations based on the accompanying course location + location of the suggested parties
|
|
||||||
* [calendar] for a new rdv: suggest and create on-the-fly locations based on the accompanying course location + location of the suggested parties
|
|
||||||
* [period] Validation added when period is confidential and confirmed -> user cannot be null.
|
|
||||||
|
|
||||||
|
|
||||||
## Test releases
|
|
||||||
|
|
||||||
### Test release 2021-11-22
|
|
||||||
|
|
||||||
* [activity] delete admin_user_show in twig template because this route is not defined and should be defined
|
|
||||||
* [activity] suggest requestor, user and ressources for adding persons|user|3rdparty
|
|
||||||
* [calendar] suggest persons, professionals and invites for adding persons|3rdparty|user
|
|
||||||
* [activity] take into account the restrictions on person|thirdparties|users visibilities defined in ActivityType
|
|
||||||
* [main] Add currentLocation to the User entity + add a page for selecting this location + add in the user menu (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/133)
|
|
||||||
* [activity] add user current location as default location for a new activity (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/133)
|
|
||||||
* [task] Select2 field in task form to allow search for a user (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/167)
|
|
||||||
* remove "search by phone configuration option": search by phone is now executed by default
|
|
||||||
* remplacer le classement par ordre alphabétique par un classement par ordre de pertinence, qui tient compte:
|
|
||||||
* de la présence d'une string avec le nom de la ville;
|
|
||||||
* de la similarité;
|
|
||||||
* du fait que la recherche commence par une partie du mot recherché
|
|
||||||
* ajouter la recherche par numéro de téléphone directement dans la barre de recherche et dans le formulaire recherche avancée;
|
|
||||||
* ajouter la recherche par date de naissance directement dans la barre de recherche;
|
|
||||||
* ajouter la recherche par ville dans la recherche avancée
|
|
||||||
* ajouter un lien vers le ménage dans les résultats de recherche
|
|
||||||
* ajouter l'id du parcours dans les résultats de recherche
|
|
||||||
* ajouter le demandeur dans les résultats de recherche
|
|
||||||
* ajout d'un bouton "recherche avancée" sur la page d'accueil
|
|
||||||
* [person] create an accompanying course: add client-side validation if no origin (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/210)
|
|
||||||
* [person] fix bounds for computing current person address: the new address appears immediatly
|
|
||||||
* [docgen] create a normalizer and serializer for normalization on doc format
|
|
||||||
* [person normalization] the key center is now "centers" and is an array. Empty array if no center
|
|
||||||
* [accompanyingCourse] Ability to close accompanying course (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/296)
|
|
||||||
* [task] Select2 field in task form to allow search for a user (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/167)
|
|
||||||
* [list result] show all courses, except ones with period closed
|
|
||||||
* [accompanyingCourse] improve banner with small carousel to display slide social-issues or slide associated persons (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/69)
|
|
||||||
|
|
||||||
### Test release 2021-11-15
|
|
||||||
|
|
||||||
* [main] fix adding multiple AddresseDeRelais (combine PickAddressType with ChillCollection)
|
|
||||||
* [person]: do not suggest the current household of the person (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/51)
|
|
||||||
* [person]: display other phone numbers in view + add message in case no others phone numbers (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/184)
|
|
||||||
* unnecessary whitespace removed from person banner after person-id + double parentheses removed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/290)
|
|
||||||
* [person]: delete accompanying period work, including related objects (cascade) (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/36)
|
|
||||||
* [address]: Display of incomplete address adjusted.
|
|
||||||
* [household]: improve relationship graph
|
|
||||||
* add form to create/edit/delete relationship link,
|
|
||||||
* improve graph refresh mechanism
|
|
||||||
* add feature to export canvas as image (png)
|
|
||||||
* [person suggest] In widget "add person", improve the pertinence of persons when one of the names starts with the pattern;
|
|
||||||
* [person] do not ask for center any more on person creation
|
|
||||||
* [3party] do not ask for center any more on 3party creation
|
|
||||||
|
|
||||||
## Test releases
|
|
||||||
|
|
||||||
### Test release 2021-11-08
|
|
||||||
|
|
||||||
* [person]: Display the name of a user when searching after a User (TMS)
|
|
||||||
* [person]: Add civility to the person
|
|
||||||
* [person]: Various improvements on the edit person form
|
|
||||||
* [person]: Set available_languages and available_countries as parameters for use in the edit person form
|
|
||||||
* [activity] Bugfix: documents can now be added to an activity.
|
|
||||||
* [tasks] improve tasks with filter order
|
|
||||||
* [tasks] refactor singleControllerTasks: limit the number of conditions from the context
|
|
||||||
* [validations] validation of accompanying period added: no duplicate participations or resources (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/60).
|
|
||||||
* [renderbox] If gender of person is not defined, no icon is displayed instead of neuter-icon (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/129).
|
|
||||||
* [confidential information] module added to blur confidential information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/248).
|
|
||||||
* refactor `AuthorizationHelper` and `UserACLAwareRepository` to fix constructor, and separate logic for parent role helper into `ParentRoleHelper`
|
|
||||||
* [main]: filter location and locationType in backend: exclude NULL names, only active and availableToUsers
|
|
||||||
* [activity]: perform client-side validation & show/hide fields in the "new location" modal
|
|
||||||
* [person]: normalize person with CenterResolverDispatcher and handle case where center is null or multiple in PersonRenderBox
|
|
||||||
* [docstore] voter for PersonDocument and AccompanyingCourseDocument on the 2.0 way (using VoterHelperFactory)
|
|
||||||
* [docstore] add authorization check inside controller and menu
|
|
||||||
* [activity]: fix inheritance for role `ACTIVITY FULL` and add missing acl in menu
|
|
||||||
* [person] show current address in search results
|
|
||||||
* [person] show alt names in search results
|
|
||||||
* [admin]: links to activity admin section added again.
|
|
||||||
* [household]: endDate field deleted from household edit form.
|
|
||||||
* [household]: View accompanying periods of current and old household members.
|
|
||||||
* [tasks]: different layout for task list / my tasks, and fix link to tasks in alert or in warning
|
|
||||||
* [admin]: links to activity admin section added again.
|
|
||||||
* [household]: household addresses ordered by ValidFrom date and by id to show the last created address on top.
|
|
||||||
* [socialWorkAction]: display of social issue and parent issues + banner context added.
|
|
||||||
* [DBAL dependencies] Upgrade to DBAL 3.1
|
|
||||||
|
|
||||||
### Test release 2021-10-27
|
|
||||||
|
|
||||||
* [person]: delete double actions buttons on search person page
|
|
||||||
* [person]: accompanying course work: remove creation date display the list of work + handle case when end date is null
|
|
||||||
* [main]: Add new pages with a menu for managing location and location type in the admin
|
|
||||||
* [main]: Add some fixtures for location type
|
|
||||||
* [calendar]: Pass the location when transforming a calendar item (rdv) into an activity
|
|
||||||
* [calendar]: Add a user menu for "my calendar"
|
|
||||||
|
|
||||||
### Test release 2021-10-18
|
|
||||||
|
|
||||||
* [3party]: french translation of contact and company
|
|
||||||
* [3party]: show parent in list
|
|
||||||
* [3party]: change color for badge "child"
|
|
||||||
* [3party]: fix address creation
|
|
||||||
* [household members editor] finalisation of editor
|
|
||||||
* [AccompanyingCourse banner]: replace translation referrer (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/70)
|
|
||||||
* [Location]: add location system in activity and RV (calendar). User can choose in location list or create a new location.
|
|
||||||
* [household]: add relationship page with dynamic data visualisation graph
|
|
||||||
|
|
||||||
## Test releases
|
|
||||||
|
|
||||||
### Test release 2021-10-11
|
|
||||||
|
|
||||||
* Address: zoom on postal code geometry + fix origin of manually entered postal code
|
|
||||||
|
|
||||||
* in the Address vue component, order the postal code and street address by alphabetic and numeric order
|
|
||||||
|
|
||||||
* add 3 new fields to PostalCode and adapt postal code command and fixtures
|
|
||||||
|
|
||||||
* [Aside activity] Fixes for aside activity
|
|
||||||
|
|
||||||
* categories with child
|
|
||||||
* fast creation buttons
|
|
||||||
* add ordering for types
|
|
||||||
|
|
||||||
* [AccompanyingCourse Resume page] dashboard for AccompanyingCourseWork and for Activities;
|
|
||||||
* Improve badges behaviour with small screens;
|
|
||||||
|
|
||||||
* [ThirdParty]:
|
|
||||||
|
|
||||||
* third party list
|
|
||||||
* create a kind contact/institution when create a new thirdparty, and set contact embedded as kind=child;
|
|
||||||
* filter thirdparties in list
|
|
||||||
|
|
||||||
* [FilterOrder]: add development kit for generating filter and ordering in list
|
|
||||||
* [Capitalization of names] person names are capitalized on creation, on prePersist event
|
|
||||||
* [On-The-Fly] modale works for showing, editing and creating person or thirdparty ;
|
|
||||||
* [AccompanyingCourse Resume page] associated persons list, can see household when hover, and with show on-the-fly modale when clicking person ;
|
|
||||||
|
|
||||||
### test release 2021-10-04
|
|
||||||
|
|
||||||
* [Household editor][UI] Update how household suggestion and addresses are picked;
|
|
||||||
|
|
||||||
See https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/80
|
|
||||||
* [AddAddress] Handle address suggestion;
|
|
||||||
* [CenterType][Create a person] when overriding the ACL rules, allow to show a PickCenterType
|
|
||||||
when no centers are reachable by the default ACL.
|
|
||||||
* [Household] Show comment event if no address are associated with the household;
|
|
||||||
* [Person results] Add requestor into search results:
|
|
||||||
|
|
||||||
* a badge "requestor" is shown into search results;
|
|
||||||
* periods where the person is only requestor (without participating) are also shown;
|
|
||||||
|
|
||||||
Issues:
|
|
||||||
|
|
||||||
* https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/13
|
|
||||||
* https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/199
|
|
||||||
* [Person form] "accept sms" not required:
|
|
||||||
|
|
||||||
https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/37
|
|
||||||
https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/221
|
|
||||||
|
|
||||||
* [Household editor] suggest only temporarily addresses;
|
|
||||||
See https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/82
|
|
||||||
* On-The-Fly modale works for showing, editing and creating person and thirdparty ;
|
|
||||||
* AccompanyingCourse Resume page: list associated persons by household, see household when hover, and show on-the-fly modale when clicking on person ;
|
|
||||||
* [AddAddress] Handle address suggestion;
|
|
||||||
* [AddAddress][Entity address]: add a link between address and address reference;
|
|
||||||
* [Household editor] suggest household by comparing the temporary addresses from courses;
|
|
||||||
|
|
||||||
See https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/81
|
|
||||||
* On-The-Fly modale works for showing, editing and creating person and thirdparty
|
|
||||||
|
|
||||||
|
|
||||||
## Test released
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
Coming soon...
|
|
||||||
|
|
||||||
DO NOT ADD unreleased items here. Add them under "Unreleased" title
|
|
||||||
|
|
||||||
### Test release yyyy-mm-dd
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Stable releases
|
|
||||||
|
|
||||||
No stable releases for v2+
|
|
||||||
|
|
@@ -1,17 +0,0 @@
|
|||||||
## v2.1.0 - 2023-06-12
|
|
||||||
|
|
||||||
### Feature
|
|
||||||
|
|
||||||
* [docgen] allow to pick a third party when generating a document in context Activity, AccompanyingPeriod
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
* ([#111](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/111)) List of "my accompanying periods": separate the active and closed periods in two different lists, and show the inactive_long and inactive_short periods
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
* ([#105](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/105)) Rights are checked for display of 'accompanying period' tab in household menu. Rights are also checked for creation of 'accompanying period' from within household context
|
|
||||||
|
|
||||||
### DX
|
|
||||||
|
|
||||||
* Add methods to RegroupmentRepository and fullfill Center / Regroupment Doctrine mapping
|
|
@@ -1,12 +0,0 @@
|
|||||||
## v2.2.0 - 2023-06-18
|
|
||||||
### Feature
|
|
||||||
* When navigating from a workflow regarding to an evaluation's document to an accompanying course, scroll directly to the document, and blink to highlight this document
|
|
||||||
* Add notification to accompanying period work and work's evaluation's documents
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113))[Export] Filter accompanying period by step at date: allow to pick multiple steps
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113))[export] add a filter on accompanying period: filter by step between two dates
|
|
||||||
### Fixed
|
|
||||||
* use the correct annotation for the association between PersonCurrentCenter and Person
|
|
||||||
* ([#58](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/58))Fix birthdate timezone in PersonRenderBox
|
|
||||||
* ([#55](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/55))Fix the notification counter
|
|
||||||
### DX
|
|
||||||
* DQL function OVERLAPSI: simplify expression in postgresql
|
|
@@ -1,3 +0,0 @@
|
|||||||
## v2.2.1 - 2023-06-19
|
|
||||||
### Fixed
|
|
||||||
* ([#114](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/114)) [notification on document evaluation] fix entityId and return path when adding a notification on a document in an evaluation
|
|
@@ -1,5 +0,0 @@
|
|||||||
## v2.2.2 - 2023-06-26
|
|
||||||
### Fixed
|
|
||||||
* [Accompanying period comments]: order comments from the most recent to the oldest, in the list
|
|
||||||
* Api: filter social action to keep only the currently activated
|
|
||||||
* ([#82](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/82)) Fix deletion and re-creation of filiation relationship
|
|
@@ -1,42 +0,0 @@
|
|||||||
## v2.3.0 - 2023-06-27
|
|
||||||
### Feature
|
|
||||||
* ([#110](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/110)) Edit saved exports options: the saved exports options (forms, filters, aggregators) are now editable.
|
|
||||||
* ([#103](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/103)) Get an unified list of document in person and accompanying period context
|
|
||||||
* [export] Set the default date of calculation of the accompanying period's list as "today"
|
|
||||||
* Force accompanying period user history to be unique for the same period and stardate/enddate [:warning: may encounter migration issue]
|
|
||||||
|
|
||||||
If some issue is encountered during migration, use this SQL to find the line which are in conflict, examine the problem and delete some of the concerning line
|
|
||||||
*
|
|
||||||
```sql
|
|
||||||
-- to see the line which are in conflict with another one
|
|
||||||
SELECT o.*
|
|
||||||
FROM chill_person_accompanying_period_user_history o
|
|
||||||
JOIN chill_person_accompanying_period_user_history c ON o.id < c.id AND o.accompanyingperiod_id = c.accompanyingperiod_id
|
|
||||||
WHERE tsrange(o.startdate, o.enddate, '[)') && tsrange(c.startdate, c.enddate, '[)')
|
|
||||||
ORDER BY accompanyingperiod_id;
|
|
||||||
-- to examine line in conflict for a given accompanyingperiod_id (given by the previous query)
|
|
||||||
SELECT * FROM chill_person_accompanying_period_user_history WHERE accompanyingperiod_id = IIIIDDDD order by startdate, enddate;
|
|
||||||
```
|
|
||||||
* Rename label of filter in French: "parcours actif" => "parcours ouvert", and "filtrer les parcours ouverts" => "Filtrer les parcours dont la date d'ouverture"
|
|
||||||
|
|
||||||
### Traduction francophone des principaux changements
|
|
||||||
|
|
||||||
* Les exports enregistrés sont éditables par l'utilisateur;
|
|
||||||
* L'onglet "Document" dans les parcours et les dossiers d'usager affiche désormais les documents ajoutés à différents endroits.
|
|
||||||
|
|
||||||
Pour les parcours, il s'agit de:
|
|
||||||
|
|
||||||
- documents ajoutés directement dans le parcours;
|
|
||||||
- documents des échanges;
|
|
||||||
- documents des rendez-vous;
|
|
||||||
- documents des évaluations;
|
|
||||||
- documents directement ajoutés dans le dossier des usagers concernés par le parcours;
|
|
||||||
|
|
||||||
Pour les usagers, il s'agit de:
|
|
||||||
|
|
||||||
- documents des échanges;
|
|
||||||
- documents des parcours;
|
|
||||||
- documents des rendez-vous;
|
|
||||||
- documents des actions, des échanges, des rendez-vous, des évaluations ajoutés dans les parcours.
|
|
||||||
* Dans la liste des parcours, la date de calcul des éléments associés est "aujourd'hui" par défaut.
|
|
||||||
* Dans les exports, renommage des libellés des filtres: "parcours actif" => "parcours ouvert", et "filtrer les parcours ouverts" => "Filtrer les parcours dont la date d'ouverture"
|
|
@@ -1,36 +0,0 @@
|
|||||||
## v2.4.0 - 2023-07-07
|
|
||||||
|
|
||||||
### Feature
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] on "filter by user working" on accompanying period, add two dates to filters intervention within a period
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] Add an aggregator by user's job working on a course
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] add an aggregator by user's scope working on a course
|
|
||||||
* [export] on aggregator "user working on a course"
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] add a center aggregator for Person
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] add a filter on "job working on a course"
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] Add a filter on "scope working on a course"
|
|
||||||
* ([#121](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/121)) Create a role "See Confidential Periods", separated from the "Reassign courses" role
|
|
||||||
* ([#124](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/124)) Sync user absence / presence through microsoft outlook / graph api.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* ([#116](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/116)) On the accompanying course page, open the action on view mode if the user does not have right to update them (i.e. if the accompanying period is closed)
|
|
||||||
* [export] Rename label for CurrentActionFilter (on accompanying period work) to make precision between "ouvert" and "sans date de fin"
|
|
||||||
* Force the db to have either a person_location or a address_location, and avoid to have both also internally in the entity
|
|
||||||
* [export] set rolling date on person age aggregator
|
|
||||||
* [export] fix list when a person locating a course is without address
|
|
||||||
* [export] remove unused condition on course about duration participation
|
|
||||||
* Command to subscribe on MS Graph users calendars: improve the loop to be more efficient
|
|
||||||
|
|
||||||
### DX
|
|
||||||
* Rolling Date: can receive a null parameter
|
|
||||||
|
|
||||||
### Traduction francophone des principaux changements
|
|
||||||
|
|
||||||
- sur le "filtre par intervenant", ajoute deux dates pour limiter la période d'intervention;
|
|
||||||
- ajout d'un regroupement par métier des intervenants sur un parcours;
|
|
||||||
- ajout d'un regroupement par service des intervenants sur un parcours;
|
|
||||||
- ajout d'un regroupement par utilisateur intervenant sur un parcours
|
|
||||||
- ajout d'un regroupement "par centre de l'usager";
|
|
||||||
- ajout d'un filtre "par métier intervenant sur un parcours";
|
|
||||||
- ajout d'un filtre "par service intervenant sur un parcours";
|
|
||||||
- création d'un rôle spécifique pour voir les parcours confidentiels (et séparer de celui de la liste qui permet de ré-assigner les parcours en lot);
|
|
||||||
- synchronisation de l'absence des utilisateurs par microsoft graph api
|
|
@@ -1,37 +0,0 @@
|
|||||||
## 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
|
|
||||||
|
|
||||||
### 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
|
|
@@ -1,3 +0,0 @@
|
|||||||
## 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
|
|
@@ -1,39 +0,0 @@
|
|||||||
changesDir: .changes
|
|
||||||
unreleasedDir: unreleased
|
|
||||||
headerPath: header.tpl.md
|
|
||||||
changelogPath: CHANGELOG.md
|
|
||||||
versionExt: md
|
|
||||||
versionFormat: '## {{.Version}} - {{.Time.Format "2006-01-02"}}'
|
|
||||||
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.
|
|
||||||
changeFormat: >-
|
|
||||||
* {{ 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:
|
|
||||||
- key: Issue
|
|
||||||
label: Issue number (on chill-bundles repository) (optional)
|
|
||||||
optional: true
|
|
||||||
type: int
|
|
||||||
minInt: 1
|
|
||||||
body:
|
|
||||||
# allow multiline messages
|
|
||||||
block: true
|
|
||||||
kinds:
|
|
||||||
- label: Feature
|
|
||||||
auto: minor
|
|
||||||
- label: Deprecated
|
|
||||||
auto: minor
|
|
||||||
- label: Fixed
|
|
||||||
auto: patch
|
|
||||||
- label: Security
|
|
||||||
auto: patch
|
|
||||||
- label: DX
|
|
||||||
auto: patch
|
|
||||||
- label: UX
|
|
||||||
auto: patch
|
|
||||||
newlines:
|
|
||||||
afterChangelogHeader: 1
|
|
||||||
beforeChangelogVersion: 1
|
|
||||||
endOfVersion: 1
|
|
||||||
envPrefix: CHANGIE_
|
|
35
.env.test
35
.env.test
@@ -3,3 +3,38 @@
|
|||||||
# 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=admin
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
ASYNC_UPLOAD_TEMP_URL_KEY=
|
||||||
|
ASYNC_UPLOAD_TEMP_URL_BASE_PATH=
|
||||||
|
ASYNC_UPLOAD_TEMP_URL_CONTAINER=
|
||||||
|
@@ -3,7 +3,6 @@
|
|||||||
# Select what we should cache between builds
|
# Select what we should cache between builds
|
||||||
cache:
|
cache:
|
||||||
paths:
|
paths:
|
||||||
- tests/app/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
|
||||||
@@ -28,13 +27,12 @@ variables:
|
|||||||
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
|
# change vendor dir to make the app install into tests/apps
|
||||||
COMPOSER_VENDOR_DIR: tests/app/vendor
|
#COMPOSER_VENDOR_DIR: /vendor
|
||||||
DEFAULT_CARRIER_CODE: BE
|
DEFAULT_CARRIER_CODE: BE
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- Composer install
|
- Composer install
|
||||||
- Tests
|
- Tests
|
||||||
- Deploy
|
|
||||||
|
|
||||||
build:
|
build:
|
||||||
stage: Composer install
|
stage: Composer install
|
||||||
@@ -50,7 +48,7 @@ build:
|
|||||||
expire_in: 30 min
|
expire_in: 30 min
|
||||||
paths:
|
paths:
|
||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- vendor/
|
||||||
|
|
||||||
code_style:
|
code_style:
|
||||||
stage: Tests
|
stage: Tests
|
||||||
@@ -64,7 +62,7 @@ code_style:
|
|||||||
expire_in: 30 min
|
expire_in: 30 min
|
||||||
paths:
|
paths:
|
||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- vendor/
|
||||||
|
|
||||||
phpstan_tests:
|
phpstan_tests:
|
||||||
stage: Tests
|
stage: Tests
|
||||||
@@ -78,7 +76,7 @@ phpstan_tests:
|
|||||||
expire_in: 30 min
|
expire_in: 30 min
|
||||||
paths:
|
paths:
|
||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- vendor/
|
||||||
|
|
||||||
rector_tests:
|
rector_tests:
|
||||||
stage: Tests
|
stage: Tests
|
||||||
@@ -92,7 +90,7 @@ rector_tests:
|
|||||||
expire_in: 30 min
|
expire_in: 30 min
|
||||||
paths:
|
paths:
|
||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- vendor/
|
||||||
|
|
||||||
# psalm_tests:
|
# psalm_tests:
|
||||||
# stage: Tests
|
# stage: Tests
|
||||||
@@ -112,24 +110,12 @@ unit_tests:
|
|||||||
# until we fix testes
|
# until we fix testes
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
script:
|
script:
|
||||||
- php tests/app/bin/console doctrine:migrations:migrate -n
|
- php tests/console doctrine:migrations:migrate -n
|
||||||
- php -d memory_limit=2G tests/app/bin/console cache:clear --env=dev
|
- php -d memory_limit=3G tests/console doctrine:fixtures:load -n
|
||||||
- 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=4G bin/phpunit --colors=never
|
- php -d memory_limit=4G bin/phpunit --colors=never
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 30 min
|
expire_in: 30 min
|
||||||
paths:
|
paths:
|
||||||
- bin
|
- bin
|
||||||
- tests/app/vendor/
|
- vendor/
|
||||||
|
|
||||||
release:
|
|
||||||
stage: Deploy
|
|
||||||
image: registry.gitlab.com/gitlab-org/release-cli:latest
|
|
||||||
rules:
|
|
||||||
- if: $CI_COMMIT_TAG
|
|
||||||
script:
|
|
||||||
- echo "running release_job"
|
|
||||||
release:
|
|
||||||
tag_name: '$CI_COMMIT_TAG'
|
|
||||||
description: "./.changes/v$CI_COMMIT_TAG.md"
|
|
||||||
|
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
|
|
||||||
|
@@ -13,7 +13,6 @@ $finder = PhpCsFixer\Finder::create();
|
|||||||
|
|
||||||
$finder
|
$finder
|
||||||
->in(__DIR__.'/src')
|
->in(__DIR__.'/src')
|
||||||
->in(__DIR__.'/utils')
|
|
||||||
->append([__FILE__])
|
->append([__FILE__])
|
||||||
->exclude(['docs/', 'tests/app'])
|
->exclude(['docs/', 'tests/app'])
|
||||||
->notPath('tests/app')
|
->notPath('tests/app')
|
||||||
|
181
CHANGELOG.md
181
CHANGELOG.md
@@ -1,182 +1,16 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
and this project adheres to
|
||||||
and is generated by [Changie](https://github.com/miniscruff/changie).
|
|
||||||
|
|
||||||
|
* [Semantic Versioning](https://semver.org/spec/v2.0.0.html) for stable releases;
|
||||||
|
* date versioning for test releases
|
||||||
|
|
||||||
## v2.5.1 - 2023-07-14
|
## Unreleased
|
||||||
### 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
|
|
||||||
|
|
||||||
### 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
|
|
||||||
|
|
||||||
## v2.4.0 - 2023-07-07
|
|
||||||
|
|
||||||
### Feature
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] on "filter by user working" on accompanying period, add two dates to filters intervention within a period
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] Add an aggregator by user's job working on a course
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] add an aggregator by user's scope working on a course
|
|
||||||
* [export] on aggregator "user working on a course"
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] add a center aggregator for Person
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] add a filter on "job working on a course"
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113)) [export] Add a filter on "scope working on a course"
|
|
||||||
* ([#121](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/121)) Create a role "See Confidential Periods", separated from the "Reassign courses" role
|
|
||||||
* ([#124](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/124)) Sync user absence / presence through microsoft outlook / graph api.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* ([#116](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/116)) On the accompanying course page, open the action on view mode if the user does not have right to update them (i.e. if the accompanying period is closed)
|
|
||||||
* [export] Rename label for CurrentActionFilter (on accompanying period work) to make precision between "ouvert" and "sans date de fin"
|
|
||||||
* Force the db to have either a person_location or a address_location, and avoid to have both also internally in the entity
|
|
||||||
* [export] set rolling date on person age aggregator
|
|
||||||
* [export] fix list when a person locating a course is without address
|
|
||||||
* [export] remove unused condition on course about duration participation
|
|
||||||
* Command to subscribe on MS Graph users calendars: improve the loop to be more efficient
|
|
||||||
|
|
||||||
### DX
|
|
||||||
* Rolling Date: can receive a null parameter
|
|
||||||
|
|
||||||
### Traduction francophone des principaux changements
|
|
||||||
|
|
||||||
- sur le "filtre par intervenant", ajoute deux dates pour limiter la période d'intervention;
|
|
||||||
- ajout d'un regroupement par métier des intervenants sur un parcours;
|
|
||||||
- ajout d'un regroupement par service des intervenants sur un parcours;
|
|
||||||
- ajout d'un regroupement par utilisateur intervenant sur un parcours
|
|
||||||
- ajout d'un regroupement "par centre de l'usager";
|
|
||||||
- ajout d'un filtre "par métier intervenant sur un parcours";
|
|
||||||
- ajout d'un filtre "par service intervenant sur un parcours";
|
|
||||||
- création d'un rôle spécifique pour voir les parcours confidentiels (et séparer de celui de la liste qui permet de ré-assigner les parcours en lot);
|
|
||||||
- synchronisation de l'absence des utilisateurs par microsoft graph api
|
|
||||||
|
|
||||||
## v2.3.0 - 2023-06-27
|
|
||||||
### Feature
|
|
||||||
* ([#110](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/110)) Edit saved exports options: the saved exports options (forms, filters, aggregators) are now editable.
|
|
||||||
* ([#103](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/103)) Get an unified list of document in person and accompanying period context
|
|
||||||
* [export] Set the default date of calculation of the accompanying period's list as "today"
|
|
||||||
* Force accompanying period user history to be unique for the same period and stardate/enddate [:warning: may encounter migration issue]
|
|
||||||
|
|
||||||
If some issue is encountered during migration, use this SQL to find the line which are in conflict, examine the problem and delete some of the concerning line
|
|
||||||
*
|
|
||||||
```sql
|
|
||||||
-- to see the line which are in conflict with another one
|
|
||||||
SELECT o.*
|
|
||||||
FROM chill_person_accompanying_period_user_history o
|
|
||||||
JOIN chill_person_accompanying_period_user_history c ON o.id < c.id AND o.accompanyingperiod_id = c.accompanyingperiod_id
|
|
||||||
WHERE tsrange(o.startdate, o.enddate, '[)') && tsrange(c.startdate, c.enddate, '[)')
|
|
||||||
ORDER BY accompanyingperiod_id;
|
|
||||||
-- to examine line in conflict for a given accompanyingperiod_id (given by the previous query)
|
|
||||||
SELECT * FROM chill_person_accompanying_period_user_history WHERE accompanyingperiod_id = IIIIDDDD order by startdate, enddate;
|
|
||||||
```
|
|
||||||
* Rename label of filter in French: "parcours actif" => "parcours ouvert", and "filtrer les parcours ouverts" => "Filtrer les parcours dont la date d'ouverture"
|
|
||||||
|
|
||||||
### Traduction francophone des principaux changements
|
|
||||||
|
|
||||||
* Les exports enregistrés sont éditables par l'utilisateur;
|
|
||||||
* L'onglet "Document" dans les parcours et les dossiers d'usager affiche désormais les documents ajoutés à différents endroits.
|
|
||||||
|
|
||||||
Pour les parcours, il s'agit de:
|
|
||||||
|
|
||||||
- documents ajoutés directement dans le parcours;
|
|
||||||
- documents des échanges;
|
|
||||||
- documents des rendez-vous;
|
|
||||||
- documents des évaluations;
|
|
||||||
- documents directement ajoutés dans le dossier des usagers concernés par le parcours;
|
|
||||||
|
|
||||||
Pour les usagers, il s'agit de:
|
|
||||||
|
|
||||||
- documents des échanges;
|
|
||||||
- documents des parcours;
|
|
||||||
- documents des rendez-vous;
|
|
||||||
- documents des actions, des échanges, des rendez-vous, des évaluations ajoutés dans les parcours.
|
|
||||||
* Dans la liste des parcours, la date de calcul des éléments associés est "aujourd'hui" par défaut.
|
|
||||||
* Dans les exports, renommage des libellés des filtres: "parcours actif" => "parcours ouvert", et "filtrer les parcours ouverts" => "Filtrer les parcours dont la date d'ouverture"
|
|
||||||
|
|
||||||
## v2.2.2 - 2023-06-26
|
|
||||||
### Fixed
|
|
||||||
* [Accompanying period comments]: order comments from the most recent to the oldest, in the list
|
|
||||||
* Api: filter social action to keep only the currently activated
|
|
||||||
* ([#82](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/82)) Fix deletion and re-creation of filiation relationship
|
|
||||||
|
|
||||||
## v2.2.1 - 2023-06-19
|
|
||||||
### Fixed
|
|
||||||
* ([#114](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/114)) [notification on document evaluation] fix entityId and return path when adding a notification on a document in an evaluation
|
|
||||||
|
|
||||||
## v2.2.0 - 2023-06-18
|
|
||||||
### Feature
|
|
||||||
* When navigating from a workflow regarding to an evaluation's document to an accompanying course, scroll directly to the document, and blink to highlight this document
|
|
||||||
* Add notification to accompanying period work and work's evaluation's documents
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113))[Export] Filter accompanying period by step at date: allow to pick multiple steps
|
|
||||||
* ([#113](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/113))[export] add a filter on accompanying period: filter by step between two dates
|
|
||||||
### Fixed
|
|
||||||
* use the correct annotation for the association between PersonCurrentCenter and Person
|
|
||||||
* ([#58](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/58))Fix birthdate timezone in PersonRenderBox
|
|
||||||
* ([#55](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/55))Fix the notification counter
|
|
||||||
### DX
|
|
||||||
* DQL function OVERLAPSI: simplify expression in postgresql
|
|
||||||
|
|
||||||
## v2.1.0 - 2023-06-12
|
|
||||||
|
|
||||||
### Feature
|
|
||||||
|
|
||||||
* [docgen] allow to pick a third party when generating a document in context Activity, AccompanyingPeriod
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
* ([#111](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/111)) List of "my accompanying periods": separate the active and closed periods in two different lists, and show the inactive_long and inactive_short periods
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
* ([#105](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/105)) Rights are checked for display of 'accompanying period' tab in household menu. Rights are also checked for creation of 'accompanying period' from within household context
|
|
||||||
|
|
||||||
### DX
|
|
||||||
|
|
||||||
* Add methods to RegroupmentRepository and fullfill Center / Regroupment Doctrine mapping
|
|
||||||
|
|
||||||
## 2.0.0
|
|
||||||
|
|
||||||
* this is a release to relaunch our proceess of release with semantic versioning
|
|
||||||
|
|
||||||
## Test releases
|
|
||||||
|
|
||||||
### 2.0.0-beta3
|
|
||||||
|
|
||||||
|
<!-- write down unreleased development here -->
|
||||||
* [person][export] Fixed: rename the alias for `accompanying_period` to `acp` in filter associated with person
|
* [person][export] Fixed: rename the alias for `accompanying_period` to `acp` in filter associated with person
|
||||||
* [activity][export] Feature: improve label for aliases in "Filter by activity type"
|
* [activity][export] Feature: improve label for aliases in "Filter by activity type"
|
||||||
* [activity][export] DX/Feature: use of an `ActivityTypeRepositoryInterface` instead of the old-style EntityRepository
|
* [activity][export] DX/Feature: use of an `ActivityTypeRepositoryInterface` instead of the old-style EntityRepository
|
||||||
@@ -184,6 +18,9 @@ and is generated by [Changie](https://github.com/miniscruff/changie).
|
|||||||
* [person][export] Fixed: use left join for related entities in accompanying course aggregators
|
* [person][export] Fixed: use left join for related entities in accompanying course aggregators
|
||||||
* [workflow] Feature: allow user to copy and send manually the access link for the workflow
|
* [workflow] Feature: allow user to copy and send manually the access link for the workflow
|
||||||
* [workflow] Feature: show the email addresses that received an access link for the workflow
|
* [workflow] Feature: show the email addresses that received an access link for the workflow
|
||||||
|
|
||||||
|
## Test releases
|
||||||
|
|
||||||
### 2.0.0-beta2
|
### 2.0.0-beta2
|
||||||
|
|
||||||
* [workflow]: Fixed: the notification is sent when the user is added to the first step.
|
* [workflow]: Fixed: the notification is sent when the user is added to the first step.
|
||||||
|
@@ -34,7 +34,6 @@
|
|||||||
"sensio/framework-extra-bundle": "^5.5",
|
"sensio/framework-extra-bundle": "^5.5",
|
||||||
"spomky-labs/base64url": "^2.0",
|
"spomky-labs/base64url": "^2.0",
|
||||||
"symfony/browser-kit": "^4.4",
|
"symfony/browser-kit": "^4.4",
|
||||||
"symfony/clock": "^6.2",
|
|
||||||
"symfony/css-selector": "^4.4",
|
"symfony/css-selector": "^4.4",
|
||||||
"symfony/expression-language": "^4.4",
|
"symfony/expression-language": "^4.4",
|
||||||
"symfony/form": "^4.4",
|
"symfony/form": "^4.4",
|
||||||
@@ -67,7 +66,6 @@
|
|||||||
"fakerphp/faker": "^1.13",
|
"fakerphp/faker": "^1.13",
|
||||||
"jangregor/phpstan-prophecy": "^1.0",
|
"jangregor/phpstan-prophecy": "^1.0",
|
||||||
"nelmio/alice": "^3.8",
|
"nelmio/alice": "^3.8",
|
||||||
"nikic/php-parser": "^4.15",
|
|
||||||
"phpspec/prophecy-phpunit": "^2.0",
|
"phpspec/prophecy-phpunit": "^2.0",
|
||||||
"phpstan/extension-installer": "^1.2",
|
"phpstan/extension-installer": "^1.2",
|
||||||
"phpstan/phpstan": "^1.9",
|
"phpstan/phpstan": "^1.9",
|
||||||
@@ -104,16 +102,14 @@
|
|||||||
"Chill\\ReportBundle\\": "src/Bundle/ChillReportBundle",
|
"Chill\\ReportBundle\\": "src/Bundle/ChillReportBundle",
|
||||||
"Chill\\TaskBundle\\": "src/Bundle/ChillTaskBundle",
|
"Chill\\TaskBundle\\": "src/Bundle/ChillTaskBundle",
|
||||||
"Chill\\ThirdPartyBundle\\": "src/Bundle/ChillThirdPartyBundle",
|
"Chill\\ThirdPartyBundle\\": "src/Bundle/ChillThirdPartyBundle",
|
||||||
"Chill\\WopiBundle\\": "src/Bundle/ChillWopiBundle/src",
|
"Chill\\WopiBundle\\": "src/Bundle/ChillWopiBundle/src"
|
||||||
"Chill\\Utils\\Rector\\": "utils/rector/src"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
@@ -127,12 +123,10 @@
|
|||||||
},
|
},
|
||||||
"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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -62,6 +62,7 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac
|
|||||||
{
|
{
|
||||||
$builder->add('date_from', DateType::class, [
|
$builder->add('date_from', DateType::class, [
|
||||||
'label' => 'Born after this date',
|
'label' => 'Born after this date',
|
||||||
|
'data' => new DateTime(),
|
||||||
'attr' => ['class' => 'datepicker'],
|
'attr' => ['class' => 'datepicker'],
|
||||||
'widget' => 'single_text',
|
'widget' => 'single_text',
|
||||||
'format' => 'dd-MM-yyyy',
|
'format' => 'dd-MM-yyyy',
|
||||||
@@ -69,15 +70,12 @@ class BirthdateFilter implements ExportElementValidatedInterface, FilterInterfac
|
|||||||
|
|
||||||
$builder->add('date_to', DateType::class, [
|
$builder->add('date_to', DateType::class, [
|
||||||
'label' => 'Born before this date',
|
'label' => 'Born before this date',
|
||||||
|
'data' => new DateTime(),
|
||||||
'attr' => ['class' => 'datepicker'],
|
'attr' => ['class' => 'datepicker'],
|
||||||
'widget' => 'single_text',
|
'widget' => 'single_text',
|
||||||
'format' => 'dd-MM-yyyy',
|
'format' => 'dd-MM-yyyy',
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return ['date_from' => new DateTime(), 'date_to' => new DateTime()];
|
|
||||||
}
|
|
||||||
|
|
||||||
// here, we create a simple string which will describe the action of
|
// here, we create a simple string which will describe the action of
|
||||||
// the filter in the Response
|
// the filter in the Response
|
||||||
|
@@ -36,10 +36,6 @@ class CountPerson implements ExportInterface
|
|||||||
{
|
{
|
||||||
// this export does not add any form
|
// this export does not add any form
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllowedFormattersTypes()
|
public function getAllowedFormattersTypes()
|
||||||
{
|
{
|
||||||
@@ -54,18 +50,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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,84 +0,0 @@
|
|||||||
|
|
||||||
.. 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`.
|
|
@@ -1,155 +0,0 @@
|
|||||||
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.
|
@@ -1,203 +0,0 @@
|
|||||||
|
|
||||||
.. 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".
|
|
||||||
|
|
||||||
.. _entity-info:
|
|
||||||
|
|
||||||
Stats about event on entity in php world
|
|
||||||
########################################
|
|
||||||
|
|
||||||
It is necessary to be able to gather information about events for some entities:
|
|
||||||
|
|
||||||
- when the event has been done;
|
|
||||||
- who did it;
|
|
||||||
- ...
|
|
||||||
|
|
||||||
Those "infos" are not linked with right management, like describe in :ref:`timelines`.
|
|
||||||
|
|
||||||
|
|
||||||
“infos” for some stats and info about an entity
|
|
||||||
-----------------------------------------------
|
|
||||||
|
|
||||||
Building an info means:
|
|
||||||
|
|
||||||
- create an Entity, and map this entity to a SQL view (not a regular table);
|
|
||||||
- use the framework to build this entity dynamically.
|
|
||||||
|
|
||||||
A framework api is built to be able to build multiple “infos” entities
|
|
||||||
through “union” views:
|
|
||||||
|
|
||||||
- use a command ``bin/console chill:db:sync-views`` to synchronize view (create view if it does not exists, or update
|
|
||||||
views when new SQL parts are added in the UNION query. Internally, this command call a new ``ViewEntityInfoManager``,
|
|
||||||
which iterate over available views to build the SQL;
|
|
||||||
- one can create a new “view entity info” by implementing a
|
|
||||||
``ViewEntityInfoProviderInterface``
|
|
||||||
- this implementation of the interface is free to create another
|
|
||||||
interface for building each part of the UNION query. This interface
|
|
||||||
is created for AccompanyingPeriodInfo:
|
|
||||||
``Chill\PersonBundle\Service\EntityInfo\AccompanyingPeriodInfoUnionQueryPartInterface``
|
|
||||||
|
|
||||||
So, converting new “events” into rows for ``AccompanyingPeriodInfo`` is
|
|
||||||
just implementing this interface!
|
|
||||||
|
|
||||||
Implementation for AccompanyingPeriod (``AccompanyingPeriod/AccompanyingPeriodInfo``)
|
|
||||||
-------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
A class is created for computing some statistical info for an
|
|
||||||
AccompanyingPeriod: ``AccompanyingPeriod/AccompanyingPeriodInfo``. This
|
|
||||||
contains information about “something happens”, who did it and when.
|
|
||||||
|
|
||||||
Having those info in table answer some questions like:
|
|
||||||
|
|
||||||
- when is the last and the first action (AccompanyingPeriodWork,
|
|
||||||
Activity, AccompanyingPeriodWorkEvaluation, …) on the period;
|
|
||||||
- who is “acting” on the period, and when is the last “action” for each
|
|
||||||
user.
|
|
||||||
|
|
||||||
The AccompanyingPeriod info is mapped to a SQL view, not a table. The
|
|
||||||
sql view is built dynamically (see below), and gather infos from
|
|
||||||
ActivityBundle, PersonBundle, CalendarBundle, … It is possible to create
|
|
||||||
custom bundle and add info on this view.
|
|
||||||
|
|
||||||
.. code:: php
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @ORM\Entity()
|
|
||||||
* @ORM\Table(name="view_chill_person_accompanying_period_info") <==== THIS IS A VIEW, NOT A TABLE
|
|
||||||
*/
|
|
||||||
class AccompanyingPeriodInfo
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
Why do we need this ?
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
For multiple jobs in PHP world:
|
|
||||||
|
|
||||||
- moving the accompanying period to another steps when inactive,
|
|
||||||
automatically;
|
|
||||||
- listing all the users which are intervening on the action on a new
|
|
||||||
“Liste des intervenants” page;
|
|
||||||
- filtering on exports
|
|
||||||
|
|
||||||
Later, we will launch automatic anonymise for accompanying period and
|
|
||||||
all related entities through this information.
|
|
||||||
|
|
||||||
How is built the SQL views which is mapped to “info” entities ?
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The AccompanyingPeriodInfo entity is mapped by a SQL view (not a regular
|
|
||||||
table).
|
|
||||||
|
|
||||||
The sql view is built dynamically, it is a SQL view like this, for now (April 2023):
|
|
||||||
|
|
||||||
.. code:: sql
|
|
||||||
|
|
||||||
create view view_chill_person_accompanying_period_info
|
|
||||||
(accompanyingperiod_id, relatedentity, relatedentityid, user_id, infodate, discriminator, metadata) as
|
|
||||||
SELECT w.accompanyingperiod_id,
|
|
||||||
'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork'::text AS relatedentity,
|
|
||||||
w.id AS relatedentityid,
|
|
||||||
cpapwr.user_id,
|
|
||||||
w.enddate AS infodate,
|
|
||||||
'accompanying_period_work_end'::text AS discriminator,
|
|
||||||
'{}'::jsonb AS metadata
|
|
||||||
FROM chill_person_accompanying_period_work w
|
|
||||||
LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON w.id = cpapwr.accompanyingperiodwork_id
|
|
||||||
WHERE w.enddate IS NOT NULL
|
|
||||||
UNION
|
|
||||||
SELECT cpapw.accompanyingperiod_id,
|
|
||||||
'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity,
|
|
||||||
e.id AS relatedentityid,
|
|
||||||
e.updatedby_id AS user_id,
|
|
||||||
e.updatedat AS infodate,
|
|
||||||
'accompanying_period_work_evaluation_updated_at'::text AS discriminator,
|
|
||||||
'{}'::jsonb AS metadata
|
|
||||||
FROM chill_person_accompanying_period_work_evaluation e
|
|
||||||
JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id
|
|
||||||
WHERE e.updatedat IS NOT NULL
|
|
||||||
UNION
|
|
||||||
SELECT cpapw.accompanyingperiod_id,
|
|
||||||
'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity,
|
|
||||||
e.id AS relatedentityid,
|
|
||||||
cpapwr.user_id,
|
|
||||||
e.maxdate AS infodate,
|
|
||||||
'accompanying_period_work_evaluation_start'::text AS discriminator,
|
|
||||||
'{}'::jsonb AS metadata
|
|
||||||
FROM chill_person_accompanying_period_work_evaluation e
|
|
||||||
JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id
|
|
||||||
LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON cpapw.id = cpapwr.accompanyingperiodwork_id
|
|
||||||
WHERE e.maxdate IS NOT NULL
|
|
||||||
UNION
|
|
||||||
SELECT cpapw.accompanyingperiod_id,
|
|
||||||
'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity,
|
|
||||||
e.id AS relatedentityid,
|
|
||||||
cpapwr.user_id,
|
|
||||||
e.startdate AS infodate,
|
|
||||||
'accompanying_period_work_evaluation_start'::text AS discriminator,
|
|
||||||
'{}'::jsonb AS metadata
|
|
||||||
FROM chill_person_accompanying_period_work_evaluation e
|
|
||||||
JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id
|
|
||||||
LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON cpapw.id = cpapwr.accompanyingperiodwork_id
|
|
||||||
UNION
|
|
||||||
SELECT cpapw.accompanyingperiod_id,
|
|
||||||
'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument'::text AS relatedentity,
|
|
||||||
doc.id AS relatedentityid,
|
|
||||||
doc.updatedby_id AS user_id,
|
|
||||||
doc.updatedat AS infodate,
|
|
||||||
'accompanying_period_work_evaluation_document_updated_at'::text AS discriminator,
|
|
||||||
'{}'::jsonb AS metadata
|
|
||||||
FROM chill_person_accompanying_period_work_evaluation_document doc
|
|
||||||
JOIN chill_person_accompanying_period_work_evaluation e ON doc.accompanyingperiodworkevaluation_id = e.id
|
|
||||||
JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id
|
|
||||||
WHERE doc.updatedat IS NOT NULL
|
|
||||||
UNION
|
|
||||||
SELECT cpapw.accompanyingperiod_id,
|
|
||||||
'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity,
|
|
||||||
e.id AS relatedentityid,
|
|
||||||
cpapwr.user_id,
|
|
||||||
e.maxdate AS infodate,
|
|
||||||
'accompanying_period_work_evaluation_max'::text AS discriminator,
|
|
||||||
'{}'::jsonb AS metadata
|
|
||||||
FROM chill_person_accompanying_period_work_evaluation e
|
|
||||||
JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id
|
|
||||||
LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON cpapw.id = cpapwr.accompanyingperiodwork_id
|
|
||||||
WHERE e.maxdate IS NOT NULL
|
|
||||||
UNION
|
|
||||||
SELECT w.accompanyingperiod_id,
|
|
||||||
'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork'::text AS relatedentity,
|
|
||||||
w.id AS relatedentityid,
|
|
||||||
cpapwr.user_id,
|
|
||||||
w.startdate AS infodate,
|
|
||||||
'accompanying_period_work_start'::text AS discriminator,
|
|
||||||
'{}'::jsonb AS metadata
|
|
||||||
FROM chill_person_accompanying_period_work w
|
|
||||||
LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON w.id = cpapwr.accompanyingperiodwork_id
|
|
||||||
UNION
|
|
||||||
SELECT activity.accompanyingperiod_id,
|
|
||||||
'Chill\ActivityBundle\Entity\Activity'::text AS relatedentity,
|
|
||||||
activity.id AS relatedentityid,
|
|
||||||
au.user_id,
|
|
||||||
activity.date AS infodate,
|
|
||||||
'activity_date'::text AS discriminator,
|
|
||||||
'{}'::jsonb AS metadata
|
|
||||||
FROM activity
|
|
||||||
LEFT JOIN activity_user au ON activity.id = au.activity_id
|
|
||||||
WHERE activity.accompanyingperiod_id IS NOT NULL;
|
|
||||||
|
|
||||||
As you can see, the view gather multiple SELECT queries and bind them
|
|
||||||
with UNION.
|
|
||||||
|
|
||||||
Each SELECT query is built dynamically, through a class implementing an
|
|
||||||
interface: ``Chill\PersonBundle\Service\EntityInfo\AccompanyingPeriodInfoUnionQueryPartInterface``, `like
|
|
||||||
here <https://gitlab.com/Chill-Projet/chill-bundles/-/blob/master/src/Bundle/ChillPersonBundle/Service/EntityInfo/AccompanyingPeriodInfoQueryPart/AccompanyingPeriodWorkEndQueryPartForAccompanyingPeriodInfo.php>`__
|
|
||||||
|
|
||||||
To add new `SELECT` query in different `UNION` parts in the sql view, create a
|
|
||||||
service and implements this interface: ``Chill\PersonBundle\Service\EntityInfo\AccompanyingPeriodInfoUnionQueryPartInterface``.
|
|
@@ -35,8 +35,6 @@ As Chill rely on the `symfony <http://symfony.com>`_ framework, reading the fram
|
|||||||
manual/index.rst
|
manual/index.rst
|
||||||
Assets <assets.rst>
|
Assets <assets.rst>
|
||||||
Cron Jobs <cronjob.rst>
|
Cron Jobs <cronjob.rst>
|
||||||
Info about entities <entity-info.rst>
|
|
||||||
Info about database (in French) <database-principles.rst>
|
|
||||||
|
|
||||||
Layout and UI
|
Layout and UI
|
||||||
**************
|
**************
|
||||||
|
@@ -6,8 +6,6 @@
|
|||||||
A copy of the license is included in the section entitled "GNU
|
A copy of the license is included in the section entitled "GNU
|
||||||
Free Documentation License".
|
Free Documentation License".
|
||||||
|
|
||||||
.. _timelines:
|
|
||||||
|
|
||||||
Timelines
|
Timelines
|
||||||
*********
|
*********
|
||||||
|
|
||||||
|
@@ -23,19 +23,12 @@ 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()
|
||||||
|
@@ -151,7 +151,6 @@ This script will :
|
|||||||
|
|
||||||
# mount into to container
|
# mount into to container
|
||||||
./docker-php.sh
|
./docker-php.sh
|
||||||
bin/console chill:db:sync-views
|
|
||||||
# and load fixtures
|
# and load fixtures
|
||||||
bin/console doctrine:migrations:migrate
|
bin/console doctrine:migrations:migrate
|
||||||
|
|
||||||
@@ -162,7 +161,7 @@ Chill will be available at ``http://localhost:8001.`` Currently, there isn't any
|
|||||||
|
|
||||||
# mount into to container
|
# mount into to container
|
||||||
./docker-php.sh
|
./docker-php.sh
|
||||||
# and load fixtures (do not this for production)
|
# and load fixtures
|
||||||
bin/console doctrine:fixtures:load --purge-with-truncate
|
bin/console doctrine:fixtures:load --purge-with-truncate
|
||||||
|
|
||||||
There are several users available:
|
There are several users available:
|
||||||
@@ -205,10 +204,8 @@ How to create the database schema (= run migrations) ?
|
|||||||
# if a container is running
|
# if a container is running
|
||||||
./docker-php.sh
|
./docker-php.sh
|
||||||
bin/console doctrine:migrations:migrate
|
bin/console doctrine:migrations:migrate
|
||||||
bin/console chill:db:sync-views
|
|
||||||
# if not
|
# if not
|
||||||
docker-compose run --user $(id -u) php bin/console doctrine:migrations:migrate
|
docker-compose run --user $(id -u) php bin/console doctrine:migrations:migrate
|
||||||
docker-compose run --user $(id -u) php bin/console chill:db:sync-views
|
|
||||||
|
|
||||||
|
|
||||||
How to read the email sent by the program ?
|
How to read the email sent by the program ?
|
||||||
@@ -239,23 +236,6 @@ How to open a terminal in the project
|
|||||||
# if not
|
# if not
|
||||||
docker-compose run --user $(id -u) php /bin/bash
|
docker-compose run --user $(id -u) php /bin/bash
|
||||||
|
|
||||||
How to run cron-jobs ?
|
|
||||||
======================
|
|
||||||
|
|
||||||
Some command must be executed in :ref:`cron jobs <cronjob>`. To execute them:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# if a container is running
|
|
||||||
./docker-php.sh
|
|
||||||
bin/console chill:cron-job:execute
|
|
||||||
# some of them are executed only during the night. So, we have to force the execution during the day:
|
|
||||||
bin/console chill:cron-job:execute 'name-of-the-cron'
|
|
||||||
# if not
|
|
||||||
docker-compose run --user $(id -u) php bin/console chill:cron-job:execute
|
|
||||||
# some of them are executed only during the night. So, we have to force the execution during the day:
|
|
||||||
docker-compose run --user $(id -u) php bin/console chill:cron-job:execute 'name-of-the-cron'
|
|
||||||
|
|
||||||
How to run composer ?
|
How to run composer ?
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
|
@@ -38,14 +38,6 @@ This should be adapted to your needs:
|
|||||||
|
|
||||||
* Think about how you will backup your database. Some adminsys find easier to store database outside of docker, which might be easier to administrate or replicate.
|
* Think about how you will backup your database. Some adminsys find easier to store database outside of docker, which might be easier to administrate or replicate.
|
||||||
|
|
||||||
Run migrations on each update
|
|
||||||
=============================
|
|
||||||
|
|
||||||
Every time you start a new version, you should apply update the sql schema:
|
|
||||||
|
|
||||||
- running ``bin/console doctrine:migration:migrate`` to run sql migration;
|
|
||||||
- synchonizing sql views to the last state: ``bin/console chill:db:sync-views``
|
|
||||||
|
|
||||||
Cron jobs
|
Cron jobs
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
@@ -18,7 +18,6 @@ These are alias conventions :
|
|||||||
| | SocialIssue::class | acp.socialIssues | acpsocialissue |
|
| | SocialIssue::class | acp.socialIssues | acpsocialissue |
|
||||||
| | User::class | acp.user | acpuser |
|
| | User::class | acp.user | acpuser |
|
||||||
| | AccompanyingPeriopStepHistory::class | acp.stepHistories | acpstephistories |
|
| | AccompanyingPeriopStepHistory::class | acp.stepHistories | acpstephistories |
|
||||||
| | 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 |
|
| | User::class | acpw.referrers | acpwuser |
|
||||||
@@ -29,8 +28,6 @@ These are alias conventions :
|
|||||||
| | Person::class | acppart.person | partperson |
|
| | Person::class | acppart.person | partperson |
|
||||||
| AccompanyingPeriodWorkEvaluation::class | | | workeval |
|
| AccompanyingPeriodWorkEvaluation::class | | | workeval |
|
||||||
| | Evaluation::class | workeval.evaluation | eval |
|
| | Evaluation::class | workeval.evaluation | eval |
|
||||||
| AccompanyingPeriodInfo::class | | | acpinfo |
|
|
||||||
| | User::class | acpinfo.user | acpinfo_user |
|
|
||||||
| Goal::class | | | goal |
|
| Goal::class | | | goal |
|
||||||
| | Result::class | goal.results | goalresult |
|
| | Result::class | goal.results | goalresult |
|
||||||
| Person::class | | | person |
|
| Person::class | | | person |
|
||||||
|
@@ -2,7 +2,6 @@ parameters:
|
|||||||
level: 5
|
level: 5
|
||||||
paths:
|
paths:
|
||||||
- src/
|
- src/
|
||||||
- utils/
|
|
||||||
tmpDir: .cache/
|
tmpDir: .cache/
|
||||||
reportUnmatchedIgnoredErrors: false
|
reportUnmatchedIgnoredErrors: false
|
||||||
excludePaths:
|
excludePaths:
|
||||||
|
@@ -1,29 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.6/phpunit.xsd"
|
|
||||||
bootstrap="tests/app/vendor/autoload.php"
|
|
||||||
cacheResultFile=".cache/phpunit/test-results-rector"
|
|
||||||
executionOrder="depends,defects"
|
|
||||||
forceCoversAnnotation="true"
|
|
||||||
beStrictAboutCoversAnnotation="true"
|
|
||||||
beStrictAboutOutputDuringTests="true"
|
|
||||||
beStrictAboutTodoAnnotatedTests="true"
|
|
||||||
convertDeprecationsToExceptions="true"
|
|
||||||
failOnRisky="true"
|
|
||||||
failOnWarning="true"
|
|
||||||
verbose="true"
|
|
||||||
colors="true"
|
|
||||||
>
|
|
||||||
<testsuites>
|
|
||||||
<testsuite name="default">
|
|
||||||
<directory>utils/rector/tests</directory>
|
|
||||||
</testsuite>
|
|
||||||
</testsuites>
|
|
||||||
|
|
||||||
<coverage cacheDirectory=".cache/phpunit/code-coverage-rector"
|
|
||||||
processUncoveredFiles="true">
|
|
||||||
<include>
|
|
||||||
<directory suffix=".php">utils/rector/src</directory>
|
|
||||||
</include>
|
|
||||||
</coverage>
|
|
||||||
</phpunit>
|
|
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
<!-- 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" />
|
||||||
|
30
rector.php
30
rector.php
@@ -12,6 +12,8 @@ return static function (RectorConfig $rectorConfig): void {
|
|||||||
__DIR__ . '/src',
|
__DIR__ . '/src',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$rectorConfig->symfonyContainerXml(__DIR__ . '/var/cache/dev/testsApp_KernelDevDebugContainer.xml');
|
||||||
|
|
||||||
//$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,12 +23,10 @@ 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\SymfonySetList::SYMFONY_44,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// chill rules
|
|
||||||
$rectorConfig->rule(\Chill\Utils\Rector\Rector\ChillBundleAddFormDefaultDataOnExportFilterAggregatorRector::class);
|
|
||||||
|
|
||||||
// skip some path...
|
// skip some path...
|
||||||
$rectorConfig->skip([
|
$rectorConfig->skip([
|
||||||
// make rector stuck for some files
|
// make rector stuck for some files
|
||||||
@@ -37,27 +37,5 @@ return static function (RectorConfig $rectorConfig): void {
|
|||||||
|
|
||||||
// must merge MR500 and review a typing of "ArrayCollection" in entities
|
// must merge MR500 and review a typing of "ArrayCollection" in entities
|
||||||
\Rector\TypeDeclaration\Rector\Property\TypedPropertyFromAssignsRector::class,
|
\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
|
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
@@ -18,17 +18,11 @@ use Chill\ActivityBundle\Repository\ActivityACLAwareRepositoryInterface;
|
|||||||
use Chill\ActivityBundle\Repository\ActivityRepository;
|
use Chill\ActivityBundle\Repository\ActivityRepository;
|
||||||
use Chill\ActivityBundle\Repository\ActivityTypeCategoryRepository;
|
use Chill\ActivityBundle\Repository\ActivityTypeCategoryRepository;
|
||||||
use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface;
|
use Chill\ActivityBundle\Repository\ActivityTypeRepositoryInterface;
|
||||||
use Chill\ActivityBundle\Repository\ActivityUserJobRepository;
|
|
||||||
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;
|
||||||
@@ -69,18 +63,13 @@ final class ActivityController extends AbstractController
|
|||||||
private readonly UserRepositoryInterface $userRepository,
|
private readonly UserRepositoryInterface $userRepository,
|
||||||
private readonly CenterResolverManagerInterface $centerResolver,
|
private readonly CenterResolverManagerInterface $centerResolver,
|
||||||
private readonly TranslatorInterface $translator,
|
private readonly TranslatorInterface $translator,
|
||||||
private readonly FilterOrderHelperFactoryInterface $filterOrderHelperFactory,
|
|
||||||
private readonly TranslatableStringHelperInterface $translatableStringHelper,
|
|
||||||
private readonly PaginatorFactory $paginatorFactory,
|
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes a Activity entity.
|
* Deletes a Activity entity.
|
||||||
*
|
|
||||||
* @param mixed $id
|
|
||||||
*/
|
*/
|
||||||
public function deleteAction(Request $request, $id)
|
public function deleteAction(Request $request, mixed $id)
|
||||||
{
|
{
|
||||||
$view = null;
|
$view = null;
|
||||||
|
|
||||||
@@ -253,31 +242,14 @@ final class ActivityController extends AbstractController
|
|||||||
{
|
{
|
||||||
$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(
|
->findByPerson($person, ActivityVoter::SEE, 0, null, ['date' => 'DESC', 'id' => 'DESC']);
|
||||||
$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,
|
||||||
@@ -289,21 +261,10 @@ final class ActivityController extends AbstractController
|
|||||||
} 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(
|
->findByAccompanyingPeriod($accompanyingPeriod, ActivityVoter::SEE, 0, null, ['date' => 'DESC', 'id' => 'DESC']);
|
||||||
$accompanyingPeriod,
|
|
||||||
ActivityVoter::SEE,
|
|
||||||
$paginator->getCurrentPageFirstItemNumber(),
|
|
||||||
$paginator->getItemsPerPage(),
|
|
||||||
['date' => 'DESC', 'id' => 'DESC'],
|
|
||||||
$filterArgs
|
|
||||||
);
|
|
||||||
|
|
||||||
$view = 'ChillActivityBundle:Activity:listAccompanyingCourse.html.twig';
|
$view = 'ChillActivityBundle:Activity:listAccompanyingCourse.html.twig';
|
||||||
} else {
|
|
||||||
throw new \LogicException("Unsupported");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render(
|
return $this->render(
|
||||||
@@ -312,47 +273,10 @@ 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();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function newAction(Request $request): Response
|
public function newAction(Request $request): Response
|
||||||
{
|
{
|
||||||
$view = null;
|
$view = null;
|
||||||
|
@@ -47,10 +47,8 @@ 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
|
|
||||||
*/
|
*/
|
||||||
public function editAction($id)
|
public function editAction(mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
@@ -98,10 +96,8 @@ class ActivityReasonCategoryController extends AbstractController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds and displays a ActivityReasonCategory entity.
|
* Finds and displays a ActivityReasonCategory entity.
|
||||||
*
|
|
||||||
* @param mixed $id
|
|
||||||
*/
|
*/
|
||||||
public function showAction($id)
|
public function showAction(mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
@@ -118,10 +114,8 @@ class ActivityReasonCategoryController extends AbstractController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Edits an existing ActivityReasonCategory entity.
|
* Edits an existing ActivityReasonCategory entity.
|
||||||
*
|
|
||||||
* @param mixed $id
|
|
||||||
*/
|
*/
|
||||||
public function updateAction(Request $request, $id)
|
public function updateAction(Request $request, mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
|
@@ -24,11 +24,8 @@ 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,10 +53,8 @@ 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
|
|
||||||
*/
|
*/
|
||||||
public function editAction($id)
|
public function editAction(mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
@@ -107,10 +102,8 @@ class ActivityReasonController extends AbstractController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds and displays a ActivityReason entity.
|
* Finds and displays a ActivityReason entity.
|
||||||
*
|
|
||||||
* @param mixed $id
|
|
||||||
*/
|
*/
|
||||||
public function showAction($id)
|
public function showAction(mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
@@ -127,10 +120,8 @@ class ActivityReasonController extends AbstractController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Edits an existing ActivityReason entity.
|
* Edits an existing ActivityReason entity.
|
||||||
*
|
|
||||||
* @param mixed $id
|
|
||||||
*/
|
*/
|
||||||
public function updateAction(Request $request, $id)
|
public function updateAction(Request $request, mixed $id)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
|
@@ -25,17 +25,14 @@ class LoadActivity extends AbstractFixture implements OrderedFixtureInterface
|
|||||||
{
|
{
|
||||||
use \Symfony\Component\DependencyInjection\ContainerAwareTrait;
|
use \Symfony\Component\DependencyInjection\ContainerAwareTrait;
|
||||||
|
|
||||||
private EntityManagerInterface $em;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \Faker\Generator
|
* @var \Faker\Generator
|
||||||
*/
|
*/
|
||||||
private $faker;
|
private $faker;
|
||||||
|
|
||||||
public function __construct(EntityManagerInterface $em)
|
public function __construct(private readonly EntityManagerInterface $em)
|
||||||
{
|
{
|
||||||
$this->faker = FakerFactory::create('fr_FR');
|
$this->faker = FakerFactory::create('fr_FR');
|
||||||
$this->em = $em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOrder()
|
public function getOrder()
|
||||||
@@ -70,7 +67,7 @@ class LoadActivity extends AbstractFixture implements OrderedFixtureInterface
|
|||||||
->setPerson($person)
|
->setPerson($person)
|
||||||
->setDate($this->faker->dateTimeThisYear())
|
->setDate($this->faker->dateTimeThisYear())
|
||||||
->setDurationTime($this->faker->dateTime(36000))
|
->setDurationTime($this->faker->dateTime(36000))
|
||||||
->setType($this->getRandomActivityType())
|
->setActivityType($this->getRandomActivityType())
|
||||||
->setScope($this->getRandomScope());
|
->setScope($this->getRandomScope());
|
||||||
|
|
||||||
// ->setAttendee($this->faker->boolean())
|
// ->setAttendee($this->faker->boolean())
|
||||||
|
@@ -65,9 +65,9 @@ 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")
|
||||||
@@ -672,7 +672,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @deprecated use @link{self::setActivityType} instead
|
||||||
*/
|
*/
|
||||||
public function setType(ActivityType $activityType): self
|
public function setType(ActivityType $activityType): self
|
||||||
{
|
{
|
||||||
|
@@ -23,10 +23,9 @@ use Doctrine\ORM\Mapping as ORM;
|
|||||||
class ActivityReason
|
class ActivityReason
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var bool
|
|
||||||
* @ORM\Column(type="boolean")
|
* @ORM\Column(type="boolean")
|
||||||
*/
|
*/
|
||||||
private $active = true;
|
private bool $active = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var ActivityReasonCategory
|
* @var ActivityReasonCategory
|
||||||
@@ -34,7 +33,7 @@ class ActivityReason
|
|||||||
* targetEntity="Chill\ActivityBundle\Entity\ActivityReasonCategory",
|
* targetEntity="Chill\ActivityBundle\Entity\ActivityReasonCategory",
|
||||||
* inversedBy="reasons")
|
* inversedBy="reasons")
|
||||||
*/
|
*/
|
||||||
private $category;
|
private ?ActivityReasonCategory $category = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int
|
* @var int
|
||||||
@@ -43,13 +42,13 @@ class ActivityReason
|
|||||||
* @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
|
* @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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@ use Doctrine\ORM\Mapping as ORM;
|
|||||||
* @ORM\Table(name="activityreasoncategory")
|
* @ORM\Table(name="activityreasoncategory")
|
||||||
* @ORM\HasLifecycleCallbacks
|
* @ORM\HasLifecycleCallbacks
|
||||||
*/
|
*/
|
||||||
class ActivityReasonCategory
|
class ActivityReasonCategory implements \Stringable
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var bool
|
* @var bool
|
||||||
@@ -65,7 +65,7 @@ class ActivityReasonCategory
|
|||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function __toString()
|
public function __toString(): string
|
||||||
{
|
{
|
||||||
return 'ActivityReasonCategory(' . $this->getName('x') . ')';
|
return 'ActivityReasonCategory(' . $this->getName('x') . ')';
|
||||||
}
|
}
|
||||||
|
@@ -27,11 +27,11 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
|||||||
*/
|
*/
|
||||||
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
|
||||||
@@ -275,10 +275,8 @@ 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 (!(2 === $this->socialIssuesVisible && 1 === $this->socialActionsVisible)) {
|
||||||
|
@@ -22,14 +22,8 @@ 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)
|
||||||
|
@@ -40,10 +40,6 @@ class ByActivityNumberAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// No form needed
|
// No form needed
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
|
@@ -20,16 +20,8 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
|
|
||||||
class ByCreatorAggregator implements AggregatorInterface
|
class ByCreatorAggregator implements AggregatorInterface
|
||||||
{
|
{
|
||||||
private UserRender $userRender;
|
public function __construct(private readonly UserRepositoryInterface $userRepository, private readonly UserRender $userRender)
|
||||||
|
{
|
||||||
private UserRepositoryInterface $userRepository;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
UserRepositoryInterface $userRepository,
|
|
||||||
UserRender $userRender
|
|
||||||
) {
|
|
||||||
$this->userRepository = $userRepository;
|
|
||||||
$this->userRender = $userRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -52,10 +44,6 @@ class ByCreatorAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// no form
|
// no form
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
|
@@ -21,16 +21,8 @@ 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
|
||||||
@@ -57,10 +49,6 @@ class BySocialActionAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// no form
|
// no form
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
|
@@ -21,16 +21,8 @@ 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
|
||||||
@@ -57,10 +49,6 @@ class BySocialIssueAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// no form
|
// no form
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
|
@@ -21,16 +21,8 @@ use function in_array;
|
|||||||
|
|
||||||
class ByThirdpartyAggregator implements AggregatorInterface
|
class ByThirdpartyAggregator implements AggregatorInterface
|
||||||
{
|
{
|
||||||
private ThirdPartyRender $thirdPartyRender;
|
public function __construct(private readonly ThirdPartyRepository $thirdPartyRepository, private readonly ThirdPartyRender $thirdPartyRender)
|
||||||
|
{
|
||||||
private ThirdPartyRepository $thirdPartyRepository;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
ThirdPartyRepository $thirdPartyRepository,
|
|
||||||
ThirdPartyRender $thirdPartyRender
|
|
||||||
) {
|
|
||||||
$this->thirdPartyRepository = $thirdPartyRepository;
|
|
||||||
$this->thirdPartyRender = $thirdPartyRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -57,10 +49,6 @@ class ByThirdpartyAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// no form
|
// no form
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
|
@@ -21,16 +21,8 @@ use function in_array;
|
|||||||
|
|
||||||
class CreatorScopeAggregator implements AggregatorInterface
|
class CreatorScopeAggregator implements AggregatorInterface
|
||||||
{
|
{
|
||||||
private ScopeRepository $scopeRepository;
|
public function __construct(private readonly ScopeRepository $scopeRepository, private readonly TranslatableStringHelper $translatableStringHelper)
|
||||||
|
{
|
||||||
private TranslatableStringHelper $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
ScopeRepository $scopeRepository,
|
|
||||||
TranslatableStringHelper $translatableStringHelper
|
|
||||||
) {
|
|
||||||
$this->scopeRepository = $scopeRepository;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -57,10 +49,6 @@ class CreatorScopeAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// no form
|
// no form
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
|
@@ -29,6 +29,10 @@ class DateAggregator implements AggregatorInterface
|
|||||||
|
|
||||||
private const DEFAULT_CHOICE = 'year';
|
private const DEFAULT_CHOICE = 'year';
|
||||||
|
|
||||||
|
public function __construct(private readonly TranslatorInterface $translator)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
@@ -76,12 +80,9 @@ class DateAggregator implements AggregatorInterface
|
|||||||
'multiple' => false,
|
'multiple' => false,
|
||||||
'expanded' => true,
|
'expanded' => true,
|
||||||
'empty_data' => self::DEFAULT_CHOICE,
|
'empty_data' => self::DEFAULT_CHOICE,
|
||||||
|
'data' => self::DEFAULT_CHOICE,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return ['frequency' => self::DEFAULT_CHOICE];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
@@ -94,17 +95,9 @@ class DateAggregator implements AggregatorInterface
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ($data['frequency']) {
|
return match ($data['frequency']) {
|
||||||
case 'month':
|
default => $value,
|
||||||
case 'week':
|
};
|
||||||
//return $this->translator->trans('for week') .' '. $value ;
|
|
||||||
|
|
||||||
case 'year':
|
|
||||||
//return $this->translator->trans('in year') .' '. $value ;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,16 +21,8 @@ use function in_array;
|
|||||||
|
|
||||||
class LocationTypeAggregator implements AggregatorInterface
|
class LocationTypeAggregator implements AggregatorInterface
|
||||||
{
|
{
|
||||||
private LocationTypeRepository $locationTypeRepository;
|
public function __construct(private readonly LocationTypeRepository $locationTypeRepository, private readonly TranslatableStringHelper $translatableStringHelper)
|
||||||
|
{
|
||||||
private TranslatableStringHelper $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
LocationTypeRepository $locationTypeRepository,
|
|
||||||
TranslatableStringHelper $translatableStringHelper
|
|
||||||
) {
|
|
||||||
$this->locationTypeRepository = $locationTypeRepository;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -57,10 +49,6 @@ class LocationTypeAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// no form
|
// no form
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
|
@@ -1,80 +0,0 @@
|
|||||||
<?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\ActivityBundle\Repository\ActivityTypeRepositoryInterface;
|
|
||||||
use Chill\MainBundle\Export\AggregatorInterface;
|
|
||||||
use Chill\MainBundle\Repository\LocationRepository;
|
|
||||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
|
||||||
use Closure;
|
|
||||||
use Doctrine\ORM\QueryBuilder;
|
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
|
||||||
use function in_array;
|
|
||||||
|
|
||||||
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';
|
|
||||||
}
|
|
||||||
}
|
|
@@ -22,18 +22,10 @@ use function in_array;
|
|||||||
|
|
||||||
class ActivityTypeAggregator implements AggregatorInterface
|
class ActivityTypeAggregator implements AggregatorInterface
|
||||||
{
|
{
|
||||||
public const KEY = 'activity_type_aggregator';
|
final public const KEY = 'activity_type_aggregator';
|
||||||
|
|
||||||
protected ActivityTypeRepositoryInterface $activityTypeRepository;
|
public function __construct(protected ActivityTypeRepositoryInterface $activityTypeRepository, protected TranslatableStringHelperInterface $translatableStringHelper)
|
||||||
|
{
|
||||||
protected TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
ActivityTypeRepositoryInterface $activityTypeRepository,
|
|
||||||
TranslatableStringHelperInterface $translatableStringHelper
|
|
||||||
) {
|
|
||||||
$this->activityTypeRepository = $activityTypeRepository;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -60,10 +52,6 @@ class ActivityTypeAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// no form required for this aggregator
|
// no form required for this aggregator
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data): Closure
|
public function getLabels($key, array $values, $data): Closure
|
||||||
{
|
{
|
||||||
|
@@ -21,18 +21,10 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
|
|
||||||
class ActivityUserAggregator implements AggregatorInterface
|
class ActivityUserAggregator implements AggregatorInterface
|
||||||
{
|
{
|
||||||
public const KEY = 'activity_user_id';
|
final public const KEY = 'activity_user_id';
|
||||||
|
|
||||||
private UserRender $userRender;
|
public function __construct(private readonly UserRepository $userRepository, private readonly UserRender $userRender)
|
||||||
|
{
|
||||||
private UserRepository $userRepository;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
UserRepository $userRepository,
|
|
||||||
UserRender $userRender
|
|
||||||
) {
|
|
||||||
$this->userRepository = $userRepository;
|
|
||||||
$this->userRender = $userRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -58,10 +50,6 @@ class ActivityUserAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// nothing to add
|
// nothing to add
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, $values, $data): Closure
|
public function getLabels($key, $values, $data): Closure
|
||||||
{
|
{
|
||||||
|
@@ -21,14 +21,8 @@ use function in_array;
|
|||||||
|
|
||||||
class ActivityUsersAggregator implements AggregatorInterface
|
class ActivityUsersAggregator implements AggregatorInterface
|
||||||
{
|
{
|
||||||
private UserRender $userRender;
|
public function __construct(private readonly UserRepositoryInterface $userRepository, private readonly UserRender $userRender)
|
||||||
|
|
||||||
private UserRepositoryInterface $userRepository;
|
|
||||||
|
|
||||||
public function __construct(UserRepositoryInterface $userRepository, UserRender $userRender)
|
|
||||||
{
|
{
|
||||||
$this->userRepository = $userRepository;
|
|
||||||
$this->userRender = $userRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -56,10 +50,6 @@ class ActivityUsersAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// nothing to add on the form
|
// nothing to add on the form
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
|
@@ -20,14 +20,8 @@ use function in_array;
|
|||||||
|
|
||||||
class ActivityUsersJobAggregator implements \Chill\MainBundle\Export\AggregatorInterface
|
class ActivityUsersJobAggregator implements \Chill\MainBundle\Export\AggregatorInterface
|
||||||
{
|
{
|
||||||
private TranslatableStringHelperInterface $translatableStringHelper;
|
public function __construct(private readonly UserJobRepositoryInterface $userJobRepository, private readonly TranslatableStringHelperInterface $translatableStringHelper)
|
||||||
|
|
||||||
private UserJobRepositoryInterface $userJobRepository;
|
|
||||||
|
|
||||||
public function __construct(UserJobRepositoryInterface $userJobRepository, TranslatableStringHelperInterface $translatableStringHelper)
|
|
||||||
{
|
{
|
||||||
$this->userJobRepository = $userJobRepository;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -55,10 +49,6 @@ class ActivityUsersJobAggregator implements \Chill\MainBundle\Export\AggregatorI
|
|||||||
{
|
{
|
||||||
// nothing to add in the form
|
// nothing to add in the form
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
|
@@ -20,14 +20,8 @@ use function in_array;
|
|||||||
|
|
||||||
class ActivityUsersScopeAggregator implements \Chill\MainBundle\Export\AggregatorInterface
|
class ActivityUsersScopeAggregator implements \Chill\MainBundle\Export\AggregatorInterface
|
||||||
{
|
{
|
||||||
private ScopeRepositoryInterface $scopeRepository;
|
public function __construct(private readonly ScopeRepositoryInterface $scopeRepository, private readonly TranslatableStringHelperInterface $translatableStringHelper)
|
||||||
|
|
||||||
private TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(ScopeRepositoryInterface $scopeRepository, TranslatableStringHelperInterface $translatableStringHelper)
|
|
||||||
{
|
{
|
||||||
$this->scopeRepository = $scopeRepository;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -55,10 +49,6 @@ class ActivityUsersScopeAggregator implements \Chill\MainBundle\Export\Aggregato
|
|||||||
{
|
{
|
||||||
// nothing to add in the form
|
// nothing to add in the form
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
|
@@ -30,20 +30,8 @@ use function in_array;
|
|||||||
|
|
||||||
class ActivityReasonAggregator implements AggregatorInterface, ExportElementValidatedInterface
|
class ActivityReasonAggregator implements AggregatorInterface, ExportElementValidatedInterface
|
||||||
{
|
{
|
||||||
protected ActivityReasonCategoryRepository $activityReasonCategoryRepository;
|
public function __construct(protected ActivityReasonCategoryRepository $activityReasonCategoryRepository, protected ActivityReasonRepository $activityReasonRepository, protected TranslatableStringHelper $translatableStringHelper)
|
||||||
|
{
|
||||||
protected ActivityReasonRepository $activityReasonRepository;
|
|
||||||
|
|
||||||
protected TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
ActivityReasonCategoryRepository $activityReasonCategoryRepository,
|
|
||||||
ActivityReasonRepository $activityReasonRepository,
|
|
||||||
TranslatableStringHelper $translatableStringHelper
|
|
||||||
) {
|
|
||||||
$this->activityReasonCategoryRepository = $activityReasonCategoryRepository;
|
|
||||||
$this->activityReasonRepository = $activityReasonRepository;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -110,28 +98,14 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali
|
|||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
// for performance reason, we load data from db only once
|
match ($data['level']) {
|
||||||
switch ($data['level']) {
|
'reasons' => $this->activityReasonRepository->findBy(['id' => $values]),
|
||||||
case 'reasons':
|
'categories' => $this->activityReasonCategoryRepository->findBy(['id' => $values]),
|
||||||
$this->activityReasonRepository->findBy(['id' => $values]);
|
default => throw new RuntimeException(sprintf("The level data '%s' is invalid.", $data['level'])),
|
||||||
|
};
|
||||||
break;
|
|
||||||
|
|
||||||
case 'categories':
|
|
||||||
$this->activityReasonCategoryRepository->findBy(['id' => $values]);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new RuntimeException(sprintf("The level data '%s' is invalid.", $data['level']));
|
|
||||||
}
|
|
||||||
|
|
||||||
return function ($value) use ($data) {
|
return function ($value) use ($data) {
|
||||||
if ('_header' === $value) {
|
if ('_header' === $value) {
|
||||||
|
@@ -20,11 +20,8 @@ use Symfony\Contracts\Translation\TranslatorInterface;
|
|||||||
|
|
||||||
class SentReceivedAggregator implements AggregatorInterface
|
class SentReceivedAggregator implements AggregatorInterface
|
||||||
{
|
{
|
||||||
private TranslatorInterface $translator;
|
public function __construct(private readonly TranslatorInterface $translator)
|
||||||
|
|
||||||
public function __construct(TranslatorInterface $translator)
|
|
||||||
{
|
{
|
||||||
$this->translator = $translator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -47,10 +44,6 @@ class SentReceivedAggregator implements AggregatorInterface
|
|||||||
{
|
{
|
||||||
// No form needed
|
// No form needed
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabels($key, array $values, $data): callable
|
public function getLabels($key, array $values, $data): callable
|
||||||
{
|
{
|
||||||
|
@@ -16,9 +16,9 @@ namespace Chill\ActivityBundle\Export;
|
|||||||
*/
|
*/
|
||||||
abstract class Declarations
|
abstract class Declarations
|
||||||
{
|
{
|
||||||
public const ACTIVITY = 'activity';
|
final public const ACTIVITY = 'activity';
|
||||||
|
|
||||||
public const ACTIVITY_ACP = 'activity_linked_to_acp';
|
final public const ACTIVITY_ACP = 'activity_linked_to_acp';
|
||||||
|
|
||||||
public const ACTIVITY_PERSON = 'activity_linked_to_person';
|
final public const ACTIVITY_PERSON = 'activity_linked_to_person';
|
||||||
}
|
}
|
||||||
|
@@ -39,10 +39,6 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface
|
|||||||
public function buildForm(FormBuilderInterface $builder)
|
public function buildForm(FormBuilderInterface $builder)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllowedFormattersTypes(): array
|
public function getAllowedFormattersTypes(): array
|
||||||
{
|
{
|
||||||
|
@@ -40,10 +40,6 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac
|
|||||||
{
|
{
|
||||||
// TODO: Implement buildForm() method.
|
// TODO: Implement buildForm() method.
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllowedFormattersTypes(): array
|
public function getAllowedFormattersTypes(): array
|
||||||
{
|
{
|
||||||
|
@@ -39,10 +39,6 @@ class CountActivity implements ExportInterface, GroupedExportInterface
|
|||||||
public function buildForm(FormBuilderInterface $builder)
|
public function buildForm(FormBuilderInterface $builder)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllowedFormattersTypes(): array
|
public function getAllowedFormattersTypes(): array
|
||||||
{
|
{
|
||||||
|
@@ -24,30 +24,14 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
|
|
||||||
class ListActivity implements ListInterface, GroupedExportInterface
|
class ListActivity implements ListInterface, GroupedExportInterface
|
||||||
{
|
{
|
||||||
private EntityManagerInterface $entityManager;
|
public function __construct(private readonly ListActivityHelper $helper, private readonly EntityManagerInterface $entityManager, private readonly TranslatableStringExportLabelHelper $translatableStringExportLabelHelper)
|
||||||
|
{
|
||||||
private ListActivityHelper $helper;
|
|
||||||
|
|
||||||
private TranslatableStringExportLabelHelper $translatableStringExportLabelHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
ListActivityHelper $helper,
|
|
||||||
EntityManagerInterface $entityManager,
|
|
||||||
TranslatableStringExportLabelHelper $translatableStringExportLabelHelper
|
|
||||||
) {
|
|
||||||
$this->helper = $helper;
|
|
||||||
$this->entityManager = $entityManager;
|
|
||||||
$this->translatableStringExportLabelHelper = $translatableStringExportLabelHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder)
|
public function buildForm(FormBuilderInterface $builder)
|
||||||
{
|
{
|
||||||
$this->helper->buildForm($builder);
|
$this->helper->buildForm($builder);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllowedFormattersTypes()
|
public function getAllowedFormattersTypes()
|
||||||
{
|
{
|
||||||
@@ -66,22 +50,17 @@ class ListActivity implements ListInterface, GroupedExportInterface
|
|||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
switch ($key) {
|
return match ($key) {
|
||||||
case 'acpId':
|
'acpId' => static function ($value) {
|
||||||
return static function ($value) {
|
|
||||||
if ('_header' === $value) {
|
if ('_header' === $value) {
|
||||||
return ListActivityHelper::MSG_KEY . 'accompanying course id';
|
return ListActivityHelper::MSG_KEY . 'accompanying course id';
|
||||||
}
|
}
|
||||||
|
|
||||||
return $value ?? '';
|
return $value ?? '';
|
||||||
|
},
|
||||||
|
'scopesNames' => $this->translatableStringExportLabelHelper->getLabelMulti($key, $values, ListActivityHelper::MSG_KEY . 'course circles'),
|
||||||
|
default => $this->helper->getLabels($key, $values, $data),
|
||||||
};
|
};
|
||||||
|
|
||||||
case 'scopesNames':
|
|
||||||
return $this->translatableStringExportLabelHelper->getLabelMulti($key, $values, ListActivityHelper::MSG_KEY . 'course circles');
|
|
||||||
|
|
||||||
default:
|
|
||||||
return $this->helper->getLabels($key, $values, $data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getQueryKeys($data)
|
public function getQueryKeys($data)
|
||||||
|
@@ -40,10 +40,6 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface
|
|||||||
{
|
{
|
||||||
// TODO: Implement buildForm() method.
|
// TODO: Implement buildForm() method.
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllowedFormattersTypes(): array
|
public function getAllowedFormattersTypes(): array
|
||||||
{
|
{
|
||||||
|
@@ -40,10 +40,6 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac
|
|||||||
{
|
{
|
||||||
// TODO: Implement buildForm() method.
|
// TODO: Implement buildForm() method.
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllowedFormattersTypes(): array
|
public function getAllowedFormattersTypes(): array
|
||||||
{
|
{
|
||||||
|
@@ -24,21 +24,13 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
|
|
||||||
class CountActivity implements ExportInterface, GroupedExportInterface
|
class CountActivity implements ExportInterface, GroupedExportInterface
|
||||||
{
|
{
|
||||||
protected ActivityRepository $activityRepository;
|
public function __construct(protected ActivityRepository $activityRepository)
|
||||||
|
{
|
||||||
public function __construct(
|
|
||||||
ActivityRepository $activityRepository
|
|
||||||
) {
|
|
||||||
$this->activityRepository = $activityRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder)
|
public function buildForm(FormBuilderInterface $builder)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllowedFormattersTypes()
|
public function getAllowedFormattersTypes()
|
||||||
{
|
{
|
||||||
|
@@ -36,8 +36,6 @@ use function in_array;
|
|||||||
|
|
||||||
class ListActivity implements ListInterface, GroupedExportInterface
|
class ListActivity implements ListInterface, GroupedExportInterface
|
||||||
{
|
{
|
||||||
protected EntityManagerInterface $entityManager;
|
|
||||||
|
|
||||||
protected array $fields = [
|
protected array $fields = [
|
||||||
'id',
|
'id',
|
||||||
'date',
|
'date',
|
||||||
@@ -52,22 +50,8 @@ class ListActivity implements ListInterface, GroupedExportInterface
|
|||||||
'person_id',
|
'person_id',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected TranslatableStringHelperInterface $translatableStringHelper;
|
public function __construct(protected EntityManagerInterface $entityManager, protected TranslatorInterface $translator, protected TranslatableStringHelperInterface $translatableStringHelper, private readonly ActivityRepository $activityRepository)
|
||||||
|
{
|
||||||
protected TranslatorInterface $translator;
|
|
||||||
|
|
||||||
private ActivityRepository $activityRepository;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
EntityManagerInterface $em,
|
|
||||||
TranslatorInterface $translator,
|
|
||||||
TranslatableStringHelperInterface $translatableStringHelper,
|
|
||||||
ActivityRepository $activityRepository
|
|
||||||
) {
|
|
||||||
$this->entityManager = $em;
|
|
||||||
$this->translator = $translator;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
$this->activityRepository = $activityRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder)
|
public function buildForm(FormBuilderInterface $builder)
|
||||||
@@ -88,10 +72,6 @@ class ListActivity implements ListInterface, GroupedExportInterface
|
|||||||
])],
|
])],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllowedFormattersTypes()
|
public function getAllowedFormattersTypes()
|
||||||
{
|
{
|
||||||
|
@@ -30,33 +30,23 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
*/
|
*/
|
||||||
class StatActivityDuration implements ExportInterface, GroupedExportInterface
|
class StatActivityDuration implements ExportInterface, GroupedExportInterface
|
||||||
{
|
{
|
||||||
public const SUM = 'sum';
|
final public const SUM = 'sum';
|
||||||
|
|
||||||
/**
|
|
||||||
* The action for this report.
|
|
||||||
*/
|
|
||||||
protected string $action;
|
|
||||||
|
|
||||||
private ActivityRepository $activityRepository;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $action the stat to perform
|
* @param string $action the stat to perform
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
ActivityRepository $activityRepository,
|
private readonly ActivityRepository $activityRepository,
|
||||||
string $action = 'sum'
|
/**
|
||||||
|
* The action for this report.
|
||||||
|
*/
|
||||||
|
protected string $action = 'sum'
|
||||||
) {
|
) {
|
||||||
$this->action = $action;
|
|
||||||
$this->activityRepository = $activityRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder)
|
public function buildForm(FormBuilderInterface $builder)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllowedFormattersTypes()
|
public function getAllowedFormattersTypes()
|
||||||
{
|
{
|
||||||
|
@@ -30,46 +30,10 @@ use const SORT_NUMERIC;
|
|||||||
|
|
||||||
class ListActivityHelper
|
class ListActivityHelper
|
||||||
{
|
{
|
||||||
public const MSG_KEY = 'export.list.activity.';
|
final public const MSG_KEY = 'export.list.activity.';
|
||||||
|
|
||||||
private ActivityPresenceRepositoryInterface $activityPresenceRepository;
|
public function __construct(private readonly ActivityPresenceRepositoryInterface $activityPresenceRepository, private readonly ActivityTypeRepositoryInterface $activityTypeRepository, private readonly DateTimeHelper $dateTimeHelper, private readonly LabelPersonHelper $labelPersonHelper, private readonly LabelThirdPartyHelper $labelThirdPartyHelper, private readonly TranslatorInterface $translator, private readonly TranslatableStringHelperInterface $translatableStringHelper, private readonly TranslatableStringExportLabelHelper $translatableStringLabelHelper, private readonly UserHelper $userHelper)
|
||||||
|
{
|
||||||
private ActivityTypeRepositoryInterface $activityTypeRepository;
|
|
||||||
|
|
||||||
private DateTimeHelper $dateTimeHelper;
|
|
||||||
|
|
||||||
private LabelPersonHelper $labelPersonHelper;
|
|
||||||
|
|
||||||
private LabelThirdPartyHelper $labelThirdPartyHelper;
|
|
||||||
|
|
||||||
private TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
private TranslatableStringExportLabelHelper $translatableStringLabelHelper;
|
|
||||||
|
|
||||||
private TranslatorInterface $translator;
|
|
||||||
|
|
||||||
private UserHelper $userHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
ActivityPresenceRepositoryInterface $activityPresenceRepository,
|
|
||||||
ActivityTypeRepositoryInterface $activityTypeRepository,
|
|
||||||
DateTimeHelper $dateTimeHelper,
|
|
||||||
LabelPersonHelper $labelPersonHelper,
|
|
||||||
LabelThirdPartyHelper $labelThirdPartyHelper,
|
|
||||||
TranslatorInterface $translator,
|
|
||||||
TranslatableStringHelperInterface $translatableStringHelper,
|
|
||||||
TranslatableStringExportLabelHelper $translatableStringLabelHelper,
|
|
||||||
UserHelper $userHelper
|
|
||||||
) {
|
|
||||||
$this->activityPresenceRepository = $activityPresenceRepository;
|
|
||||||
$this->activityTypeRepository = $activityTypeRepository;
|
|
||||||
$this->dateTimeHelper = $dateTimeHelper;
|
|
||||||
$this->labelPersonHelper = $labelPersonHelper;
|
|
||||||
$this->labelThirdPartyHelper = $labelThirdPartyHelper;
|
|
||||||
$this->translator = $translator;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
$this->translatableStringLabelHelper = $translatableStringLabelHelper;
|
|
||||||
$this->userHelper = $userHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addSelect(QueryBuilder $qb): void
|
public function addSelect(QueryBuilder $qb): void
|
||||||
@@ -115,20 +79,11 @@ class ListActivityHelper
|
|||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
switch ($key) {
|
return match ($key) {
|
||||||
case 'createdAt':
|
'createdAt', 'updatedAt' => $this->dateTimeHelper->getLabel($key),
|
||||||
case 'updatedAt':
|
'createdBy', 'updatedBy' => $this->userHelper->getLabel($key, $values, $key),
|
||||||
return $this->dateTimeHelper->getLabel($key);
|
'date' => $this->dateTimeHelper->getLabel(self::MSG_KEY . $key),
|
||||||
|
'attendeeName' => function ($value) {
|
||||||
case 'createdBy':
|
|
||||||
case 'updatedBy':
|
|
||||||
return $this->userHelper->getLabel($key, $values, $key);
|
|
||||||
|
|
||||||
case 'date':
|
|
||||||
return $this->dateTimeHelper->getLabel(self::MSG_KEY . $key);
|
|
||||||
|
|
||||||
case 'attendeeName':
|
|
||||||
return function ($value) {
|
|
||||||
if ('_header' === $value) {
|
if ('_header' === $value) {
|
||||||
return 'Attendee';
|
return 'Attendee';
|
||||||
}
|
}
|
||||||
@@ -138,13 +93,9 @@ class ListActivityHelper
|
|||||||
}
|
}
|
||||||
|
|
||||||
return $this->translatableStringHelper->localize($presence->getName());
|
return $this->translatableStringHelper->localize($presence->getName());
|
||||||
};
|
},
|
||||||
|
'listReasons' => $this->translatableStringLabelHelper->getLabelMulti($key, $values, 'Activity Reasons'),
|
||||||
case 'listReasons':
|
'typeName' => function ($value) {
|
||||||
return $this->translatableStringLabelHelper->getLabelMulti($key, $values, 'Activity Reasons');
|
|
||||||
|
|
||||||
case 'typeName':
|
|
||||||
return function ($value) {
|
|
||||||
if ('_header' === $value) {
|
if ('_header' === $value) {
|
||||||
return 'Activity type';
|
return 'Activity type';
|
||||||
}
|
}
|
||||||
@@ -154,29 +105,15 @@ class ListActivityHelper
|
|||||||
}
|
}
|
||||||
|
|
||||||
return $this->translatableStringHelper->localize($type->getName());
|
return $this->translatableStringHelper->localize($type->getName());
|
||||||
};
|
},
|
||||||
|
'usersNames' => $this->userHelper->getLabelMulti($key, $values, self::MSG_KEY . 'users name'),
|
||||||
case 'usersNames':
|
'usersIds', 'thirdPartiesIds', 'personsIds' => static function ($value) use ($key) {
|
||||||
return $this->userHelper->getLabelMulti($key, $values, self::MSG_KEY . 'users name');
|
|
||||||
|
|
||||||
case 'usersIds':
|
|
||||||
case 'thirdPartiesIds':
|
|
||||||
case 'personsIds':
|
|
||||||
return static function ($value) use ($key) {
|
|
||||||
if ('_header' === $value) {
|
if ('_header' === $value) {
|
||||||
switch ($key) {
|
return match ($key) {
|
||||||
case 'usersIds':
|
'usersIds' => self::MSG_KEY . 'users ids',
|
||||||
return self::MSG_KEY . 'users ids';
|
'thirdPartiesIds' => self::MSG_KEY . 'third parties ids',
|
||||||
|
'personsIds' => self::MSG_KEY . 'persons ids',
|
||||||
case 'thirdPartiesIds':
|
};
|
||||||
return self::MSG_KEY . 'third parties ids';
|
|
||||||
|
|
||||||
case 'personsIds':
|
|
||||||
return self::MSG_KEY . 'persons ids';
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new LogicException('key not supported');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$decoded = json_decode($value, null, 512, JSON_THROW_ON_ERROR);
|
$decoded = json_decode($value, null, 512, JSON_THROW_ON_ERROR);
|
||||||
@@ -188,16 +125,10 @@ class ListActivityHelper
|
|||||||
SORT_NUMERIC
|
SORT_NUMERIC
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
};
|
},
|
||||||
|
'personsNames' => $this->labelPersonHelper->getLabelMulti($key, $values, self::MSG_KEY . 'persons name'),
|
||||||
case 'personsNames':
|
'thirdPartiesNames' => $this->labelThirdPartyHelper->getLabelMulti($key, $values, self::MSG_KEY . 'thirds parties'),
|
||||||
return $this->labelPersonHelper->getLabelMulti($key, $values, self::MSG_KEY . 'persons name');
|
'sentReceived' => function ($value) {
|
||||||
|
|
||||||
case 'thirdPartiesNames':
|
|
||||||
return $this->labelThirdPartyHelper->getLabelMulti($key, $values, self::MSG_KEY . 'thirds parties');
|
|
||||||
|
|
||||||
case 'sentReceived':
|
|
||||||
return function ($value) {
|
|
||||||
if ('_header' === $value) {
|
if ('_header' === $value) {
|
||||||
return self::MSG_KEY . 'sent received';
|
return self::MSG_KEY . 'sent received';
|
||||||
}
|
}
|
||||||
@@ -207,10 +138,8 @@ class ListActivityHelper
|
|||||||
}
|
}
|
||||||
|
|
||||||
return $this->translator->trans($value);
|
return $this->translator->trans($value);
|
||||||
};
|
},
|
||||||
|
default => function ($value) use ($key) {
|
||||||
default:
|
|
||||||
return function ($value) use ($key) {
|
|
||||||
if ('_header' === $value) {
|
if ('_header' === $value) {
|
||||||
return self::MSG_KEY . $key;
|
return self::MSG_KEY . $key;
|
||||||
}
|
}
|
||||||
@@ -220,9 +149,9 @@ class ListActivityHelper
|
|||||||
}
|
}
|
||||||
|
|
||||||
return $this->translator->trans($value);
|
return $this->translator->trans($value);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public function getQueryKeys($data)
|
public function getQueryKeys($data)
|
||||||
{
|
{
|
||||||
|
@@ -23,16 +23,8 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
|
|
||||||
class ActivityTypeFilter implements FilterInterface
|
class ActivityTypeFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
private ActivityTypeRepositoryInterface $activityTypeRepository;
|
public function __construct(private readonly ActivityTypeRepositoryInterface $activityTypeRepository, private readonly TranslatableStringHelperInterface $translatableStringHelper)
|
||||||
|
{
|
||||||
private TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
ActivityTypeRepositoryInterface $activityTypeRepository,
|
|
||||||
TranslatableStringHelperInterface $translatableStringHelper
|
|
||||||
) {
|
|
||||||
$this->activityTypeRepository = $activityTypeRepository;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -68,10 +60,6 @@ class ActivityTypeFilter implements FilterInterface
|
|||||||
'expanded' => true,
|
'expanded' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -20,11 +20,8 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
|
|
||||||
class ByCreatorFilter implements FilterInterface
|
class ByCreatorFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
private UserRender $userRender;
|
public function __construct(private readonly UserRender $userRender)
|
||||||
|
|
||||||
public function __construct(UserRender $userRender)
|
|
||||||
{
|
{
|
||||||
$this->userRender = $userRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -52,10 +49,6 @@ class ByCreatorFilter implements FilterInterface
|
|||||||
'multiple' => true,
|
'multiple' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -22,11 +22,8 @@ use function in_array;
|
|||||||
|
|
||||||
class BySocialActionFilter implements FilterInterface
|
class BySocialActionFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
private SocialActionRender $actionRender;
|
public function __construct(private readonly SocialActionRender $actionRender)
|
||||||
|
|
||||||
public function __construct(SocialActionRender $actionRender)
|
|
||||||
{
|
{
|
||||||
$this->actionRender = $actionRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -60,10 +57,6 @@ class BySocialActionFilter implements FilterInterface
|
|||||||
'multiple' => true,
|
'multiple' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -22,11 +22,8 @@ use function in_array;
|
|||||||
|
|
||||||
class BySocialIssueFilter implements FilterInterface
|
class BySocialIssueFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
private SocialIssueRender $issueRender;
|
public function __construct(private readonly SocialIssueRender $issueRender)
|
||||||
|
|
||||||
public function __construct(SocialIssueRender $issueRender)
|
|
||||||
{
|
{
|
||||||
$this->issueRender = $issueRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -60,10 +57,6 @@ class BySocialIssueFilter implements FilterInterface
|
|||||||
'multiple' => true,
|
'multiple' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -28,11 +28,8 @@ class EmergencyFilter implements FilterInterface
|
|||||||
|
|
||||||
private const DEFAULT_CHOICE = false;
|
private const DEFAULT_CHOICE = false;
|
||||||
|
|
||||||
private TranslatorInterface $translator;
|
public function __construct(private readonly TranslatorInterface $translator)
|
||||||
|
|
||||||
public function __construct(TranslatorInterface $translator)
|
|
||||||
{
|
{
|
||||||
$this->translator = $translator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -68,12 +65,9 @@ class EmergencyFilter implements FilterInterface
|
|||||||
'multiple' => false,
|
'multiple' => false,
|
||||||
'expanded' => true,
|
'expanded' => true,
|
||||||
'empty_data' => self::DEFAULT_CHOICE,
|
'empty_data' => self::DEFAULT_CHOICE,
|
||||||
|
'data' => self::DEFAULT_CHOICE,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return ['accepted_emergency' => self::DEFAULT_CHOICE];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -44,10 +44,6 @@ class HasNoActivityFilter implements FilterInterface
|
|||||||
{
|
{
|
||||||
//no form needed
|
//no form needed
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -46,10 +46,6 @@ class LocationFilter implements FilterInterface
|
|||||||
'label' => 'pick location',
|
'label' => 'pick location',
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -22,11 +22,8 @@ use function in_array;
|
|||||||
|
|
||||||
class LocationTypeFilter implements FilterInterface
|
class LocationTypeFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
private TranslatableStringHelper $translatableStringHelper;
|
public function __construct(private readonly TranslatableStringHelper $translatableStringHelper)
|
||||||
|
|
||||||
public function __construct(TranslatableStringHelper $translatableStringHelper)
|
|
||||||
{
|
{
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -65,10 +62,6 @@ class LocationTypeFilter implements FilterInterface
|
|||||||
//'label' => false,
|
//'label' => false,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -1,90 +0,0 @@
|
|||||||
<?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\Filter\ACPFilters;
|
|
||||||
|
|
||||||
use Chill\ActivityBundle\Entity\Activity;
|
|
||||||
use Chill\MainBundle\Export\FilterInterface;
|
|
||||||
use Chill\MainBundle\Form\Type\PickRollingDateType;
|
|
||||||
use Chill\MainBundle\Service\RollingDate\RollingDate;
|
|
||||||
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
|
|
||||||
use Doctrine\ORM\QueryBuilder;
|
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
|
||||||
|
|
||||||
final readonly class PeriodHavingActivityBetweenDatesFilter implements FilterInterface
|
|
||||||
{
|
|
||||||
public function __construct(
|
|
||||||
private RollingDateConverterInterface $rollingDateConverter,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTitle()
|
|
||||||
{
|
|
||||||
return 'export.filter.activity.course_having_activity_between_date.Title';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder)
|
|
||||||
{
|
|
||||||
$builder
|
|
||||||
->add('start_date', PickRollingDateType::class, [
|
|
||||||
'label' => 'export.filter.activity.course_having_activity_between_date.Receiving an activity after'
|
|
||||||
])
|
|
||||||
->add('end_date', PickRollingDateType::class, [
|
|
||||||
'label' => 'export.filter.activity.course_having_activity_between_date.Receiving an activity before'
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'start_date' => new RollingDate(RollingDate::T_YEAR_CURRENT_START),
|
|
||||||
'end_date' => new RollingDate(RollingDate::T_TODAY)
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string')
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'export.filter.activity.course_having_activity_between_date.Only course having an activity between from and to',
|
|
||||||
[
|
|
||||||
'from' => $this->rollingDateConverter->convert($data['start_date']),
|
|
||||||
'to' => $this->rollingDateConverter->convert($data['end_date']),
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function addRole(): ?string
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function alterQuery(QueryBuilder $qb, $data)
|
|
||||||
{
|
|
||||||
$alias = 'act_period_having_act_betw_date_alias';
|
|
||||||
$from = 'act_period_having_act_betw_date_start';
|
|
||||||
$to = 'act_period_having_act_betw_date_end';
|
|
||||||
|
|
||||||
$qb->andWhere(
|
|
||||||
$qb->expr()->exists(
|
|
||||||
'SELECT 1 FROM ' . Activity::class . " {$alias} WHERE {$alias}.date >= :{$from} AND {$alias}.date < :{$to} AND {$alias}.accompanyingPeriod = acp"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$qb
|
|
||||||
->setParameter($from, $this->rollingDateConverter->convert($data['start_date']))
|
|
||||||
->setParameter($to, $this->rollingDateConverter->convert($data['end_date']));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function applyOn()
|
|
||||||
{
|
|
||||||
return \Chill\PersonBundle\Export\Declarations::ACP_TYPE;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -29,11 +29,8 @@ class SentReceivedFilter implements FilterInterface
|
|||||||
|
|
||||||
private const DEFAULT_CHOICE = Activity::SENTRECEIVED_SENT;
|
private const DEFAULT_CHOICE = Activity::SENTRECEIVED_SENT;
|
||||||
|
|
||||||
private TranslatorInterface $translator;
|
public function __construct(private readonly TranslatorInterface $translator)
|
||||||
|
|
||||||
public function __construct(TranslatorInterface $translator)
|
|
||||||
{
|
{
|
||||||
$this->translator = $translator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -69,12 +66,9 @@ class SentReceivedFilter implements FilterInterface
|
|||||||
'multiple' => false,
|
'multiple' => false,
|
||||||
'expanded' => true,
|
'expanded' => true,
|
||||||
'empty_data' => self::DEFAULT_CHOICE,
|
'empty_data' => self::DEFAULT_CHOICE,
|
||||||
|
'data' => self::DEFAULT_CHOICE,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return ['accepted_sentreceived' => self::DEFAULT_CHOICE];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -21,11 +21,8 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
|
|
||||||
class UserFilter implements FilterInterface
|
class UserFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
private UserRender $userRender;
|
public function __construct(private readonly UserRender $userRender)
|
||||||
|
|
||||||
public function __construct(UserRender $userRender)
|
|
||||||
{
|
{
|
||||||
$this->userRender = $userRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -61,10 +58,6 @@ class UserFilter implements FilterInterface
|
|||||||
'label' => 'Creators',
|
'label' => 'Creators',
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -23,11 +23,8 @@ use function in_array;
|
|||||||
|
|
||||||
class UserScopeFilter implements FilterInterface
|
class UserScopeFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
private TranslatableStringHelper $translatableStringHelper;
|
public function __construct(private readonly TranslatableStringHelper $translatableStringHelper)
|
||||||
|
|
||||||
public function __construct(TranslatableStringHelper $translatableStringHelper)
|
|
||||||
{
|
{
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -71,10 +68,6 @@ class UserScopeFilter implements FilterInterface
|
|||||||
'expanded' => true,
|
'expanded' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string'): array
|
public function describeAction($data, $format = 'string'): array
|
||||||
{
|
{
|
||||||
|
@@ -27,16 +27,8 @@ use Symfony\Contracts\Translation\TranslatorInterface;
|
|||||||
|
|
||||||
class ActivityDateFilter implements FilterInterface
|
class ActivityDateFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
protected TranslatorInterface $translator;
|
public function __construct(protected TranslatorInterface $translator, private readonly RollingDateConverterInterface $rollingDateConverter)
|
||||||
|
{
|
||||||
private RollingDateConverterInterface $rollingDateConverter;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
TranslatorInterface $translator,
|
|
||||||
RollingDateConverterInterface $rollingDateConverter
|
|
||||||
) {
|
|
||||||
$this->translator = $translator;
|
|
||||||
$this->rollingDateConverter = $rollingDateConverter;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -80,9 +72,11 @@ class ActivityDateFilter implements FilterInterface
|
|||||||
$builder
|
$builder
|
||||||
->add('date_from', PickRollingDateType::class, [
|
->add('date_from', PickRollingDateType::class, [
|
||||||
'label' => 'Activities after this date',
|
'label' => 'Activities after this date',
|
||||||
|
'data' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START),
|
||||||
])
|
])
|
||||||
->add('date_to', PickRollingDateType::class, [
|
->add('date_to', PickRollingDateType::class, [
|
||||||
'label' => 'Activities before this date',
|
'label' => 'Activities before this date',
|
||||||
|
'data' => new RollingDate(RollingDate::T_TODAY),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
|
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
|
||||||
@@ -125,10 +119,6 @@ class ActivityDateFilter implements FilterInterface
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return ['date_from' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), 'date_to' => new RollingDate(RollingDate::T_TODAY)];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string')
|
public function describeAction($data, $format = 'string')
|
||||||
{
|
{
|
||||||
|
@@ -26,16 +26,8 @@ use function count;
|
|||||||
|
|
||||||
class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInterface
|
class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInterface
|
||||||
{
|
{
|
||||||
protected ActivityTypeRepositoryInterface $activityTypeRepository;
|
public function __construct(protected TranslatableStringHelperInterface $translatableStringHelper, protected ActivityTypeRepositoryInterface $activityTypeRepository)
|
||||||
|
{
|
||||||
protected TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
TranslatableStringHelperInterface $translatableStringHelper,
|
|
||||||
ActivityTypeRepositoryInterface $activityTypeRepository
|
|
||||||
) {
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
$this->activityTypeRepository = $activityTypeRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -78,10 +70,6 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter
|
|||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string')
|
public function describeAction($data, $format = 'string')
|
||||||
{
|
{
|
||||||
|
@@ -20,11 +20,8 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
|
|
||||||
class ActivityUsersFilter implements FilterInterface
|
class ActivityUsersFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
private UserRender $userRender;
|
public function __construct(private readonly UserRender $userRender)
|
||||||
|
|
||||||
public function __construct(UserRender $userRender)
|
|
||||||
{
|
{
|
||||||
$this->userRender = $userRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -56,10 +53,6 @@ class ActivityUsersFilter implements FilterInterface
|
|||||||
'label' => 'Users',
|
'label' => 'Users',
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string')
|
public function describeAction($data, $format = 'string')
|
||||||
{
|
{
|
||||||
|
@@ -29,16 +29,8 @@ use function in_array;
|
|||||||
|
|
||||||
class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInterface
|
class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInterface
|
||||||
{
|
{
|
||||||
protected ActivityReasonRepository $activityReasonRepository;
|
public function __construct(protected TranslatableStringHelper $translatableStringHelper, protected ActivityReasonRepository $activityReasonRepository)
|
||||||
|
{
|
||||||
protected TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
TranslatableStringHelper $helper,
|
|
||||||
ActivityReasonRepository $activityReasonRepository
|
|
||||||
) {
|
|
||||||
$this->translatableStringHelper = $helper;
|
|
||||||
$this->activityReasonRepository = $activityReasonRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -82,10 +74,6 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt
|
|||||||
'expanded' => false,
|
'expanded' => false,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string')
|
public function describeAction($data, $format = 'string')
|
||||||
{
|
{
|
||||||
|
@@ -37,20 +37,8 @@ use function count;
|
|||||||
|
|
||||||
class PersonHavingActivityBetweenDateFilter implements ExportElementValidatedInterface, FilterInterface
|
class PersonHavingActivityBetweenDateFilter implements ExportElementValidatedInterface, FilterInterface
|
||||||
{
|
{
|
||||||
protected ActivityReasonRepository $activityReasonRepository;
|
public function __construct(protected TranslatableStringHelper $translatableStringHelper, protected ActivityReasonRepository $activityReasonRepository, protected TranslatorInterface $translator)
|
||||||
|
{
|
||||||
protected TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
protected TranslatorInterface $translator;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
TranslatableStringHelper $translatableStringHelper,
|
|
||||||
ActivityReasonRepository $activityReasonRepository,
|
|
||||||
TranslatorInterface $translator
|
|
||||||
) {
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
$this->activityReasonRepository = $activityReasonRepository;
|
|
||||||
$this->translator = $translator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -112,6 +100,7 @@ class PersonHavingActivityBetweenDateFilter implements ExportElementValidatedInt
|
|||||||
{
|
{
|
||||||
$builder->add('date_from', DateType::class, [
|
$builder->add('date_from', DateType::class, [
|
||||||
'label' => 'Implied in an activity after this date',
|
'label' => 'Implied in an activity after this date',
|
||||||
|
'data' => new DateTime(),
|
||||||
'attr' => ['class' => 'datepicker'],
|
'attr' => ['class' => 'datepicker'],
|
||||||
'widget' => 'single_text',
|
'widget' => 'single_text',
|
||||||
'format' => 'dd-MM-yyyy',
|
'format' => 'dd-MM-yyyy',
|
||||||
@@ -119,6 +108,7 @@ class PersonHavingActivityBetweenDateFilter implements ExportElementValidatedInt
|
|||||||
|
|
||||||
$builder->add('date_to', DateType::class, [
|
$builder->add('date_to', DateType::class, [
|
||||||
'label' => 'Implied in an activity before this date',
|
'label' => 'Implied in an activity before this date',
|
||||||
|
'data' => new DateTime(),
|
||||||
'attr' => ['class' => 'datepicker'],
|
'attr' => ['class' => 'datepicker'],
|
||||||
'widget' => 'single_text',
|
'widget' => 'single_text',
|
||||||
'format' => 'dd-MM-yyyy',
|
'format' => 'dd-MM-yyyy',
|
||||||
@@ -128,6 +118,7 @@ class PersonHavingActivityBetweenDateFilter implements ExportElementValidatedInt
|
|||||||
'class' => ActivityReason::class,
|
'class' => ActivityReason::class,
|
||||||
'choice_label' => fn (ActivityReason $reason): ?string => $this->translatableStringHelper->localize($reason->getName()),
|
'choice_label' => fn (ActivityReason $reason): ?string => $this->translatableStringHelper->localize($reason->getName()),
|
||||||
'group_by' => fn (ActivityReason $reason): ?string => $this->translatableStringHelper->localize($reason->getCategory()->getName()),
|
'group_by' => fn (ActivityReason $reason): ?string => $this->translatableStringHelper->localize($reason->getCategory()->getName()),
|
||||||
|
'data' => $this->activityReasonRepository->findAll(),
|
||||||
'multiple' => true,
|
'multiple' => true,
|
||||||
'expanded' => false,
|
'expanded' => false,
|
||||||
'label' => 'Activity reasons for those activities',
|
'label' => 'Activity reasons for those activities',
|
||||||
@@ -173,10 +164,6 @@ class PersonHavingActivityBetweenDateFilter implements ExportElementValidatedInt
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return ['date_from' => new DateTime(), 'date_to' => new DateTime(), 'reasons' => $this->activityReasonRepository->findAll()];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string')
|
public function describeAction($data, $format = 'string')
|
||||||
{
|
{
|
||||||
|
@@ -22,11 +22,8 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
|
|
||||||
class UsersJobFilter implements FilterInterface
|
class UsersJobFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
private TranslatableStringHelperInterface $translatableStringHelper;
|
public function __construct(private readonly TranslatableStringHelperInterface $translatableStringHelper)
|
||||||
|
|
||||||
public function __construct(TranslatableStringHelperInterface $translatableStringHelper)
|
|
||||||
{
|
{
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -60,10 +57,6 @@ class UsersJobFilter implements FilterInterface
|
|||||||
'expanded' => true,
|
'expanded' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string')
|
public function describeAction($data, $format = 'string')
|
||||||
{
|
{
|
||||||
|
@@ -23,16 +23,8 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
|
|
||||||
class UsersScopeFilter implements FilterInterface
|
class UsersScopeFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
private ScopeRepositoryInterface $scopeRepository;
|
public function __construct(private readonly ScopeRepositoryInterface $scopeRepository, private readonly TranslatableStringHelperInterface $translatableStringHelper)
|
||||||
|
{
|
||||||
private TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
ScopeRepositoryInterface $scopeRepository,
|
|
||||||
TranslatableStringHelperInterface $translatableStringHelper
|
|
||||||
) {
|
|
||||||
$this->scopeRepository = $scopeRepository;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addRole(): ?string
|
public function addRole(): ?string
|
||||||
@@ -67,10 +59,6 @@ class UsersScopeFilter implements FilterInterface
|
|||||||
'expanded' => true,
|
'expanded' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function getFormDefaultData(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAction($data, $format = 'string')
|
public function describeAction($data, $format = 'string')
|
||||||
{
|
{
|
||||||
|
@@ -58,40 +58,22 @@ use function in_array;
|
|||||||
|
|
||||||
class ActivityType extends AbstractType
|
class ActivityType extends AbstractType
|
||||||
{
|
{
|
||||||
protected AuthorizationHelper $authorizationHelper;
|
|
||||||
|
|
||||||
protected ObjectManager $om;
|
|
||||||
|
|
||||||
protected SocialActionRender $socialActionRender;
|
|
||||||
|
|
||||||
protected SocialIssueRender $socialIssueRender;
|
|
||||||
|
|
||||||
protected array $timeChoices;
|
|
||||||
|
|
||||||
protected TranslatableStringHelper $translatableStringHelper;
|
|
||||||
|
|
||||||
protected User $user;
|
protected User $user;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
TokenStorageInterface $tokenStorage,
|
TokenStorageInterface $tokenStorage,
|
||||||
AuthorizationHelper $authorizationHelper,
|
protected AuthorizationHelper $authorizationHelper,
|
||||||
ObjectManager $om,
|
protected ObjectManager $om,
|
||||||
TranslatableStringHelper $translatableStringHelper,
|
protected TranslatableStringHelper $translatableStringHelper,
|
||||||
array $timeChoices,
|
protected array $timeChoices,
|
||||||
SocialIssueRender $socialIssueRender,
|
protected SocialIssueRender $socialIssueRender,
|
||||||
SocialActionRender $socialActionRender
|
protected SocialActionRender $socialActionRender
|
||||||
) {
|
) {
|
||||||
if (!$tokenStorage->getToken()->getUser() instanceof User) {
|
if (!$tokenStorage->getToken()->getUser() instanceof User) {
|
||||||
throw new RuntimeException('you should have a valid user');
|
throw new RuntimeException('you should have a valid user');
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->user = $tokenStorage->getToken()->getUser();
|
$this->user = $tokenStorage->getToken()->getUser();
|
||||||
$this->authorizationHelper = $authorizationHelper;
|
|
||||||
$this->om = $om;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
$this->timeChoices = $timeChoices;
|
|
||||||
$this->socialIssueRender = $socialIssueRender;
|
|
||||||
$this->socialActionRender = $socialActionRender;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||||
|
@@ -25,11 +25,8 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
|||||||
|
|
||||||
class ActivityTypeType extends AbstractType
|
class ActivityTypeType extends AbstractType
|
||||||
{
|
{
|
||||||
private TranslatableStringHelper $translatableStringHelper;
|
public function __construct(private readonly TranslatableStringHelper $translatableStringHelper)
|
||||||
|
|
||||||
public function __construct(TranslatableStringHelper $translatableStringHelper)
|
|
||||||
{
|
{
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||||
|
@@ -24,20 +24,8 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
|||||||
*/
|
*/
|
||||||
class PickActivityReasonType extends AbstractType
|
class PickActivityReasonType extends AbstractType
|
||||||
{
|
{
|
||||||
private ActivityReasonRepository $activityReasonRepository;
|
public function __construct(private readonly ActivityReasonRepository $activityReasonRepository, private readonly ActivityReasonRender $reasonRender, private readonly TranslatableStringHelperInterface $translatableStringHelper)
|
||||||
|
{
|
||||||
private ActivityReasonRender $reasonRender;
|
|
||||||
|
|
||||||
private TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
ActivityReasonRepository $activityReasonRepository,
|
|
||||||
ActivityReasonRender $reasonRender,
|
|
||||||
TranslatableStringHelperInterface $translatableStringHelper
|
|
||||||
) {
|
|
||||||
$this->activityReasonRepository = $activityReasonRepository;
|
|
||||||
$this->reasonRender = $reasonRender;
|
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function configureOptions(OptionsResolver $resolver)
|
public function configureOptions(OptionsResolver $resolver)
|
||||||
|
@@ -23,14 +23,8 @@ use Symfony\Contracts\Translation\TranslatorInterface;
|
|||||||
*/
|
*/
|
||||||
class TranslatableActivityReasonCategoryType extends AbstractType
|
class TranslatableActivityReasonCategoryType extends AbstractType
|
||||||
{
|
{
|
||||||
private TranslatableStringHelperInterface $translatableStringHelper;
|
public function __construct(private readonly TranslatableStringHelperInterface $translatableStringHelper, private readonly TranslatorInterface $translator)
|
||||||
|
|
||||||
private TranslatorInterface $translator;
|
|
||||||
|
|
||||||
public function __construct(TranslatableStringHelperInterface $translatableStringHelper, TranslatorInterface $translator)
|
|
||||||
{
|
{
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
|
||||||
$this->translator = $translator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function configureOptions(OptionsResolver $resolver)
|
public function configureOptions(OptionsResolver $resolver)
|
||||||
|
@@ -20,16 +20,8 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
|||||||
|
|
||||||
class TranslatableActivityType extends AbstractType
|
class TranslatableActivityType extends AbstractType
|
||||||
{
|
{
|
||||||
protected ActivityTypeRepositoryInterface $activityTypeRepository;
|
public function __construct(protected TranslatableStringHelperInterface $translatableStringHelper, protected ActivityTypeRepositoryInterface $activityTypeRepository)
|
||||||
|
{
|
||||||
protected TranslatableStringHelperInterface $translatableStringHelper;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
TranslatableStringHelperInterface $helper,
|
|
||||||
ActivityTypeRepositoryInterface $activityTypeRepository
|
|
||||||
) {
|
|
||||||
$this->translatableStringHelper = $helper;
|
|
||||||
$this->activityTypeRepository = $activityTypeRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function configureOptions(OptionsResolver $resolver)
|
public function configureOptions(OptionsResolver $resolver)
|
||||||
|
@@ -23,16 +23,8 @@ use Symfony\Contracts\Translation\TranslatorInterface;
|
|||||||
*/
|
*/
|
||||||
class AccompanyingCourseMenuBuilder implements LocalMenuBuilderInterface
|
class AccompanyingCourseMenuBuilder implements LocalMenuBuilderInterface
|
||||||
{
|
{
|
||||||
protected Security $security;
|
public function __construct(protected Security $security, protected TranslatorInterface $translator)
|
||||||
|
{
|
||||||
protected TranslatorInterface $translator;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
Security $security,
|
|
||||||
TranslatorInterface $translator
|
|
||||||
) {
|
|
||||||
$this->security = $security;
|
|
||||||
$this->translator = $translator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildMenu($menuId, MenuItem $menu, array $parameters)
|
public function buildMenu($menuId, MenuItem $menu, array $parameters)
|
||||||
|
@@ -18,13 +18,10 @@ use Symfony\Component\Security\Core\Security;
|
|||||||
/**
|
/**
|
||||||
* @implements LocalMenuBuilderInterface<array>
|
* @implements LocalMenuBuilderInterface<array>
|
||||||
*/
|
*/
|
||||||
final class AdminMenuBuilder implements LocalMenuBuilderInterface
|
final readonly class AdminMenuBuilder implements LocalMenuBuilderInterface
|
||||||
{
|
{
|
||||||
private Security $security;
|
public function __construct(private Security $security)
|
||||||
|
|
||||||
public function __construct(Security $security)
|
|
||||||
{
|
{
|
||||||
$this->security = $security;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildMenu($menuId, MenuItem $menu, array $parameters)
|
public function buildMenu($menuId, MenuItem $menu, array $parameters)
|
||||||
|
@@ -23,22 +23,8 @@ use Symfony\Contracts\Translation\TranslatorInterface;
|
|||||||
*/
|
*/
|
||||||
final class PersonMenuBuilder implements LocalMenuBuilderInterface
|
final class PersonMenuBuilder implements LocalMenuBuilderInterface
|
||||||
{
|
{
|
||||||
/**
|
public function __construct(protected AuthorizationCheckerInterface $authorizationChecker, protected TranslatorInterface $translator)
|
||||||
* @var AuthorizationCheckerInterface
|
{
|
||||||
*/
|
|
||||||
private $authorizationChecker;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var TranslatorInterface
|
|
||||||
*/
|
|
||||||
private $translator;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
AuthorizationCheckerInterface $authorizationChecker,
|
|
||||||
TranslatorInterface $translator
|
|
||||||
) {
|
|
||||||
$this->translator = $translator;
|
|
||||||
$this->authorizationChecker = $authorizationChecker;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildMenu($menuId, MenuItem $menu, array $parameters)
|
public function buildMenu($menuId, MenuItem $menu, array $parameters)
|
||||||
|
@@ -16,13 +16,10 @@ use Chill\ActivityBundle\Repository\ActivityRepository;
|
|||||||
use Chill\MainBundle\Entity\Notification;
|
use Chill\MainBundle\Entity\Notification;
|
||||||
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
||||||
|
|
||||||
final class ActivityNotificationHandler implements NotificationHandlerInterface
|
final readonly class ActivityNotificationHandler implements NotificationHandlerInterface
|
||||||
{
|
{
|
||||||
private ActivityRepository $activityRepository;
|
public function __construct(private ActivityRepository $activityRepository)
|
||||||
|
|
||||||
public function __construct(ActivityRepository $activityRepository)
|
|
||||||
{
|
{
|
||||||
$this->activityRepository = $activityRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTemplate(Notification $notification, array $options = []): string
|
public function getTemplate(Notification $notification, array $options = []): string
|
||||||
|
@@ -18,21 +18,16 @@ use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
|
|||||||
use Chill\MainBundle\Entity\Location;
|
use Chill\MainBundle\Entity\Location;
|
||||||
use Chill\MainBundle\Entity\LocationType;
|
use Chill\MainBundle\Entity\LocationType;
|
||||||
use Chill\MainBundle\Entity\Scope;
|
use Chill\MainBundle\Entity\Scope;
|
||||||
use Chill\MainBundle\Entity\User;
|
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
|
||||||
use Chill\MainBundle\Entity\UserJob;
|
use Chill\MainBundle\Security\Resolver\CenterResolverDispatcherInterface;
|
||||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelperForCurrentUserInterface;
|
|
||||||
use Chill\MainBundle\Security\Resolver\CenterResolverManagerInterface;
|
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
use Doctrine\DBAL\Types\Types;
|
use Doctrine\DBAL\Types\Types;
|
||||||
use Doctrine\ORM\AbstractQuery;
|
use Doctrine\ORM\AbstractQuery;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Doctrine\ORM\NonUniqueResultException;
|
|
||||||
use Doctrine\ORM\NoResultException;
|
|
||||||
use Doctrine\ORM\Query\Expr\Join;
|
|
||||||
use Doctrine\ORM\Query\ResultSetMappingBuilder;
|
use Doctrine\ORM\Query\ResultSetMappingBuilder;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
||||||
use Symfony\Component\HttpFoundation\RequestStack;
|
use Symfony\Component\Security\Core\Role\Role;
|
||||||
use Symfony\Component\Security\Core\Security;
|
use Symfony\Component\Security\Core\Security;
|
||||||
|
|
||||||
use function count;
|
use function count;
|
||||||
@@ -40,171 +35,26 @@ use function in_array;
|
|||||||
|
|
||||||
final readonly class ActivityACLAwareRepository implements ActivityACLAwareRepositoryInterface
|
final readonly class ActivityACLAwareRepository implements ActivityACLAwareRepositoryInterface
|
||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(private AuthorizationHelper $authorizationHelper, private CenterResolverDispatcherInterface $centerResolverDispatcher, private TokenStorageInterface $tokenStorage, private ActivityRepository $repository, private EntityManagerInterface $em, private Security $security)
|
||||||
private AuthorizationHelperForCurrentUserInterface $authorizationHelper,
|
|
||||||
private CenterResolverManagerInterface $centerResolverManager,
|
|
||||||
private ActivityRepository $repository,
|
|
||||||
private EntityManagerInterface $em,
|
|
||||||
private Security $security,
|
|
||||||
private RequestStack $requestStack,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws NonUniqueResultException
|
|
||||||
* @throws NoResultException
|
|
||||||
*/
|
|
||||||
public function countByAccompanyingPeriod(AccompanyingPeriod $period, string $role, array $filters = []): int
|
|
||||||
{
|
{
|
||||||
$qb = $this->buildBaseQuery($filters);
|
|
||||||
|
|
||||||
$qb
|
|
||||||
->select('COUNT(a)')
|
|
||||||
->andWhere('a.accompanyingPeriod = :period')->setParameter('period', $period);
|
|
||||||
|
|
||||||
return $qb->getQuery()->getSingleScalarResult();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function countByPerson(Person $person, string $role, array $filters = []): int
|
public function findByAccompanyingPeriod(AccompanyingPeriod $period, string $role, ?int $start = 0, ?int $limit = 1000, ?array $orderBy = []): array
|
||||||
{
|
{
|
||||||
$qb = $this->buildBaseQuery($filters);
|
$user = $this->security->getUser();
|
||||||
|
$center = $this->centerResolverDispatcher->resolveCenter($period);
|
||||||
|
|
||||||
$qb = $this->filterBaseQueryByPerson($qb, $person, $role);
|
if (0 === count($orderBy)) {
|
||||||
|
$orderBy = ['date' => 'DESC'];
|
||||||
$qb->select('COUNT(a)');
|
|
||||||
|
|
||||||
return $qb->getQuery()->getSingleScalarResult();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$scopes = $this->authorizationHelper
|
||||||
|
->getReachableCircles($user, $role, $center);
|
||||||
|
|
||||||
public function findByAccompanyingPeriod(AccompanyingPeriod $period, string $role, ?int $start = 0, ?int $limit = 1000, array $orderBy = ['date' => 'DESC'], array $filters = []): array
|
return $this->em->getRepository(Activity::class)
|
||||||
{
|
->findByAccompanyingPeriod($period, $scopes, true, $limit, $start, $orderBy);
|
||||||
$qb = $this->buildBaseQuery($filters);
|
|
||||||
|
|
||||||
$qb->andWhere('a.accompanyingPeriod = :period')->setParameter('period', $period);
|
|
||||||
|
|
||||||
foreach ($orderBy as $field => $order) {
|
|
||||||
$qb->addOrderBy('a.' . $field, $order);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null !== $start) {
|
|
||||||
$qb->setFirstResult($start);
|
|
||||||
}
|
|
||||||
if (null !== $limit) {
|
|
||||||
$qb->setMaxResults($limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $qb->getQuery()->getResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildBaseQuery(array $filters): QueryBuilder
|
|
||||||
{
|
|
||||||
$qb = $this->repository
|
|
||||||
->createQueryBuilder('a')
|
|
||||||
;
|
|
||||||
|
|
||||||
if (($filters['my_activities'] ?? false) and ($user = $this->security->getUser()) instanceof User) {
|
|
||||||
$qb->andWhere(
|
|
||||||
$qb->expr()->orX(
|
|
||||||
'a.createdBy = :user',
|
|
||||||
'a.user = :user',
|
|
||||||
':user MEMBER OF a.users'
|
|
||||||
)
|
|
||||||
)->setParameter('user', $user);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([] !== ($types = $filters['types'] ?? [])) {
|
|
||||||
$qb->andWhere('a.activityType IN (:types)')->setParameter('types', $types);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([] !== ($jobs = $filters['jobs'] ?? [])) {
|
|
||||||
$qb
|
|
||||||
->leftJoin('a.createdBy', 'creator')
|
|
||||||
->leftJoin('a.user', 'activity_u')
|
|
||||||
->andWhere(
|
|
||||||
$qb->expr()->orX(
|
|
||||||
'creator.userJob IN (:jobs)',
|
|
||||||
'activity_u.userJob IN (:jobs)',
|
|
||||||
'EXISTS (SELECT 1 FROM ' . User::class . ' activity_user WHERE activity_user MEMBER OF a.users AND activity_user.userJob IN (:jobs))'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
->setParameter('jobs', $jobs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null !== ($after = $filters['after'] ?? null)) {
|
|
||||||
$qb->andWhere('a.date >= :after')->setParameter('after', $after);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null !== ($before = $filters['before'] ?? null)) {
|
|
||||||
$qb->andWhere('a.date <= :before')->setParameter('before', $before);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $qb;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param AccompanyingPeriod|Person $associated
|
|
||||||
* @return array<ActivityType>
|
|
||||||
*/
|
|
||||||
public function findActivityTypeByAssociated(AccompanyingPeriod|Person $associated): array
|
|
||||||
{
|
|
||||||
$in = $this->em->createQueryBuilder();
|
|
||||||
$in
|
|
||||||
->select('1')
|
|
||||||
->from(Activity::class, 'a');
|
|
||||||
|
|
||||||
if ($associated instanceof Person) {
|
|
||||||
$in = $this->filterBaseQueryByPerson($in, $associated, ActivityVoter::SEE);
|
|
||||||
} else {
|
|
||||||
$in->andWhere('a.accompanyingPeriod = :period')->setParameter('period', $associated);
|
|
||||||
}
|
|
||||||
|
|
||||||
// join between the embedded exist query and the main query
|
|
||||||
$in->andWhere('a.activityType = t');
|
|
||||||
|
|
||||||
$qb = $this->em->createQueryBuilder()->setParameters($in->getParameters());
|
|
||||||
$qb
|
|
||||||
->select('t')
|
|
||||||
->from(ActivityType::class, 't')
|
|
||||||
->where(
|
|
||||||
$qb->expr()->exists($in->getDQL())
|
|
||||||
);
|
|
||||||
|
|
||||||
return $qb->getQuery()->getResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function findUserJobByAssociated(Person|AccompanyingPeriod $associated): array
|
|
||||||
{
|
|
||||||
$in = $this->em->createQueryBuilder();
|
|
||||||
$in->select('IDENTITY(u.userJob)')
|
|
||||||
->from(User::class, 'u')
|
|
||||||
->join(
|
|
||||||
Activity::class,
|
|
||||||
'a',
|
|
||||||
Join::WITH,
|
|
||||||
'a.createdBy = u OR a.user = u OR u MEMBER OF a.users'
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($associated instanceof Person) {
|
|
||||||
$in = $this->filterBaseQueryByPerson($in, $associated, ActivityVoter::SEE);
|
|
||||||
} else {
|
|
||||||
$in->andWhere('a.accompanyingPeriod = :associated');
|
|
||||||
$in->setParameter('associated', $associated);
|
|
||||||
}
|
|
||||||
|
|
||||||
$qb = $this->em->createQueryBuilder()->setParameters($in->getParameters());
|
|
||||||
|
|
||||||
$qb->select('ub', 'JSON_EXTRACT(ub.label, :lang) AS HIDDEN lang')
|
|
||||||
->from(UserJob::class, 'ub')
|
|
||||||
->where($qb->expr()->in('ub.id', $in->getDQL()))
|
|
||||||
->setParameter('lang', $this->requestStack->getCurrentRequest()->getLocale())
|
|
||||||
->orderBy('lang')
|
|
||||||
;
|
|
||||||
|
|
||||||
return $qb->getQuery()->getResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function findByAccompanyingPeriodSimplified(AccompanyingPeriod $period, ?int $limit = 1000): array
|
public function findByAccompanyingPeriodSimplified(AccompanyingPeriod $period, ?int $limit = 1000): array
|
||||||
{
|
{
|
||||||
$rsm = new ResultSetMappingBuilder($this->em);
|
$rsm = new ResultSetMappingBuilder($this->em);
|
||||||
@@ -285,73 +135,25 @@ final readonly class ActivityACLAwareRepository implements ActivityACLAwareRepos
|
|||||||
return $nq->getResult(AbstractQuery::HYDRATE_ARRAY);
|
return $nq->getResult(AbstractQuery::HYDRATE_ARRAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findByPerson(Person $person, string $role, ?int $start = 0, ?int $limit = 1000, ?array $orderBy = [], array $filters = []): array
|
/**
|
||||||
|
* @param array $orderBy
|
||||||
|
*
|
||||||
|
* @return Activity[]|array
|
||||||
|
*/
|
||||||
|
public function findByPerson(Person $person, string $role, ?int $start = 0, ?int $limit = 1000, ?array $orderBy = []): array
|
||||||
{
|
{
|
||||||
$qb = $this->buildBaseQuery($filters);
|
$user = $this->security->getUser();
|
||||||
|
$center = $this->centerResolverDispatcher->resolveCenter($person);
|
||||||
|
|
||||||
$qb = $this->filterBaseQueryByPerson($qb, $person, $role);
|
if (0 === count($orderBy)) {
|
||||||
|
$orderBy = ['date' => 'DESC'];
|
||||||
foreach ($orderBy as $field => $direction) {
|
|
||||||
$qb->addOrderBy('a.' . $field, $direction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null !== $start) {
|
$reachableScopes = $this->authorizationHelper
|
||||||
$qb->setFirstResult($start);
|
->getReachableCircles($user, $role, $center);
|
||||||
}
|
|
||||||
if (null !== $limit) {
|
|
||||||
$qb->setMaxResults($limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $qb->getQuery()->getResult();
|
return $this->em->getRepository(Activity::class)
|
||||||
}
|
->findByPersonImplied($person, $reachableScopes, $orderBy, $limit, $start);
|
||||||
|
|
||||||
private function filterBaseQueryByPerson(QueryBuilder $qb, Person $person, string $role): QueryBuilder
|
|
||||||
{
|
|
||||||
$orX = $qb->expr()->orX();
|
|
||||||
$counter = 0;
|
|
||||||
foreach ($this->centerResolverManager->resolveCenters($person) as $center) {
|
|
||||||
$scopes = $this->authorizationHelper->getReachableScopes($role, $center);
|
|
||||||
|
|
||||||
if ([] === $scopes) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$orX->add(sprintf('a.person = :person AND a.scope IN (:scopes_%d)', $counter));
|
|
||||||
$qb->setParameter(sprintf('scopes_%d', $counter), $scopes);
|
|
||||||
$qb->setParameter('person', $person);
|
|
||||||
$counter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($person->getAccompanyingPeriodParticipations() as $participation) {
|
|
||||||
if (!$this->security->isGranted(ActivityVoter::SEE, $participation->getAccompanyingPeriod())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$and = $qb->expr()->andX(
|
|
||||||
sprintf('a.accompanyingPeriod = :period_%d', $counter),
|
|
||||||
sprintf('a.date >= :participation_start_%d', $counter)
|
|
||||||
);
|
|
||||||
|
|
||||||
$qb
|
|
||||||
->setParameter(sprintf('period_%d', $counter), $participation->getAccompanyingPeriod())
|
|
||||||
->setParameter(sprintf('participation_start_%d', $counter), $participation->getStartDate());
|
|
||||||
|
|
||||||
if (null !== $participation->getEndDate()) {
|
|
||||||
$and->add(sprintf('a.date < :participation_end_%d', $counter));
|
|
||||||
$qb
|
|
||||||
->setParameter(sprintf('participation_end_%d', $counter), $participation->getEndDate());
|
|
||||||
}
|
|
||||||
$orX->add($and);
|
|
||||||
$counter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 === $orX->count()) {
|
|
||||||
$qb->andWhere('FALSE = TRUE');
|
|
||||||
} else {
|
|
||||||
$qb->andWhere($orX);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $qb;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function queryTimelineIndexer(string $context, array $args = []): array
|
public function queryTimelineIndexer(string $context, array $args = []): array
|
||||||
@@ -400,6 +202,7 @@ final readonly class ActivityACLAwareRepository implements ActivityACLAwareRepos
|
|||||||
|
|
||||||
// acls:
|
// acls:
|
||||||
$reachableCenters = $this->authorizationHelper->getReachableCenters(
|
$reachableCenters = $this->authorizationHelper->getReachableCenters(
|
||||||
|
$this->tokenStorage->getToken()->getUser(),
|
||||||
ActivityVoter::SEE
|
ActivityVoter::SEE
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -424,7 +227,7 @@ final readonly class ActivityACLAwareRepository implements ActivityACLAwareRepos
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// we get all the reachable scopes for this center
|
// we get all the reachable scopes for this center
|
||||||
$reachableScopes = $this->authorizationHelper->getReachableScopes(ActivityVoter::SEE, $center);
|
$reachableScopes = $this->authorizationHelper->getReachableScopes($this->tokenStorage->getToken()->getUser(), ActivityVoter::SEE, $center);
|
||||||
// we get the ids for those scopes
|
// we get the ids for those scopes
|
||||||
$reachablesScopesId = array_map(
|
$reachablesScopesId = array_map(
|
||||||
static fn (Scope $scope) => $scope->getId(),
|
static fn (Scope $scope) => $scope->getId(),
|
||||||
|
@@ -11,32 +11,15 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Chill\ActivityBundle\Repository;
|
namespace Chill\ActivityBundle\Repository;
|
||||||
|
|
||||||
use Chill\ActivityBundle\Entity\Activity;
|
|
||||||
use Chill\ActivityBundle\Entity\ActivityType;
|
|
||||||
use Chill\MainBundle\Entity\UserJob;
|
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
|
|
||||||
interface ActivityACLAwareRepositoryInterface
|
interface ActivityACLAwareRepositoryInterface
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Return all the activities associated to an accompanying period and that the user is allowed to apply the given role.
|
* @return Activity[]|array
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param array{my_activities?: bool, types?: array<ActivityType>, jobs?: array<UserJob>, after?: \DateTimeImmutable|null, before?: \DateTimeImmutable|null} $filters
|
|
||||||
* @return array<Activity>
|
|
||||||
*/
|
*/
|
||||||
public function findByAccompanyingPeriod(AccompanyingPeriod $period, string $role, ?int $start = 0, ?int $limit = 1000, array $orderBy = ['date' => 'DESC'], array $filters = []): array;
|
public function findByAccompanyingPeriod(AccompanyingPeriod $period, string $role, ?int $start = 0, ?int $limit = 1000, ?array $orderBy = []): array;
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array{my_activities?: bool, types?: array<ActivityType>, jobs?: array<UserJob>, after?: \DateTimeImmutable|null, before?: \DateTimeImmutable|null} $filters
|
|
||||||
*/
|
|
||||||
public function countByAccompanyingPeriod(AccompanyingPeriod $period, string $role, array $filters = []): int;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array{my_activities?: bool, types?: array<ActivityType>, jobs?: array<UserJob>, after?: \DateTimeImmutable|null, before?: \DateTimeImmutable|null} $filters
|
|
||||||
*/
|
|
||||||
public function countByPerson(Person $person, string $role, array $filters = []): int;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a list of activities, simplified as array (not object).
|
* Return a list of activities, simplified as array (not object).
|
||||||
@@ -48,28 +31,7 @@ interface ActivityACLAwareRepositoryInterface
|
|||||||
public function findByAccompanyingPeriodSimplified(AccompanyingPeriod $period, ?int $limit = 1000): array;
|
public function findByAccompanyingPeriodSimplified(AccompanyingPeriod $period, ?int $limit = 1000): array;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array{my_activities?: bool, types?: array<ActivityType>, jobs?: array<UserJob>, after?: \DateTimeImmutable|null, before?: \DateTimeImmutable|null} $filters
|
* @return Activity[]|array
|
||||||
* @return array<Activity>
|
|
||||||
*/
|
*/
|
||||||
public function findByPerson(Person $person, string $role, ?int $start = 0, ?int $limit = 1000, array $orderBy = ['date' => 'DESC'], array $filters = []): array;
|
public function findByPerson(Person $person, string $role, ?int $start = 0, ?int $limit = 1000, ?array $orderBy = []): array;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a list of the type for the activities associated to person or accompanying period
|
|
||||||
*
|
|
||||||
* @return array<ActivityType>
|
|
||||||
*/
|
|
||||||
public function findActivityTypeByAssociated(AccompanyingPeriod|Person $associated): array;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a list of the user job for the activities associated to person or accompanying period
|
|
||||||
*
|
|
||||||
* Associated mean the job:
|
|
||||||
* - of the creator;
|
|
||||||
* - of the user (activity.user)
|
|
||||||
* - of all the users
|
|
||||||
*
|
|
||||||
* @return array<UserJob>
|
|
||||||
*/
|
|
||||||
public function findUserJobByAssociated(AccompanyingPeriod|Person $associated): array;
|
|
||||||
}
|
}
|
||||||
|
@@ -1,198 +0,0 @@
|
|||||||
<?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\Repository;
|
|
||||||
|
|
||||||
use Chill\ActivityBundle\Entity\Activity;
|
|
||||||
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
|
|
||||||
use Chill\ActivityBundle\Service\GenericDoc\Providers\AccompanyingPeriodActivityGenericDocProvider;
|
|
||||||
use Chill\ActivityBundle\Service\GenericDoc\Providers\PersonActivityGenericDocProvider;
|
|
||||||
use Chill\DocStoreBundle\Entity\PersonDocument;
|
|
||||||
use Chill\DocStoreBundle\Entity\StoredObject;
|
|
||||||
use Chill\DocStoreBundle\GenericDoc\FetchQuery;
|
|
||||||
use Chill\DocStoreBundle\GenericDoc\FetchQueryInterface;
|
|
||||||
use Chill\DocStoreBundle\GenericDoc\Providers\PersonDocumentGenericDocProvider;
|
|
||||||
use Chill\DocStoreBundle\Repository\PersonDocumentACLAwareRepositoryInterface;
|
|
||||||
use Chill\DocStoreBundle\Security\Authorization\PersonDocumentVoter;
|
|
||||||
use Chill\MainBundle\Entity\Scope;
|
|
||||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelperForCurrentUserInterface;
|
|
||||||
use Chill\MainBundle\Security\Resolver\CenterResolverManagerInterface;
|
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
|
||||||
use Chill\PersonBundle\Entity\Person;
|
|
||||||
use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodWorkVoter;
|
|
||||||
use DateTimeImmutable;
|
|
||||||
use Doctrine\DBAL\Types\Types;
|
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
|
||||||
use Doctrine\ORM\Mapping\MappingException;
|
|
||||||
use Doctrine\ORM\QueryBuilder;
|
|
||||||
use Symfony\Component\HttpKernel\HttpCache\Store;
|
|
||||||
use Symfony\Component\Security\Core\Security;
|
|
||||||
|
|
||||||
final readonly class ActivityDocumentACLAwareRepository implements ActivityDocumentACLAwareRepositoryInterface
|
|
||||||
{
|
|
||||||
public function __construct(
|
|
||||||
private EntityManagerInterface $em,
|
|
||||||
private CenterResolverManagerInterface $centerResolverManager,
|
|
||||||
private AuthorizationHelperForCurrentUserInterface $authorizationHelperForCurrentUser,
|
|
||||||
private Security $security
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildFetchQueryActivityDocumentLinkedToPersonFromPersonContext(Person $person, ?DateTimeImmutable $startDate = null, ?DateTimeImmutable $endDate = null, ?string $content = null): FetchQueryInterface
|
|
||||||
{
|
|
||||||
$query = $this->buildBaseFetchQueryActivityDocumentLinkedToPersonFromPersonContext($person, $startDate, $endDate, $content);
|
|
||||||
|
|
||||||
return $this->addFetchQueryByPersonACL($query, $person);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildBaseFetchQueryActivityDocumentLinkedToPersonFromPersonContext(Person $person, ?DateTimeImmutable $startDate = null, ?DateTimeImmutable $endDate = null, ?string $content = null): FetchQuery
|
|
||||||
{
|
|
||||||
$storedObjectMetadata = $this->em->getClassMetadata(StoredObject::class);
|
|
||||||
$activityMetadata = $this->em->getClassMetadata(Activity::class);
|
|
||||||
|
|
||||||
$query = new FetchQuery(
|
|
||||||
PersonActivityGenericDocProvider::KEY,
|
|
||||||
sprintf('jsonb_build_object(\'id\', stored_obj.%s, \'activity_id\', activity.%s)', $storedObjectMetadata->getSingleIdentifierColumnName(), $activityMetadata->getSingleIdentifierColumnName()),
|
|
||||||
sprintf('stored_obj.%s', $storedObjectMetadata->getColumnName('createdAt')),
|
|
||||||
sprintf('%s AS stored_obj', $storedObjectMetadata->getSchemaName().'.'.$storedObjectMetadata->getTableName())
|
|
||||||
);
|
|
||||||
|
|
||||||
$query->addJoinClause(
|
|
||||||
'JOIN public.activity_storedobject activity_doc ON activity_doc.storedobject_id = stored_obj.id'
|
|
||||||
);
|
|
||||||
|
|
||||||
$query->addJoinClause(
|
|
||||||
'JOIN public.activity activity ON activity.id = activity_doc.activity_id'
|
|
||||||
);
|
|
||||||
|
|
||||||
$query->addWhereClause(
|
|
||||||
sprintf('activity.%s = ?', $activityMetadata->getSingleAssociationJoinColumnName('person')),
|
|
||||||
[$person->getId()],
|
|
||||||
[Types::INTEGER]
|
|
||||||
);
|
|
||||||
|
|
||||||
return $this->addWhereClauses($query, $startDate, $endDate, $content);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildFetchQueryActivityDocumentLinkedToAccompanyingPeriodFromPersonContext(Person $person, ?DateTimeImmutable $startDate = null, ?DateTimeImmutable $endDate = null, ?string $content = null): FetchQuery
|
|
||||||
{
|
|
||||||
$storedObjectMetadata = $this->em->getClassMetadata(StoredObject::class);
|
|
||||||
$activityMetadata = $this->em->getClassMetadata(Activity::class);
|
|
||||||
|
|
||||||
$query = new FetchQuery(
|
|
||||||
AccompanyingPeriodActivityGenericDocProvider::KEY,
|
|
||||||
sprintf('jsonb_build_object(\'id\', stored_obj.%s, \'activity_id\', activity.%s)', $storedObjectMetadata->getSingleIdentifierColumnName(), $activityMetadata->getSingleIdentifierColumnName()),
|
|
||||||
sprintf('stored_obj.%s', $storedObjectMetadata->getColumnName('createdAt')),
|
|
||||||
sprintf('%s AS stored_obj', $storedObjectMetadata->getSchemaName().'.'.$storedObjectMetadata->getTableName())
|
|
||||||
);
|
|
||||||
|
|
||||||
$query->addJoinClause(
|
|
||||||
'JOIN public.activity_storedobject activity_doc ON activity_doc.storedobject_id = stored_obj.id'
|
|
||||||
);
|
|
||||||
|
|
||||||
$query->addJoinClause(
|
|
||||||
'JOIN public.activity activity ON activity.id = activity_doc.activity_id'
|
|
||||||
);
|
|
||||||
|
|
||||||
// add documents of activities from parcours context
|
|
||||||
$or = [];
|
|
||||||
$orParams = [];
|
|
||||||
$orTypes = [];
|
|
||||||
foreach ($person->getAccompanyingPeriodParticipations() as $participation) {
|
|
||||||
if (!$this->security->isGranted(ActivityVoter::SEE, $participation->getAccompanyingPeriod())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$or[] = sprintf(
|
|
||||||
'(activity.%s = ? AND stored_obj.%s BETWEEN ?::date AND COALESCE(?::date, \'infinity\'::date))',
|
|
||||||
$activityMetadata->getSingleAssociationJoinColumnName('accompanyingPeriod'),
|
|
||||||
$storedObjectMetadata->getColumnName('createdAt')
|
|
||||||
);
|
|
||||||
$orParams = [...$orParams, $participation->getAccompanyingPeriod()->getId(),
|
|
||||||
DateTimeImmutable::createFromInterface($participation->getStartDate()),
|
|
||||||
null === $participation->getEndDate() ? null : DateTimeImmutable::createFromInterface($participation->getEndDate())];
|
|
||||||
$orTypes = [...$orTypes, Types::INTEGER, Types::DATE_IMMUTABLE, Types::DATE_IMMUTABLE];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([] === $or) {
|
|
||||||
$query->addWhereClause('TRUE = FALSE');
|
|
||||||
|
|
||||||
return $query;
|
|
||||||
}
|
|
||||||
|
|
||||||
$query->addWhereClause(sprintf('(%s)', implode(' OR ', $or)), $orParams, $orTypes);
|
|
||||||
|
|
||||||
return $this->addWhereClauses($query, $startDate, $endDate, $content);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function addWhereClauses(FetchQuery $query, ?DateTimeImmutable $startDate = null, ?DateTimeImmutable $endDate = null, ?string $content = null): FetchQuery
|
|
||||||
{
|
|
||||||
$storedObjectMetadata = $this->em->getClassMetadata(StoredObject::class);
|
|
||||||
|
|
||||||
if (null !== $startDate) {
|
|
||||||
$query->addWhereClause(
|
|
||||||
sprintf('stored_obj.%s >= ?', $storedObjectMetadata->getColumnName('createdAt')),
|
|
||||||
[$startDate],
|
|
||||||
[Types::DATE_IMMUTABLE]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null !== $endDate) {
|
|
||||||
$query->addWhereClause(
|
|
||||||
sprintf('stored_obj.%s < ?', $storedObjectMetadata->getColumnName('createdAt')),
|
|
||||||
[$endDate],
|
|
||||||
[Types::DATE_IMMUTABLE]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null !== $content and '' !== $content) {
|
|
||||||
$query->addWhereClause(
|
|
||||||
'stored_obj.title ilike ?',
|
|
||||||
['%' . $content . '%'],
|
|
||||||
[Types::STRING]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $query;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function addFetchQueryByPersonACL(FetchQuery $fetchQuery, Person $person): FetchQuery
|
|
||||||
{
|
|
||||||
$activityMetadata = $this->em->getClassMetadata(Activity::class);
|
|
||||||
|
|
||||||
$reachableScopes = [];
|
|
||||||
|
|
||||||
foreach ($this->centerResolverManager->resolveCenters($person) as $center) {
|
|
||||||
$reachableScopes = [
|
|
||||||
...$reachableScopes,
|
|
||||||
...$this->authorizationHelperForCurrentUser->getReachableScopes(ActivityVoter::SEE, $center)
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([] === $reachableScopes) {
|
|
||||||
$fetchQuery->addWhereClause('FALSE = TRUE');
|
|
||||||
|
|
||||||
return $fetchQuery;
|
|
||||||
}
|
|
||||||
|
|
||||||
$fetchQuery->addWhereClause(
|
|
||||||
sprintf(
|
|
||||||
'activity.%s IN (%s)',
|
|
||||||
$activityMetadata->getSingleAssociationJoinColumnName('scope'),
|
|
||||||
implode(', ', array_fill(0, count($reachableScopes), '?'))
|
|
||||||
),
|
|
||||||
array_map(static fn (Scope $s) => $s->getId(), $reachableScopes),
|
|
||||||
array_fill(0, count($reachableScopes), Types::INTEGER)
|
|
||||||
);
|
|
||||||
|
|
||||||
return $fetchQuery;
|
|
||||||
}
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user