mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-10-31 01:08:26 +00:00 
			
		
		
		
	Compare commits
	
		
			6 Commits
		
	
	
		
			fix_filiat
			...
			test/fixes
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d4feacc8da | |||
| d55311ce40 | |||
| 07608dc412 | |||
| 83a9969220 | |||
| a5295123d4 | |||
| a947b9defb | 
| @@ -94,7 +94,8 @@ unit_tests: | ||||
|         - php -d memory_limit=2G tests/app/bin/console cache:clear --env=dev | ||||
|         - php -d memory_limit=3G tests/app/bin/console doctrine:fixtures:load -n | ||||
|         - 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=2G tests/app/bin/console doctrine:query:dql "SELECT c.name FROM Chill\\MainBundle\\Entity\\Center c" | ||||
|         - php -d memory_limit=4G bin/phpunit --colors=never --testdox | ||||
|     artifacts: | ||||
|         expire_in: 30 min | ||||
|         paths: | ||||
|   | ||||
| @@ -16,8 +16,7 @@ and this project adheres to | ||||
| * [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) | ||||
| * [filiation]: Allow the deletion of a relationship in filiations (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/608) | ||||
| * [household]: Reposition and cut button for enfant hors menage have been deleted (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/620) | ||||
| * [action]: Agents traitants should be prefilled with referrer of the parcours or left empty if there is no referrer (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/696) | ||||
|  | ||||
| ## Test releases | ||||
|  | ||||
|   | ||||
| @@ -10,8 +10,8 @@ | ||||
|     "require": { | ||||
|         "php": "^7.4", | ||||
|         "champs-libres/async-uploader-bundle": "dev-sf4#d57134aee8e504a83c902ff0cf9f8d36ac418290", | ||||
|         "champs-libres/wopi-bundle": "dev-master#6dd8e0a14e00131eb4b889ecc30270ee4a0e5224", | ||||
|         "champs-libres/wopi-lib": "dev-master#8615f4a45a39fc2b6a98765ea835fcfd39618787", | ||||
|         "champs-libres/wopi-bundle": "dev-master#59b468503b9413f8d588ef9e626e7675560db3d8", | ||||
|         "champs-libres/wopi-lib": "dev-master#0e1da19bb6de820080b8651867a7e475be590060", | ||||
|         "doctrine/doctrine-bundle": "^2.1", | ||||
|         "doctrine/doctrine-migrations-bundle": "^3.0", | ||||
|         "doctrine/orm": "^2.7", | ||||
| @@ -96,8 +96,7 @@ | ||||
|     "autoload-dev": { | ||||
|         "psr-4": { | ||||
|             "App\\": "tests/app/src/", | ||||
|             "Chill\\DocGeneratorBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests", | ||||
|             "Chill\\WopiBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests" | ||||
|             "Chill\\DocGeneratorBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests" | ||||
|         } | ||||
|     }, | ||||
|     "config": { | ||||
|   | ||||
| @@ -65,17 +65,6 @@ This script will : | ||||
| 4. build assets | ||||
|  | ||||
|  | ||||
| .. note:: | ||||
|  | ||||
|    In some cases it can happen that an old image (chill_base_php or chill_php) stored in the docker cache will make the script fail. To solve this problem you have to delete the image and the container, before the make init : | ||||
|  | ||||
|     .. code-block:: bash | ||||
|  | ||||
|        docker-compose images php | ||||
|        docker rmi -f chill_php:prod | ||||
|        docker-compose rm php | ||||
|  | ||||
|  | ||||
| 4. Start the project | ||||
| ==================== | ||||
|  | ||||
|   | ||||
| @@ -24,7 +24,6 @@ parameters: | ||||
|         - "/spec/" | ||||
|         - "/var/" | ||||
|         - "/vendor/" | ||||
|         - "/tests/app" | ||||
|  | ||||
|     # Psalm | ||||
|     tasks.psalm.blocking: true | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -25,6 +25,16 @@ parameters: | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Form/ActivityType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in &&, mixed given on the right side\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillActivityBundle/Form/ActivityType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillActivityBundle/Form/ActivityType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 3 | ||||
|   | ||||
| @@ -40,9 +40,6 @@ | ||||
|         <testsuite name="DocGeneratorBundle"> | ||||
|             <directory suffix="Test.php">src/Bundle/ChillDocGeneratorBundle/tests/</directory> | ||||
|         </testsuite> | ||||
|         <testsuite name="WopiBundle"> | ||||
|             <directory suffix="Test.php">src/Bundle/ChillWopiBundle/tests/</directory> | ||||
|         </testsuite> | ||||
|     </testsuites> | ||||
|  | ||||
|     <listeners> | ||||
|   | ||||
| @@ -21,7 +21,6 @@ use Chill\ActivityBundle\Repository\ActivityTypeRepository; | ||||
| use Chill\ActivityBundle\Security\Authorization\ActivityVoter; | ||||
| use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable; | ||||
| use Chill\MainBundle\Repository\LocationRepository; | ||||
| use Chill\MainBundle\Security\Resolver\CenterResolverManagerInterface; | ||||
| use Chill\PersonBundle\Entity\AccompanyingPeriod; | ||||
| use Chill\PersonBundle\Entity\Person; | ||||
| use Chill\PersonBundle\Privacy\PrivacyEvent; | ||||
| @@ -57,8 +56,6 @@ final class ActivityController extends AbstractController | ||||
|  | ||||
|     private ActivityTypeRepository $activityTypeRepository; | ||||
|  | ||||
|     private CenterResolverManagerInterface $centerResolver; | ||||
|  | ||||
|     private EntityManagerInterface $entityManager; | ||||
|  | ||||
|     private EventDispatcherInterface $eventDispatcher; | ||||
| @@ -85,8 +82,7 @@ final class ActivityController extends AbstractController | ||||
|         EntityManagerInterface $entityManager, | ||||
|         EventDispatcherInterface $eventDispatcher, | ||||
|         LoggerInterface $logger, | ||||
|         SerializerInterface $serializer, | ||||
|         CenterResolverManagerInterface $centerResolver | ||||
|         SerializerInterface $serializer | ||||
|     ) { | ||||
|         $this->activityACLAwareRepository = $activityACLAwareRepository; | ||||
|         $this->activityTypeRepository = $activityTypeRepository; | ||||
| @@ -100,7 +96,6 @@ final class ActivityController extends AbstractController | ||||
|         $this->eventDispatcher = $eventDispatcher; | ||||
|         $this->logger = $logger; | ||||
|         $this->serializer = $serializer; | ||||
|         $this->centerResolver = $centerResolver; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -203,7 +198,7 @@ final class ActivityController extends AbstractController | ||||
|         // $this->denyAccessUnlessGranted('CHILL_ACTIVITY_UPDATE', $entity); | ||||
|  | ||||
|         $form = $this->createForm(ActivityType::class, $entity, [ | ||||
|             'center' => $this->centerResolver->resolveCenters($entity)[0] ?? null, | ||||
|             'center' => $entity->getCenter(), | ||||
|             'role' => new Role('CHILL_ACTIVITY_UPDATE'), | ||||
|             'activityType' => $entity->getActivityType(), | ||||
|             'accompanyingPeriod' => $accompanyingPeriod, | ||||
| @@ -421,7 +416,7 @@ final class ActivityController extends AbstractController | ||||
|         $this->denyAccessUnlessGranted(ActivityVoter::CREATE, $entity); | ||||
|  | ||||
|         $form = $this->createForm(ActivityType::class, $entity, [ | ||||
|             'center' => $this->centerResolver->resolveCenters($entity)[0] ?? null, | ||||
|             'center' => $entity->getCenter(), | ||||
|             'role' => new Role('CHILL_ACTIVITY_CREATE'), | ||||
|             'activityType' => $entity->getActivityType(), | ||||
|             'accompanyingPeriod' => $accompanyingPeriod, | ||||
|   | ||||
| @@ -61,6 +61,8 @@ class ChillActivityExtension extends Extension implements PrependExtensionInterf | ||||
|                 ActivityVoter::DELETE => [ActivityVoter::SEE_DETAILS], | ||||
|                 ActivityVoter::SEE_DETAILS => [ActivityVoter::SEE], | ||||
|                 ActivityVoter::FULL => [ | ||||
|                     ActivityVoter::CREATE_PERSON, | ||||
|                     ActivityVoter::CREATE_ACCOMPANYING_COURSE, | ||||
|                     ActivityVoter::DELETE, | ||||
|                     ActivityVoter::UPDATE, | ||||
|                 ], | ||||
|   | ||||
| @@ -16,8 +16,8 @@ use Chill\DocStoreBundle\Entity\StoredObject; | ||||
| use Chill\MainBundle\Entity\Center; | ||||
| use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable; | ||||
| use Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable; | ||||
| use Chill\MainBundle\Entity\HasCentersInterface; | ||||
| use Chill\MainBundle\Entity\HasScopesInterface; | ||||
| use Chill\MainBundle\Entity\HasCenterInterface; | ||||
| use Chill\MainBundle\Entity\HasScopeInterface; | ||||
| use Chill\MainBundle\Entity\Location; | ||||
| use Chill\MainBundle\Entity\Scope; | ||||
| use Chill\MainBundle\Entity\User; | ||||
| @@ -55,7 +55,7 @@ use Symfony\Component\Validator\Constraints as Assert; | ||||
|  *     getUserFunction="getUser", | ||||
|  * path="scope") | ||||
|  */ | ||||
| class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterface, HasCentersInterface, HasScopesInterface | ||||
| class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterface, HasCenterInterface, HasScopeInterface | ||||
| { | ||||
|     public const SENTRECEIVED_RECEIVED = 'received'; | ||||
|  | ||||
| @@ -306,17 +306,13 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac | ||||
|      * get the center | ||||
|      * center is extracted from person. | ||||
|      */ | ||||
|     public function getCenters(): iterable | ||||
|     public function getCenter(): ?Center | ||||
|     { | ||||
|         if ($this->person instanceof Person) { | ||||
|             return [$this->person->getCenter()]; | ||||
|             return $this->person->getCenter(); | ||||
|         } | ||||
|  | ||||
|         if ($this->getAccompanyingPeriod() instanceof AccompanyingPeriod) { | ||||
|             return $this->getAccompanyingPeriod()->getCenters() ?? []; | ||||
|         } | ||||
|  | ||||
|         return []; | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public function getComment(): CommentEmbeddable | ||||
| @@ -426,19 +422,6 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac | ||||
|         return $this->scope; | ||||
|     } | ||||
|  | ||||
|     public function getScopes(): iterable | ||||
|     { | ||||
|         if (null !== $this->getAccompanyingPeriod()) { | ||||
|             return $this->getAccompanyingPeriod()->getScopes(); | ||||
|         } | ||||
|  | ||||
|         if (null !== $this->getPerson()) { | ||||
|             return [$this->scope]; | ||||
|         } | ||||
|  | ||||
|         return []; | ||||
|     } | ||||
|  | ||||
|     public function getSentReceived(): string | ||||
|     { | ||||
|         return $this->sentReceived; | ||||
|   | ||||
| @@ -14,20 +14,17 @@ namespace Chill\ActivityBundle\Form; | ||||
| use Chill\ActivityBundle\Entity\Activity; | ||||
| use Chill\ActivityBundle\Entity\ActivityPresence; | ||||
| use Chill\ActivityBundle\Entity\ActivityReason; | ||||
| use Chill\ActivityBundle\Security\Authorization\ActivityVoter; | ||||
| use Chill\DocStoreBundle\Form\StoredObjectType; | ||||
| use Chill\MainBundle\Entity\Center; | ||||
| use Chill\MainBundle\Entity\Location; | ||||
| use Chill\MainBundle\Entity\User; | ||||
| use Chill\MainBundle\Form\Type\ChillCollectionType; | ||||
| use Chill\MainBundle\Form\Type\ChillDateType; | ||||
| use Chill\MainBundle\Form\Type\CommentType; | ||||
| use Chill\MainBundle\Form\Type\PickUserDynamicType; | ||||
| use Chill\MainBundle\Form\Type\PrivateCommentType; | ||||
| use Chill\MainBundle\Form\Type\ScopePickerType; | ||||
| use Chill\MainBundle\Form\Type\UserPickerType; | ||||
| use Chill\MainBundle\Security\Authorization\AuthorizationHelper; | ||||
| use Chill\MainBundle\Templating\TranslatableStringHelper; | ||||
| use Chill\PersonBundle\Entity\AccompanyingPeriod; | ||||
| use Chill\PersonBundle\Entity\Person; | ||||
| use Chill\PersonBundle\Entity\SocialWork\SocialAction; | ||||
| use Chill\PersonBundle\Entity\SocialWork\SocialIssue; | ||||
| @@ -53,7 +50,6 @@ use Symfony\Component\Form\FormEvents; | ||||
| use Symfony\Component\OptionsResolver\OptionsResolver; | ||||
| use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; | ||||
|  | ||||
| use Symfony\Component\Security\Core\Role\Role; | ||||
| use function in_array; | ||||
|  | ||||
| class ActivityType extends AbstractType | ||||
| @@ -113,18 +109,19 @@ class ActivityType extends AbstractType | ||||
|         $activityType = $options['activityType']; | ||||
|  | ||||
|         // TODO revoir la gestion des center au niveau du form des activité. | ||||
|         if ($options['center'] instanceof Center && null !== $options['data']->getPerson()) { | ||||
|         if ($options['center']) { | ||||
|             $builder->add('scope', ScopePickerType::class, [ | ||||
|                 'center' => $options['center'], | ||||
|                 'role' => ActivityVoter::CREATE === (string) $options['role'] ? ActivityVoter::CREATE_PERSON : (string) $options['role'], | ||||
|                 'required' => true, | ||||
|                 'role' => $options['role'], | ||||
|                 // TODO make required again once scope and rights are fixed | ||||
|                 'required' => false, | ||||
|             ]); | ||||
|         } | ||||
|  | ||||
|         /** @var ? \Chill\PersonBundle\Entity\AccompanyingPeriod  $accompanyingPeriod */ | ||||
|         $accompanyingPeriod = null; | ||||
|  | ||||
|         if ($options['accompanyingPeriod'] instanceof AccompanyingPeriod) { | ||||
|         if ($options['accompanyingPeriod']) { | ||||
|             $accompanyingPeriod = $options['accompanyingPeriod']; | ||||
|         } | ||||
|  | ||||
| @@ -221,10 +218,12 @@ class ActivityType extends AbstractType | ||||
|             ]); | ||||
|         } | ||||
|  | ||||
|         if ($activityType->isVisible('user') && $options['center'] instanceof Center) { | ||||
|             $builder->add('user', PickUserDynamicType::class, [ | ||||
|         if ($activityType->isVisible('user') && $options['center']) { | ||||
|             $builder->add('user', UserPickerType::class, [ | ||||
|                 'label' => $activityType->getLabel('user'), | ||||
|                 'required' => $activityType->isRequired('user'), | ||||
|                 'center' => $options['center'], | ||||
|                 'role' => $options['role'], | ||||
|             ]); | ||||
|         } | ||||
|  | ||||
| @@ -443,8 +442,8 @@ class ActivityType extends AbstractType | ||||
|  | ||||
|         $resolver | ||||
|             ->setRequired(['center', 'role', 'activityType', 'accompanyingPeriod']) | ||||
|             ->setAllowedTypes('center', ['null', Center::class]) | ||||
|             ->setAllowedTypes('role', [Role::class, 'string']) | ||||
|             ->setAllowedTypes('center', ['null', 'Chill\MainBundle\Entity\Center']) | ||||
|             ->setAllowedTypes('role', 'Symfony\Component\Security\Core\Role\Role') | ||||
|             ->setAllowedTypes('activityType', \Chill\ActivityBundle\Entity\ActivityType::class) | ||||
|             ->setAllowedTypes('accompanyingPeriod', [\Chill\PersonBundle\Entity\AccompanyingPeriod::class, 'null']); | ||||
|     } | ||||
|   | ||||
| @@ -120,11 +120,3 @@ | ||||
|  | ||||
| {{ form_end(edit_form) }} | ||||
| {# {{ form(delete_form) }} #} | ||||
|  | ||||
| {% block js %} | ||||
|     {{ encore_entry_script_tags('mod_pickentity_type') }} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block css %} | ||||
|     {{ encore_entry_link_tags('mod_pickentity_type') }} | ||||
| {% endblock %} | ||||
| @@ -46,7 +46,7 @@ | ||||
|  | ||||
|     {% include 'ChillActivityBundle:Activity:list.html.twig' with {'context': 'person'} %} | ||||
|  | ||||
|     {% if is_granted('CHILL_ACTIVITY_CREATE', person) %} | ||||
|     {% if is_granted('CHILL_ACTIVITY_CREATE_PERSON', person) %} | ||||
|     <ul class="record_actions sticky-form-buttons"> | ||||
|         <li> | ||||
|             <a href="{{ path('chill_activity_activity_new', {'person_id': person_id, 'accompanying_period_id': accompanying_course_id}) }}" | ||||
|   | ||||
| @@ -119,11 +119,3 @@ | ||||
|   </li> | ||||
| </ul> | ||||
| {{ form_end(form) }} | ||||
|  | ||||
| {% block js %} | ||||
|     {{ encore_entry_script_tags('mod_pickentity_type') }} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block css %} | ||||
|     {{ encore_entry_link_tags('mod_pickentity_type') }} | ||||
| {% endblock %} | ||||
| @@ -133,7 +133,7 @@ class ActivityVoter extends AbstractChillVoter implements ProvideRoleHierarchyIn | ||||
|  | ||||
|                 // change attribute CREATE | ||||
|                 if (self::CREATE === $attribute) { | ||||
|                     return $this->voterHelper->voteOnAttribute(self::CREATE_PERSON, $subject->getPerson(), $token); | ||||
|                     $attribute = self::CREATE_PERSON; | ||||
|                 } | ||||
|             } elseif ($subject->getAccompanyingPeriod() instanceof AccompanyingPeriod) { | ||||
|                 if (!$this->security->isGranted(AccompanyingPeriodVoter::SEE, $subject->getAccompanyingPeriod())) { | ||||
| @@ -144,8 +144,7 @@ class ActivityVoter extends AbstractChillVoter implements ProvideRoleHierarchyIn | ||||
|                     if (AccompanyingPeriod::STEP_CLOSED === $subject->getAccompanyingPeriod()->getStep()) { | ||||
|                         return false; | ||||
|                     } | ||||
|  | ||||
|                     return $this->voterHelper->voteOnAttribute(self::CREATE_ACCOMPANYING_COURSE, $subject->getAccompanyingPeriod(), $token); | ||||
|                     $attribute = self::CREATE_ACCOMPANYING_COURSE; | ||||
|                 } | ||||
|             } else { | ||||
|                 throw new RuntimeException('Could not determine context of activity.'); | ||||
| @@ -159,12 +158,12 @@ class ActivityVoter extends AbstractChillVoter implements ProvideRoleHierarchyIn | ||||
|  | ||||
|             // transform the attribute | ||||
|             if (self::CREATE === $attribute) { | ||||
|                 return $this->voterHelper->voteOnAttribute(self::CREATE_ACCOMPANYING_COURSE, $subject, $token); | ||||
|                 $attribute = self::CREATE_ACCOMPANYING_COURSE; | ||||
|             } | ||||
|         } elseif ($subject instanceof Person) { | ||||
|             // transform the attribute | ||||
|             if (self::CREATE === $attribute) { | ||||
|                 return $this->voterHelper->voteOnAttribute(self::CREATE_PERSON, $subject, $token); | ||||
|                 $attribute = self::CREATE_PERSON; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -130,10 +130,8 @@ class ActivityContext implements | ||||
|                         return $this->personRender->renderString($p, []); | ||||
|                     }, | ||||
|                     'multiple' => false, | ||||
|                     'required' => false, | ||||
|                     'expanded' => true, | ||||
|                     'label' => $options[$key . 'Label'], | ||||
|                     'placeholder' => $this->translator->trans('Any person selected'), | ||||
|                 ]); | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -1,234 +0,0 @@ | ||||
| #general | ||||
| Show the activity: Toon activiteit | ||||
| Edit the activity: Wijzig activiteit | ||||
| Activity: Activiteit | ||||
| Duration time: Duur | ||||
| Duration Time: Duur | ||||
| durationTime:  duur | ||||
| Travel time: Duur van verplaatsing | ||||
| Attendee: Aanwezigheden | ||||
| attendee: aanwezigheden | ||||
| list_reasons: Onderwerpen | ||||
| user_username: gebruikersnaam | ||||
| circle_name: naam kring | ||||
| Remark: Opmerking | ||||
| No comments: Geen opmerkingen | ||||
| Add a new activity: Voeg een nieuwe activiteit toe | ||||
| Activity list: Lijst van activiteiten | ||||
| present: aanwezig | ||||
| not present: afwezig | ||||
| Delete: Verwijderen | ||||
| Update: Bijwerken | ||||
| Update activity: Activieit bijwerken | ||||
| Scope: Werkingsgebied | ||||
| Activity data: Gegevens activiteit | ||||
| Activity location: Locatie activiteit | ||||
| No reason associated: Geen onderwerp | ||||
| No social issues associated: Geen sociaal vraagstuk | ||||
| No social actions associated: Geen maatschappelijke actie | ||||
| There isn't any activities.: Er zijn geen activiteiten | ||||
| type_name: Soort activiteit | ||||
| person_firstname: voornaam | ||||
| person_lastname: familienaam | ||||
| person_id: Identificatienummer persoon | ||||
| Type: Soort | ||||
| Invisible: Onzichtbaar | ||||
| Optional: Optioneel | ||||
| Required: Verplicht | ||||
| Persons: Personen | ||||
| Users: Gebruikers | ||||
| Emergency: Dringend | ||||
| Sent received: Inkomend / Uitgaand | ||||
| Sent: Verzenden | ||||
| Received: Ontvangen | ||||
| by: 'Door ' | ||||
| location: Plaats | ||||
| Reasons: Onderwerpen | ||||
|  | ||||
|  | ||||
| #forms | ||||
| Activity creation: Nouvelle activité | ||||
| Create: Créer | ||||
| Back to the list: Retour à la liste | ||||
| Save activity: Sauver l'activité | ||||
| Reset form: Remise à zéro du formulaire | ||||
| Choose the duration: Choisir la durée | ||||
| Choose a type: Choisir un type | ||||
| 5 minutes: 5 minutes | ||||
| 10 minutes: 10 minutes | ||||
| 15 minutes: 15 minutes | ||||
| 20 minutes: 20 minutes | ||||
| 25 minutes: 25 minutes | ||||
| 30 minutes: 30 minutes | ||||
| 45 minutes: 45 minutes | ||||
| 1 hour: 1 heure | ||||
| 1 hour 15: 1 heure 15 | ||||
| 1 hour 30: 1 heure 30 | ||||
| 1 hour 45: 1 heure 45 | ||||
| 2 hours: 2 heures | ||||
| Concerned groups: Parties concernées | ||||
| Persons in accompanying course: Usagers du parcours | ||||
| Third persons: Tiers non-pro. | ||||
| Others persons: Usagers | ||||
| Third parties: Tiers professionnels | ||||
| Users concerned: T(M)S | ||||
| activity: | ||||
|     Insert a document: Insérer un document | ||||
|     Remove a document: Supprimer le document | ||||
|     comment: Commentaire | ||||
| No documents: Aucun document | ||||
|  | ||||
| #timeline | ||||
| '%user% has done an %activity_type%': '%user% a effectué une activité de type "%activity_type%"' | ||||
|  | ||||
| #controller | ||||
| 'Success : activity created!': L'activité a été créée. | ||||
| 'The form is not valid. The activity has not been created !': Le formulaire est invalide. L'activité n'a pas été créée. | ||||
| 'Success : activity updated!': L'activité a été mise à jour. | ||||
| 'The form is not valid. The activity has not been updated !': Le formulaire est invalide. L'activité n'a pas été mise à jour. | ||||
|  | ||||
| # ROLES | ||||
| CHILL_ACTIVITY_CREATE: Créer une activité | ||||
| CHILL_ACTIVITY_UPDATE: Modifier une activité | ||||
| CHILL_ACTIVITY_SEE: Voir une activité | ||||
| CHILL_ACTIVITY_SEE_DETAILS: Voir le détail des activités | ||||
| CHILL_ACTIVITY_DELETE: Supprimer une activité | ||||
| CHILL_ACTIVITY_STATS: Statistique des activités | ||||
| CHILL_ACTIVITY_LIST: Liste des activités | ||||
|  | ||||
| # admin | ||||
| Activities: Activités | ||||
| Activity configuration: Configuration des activités | ||||
| Activity configuration menu: Configuration des activités | ||||
| Activity types: Types d'activité | ||||
| Activity type configuration: Configuration des categories d'activités | ||||
| Activity Reasons: Sujets d'une activité | ||||
| Activity Reasons Category: Catégories de sujet d'activités | ||||
| Activity Types Categories: Catégories des types d'activité | ||||
| Activity Presences: Presences des activités | ||||
|  | ||||
|  | ||||
| # Crud | ||||
| crud: | ||||
|   activity_type: | ||||
|     title_new: Nouveau type d'activité | ||||
|     title_edit: Edition d'un type d'activité | ||||
|   activity_type_category: | ||||
|     title_new: Nouvelle catégorie de type d'activité | ||||
|     title_edit: Edition d'une catégorie de type d'activité | ||||
|  | ||||
| # activity reason admin | ||||
| ActivityReason list: Liste des sujets | ||||
| Create a new activity reason: Créer un nouveau sujet | ||||
| Active: Actif | ||||
| Category: Catégorie | ||||
| ActivityReason creation: Nouveau sujet | ||||
| ActivityReason edit: Modification d'un sujet | ||||
| ActivityReason: Sujet d'activité | ||||
| The entity is inactive and won't be proposed: Le sujet est inactif et ne sera pas proposé | ||||
| The entity is active and will be proposed: Le sujet est actif et sera proposé | ||||
|  | ||||
| #activity reason category admin | ||||
| ActivityReasonCategory list: Catégories de sujets | ||||
| Create a new activity category reason: Créer une nouvelle catégorie | ||||
| ActivityReasonCategory creation: Nouvelle catégorie de sujet | ||||
| ActivityReasonCategory edit: Modification d'une catégorie de sujet | ||||
| ActivityReasonCategory: Catégorie de sujet d'activité | ||||
| ActivityReasonCategory is active and will be proposed: La catégorie est active et sera proposée | ||||
| ActivityReasonCategory is inactive and won't be proposed: La catégorie est inactive et ne sera pas proposée | ||||
|  | ||||
| # activity type type admin | ||||
| ActivityType list: Types d'activités | ||||
| Create a new activity type: Créer un nouveau type d'activité | ||||
| Persons visible: Visibilité du champ Personnes | ||||
| Persons label: Libellé du champ Personnes | ||||
| User visible: Visibilité du champ Utilisateur | ||||
| User label: Libellé du champ Utilisateur | ||||
| Date visible: Visibilité du champ Date | ||||
| Date label: Libellé du champ Date | ||||
| Location visible: Visibilité du champ Lieu | ||||
| Location label: Libellé du champ Lieu | ||||
| Third parties visible: Visibilité du champ Tiers | ||||
| Third parties label: Libellé du champ Tiers | ||||
| Duration time visible: Visibilité du champ Durée | ||||
| Duration time label: Libellé du champ Durée | ||||
| Travel time visible: Visibilité du champ Durée de déplacement | ||||
| Travel time label: Libellé du champ Durée de déplacement | ||||
| Attendee visible: Visibilité du champ Présence de l'usager | ||||
| Attendee label: Libellé du champ Présence de l'usager | ||||
| Reasons visible: Visibilité du champ Sujet | ||||
| Reasons label: Libellé du champ Sujet | ||||
| Comment visible: Visibilité du champ Commentaire | ||||
| Comment label: Libellé du champ Commentaire | ||||
| Emergency visible: Visibilité du champ Urgent | ||||
| Emergency label: Libellé du champ Urgent | ||||
| Accompanying period visible: Visibilité du champ Période d'accompagnement | ||||
| Accompanying period label: Libellé du champ Période d'accompagnement | ||||
| Social issues visible: Visibilité du champ Problématiques sociales | ||||
| Social issues label: Libellé du champ Problématiques sociales | ||||
| Social actions visible: Visibilité du champ Action sociale | ||||
| Social actions label: Libellé du champ Action sociale | ||||
| Users visible: Visibilité du champ Utilisateurs | ||||
| Users label: Libellé du champ Utilisateurs | ||||
| Sent received visible: Visibilité du champ Entrant / Sortant | ||||
| Sent received label: Libellé du champ Entrant / Sortant | ||||
| Documents visible: Visibilité du champ Documents | ||||
| Documents label: Libellé du champ Documents | ||||
|  | ||||
| # activity type category admin | ||||
| ActivityTypeCategory list: Liste des catégories des types d'activité | ||||
| Create a new activity type category: Créer une nouvelle catégorie de type d'activité | ||||
|  | ||||
| # activity delete | ||||
| Remove activity: Supprimer une activité | ||||
| Are you sure you want to remove the activity about "%name%" ?: Êtes-vous sûr de vouloir supprimer une activité qui concerne "%name%" ? | ||||
| The activity has been successfully removed.: L'activité a été supprimée. | ||||
|  | ||||
| # exports | ||||
| Count activities: Nombre d'activités | ||||
| Count activities by various parameters.: Compte le nombre d'activités enregistrées en fonction de différents paramètres. | ||||
| Sum activity duration: Total de la durée des activités | ||||
| Sum activities duration by various parameters.: Additionne la durée des activités en fonction de différents paramètres. | ||||
| List activities: Liste les activités | ||||
| Number of activities: Nombre d'activités | ||||
|  | ||||
| #filters | ||||
| Filter by reason: Filtrer par sujet d'activité | ||||
| 'Filtered by reasons: only %list%': 'Filtré par sujet: seulement %list%' | ||||
| 'Filtered by activity type: only %list%': "Filtré par type d'activity: seulement %list%" | ||||
| Filtered by date activity: Filtrer par date d'activité | ||||
| Activities after this date: Activités après cette date | ||||
| Activities before this date: Activités avant cette date | ||||
| "Filtered by date of activity: only between %date_from% and %date_to%": "Filtré par date de l'activité: uniquement entre %date_from% et %date_to%" | ||||
| This date should be after the date given in "Implied in an activity after this date" field: Cette date devrait être postérieure à la date donnée dans le champ "activités après cette date" | ||||
|  | ||||
| Filtered by person having an activity in a period: Uniquement les personnes ayant eu une activité dans la période donnée | ||||
| Implied in an activity after this date: Impliqué dans une activité après cette date | ||||
| Implied in an activity before this date: Impliqué dans une activité avant cette date | ||||
| Filtered by person having an activity between %date_from% and %date_to% with reasons %reasons_name%: Filtré par personnes associées à une activité entre %date_from% et %date_to% avec les sujets %reasons_name% | ||||
| Activity reasons for those activities: Sujets de ces activités | ||||
|  | ||||
| Filter by activity type: Filtrer par type d'activité | ||||
|  | ||||
| #aggregators | ||||
| Activity type: Type d'activité | ||||
| Activity user: Utilisateur lié à l'activity | ||||
| By reason: Par sujet | ||||
| By category of reason: Par catégorie de sujet | ||||
| Reason's level: Niveau du sujet | ||||
| Group by reasons: Sujet d'activité | ||||
| Aggregate by activity user: Aggréger par utilisateur lié à l'activité | ||||
| Aggregate by activity type: Aggréger par type d'activité | ||||
| Aggregate by activity reason: Aggréger par sujet de l'activité | ||||
|  | ||||
| Last activities: Les dernières activités | ||||
|  | ||||
| See activity in accompanying course context: Voir l'activité dans le contexte du parcours d'accompagnement | ||||
|  | ||||
| You get notified of an activity which does not exists any more: Cette notification ne correspond pas à une activité valide. | ||||
| you are not allowed to see it details: La notification fait référence à une activité à laquelle vous n'avez pas accès. | ||||
| This is the minimal activity data: Activité n° | ||||
|  | ||||
| docgen: | ||||
|     Activity basic: Echange | ||||
|     A basic context for activity: Contexte pour les échanges | ||||
| @@ -1,23 +0,0 @@ | ||||
| The reasons's level should not be empty: Het onderwerp niveau mag niet leeg zijn. | ||||
| At least one reason must be choosen: Kies minstens één onderwerp | ||||
| For this type of activity, you must add at least one person: Voor dit soort activiteit dient u minstens één persoon toe te voegen. | ||||
| For this type of activity, you must add at least one user: Voor dit soort activiteit dient u minstens één gebruiker toe te voegen. | ||||
| For this type of activity, you must add at least one third party: Voor dit soort activiteit dient u minstens één externe partner toe te voegen. | ||||
| For this type of activity, user is required: Voor dit soort activiteit, dient u een gebruiker in te vullen. | ||||
| For this type of activity, date is required: Voor dit soort activiteit, dient u een datum in te vullen. | ||||
| For this type of activity, location is required: Voor dit soort activiteit, dient u een locatie in te vullen. | ||||
| For this type of activity, attendee is required: Voor dit soort activiteit, dient u minstend één 'aanwezige persoon' in te vullen. | ||||
| For this type of activity, duration time is required: Voor dit soort activiteit, dient u een duur in te vullen. | ||||
| For this type of activity, travel time is required: Voor dit soort activiteit, dient u een verplaatsingsduur in te vullen. | ||||
| For this type of activity, reasons is required: Voor dit soort activiteit, dient u een onderwerp in te vullen. | ||||
| For this type of activity, comment is required: Voor dit soort activiteit, dient u een opmerking in te vullen. | ||||
| For this type of activity, sent/received is required: Voor dit soort activiteit, dient u het veld 'inkomend/uitgaand' in te vullen. | ||||
| For this type of activity, document is required: Voor dit soort activiteit, dient u een document toe te voegen. | ||||
| For this type of activity, emergency is required: Voor dit soort activiteit, is het veld 'dringend' verplicht. | ||||
| For this type of activity, accompanying period is required: Voor dit soort activiteit, dient u een begeleidingstraject in te vullen. | ||||
| For this type of activity, you must add at least one social issue: Voor dit soort activiteit, dient u een sociaal vraagstuk aan te duiden. | ||||
| For this type of activity, you must add at least one social action: Voor dit soort activiteit, dient u een maatschappelijke actie toe te voegen. | ||||
|  | ||||
| # admin | ||||
| This parameter must be equal to social issue parameter: Deze parameter moet gelijk zijn aan de parameter "zichtbaarheid veld sociaal vraagstuk". | ||||
| The socialActionsVisible value is not compatible with the socialIssuesVisible value: De waarde van de parameter "zichtbaarheid veld maatschappelijke actie" is niet compatibel met de waarde van de parameter "zichtbaarheid veld sociaal vraagstuk". | ||||
| @@ -1,167 +0,0 @@ | ||||
| #general | ||||
| Show the aside activity: Toon de nevenactiviteit | ||||
| Edit the aside activity: Wijzig de nevenactiviteit | ||||
| Remove aside activity: Verwijder de nevenactiviteit | ||||
| Aside activity: Nevenactiviteit | ||||
| Aside Activity Type List: Lijst van nevenactiviteiten | ||||
| Duration time: Duur | ||||
| durationTime: duur | ||||
| user_username: gebruikersnaam | ||||
| Remark: Opmerking | ||||
| No comments: Geen opmerkingen | ||||
| Add a new aside activity: Nevenactiviteit toeveogen | ||||
| Aside activity list: Nevenactiviteiten | ||||
| present: aanwezig | ||||
| not present: afwezig | ||||
| Delete: Verwijderen | ||||
| Update: Bijwerken | ||||
| Aside activity data: Gegevens van nevenactiviteit | ||||
| There aren't any aside activities.: Geen nevenactiviteiten om weer te geven | ||||
| Type: Type | ||||
| Invisible: Onzichtbaar | ||||
| Optional: Optioneel | ||||
| Required: Verplicht | ||||
| Persons: Personen | ||||
| Users: Gebruikers | ||||
| Emergency: Dringend | ||||
| by: "Door " | ||||
| location: Plaats | ||||
|  | ||||
| # Crud | ||||
| crud: | ||||
|   aside_activity: | ||||
|     title_view: Details nevenactiviteit | ||||
|     title_new: Nieuwe nevenactiviteit | ||||
|     title_edit: Wijzig nevenactiviteit | ||||
|     title_delete: Verwijder nevenactiviteit | ||||
|     button_delete: Verwijderen | ||||
|     confirm_message_delete: Bent u zeker deze nevenactiviteit te willen verwijderen? | ||||
|   aside_activity_category: | ||||
|     title_new: Nieuwe categorie nevenactiviteiten | ||||
|     title_edit: Wijzigen categorie nevenactiviteiten | ||||
|  | ||||
| #forms | ||||
| Create a new aside activity type: Nieuwe categorie nevenactiviteiten | ||||
| Back to the list: Terug naar de lijst | ||||
| Choose the duration: Kies een duur | ||||
| Choose a category: Kies een categorie | ||||
| Is active: Actief | ||||
| For agent: Voor de gebruiker | ||||
| date: Datum | ||||
| Duration: Duur | ||||
| Note: Opmerking | ||||
| Choose the agent for whom this activity is created: Kies de gebruiker voor wie deze nevenactiviteit wordt aangemaakt. | ||||
| Choose the activity category: Kies een categorie | ||||
|  | ||||
| #Duration | ||||
| minutes: minuten | ||||
| hour: uur | ||||
| hours: uren | ||||
| day: dag | ||||
| days: dagen | ||||
| 5 minutes: 5 minuten | ||||
| 10 minutes: 10 minuten | ||||
| 15 minutes: 15 minuten | ||||
| 20 minutes: 20 minuten | ||||
| 25 minutes: 25 minuten | ||||
| 30 minutes: 30 minuten | ||||
| 45 minutes: 45 minuten | ||||
| 1 hour: 1 uur | ||||
| 1 hour 15: 1 uur 15 | ||||
| 1 hour 30: 1 uur 30 | ||||
| 1 hour 45: 1 uur 45 | ||||
| 2 hours: 2 uren | ||||
| 2 hours 30: 2 uur 30 | ||||
| 3 hours: 3 uren | ||||
| 3 hours 30: 3 uur 30 | ||||
| 4 hours: 4 uren | ||||
| 4 hours 30: 4 uur 30 | ||||
| 5 hours: 5 uren | ||||
| 5 hours 30: 5 uur 30 | ||||
| 6 hours: 6 uren | ||||
| 6 hours 30: 6 uur 30 | ||||
| 7 hours: 7 uren | ||||
| 7 hours 30: 7 uur 30 | ||||
| 8 hours: 8 uren | ||||
| 8 hours 30: 8 uur 30 | ||||
| 9 hours: 9 uren | ||||
| 9 hours 30: 9 uur 30 | ||||
| 10 hours: 10 uren | ||||
| 1/2 day: 1/2 dag | ||||
| 1 day: 1 dag | ||||
| 1 1/2 days: 1 1/2 dagen | ||||
| 2 days: 2 dagen | ||||
| 2 1/2 days: 2 1/2 dagen | ||||
| 3 days: 3 dagen | ||||
| 3 1/2 days: 3 1/2 dagen | ||||
| 4 days: 4 dagen | ||||
| 4 1/2 days: 4 1/2 dagen | ||||
| 5 days: 5 dagen | ||||
| 5 1/2 days: 5 1/2 dagen | ||||
| 6 days: 6 dagen | ||||
| 6 1/2 days: 6 1/2 dagen | ||||
| 7 days: 7 dagen | ||||
| 7 1/2 days: 7 1/2 dagen | ||||
| 8 days: 8 dagen | ||||
| 8 1/2 days: 8 1/2 dagen | ||||
| 9 days: 9 dagen | ||||
| 9 1/2 days: 9 1/2 dagen | ||||
| 10 days: 10 dagen | ||||
| 10 1/2 days: 10 1/2 dagen | ||||
| 11 days: 11 dagen | ||||
| 11 1/2 days: 11 1/2 dagen | ||||
| 12 days: 12 dagen | ||||
| 12 1/2 days: 12 1/2 dagen | ||||
| 13 days: 13 dagen | ||||
| 13 1/2 days: 13 1/2 dagen | ||||
| 14 days: 14 dagen | ||||
| 14 1/2 days: 14 1/2 dagen | ||||
| 15 days: 15 dagen | ||||
| 15 1/2 days: 15 1/2 dagen | ||||
| 16 days: 16 dagen | ||||
| 16 1/2 days: 16 1/2 dagen | ||||
| 17 days: 17 dagen | ||||
| 17 1/2 days: 17 1/2 dagen | ||||
| 18 days: 18 dagen | ||||
| 18 1/2 days: 18 1/2 dagen | ||||
| 19 days: 19 dagen | ||||
| 19 1/2 days: 19 1/2 dagen | ||||
| 20 days: 20 dagen | ||||
| 20 1/2 days: 20 1/2 dagen | ||||
| 21 days: 21 dagen | ||||
| 21 1/2 days: 21 1/2 dagen | ||||
| 22 days: 22 dagen | ||||
| 22 1/2 days: 22 1/2 dagen | ||||
| 23 days: 23 dagen | ||||
| 23 1/2 days: 23 1/2 dagen | ||||
| 24 days: 24 dagen | ||||
| 24 1/2 days: 24 1/2 dagen | ||||
| 25 days: 25 dagen | ||||
| 25 1/2 days: 25 1/2 dagen | ||||
| 26 days: 26 dagen | ||||
| 26 1/2 days: 26 1/2 dagen | ||||
| 27 days: 27 dagen | ||||
| 27 1/2 days: 27 1/2 dagen | ||||
| 28 days: 28 dagen | ||||
| 28 1/2 days: 28 1/2 dagen | ||||
| 29 days: 29 dagen | ||||
| 29 1/2 days: 29 1/2 dagen | ||||
| 30 days: 30 dagen | ||||
|  | ||||
| #list | ||||
| My aside activities: Mijn nevenactiviteiten | ||||
| #Aside activity delete | ||||
| Delete aside activity: Verwijder een nevenactiviteit | ||||
| Are you sure you want to remove the aside activity concerning "%name%" ?: Bent u zeker deze nevenactiviteit voor "%name%" te willen verwijderen ? | ||||
| The activity has been successfully removed.: De nevenactiviteit werd verwijdert. | ||||
|  | ||||
| #Menu | ||||
| Create an aside activity: "Maak een nevenactiviteit aan" | ||||
| Aside activity categories: Categorieën van nevenactiviteiten | ||||
| Aside activity configuration menu: "Configuratie menu voor nevenactiviteiten" | ||||
| Phonecall: "Telefoon oproep" | ||||
|  | ||||
| # admin | ||||
| Aside activities: Nevenactiviteiten | ||||
| Aside activity types: Types nevenactiviteiten | ||||
| Aside activity type configuration: Configuratie categorieën nevenactiviteiten | ||||
| @@ -1 +0,0 @@ | ||||
| You must not add twice the same category in the parent tree (previous result returned): Je mag niet tweemaal dezelfde entiteit aanduiden in de stamboom. (Het vorige resultaat werd hersteld) | ||||
| @@ -1,8 +0,0 @@ | ||||
| budget: | ||||
|     number of elements: >- | ||||
|         {nb_items, plural, | ||||
|             =0 {Geen element} | ||||
|             one {Één element} | ||||
|             many {# elementen} | ||||
|             other {# elementen} | ||||
|         } | ||||
| @@ -37,7 +37,7 @@ No charges registered: Aucune charge enregistrée | ||||
| No past resources registered: Aucune ressource passée | ||||
| No past charges registered: Aucune charge passée | ||||
| No future resources registered: Aucune ressource future enregistrée | ||||
| No future charges registered: Aucune charge future enregistrée | ||||
| No future charges registered: Aucune ressource future enregistrée | ||||
| No current budget element registered: Pas des éléments de budget actuelles enregistrés | ||||
|  | ||||
| New resource: Nouvelle ressource | ||||
|   | ||||
| @@ -1,76 +0,0 @@ | ||||
| Budget: Budget | ||||
| Resource: Inkomsten | ||||
| Charge: Onkosten | ||||
| Budget for %name%: Budget van %name% | ||||
| Budget for household %household%: Budget van gezin | ||||
| Current budget household members: Actuele budget van gezinsleden | ||||
| Show budget of %name%: Toon budget van %name% | ||||
| See complete budget: Toon volledige budget | ||||
| Hide budget: Verbergen | ||||
| Hide budget of %name%: Verberg budget van %name% | ||||
| Resource element type: Type inkomsten | ||||
| Actual budget: Actuele elementen budget | ||||
| Actual resources: Actuele inkomsten | ||||
| Actual resources for %name%: Actuele inkomsten van %name% | ||||
| Actual charges for %name%: Actuele onkosten van %name% | ||||
| Actual charges: Actuele onkosten | ||||
| Past budget: Elementen van afgelopen budget | ||||
| Show past budget: Toon afgelopen budget | ||||
| Show future budget: Toon toekomstig budget | ||||
| Past resources: Afgelopen inkomsten | ||||
| Past charges: Afgelopen onkosten | ||||
| Future budget: Toekomstige elementen van budget | ||||
| Future resources: Toekomstige inkomsten | ||||
| Future charges: Toekomstige onkosten | ||||
| Budget element type: Type | ||||
| Validity period: Geldigheidsperiod | ||||
| Start of validity period: Begin geldigheidsperiode | ||||
| End of validity period: Eind geldigheidsperiode | ||||
| Total: Totaal | ||||
| Create new resource: Nieuwe inkomsten toevoegen | ||||
| Create new charge: Nieuwe onkosten toevoegen | ||||
| See person: Toon persoon | ||||
|  | ||||
| There isn't any element recorded: Geen budget elementen geregistreerd | ||||
| No resources registered: Geen inkomsten geregistreerd | ||||
| No charges registered: Geen onkosten geregistreerd | ||||
| No past resources registered: Geen afgelopen inkomsten geregistreerd | ||||
| No past charges registered: Geen afgelopen onkosten geregistreerd | ||||
| No future resources registered: Geen toekomstige inkomsten geregistreerd | ||||
| No future charges registered: Geen toekomste onkosten geregistreerd | ||||
| No current budget element registered: Geen actuele budget elementen geregistreerd | ||||
|  | ||||
| New resource: Nieuwe inkomsten | ||||
| New charge: Nieuwe onkosten | ||||
| Edit resource: Wijzig inkomsten | ||||
| Edit: Wijzigen | ||||
| Edit charge: Wijzig onkosten | ||||
| Remove resource: Verwijder inkomsten | ||||
| Remove charge: Verwijder onkosten | ||||
| Are you sure you want to remove the ressource "%type%" associated to "%name%" ?: Bent u zeker de inkomsten van het type "%type%" en geassocieerd met %name% te willen verwijderen? | ||||
| Are you sure you want to remove the charge "%type%" associated to "%name%" ?: Bent u zeker de onkosten van het type "%type%" en geassocieerd met %name% te willen verwijderen? | ||||
| Resource deleted: Inkomsten verwijdert | ||||
| Charge deleted: Onkosten verwijdert | ||||
| Charge created: Onkosten toegevoegd | ||||
| Resource created: Inkomsten toegevoegd | ||||
| Resource updated: Inkomsten bijgewerkt | ||||
| Charge updated: Onkosten bijgewerkt | ||||
|  | ||||
| Choose a resource type: Kies een type inkomsten | ||||
| Choose a charge type: Kies een type onkosten | ||||
| Amount: Bedrag | ||||
| Comment: Opmerking | ||||
|  | ||||
| Help to pay charges: Hulp bij afbetaling onkosten | ||||
| Choose a status: Kies een status | ||||
| charge.help.running: In uitvoering | ||||
| charge.help.no: Niet gevraagd | ||||
| charge.help.yes: Ja | ||||
| charge.help.not-concerned: Niet betrokken | ||||
|  | ||||
| Budget calculator: Berekeningen en indicatoren van budget | ||||
| Budget calculator result: Resultaten | ||||
| The balance: Verschil tussen inkomsten en onkosten | ||||
|  | ||||
| Valid since %startDate% until %endDate%: Geldig sinds %startDate% tot %endDate% | ||||
| Valid since %startDate%: Geldig sinds %startDate% | ||||
| @@ -1,2 +0,0 @@ | ||||
| The amount cannot be empty: Le montant ne peut pas être vide ou égal à zéro | ||||
| The budget element's end date must be after the start date: La date de fin doit être après la date de début | ||||
| @@ -1,28 +0,0 @@ | ||||
| Calendar: Afspraken | ||||
| Calendar list: Lijst van afspraken | ||||
| My calendar list: Mijn afspraken | ||||
| There is no calendar items.: Er zijn geen afspraken | ||||
| Remove calendar item: Verwijder afspraak | ||||
| Are you sure you want to remove the calendar item?: Bent u zeker deze afspraak te willen verwijderen | ||||
| Concerned groups: Betrokken partijen | ||||
| Calendar data: Gegevens afspraak | ||||
| Update calendar: Wijzig afspraak | ||||
| main user concerned: Betrokken gebruiker | ||||
| Main user: Hoofdgebruiker | ||||
| Calendar item creation: Maak afspraak aan | ||||
| start date: Begin afspraak | ||||
| end date: Einde afspraak | ||||
| cancel reason: reden van annulatie | ||||
| status: Status van afspraak | ||||
| calendar location: Locatie afspraak | ||||
| calendar comment: Opmerkingen over afspraak | ||||
| sendSMS: Verzenden sms | ||||
| Send s m s: Sms verzenden? | ||||
| Cancel reason: Reden van annulatie | ||||
| Add a new calendar: Nieuwe afspraak toevoegen | ||||
| "Success : calendar item updated!": "Afspraak bijgewerkt" | ||||
| "Success : calendar item created!": "Afspraak aangemaakt" | ||||
| The calendar item has been successfully removed.: De afspraak is verwijdert | ||||
| From the day: Vanaf | ||||
| to the day: tot | ||||
| Transform to activity: In activiteit omzetten | ||||
| @@ -11,7 +11,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace Chill\DocStoreBundle\Entity; | ||||
|  | ||||
| use Chill\MainBundle\Entity\HasScopesInterface; | ||||
| use Chill\PersonBundle\Entity\AccompanyingPeriod; | ||||
| use Doctrine\ORM\Mapping as ORM; | ||||
|  | ||||
| @@ -19,7 +18,7 @@ use Doctrine\ORM\Mapping as ORM; | ||||
|  * @ORM\Entity | ||||
|  * @ORM\Table("chill_doc.accompanyingcourse_document") | ||||
|  */ | ||||
| class AccompanyingCourseDocument extends Document implements HasScopesInterface | ||||
| class AccompanyingCourseDocument extends Document | ||||
| { | ||||
|     /** | ||||
|      * @ORM\ManyToOne(targetEntity=AccompanyingPeriod::class) | ||||
| @@ -32,15 +31,6 @@ class AccompanyingCourseDocument extends Document implements HasScopesInterface | ||||
|         return $this->course; | ||||
|     } | ||||
|  | ||||
|     public function getScopes(): iterable | ||||
|     { | ||||
|         if (null !== $this->course) { | ||||
|             return []; | ||||
|         } | ||||
|  | ||||
|         return $this->course->getScopes(); | ||||
|     } | ||||
|  | ||||
|     public function setCourse(?AccompanyingPeriod $course): self | ||||
|     { | ||||
|         $this->course = $course; | ||||
|   | ||||
| @@ -16,6 +16,8 @@ use Chill\MainBundle\Doctrine\Model\TrackCreationInterface; | ||||
| use Chill\MainBundle\Doctrine\Model\TrackCreationTrait; | ||||
| use Chill\MainBundle\Doctrine\Model\TrackUpdateInterface; | ||||
| use Chill\MainBundle\Doctrine\Model\TrackUpdateTrait; | ||||
| use Chill\MainBundle\Entity\HasScopeInterface; | ||||
| use Chill\MainBundle\Entity\Scope; | ||||
| use Chill\MainBundle\Entity\User; | ||||
| use DateTimeInterface; | ||||
| use Doctrine\ORM\Mapping as ORM; | ||||
| @@ -24,7 +26,7 @@ use Symfony\Component\Validator\Constraints as Assert; | ||||
| /** | ||||
|  * @ORM\MappedSuperclass | ||||
|  */ | ||||
| class Document implements TrackCreationInterface, TrackUpdateInterface | ||||
| class Document implements HasScopeInterface, TrackCreationInterface, TrackUpdateInterface | ||||
| { | ||||
|     use TrackCreationTrait; | ||||
|  | ||||
| @@ -68,6 +70,13 @@ class Document implements TrackCreationInterface, TrackUpdateInterface | ||||
|      */ | ||||
|     private $object; | ||||
|  | ||||
|     /** | ||||
|      * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Scope") | ||||
|      * | ||||
|      * @var \Chill\MainBundle\Entity\Scope The document's center | ||||
|      */ | ||||
|     private $scope; | ||||
|  | ||||
|     /** | ||||
|      * @ORM\ManyToOne(targetEntity="Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate") | ||||
|      */ | ||||
| @@ -113,6 +122,16 @@ class Document implements TrackCreationInterface, TrackUpdateInterface | ||||
|         return $this->object; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get scope. | ||||
|      * | ||||
|      * @return \Chill\MainBundle\Entity\Scope | ||||
|      */ | ||||
|     public function getScope(): ?Scope | ||||
|     { | ||||
|         return $this->scope; | ||||
|     } | ||||
|  | ||||
|     public function getTemplate(): ?DocGeneratorTemplate | ||||
|     { | ||||
|         return $this->template; | ||||
| @@ -156,6 +175,13 @@ class Document implements TrackCreationInterface, TrackUpdateInterface | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     public function setScope($scope): self | ||||
|     { | ||||
|         $this->scope = $scope; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     public function setTemplate(?DocGeneratorTemplate $template): self | ||||
|     { | ||||
|         $this->template = $template; | ||||
|   | ||||
| @@ -13,7 +13,6 @@ namespace Chill\DocStoreBundle\Entity; | ||||
|  | ||||
| use Chill\MainBundle\Entity\HasCenterInterface; | ||||
| use Chill\MainBundle\Entity\HasScopeInterface; | ||||
| use Chill\MainBundle\Entity\Scope; | ||||
| use Chill\PersonBundle\Entity\Person; | ||||
| use Doctrine\ORM\Mapping as ORM; | ||||
|  | ||||
| @@ -28,13 +27,6 @@ class PersonDocument extends Document implements HasCenterInterface, HasScopeInt | ||||
|      */ | ||||
|     private Person $person; | ||||
|  | ||||
|     /** | ||||
|      * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Scope") | ||||
|      * | ||||
|      * @var \Chill\MainBundle\Entity\Scope The document's center | ||||
|      */ | ||||
|     private $scope; | ||||
|  | ||||
|     public function getCenter() | ||||
|     { | ||||
|         return $this->getPerson()->getCenter(); | ||||
| @@ -45,22 +37,10 @@ class PersonDocument extends Document implements HasCenterInterface, HasScopeInt | ||||
|         return $this->person; | ||||
|     } | ||||
|  | ||||
|     public function getScope(): ?Scope | ||||
|     { | ||||
|         return $this->scope; | ||||
|     } | ||||
|  | ||||
|     public function setPerson($person): self | ||||
|     { | ||||
|         $this->person = $person; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     public function setScope($scope): self | ||||
|     { | ||||
|         $this->scope = $scope; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -88,5 +88,10 @@ class AccompanyingCourseDocumentType extends AbstractType | ||||
|         $resolver->setDefaults([ | ||||
|             'data_class' => Document::class, | ||||
|         ]); | ||||
|  | ||||
|         // $resolver->setRequired(['role', 'center']) | ||||
|         //     ->setAllowedTypes('role', [ \Symfony\Component\Security\Core\Role\Role::class ]) | ||||
|         //     ->setAllowedTypes('center', [ \Chill\MainBundle\Entity\Center::class ]) | ||||
|         //     ; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -65,7 +65,7 @@ class PersonDocumentACLAwareRepository implements PersonDocumentACLAwareReposito | ||||
|         $this->addACL($qb, $person); | ||||
|  | ||||
|         foreach ($orderBy as $field => $order) { | ||||
|             $qb->addOrderBy('d.' . $field, $order); | ||||
|             $qb->addOrderBy($field, $order); | ||||
|         } | ||||
|  | ||||
|         $qb->setFirstResult($offset)->setMaxResults($limit); | ||||
|   | ||||
| @@ -106,10 +106,6 @@ class AccompanyingCourseDocumentVoter extends AbstractChillVoter implements Prov | ||||
|             ) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             if (self::CREATE === $attribute && null !== $subject->getCourse()) { | ||||
|                 return $this->voterHelper->voteOnAttribute($attribute, $subject->getCourse(), $token); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $this->voterHelper->voteOnAttribute($attribute, $subject, $token); | ||||
|   | ||||
| @@ -15,18 +15,12 @@ use Base64Url\Base64Url; | ||||
| use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlGeneratorInterface; | ||||
| use Chill\DocStoreBundle\Entity\StoredObject; | ||||
| use Chill\DocStoreBundle\Exception\StoredObjectManagerException; | ||||
| use DateTimeImmutable; | ||||
| use DateTimeInterface; | ||||
| use DateTimeZone; | ||||
| use RuntimeException; | ||||
| use Symfony\Component\HttpFoundation\Request; | ||||
| use Symfony\Component\HttpFoundation\Response; | ||||
|  | ||||
| use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; | ||||
| use Symfony\Contracts\HttpClient\HttpClientInterface; | ||||
| use Symfony\Contracts\HttpClient\ResponseInterface; | ||||
| use Throwable; | ||||
| use function array_key_exists; | ||||
|  | ||||
| use const OPENSSL_RAW_DATA; | ||||
|  | ||||
| final class StoredObjectManager implements StoredObjectManagerInterface | ||||
| @@ -35,8 +29,6 @@ final class StoredObjectManager implements StoredObjectManagerInterface | ||||
|  | ||||
|     private HttpClientInterface $client; | ||||
|  | ||||
|     private array $inMemory = []; | ||||
|  | ||||
|     private TempUrlGeneratorInterface $tempUrlGenerator; | ||||
|  | ||||
|     public function __construct( | ||||
| @@ -47,35 +39,28 @@ final class StoredObjectManager implements StoredObjectManagerInterface | ||||
|         $this->tempUrlGenerator = $tempUrlGenerator; | ||||
|     } | ||||
|  | ||||
|     public function getLastModified(StoredObject $document): DateTimeInterface | ||||
|     { | ||||
|         if ($this->hasCache($document)) { | ||||
|             $response = $this->getResponseFromCache($document); | ||||
|         } else { | ||||
|             try { | ||||
|                 $response = $this | ||||
|                     ->client | ||||
|                     ->request( | ||||
|                         Request::METHOD_HEAD, | ||||
|                         $this | ||||
|                             ->tempUrlGenerator | ||||
|                             ->generate( | ||||
|                                 Request::METHOD_PUT, | ||||
|                                 $document->getFilename() | ||||
|                             ) | ||||
|                             ->url | ||||
|                     ); | ||||
|             } catch (TransportExceptionInterface $exception) { | ||||
|                 throw StoredObjectManagerException::errorDuringHttpRequest($exception); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $this->extractLastModifiedFromResponse($response); | ||||
|     } | ||||
|  | ||||
|     public function read(StoredObject $document): string | ||||
|     { | ||||
|         $response = $this->getResponseFromCache($document); | ||||
|         try { | ||||
|             $response = $this | ||||
|                 ->client | ||||
|                 ->request( | ||||
|                     Request::METHOD_GET, | ||||
|                     $this | ||||
|                         ->tempUrlGenerator | ||||
|                         ->generate( | ||||
|                             Request::METHOD_GET, | ||||
|                             $document->getFilename() | ||||
|                         ) | ||||
|                         ->url | ||||
|                 ); | ||||
|         } catch (Throwable $e) { | ||||
|             throw StoredObjectManagerException::errorDuringHttpRequest($e); | ||||
|         } | ||||
|  | ||||
|         if ($response->getStatusCode() !== Response::HTTP_OK) { | ||||
|             throw StoredObjectManagerException::invalidStatusCode($response->getStatusCode()); | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             $data = $response->getContent(); | ||||
| @@ -105,10 +90,6 @@ final class StoredObjectManager implements StoredObjectManagerInterface | ||||
|  | ||||
|     public function write(StoredObject $document, string $clearContent): void | ||||
|     { | ||||
|         if ($this->hasCache($document)) { | ||||
|             unset($this->inMemory[$document->getUuid()->toString()]); | ||||
|         } | ||||
|  | ||||
|         $encryptedContent = $this->hasKeysAndIv($document) | ||||
|             ? openssl_encrypt( | ||||
|                 $clearContent, | ||||
| @@ -145,64 +126,6 @@ final class StoredObjectManager implements StoredObjectManagerInterface | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private function extractLastModifiedFromResponse(ResponseInterface $response): DateTimeImmutable | ||||
|     { | ||||
|         $lastModifiedString = (($response->getHeaders()['last-modified'] ?? [])[0] ?? ''); | ||||
|  | ||||
|         $date = DateTimeImmutable::createFromFormat( | ||||
|             DateTimeImmutable::RFC7231, | ||||
|             $lastModifiedString, | ||||
|             new DateTimeZone('GMT') | ||||
|         ); | ||||
|  | ||||
|         if (false === $date) { | ||||
|             throw new RuntimeException('the date from remote storage could not be parsed: ' | ||||
|                 . $lastModifiedString); | ||||
|         } | ||||
|  | ||||
|         return $date; | ||||
|     } | ||||
|  | ||||
|     private function fillCache(StoredObject $document): void | ||||
|     { | ||||
|         try { | ||||
|             $response = $this | ||||
|                 ->client | ||||
|                 ->request( | ||||
|                     Request::METHOD_GET, | ||||
|                     $this | ||||
|                         ->tempUrlGenerator | ||||
|                         ->generate( | ||||
|                             Request::METHOD_GET, | ||||
|                             $document->getFilename() | ||||
|                         ) | ||||
|                         ->url | ||||
|                 ); | ||||
|         } catch (Throwable $e) { | ||||
|             throw StoredObjectManagerException::errorDuringHttpRequest($e); | ||||
|         } | ||||
|  | ||||
|         if ($response->getStatusCode() !== Response::HTTP_OK) { | ||||
|             throw StoredObjectManagerException::invalidStatusCode($response->getStatusCode()); | ||||
|         } | ||||
|  | ||||
|         $this->inMemory[$document->getUuid()->toString()] = $response; | ||||
|     } | ||||
|  | ||||
|     private function getResponseFromCache(StoredObject $document): ResponseInterface | ||||
|     { | ||||
|         if (!$this->hasCache($document)) { | ||||
|             $this->fillCache($document); | ||||
|         } | ||||
|  | ||||
|         return $this->inMemory[$document->getUuid()->toString()]; | ||||
|     } | ||||
|  | ||||
|     private function hasCache(StoredObject $document): bool | ||||
|     { | ||||
|         return array_key_exists($document->getUuid()->toString(), $this->inMemory); | ||||
|     } | ||||
|  | ||||
|     private function hasKeysAndIv(StoredObject $storedObject): bool | ||||
|     { | ||||
|         return ([] !== $storedObject->getKeyInfos()) && ([] !== $storedObject->getIv()); | ||||
|   | ||||
| @@ -12,12 +12,9 @@ declare(strict_types=1); | ||||
| namespace Chill\DocStoreBundle\Service; | ||||
|  | ||||
| use Chill\DocStoreBundle\Entity\StoredObject; | ||||
| use DateTimeInterface; | ||||
|  | ||||
| interface StoredObjectManagerInterface | ||||
| { | ||||
|     public function getLastModified(StoredObject $document): DateTimeInterface; | ||||
|  | ||||
|     /** | ||||
|      * Get the content of a StoredObject. | ||||
|      * | ||||
|   | ||||
| @@ -12,7 +12,6 @@ declare(strict_types=1); | ||||
| namespace Chill\EventBundle\Controller; | ||||
|  | ||||
| use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | ||||
| use Symfony\Component\Routing\Annotation\Route; | ||||
|  | ||||
| /** | ||||
|  * Class AdminController | ||||
| @@ -21,12 +20,18 @@ use Symfony\Component\Routing\Annotation\Route; | ||||
| class AdminController extends AbstractController | ||||
| { | ||||
|     /** | ||||
|      * Event admin. | ||||
|      * | ||||
|      * @Route("/{_locale}/admin/event", name="chill_event_admin_index") | ||||
|      * @return \Symfony\Component\HttpFoundation\Response | ||||
|      */ | ||||
|     public function indexAdminAction() | ||||
|     public function indexAction() | ||||
|     { | ||||
|         return $this->render('ChillEventBundle:Admin:index.html.twig'); | ||||
|         return $this->render('ChillEventBundle:Admin:layout.html.twig'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return \Symfony\Component\HttpFoundation\RedirectResponse | ||||
|      */ | ||||
|     public function redirectToAdminIndexAction() | ||||
|     { | ||||
|         return $this->redirectToRoute('chill_main_admin_central'); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -273,7 +273,7 @@ class EventController extends AbstractController | ||||
|         /** | ||||
|          * @var Center $centers | ||||
|          */ | ||||
|         $centers = $this->authorizationHelper->getReachableCenters($this->getUser(), (string) $role); | ||||
|         $centers = $this->authorizationHelper->getReachableCenters($this->getUser(), $role); | ||||
|  | ||||
|         if (count($centers) === 1) { | ||||
|             return $this->redirectToRoute('chill_event__event_new', [ | ||||
|   | ||||
| @@ -151,7 +151,7 @@ class PickEventType extends AbstractType | ||||
|         } else { | ||||
|             $centers = $this->authorizationHelper->getReachableCenters( | ||||
|                 $this->user, | ||||
|                 (string) $options['role'] | ||||
|                 $options['role'] | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -1,61 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace Chill\EventBundle\Menu; | ||||
|  | ||||
| use Chill\MainBundle\Routing\LocalMenuBuilderInterface; | ||||
| use Knp\Menu\MenuItem; | ||||
| use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; | ||||
|  | ||||
| class AdminMenuBuilder implements LocalMenuBuilderInterface | ||||
| { | ||||
|     /** | ||||
|      * @var AuthorizationCheckerInterface | ||||
|      */ | ||||
|     protected $authorizationChecker; | ||||
|  | ||||
|     public function __construct(AuthorizationCheckerInterface $authorizationChecker) | ||||
|     { | ||||
|         $this->authorizationChecker = $authorizationChecker; | ||||
|     } | ||||
|  | ||||
|     public function buildMenu($menuId, MenuItem $menu, array $parameters) | ||||
|     { | ||||
|         if (!$this->authorizationChecker->isGranted('ROLE_ADMIN')) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $menu->addChild('Events', [ | ||||
|             'route' => 'chill_event_admin_index', | ||||
|         ]) | ||||
|             ->setAttribute('class', 'list-group-item-header') | ||||
|             ->setExtras([ | ||||
|                 'order' => 6500, | ||||
|             ]); | ||||
|  | ||||
|         $menu->addChild('Event type', [ | ||||
|             'route' => 'chill_eventtype_admin', | ||||
|         ])->setExtras(['order' => 6510]); | ||||
|  | ||||
|         $menu->addChild('Event status', [ | ||||
|             'route' => 'chill_event_admin_status', | ||||
|         ])->setExtras(['order' => 6520]); | ||||
|  | ||||
|         $menu->addChild('Role', [ | ||||
|             'route' => 'chill_event_admin_role', | ||||
|         ])->setExtras(['order' => 6530]); | ||||
|     } | ||||
|  | ||||
|     public static function getMenuIds(): array | ||||
|     { | ||||
|         return ['admin_section', 'admin_event']; | ||||
|     } | ||||
| } | ||||
| @@ -1,13 +0,0 @@ | ||||
| {% extends "@ChillMain/Admin/layoutWithVerticalMenu.html.twig" %} | ||||
|  | ||||
| {% block vertical_menu_content %} | ||||
|     {{ chill_menu('admin_event', { | ||||
|         'layout': '@ChillMain/Admin/menu_admin_section.html.twig', | ||||
|     }) }} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block layout_wvm_content %} | ||||
|     {% block admin_content %}<!-- block content empty --> | ||||
|         <h1>{{ 'Events configuration' |trans }}</h1> | ||||
|     {% endblock %} | ||||
| {% endblock  %} | ||||
| @@ -0,0 +1,31 @@ | ||||
| {# | ||||
|  * Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,  | ||||
|  <info@champs-libres.coop> / <http://www.champs-libres.coop> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  *  it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  *  License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| #} | ||||
|  | ||||
| {% extends "@ChillMain/Admin/layoutWithVerticalMenu.html.twig" %} | ||||
|  | ||||
| {% block vertical_menu_content %} | ||||
|     {{ chill_menu('admin_events', { | ||||
|         'layout': '@ChillEvent/Admin/menu.html.twig', | ||||
|     }) }} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block layout_wvm_content %} | ||||
|     {% block admin_content %}<!-- block content empty --> | ||||
|         <h1>{{ 'Events configuration' |trans }}</h1> | ||||
|     {% endblock %} | ||||
| {% endblock  %} | ||||
| @@ -1,3 +1,21 @@ | ||||
| {# | ||||
|  * Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,  | ||||
|  <info@champs-libres.coop> / <http://www.champs-libres.coop> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  *  it under the terms of the GNU Affero General Public License as | ||||
|  * published by the Free Software Foundation, either version 3 of the | ||||
|  *  License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| #} | ||||
|  | ||||
| {% extends "@ChillMain/Menu/verticalMenu.html.twig" %} | ||||
| {% block v_menu_title %}{{ 'Events configuration menu'|trans }}{% endblock %} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|     <h1>{{ 'Role edit'|trans }}</h1> | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "ChillEventBundle:Admin:index.html.twig" %} | ||||
| {% extends "ChillEventBundle:Admin:layout.html.twig" %} | ||||
|  | ||||
| {% block admin_content -%} | ||||
|  | ||||
|   | ||||
| @@ -9,24 +9,24 @@ chill_event_participation: | ||||
|  | ||||
| ## ADMIN | ||||
|  | ||||
| chill_event_admin_index: | ||||
| chill_event_admin: | ||||
|     path:     /{_locale}/admin/event | ||||
|     controller: Chill\EventBundle\Controller\AdminController::indexAdminAction | ||||
|     # options: | ||||
|     #     menus: | ||||
|     #         admin_section: | ||||
|     #             order: 2100 | ||||
|     #             label: "Events" | ||||
|     #             icons: ['calendar'] | ||||
|     controller: Chill\EventBundle\Controller\AdminController::indexAction | ||||
|     options: | ||||
|         menus: | ||||
|             admin_section: | ||||
|                 order: 2100 | ||||
|                 label: "Events" | ||||
|                 icons: ['calendar'] | ||||
|  | ||||
| # chill_event_admin_redirect_to_admin_index: | ||||
| #     path:     /{_locale}/admin/event_redirect_to_main | ||||
| #     controller: Chill\EventBundle\Controller\AdminController::redirectToAdminIndexAction | ||||
| #     options: | ||||
| #         menus: | ||||
| #             admin_events: | ||||
| #                 order: 0 | ||||
| #                 label: Main admin menu | ||||
| chill_event_admin_redirect_to_admin_index: | ||||
|     path:     /{_locale}/admin/event_redirect_to_main | ||||
|     controller: Chill\EventBundle\Controller\AdminController::redirectToAdminIndexAction | ||||
|     options: | ||||
|         menus: | ||||
|             admin_events: | ||||
|                 order: 0 | ||||
|                 label: Main admin menu | ||||
|  | ||||
| chill_event_admin_status: | ||||
|     resource: "@ChillEventBundle/config/routes/status.yaml" | ||||
| @@ -39,4 +39,4 @@ chill_event_admin_role: | ||||
| chill_event_admin_event_type: | ||||
|     resource: "@ChillEventBundle/config/routes/eventtype.yaml" | ||||
|     prefix:   /{_locale}/admin/event/event_type | ||||
|  | ||||
|      | ||||
|   | ||||
| @@ -1,11 +1,2 @@ | ||||
| services: | ||||
|     Chill\EventBundle\Controller\: | ||||
|         autowire: true | ||||
|         resource: '../Controller' | ||||
|         tags: ['controller.service_arguments'] | ||||
|  | ||||
|     Chill\EventBundle\Menu\: | ||||
|         autowire: true | ||||
|         autoconfigure: true | ||||
|         resource: '../Menu/' | ||||
|         tags: ['chill.menu_builder'] | ||||
| @@ -126,7 +126,7 @@ class Version20160318111334 extends AbstractMigration | ||||
|         $this->addSql('ALTER TABLE chill_event_participation ' | ||||
|                 . 'ADD CONSTRAINT FK_4E7768AC217BBB47 ' | ||||
|                 . 'FOREIGN KEY (person_id) ' | ||||
|                 . 'REFERENCES chill_person_person(id) ' | ||||
|                 . 'REFERENCES Person (id) ' | ||||
|                 . 'NOT DEFERRABLE INITIALLY IMMEDIATE'); | ||||
|         $this->addSql('ALTER TABLE chill_event_participation ' | ||||
|                 . 'ADD CONSTRAINT FK_4E7768ACD60322AC ' | ||||
|   | ||||
| @@ -405,7 +405,7 @@ class ExportController extends AbstractController | ||||
|             'alias' => $alias, | ||||
|         ]; | ||||
|         unset($parameters['_token']); | ||||
|         $key = md5(uniqid((string) mt_rand(), false)); | ||||
|         $key = md5(uniqid(mt_rand(), false)); | ||||
|  | ||||
|         $this->redis->setEx($key, 3600, serialize($parameters)); | ||||
|  | ||||
|   | ||||
| @@ -92,8 +92,5 @@ final class PostalCodeAPIController extends ApiController | ||||
|             $qb->where('e.country = :country') | ||||
|                 ->setParameter('country', $request->query->get('country')); | ||||
|         } | ||||
|  | ||||
|         $qb->andWhere('e.origin = :zero') | ||||
|             ->setParameter('zero', 0); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -12,9 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\MainBundle\Controller; | ||||
|  | ||||
| use Chill\MainBundle\CRUD\Controller\ApiController; | ||||
| use Doctrine\ORM\QueryBuilder; | ||||
| use Symfony\Component\HttpFoundation\JsonResponse; | ||||
| use Symfony\Component\HttpFoundation\Request; | ||||
| use Symfony\Component\Routing\Annotation\Route; | ||||
|  | ||||
| class UserApiController extends ApiController | ||||
| @@ -60,14 +58,4 @@ class UserApiController extends ApiController | ||||
|             ['groups' => ['read']] | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param QueryBuilder $query | ||||
|      */ | ||||
|     protected function customizeQuery(string $action, Request $request, $query): void | ||||
|     { | ||||
|         if ('_index' === $action) { | ||||
|             $query->andWhere($query->expr()->eq('e.enabled', "'TRUE'")); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,25 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace Chill\MainBundle\Controller; | ||||
|  | ||||
| use Chill\MainBundle\CRUD\Controller\ApiController; | ||||
| use Symfony\Component\HttpFoundation\Request; | ||||
|  | ||||
| class UserJobApiController extends ApiController | ||||
| { | ||||
|     protected function customizeQuery(string $action, Request $request, $query): void | ||||
|     { | ||||
|         if ('_index' === $action) { | ||||
|             $query->andWhere($query->expr()->eq('e.active', "'TRUE'")); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -19,7 +19,6 @@ use Chill\MainBundle\Controller\LanguageController; | ||||
| use Chill\MainBundle\Controller\LocationController; | ||||
| use Chill\MainBundle\Controller\LocationTypeController; | ||||
| use Chill\MainBundle\Controller\UserController; | ||||
| use Chill\MainBundle\Controller\UserJobApiController; | ||||
| use Chill\MainBundle\Controller\UserJobController; | ||||
| use Chill\MainBundle\DependencyInjection\Widget\Factory\WidgetFactoryInterface; | ||||
| use Chill\MainBundle\Doctrine\DQL\GetJsonFieldByKey; | ||||
| @@ -502,7 +501,6 @@ class ChillMainExtension extends Extension implements | ||||
|                     'name' => 'user_job', | ||||
|                     'base_path' => '/api/1.0/main/user-job', | ||||
|                     'base_role' => 'ROLE_USER', | ||||
|                     'controller' => UserJobApiController::class, | ||||
|                     'actions' => [ | ||||
|                         '_index' => [ | ||||
|                             'methods' => [ | ||||
|   | ||||
| @@ -87,7 +87,7 @@ class ComposedRoleScopeType extends AbstractType | ||||
|                 }, | ||||
|             ]) | ||||
|             ->add('scope', EntityType::class, [ | ||||
|                 'class' => Scope::class, | ||||
|                 'class' => 'ChillMainBundle:Scope', | ||||
|                 'choice_label' => static function (Scope $scope) use ($translatableStringHelper) { | ||||
|                     return $translatableStringHelper->localize($scope->getName()); | ||||
|                 }, | ||||
|   | ||||
| @@ -78,11 +78,11 @@ class PickCenterType extends AbstractType | ||||
|         $export = $this->exportManager->getExport($options['export_alias']); | ||||
|         $centers = $this->authorizationHelper->getReachableCenters( | ||||
|             $this->user, | ||||
|             (string) $export->requiredRole() | ||||
|             $export->requiredRole() | ||||
|         ); | ||||
|  | ||||
|         $builder->add(self::CENTERS_IDENTIFIERS, EntityType::class, [ | ||||
|             'class' => Center::class, | ||||
|             'class' => 'ChillMainBundle:Center', | ||||
|             'query_builder' => static function (EntityRepository $er) use ($centers) { | ||||
|                 $qb = $er->createQueryBuilder('c'); | ||||
|                 $ids = array_map( | ||||
|   | ||||
| @@ -43,7 +43,6 @@ class UserCurrentLocationType extends AbstractType | ||||
|                 }, | ||||
|                 'placeholder' => 'Pick a location', | ||||
|                 'required' => false, | ||||
|                 'attr' => ['class' => 'select2'], | ||||
|             ]); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -119,8 +119,8 @@ final class PostalCodeRepository implements ObjectRepository | ||||
|  | ||||
|         $pertinenceClause = ['STRICT_WORD_SIMILARITY(canonical, UNACCENT(?))']; | ||||
|         $pertinenceArgs = [$pattern]; | ||||
|         $andWhere = ['canonical %>> UNACCENT(?)']; | ||||
|         $andWhereArgs = [$pattern]; | ||||
|         $orWhere = ['canonical %>> UNACCENT(?)']; | ||||
|         $orWhereArgs = [$pattern]; | ||||
|  | ||||
|         foreach (explode(' ', $pattern) as $part) { | ||||
|             $part = trim($part); | ||||
| @@ -129,8 +129,8 @@ final class PostalCodeRepository implements ObjectRepository | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             $andWhere[] = "canonical LIKE '%' || UNACCENT(LOWER(?)) || '%'"; | ||||
|             $andWhereArgs[] = $part; | ||||
|             $orWhere[] = "canonical LIKE '%' || UNACCENT(LOWER(?)) || '%'"; | ||||
|             $orWhereArgs[] = $part; | ||||
|             $pertinenceClause[] = | ||||
|                 "(EXISTS (SELECT 1 FROM unnest(string_to_array(canonical, ' ')) AS t WHERE starts_with(t, UNACCENT(LOWER(?)))))::int"; | ||||
|             $pertinenceClause[] = | ||||
| @@ -139,7 +139,7 @@ final class PostalCodeRepository implements ObjectRepository | ||||
|         } | ||||
|         $query | ||||
|             ->setSelectPertinence(implode(' + ', $pertinenceClause), $pertinenceArgs) | ||||
|             ->andWhereClause(implode(' AND ', $andWhere), $andWhereArgs); | ||||
|             ->andWhereClause(implode(' OR ', $orWhere), $orWhereArgs); | ||||
|  | ||||
|         return $query; | ||||
|     } | ||||
|   | ||||
| @@ -121,9 +121,7 @@ export default { | ||||
|          this.entity.selected.city = value; | ||||
|          this.entity.selected.postcode.name = value.name; | ||||
|          this.entity.selected.postcode.code = value.code; | ||||
|          if (value.center) { | ||||
|             this.entity.selected.postcode.coordinates = value.center.coordinates; | ||||
|          } | ||||
|          this.entity.selected.postcode.coordinates = value.center.coordinates; | ||||
|          this.entity.selected.writeNew.postcode = false; | ||||
|          this.$emit('getReferenceAddresses', value); | ||||
|          this.focusOnAddress(); | ||||
|   | ||||
| @@ -16,7 +16,6 @@ use Chill\MainBundle\Notification\Counter\NotificationByUserCounter; | ||||
| use Chill\MainBundle\Routing\LocalMenuBuilderInterface; | ||||
| use Chill\MainBundle\Workflow\Counter\WorkflowByUserCounter; | ||||
| use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; | ||||
| use Symfony\Component\HttpFoundation\RequestStack; | ||||
| use Symfony\Component\Security\Core\Security; | ||||
| use Symfony\Contracts\Translation\TranslatorInterface; | ||||
|  | ||||
| @@ -26,8 +25,6 @@ class UserMenuBuilder implements LocalMenuBuilderInterface | ||||
|  | ||||
|     private NotificationByUserCounter $notificationByUserCounter; | ||||
|  | ||||
|     private RequestStack $requestStack; | ||||
|  | ||||
|     private Security $security; | ||||
|  | ||||
|     private TranslatorInterface $translator; | ||||
| @@ -39,15 +36,13 @@ class UserMenuBuilder implements LocalMenuBuilderInterface | ||||
|         WorkflowByUserCounter $workflowByUserCounter, | ||||
|         Security $security, | ||||
|         TranslatorInterface $translator, | ||||
|         ParameterBagInterface $parameterBag, | ||||
|         RequestStack $requestStack | ||||
|         ParameterBagInterface $parameterBag | ||||
|     ) { | ||||
|         $this->notificationByUserCounter = $notificationByUserCounter; | ||||
|         $this->workflowByUserCounter = $workflowByUserCounter; | ||||
|         $this->security = $security; | ||||
|         $this->translator = $translator; | ||||
|         $this->parameterBag = $parameterBag; | ||||
|         $this->requestStack = $requestStack; | ||||
|     } | ||||
|  | ||||
|     public function buildMenu($menuId, \Knp\Menu\MenuItem $menu, array $parameters) | ||||
| @@ -64,12 +59,7 @@ class UserMenuBuilder implements LocalMenuBuilderInterface | ||||
|             $menu | ||||
|                 ->addChild( | ||||
|                     $locationTextMenu, | ||||
|                     [ | ||||
|                         'route' => 'chill_main_user_currentlocation_edit', | ||||
|                         'routeParameters' => [ | ||||
|                             'returnPath' => $this->requestStack->getCurrentRequest()->getRequestUri(), | ||||
|                         ], | ||||
|                     ] | ||||
|                     ['route' => 'chill_main_user_currentlocation_edit'] | ||||
|                 ) | ||||
|                 ->setExtras([ | ||||
|                     'order' => -9999999, | ||||
|   | ||||
| @@ -47,12 +47,12 @@ final class Version20210505153727 extends AbstractMigration | ||||
|         '); | ||||
|         $this->addSql(' | ||||
|             WITH hydrated_addresses AS ( | ||||
|                 SELECT *, rank() OVER (PARTITION BY pa_a.person_id ORDER BY validfrom, id) | ||||
|                 SELECT *, rank() OVER (PARTITION BY pa_a.person_id ORDER BY validfrom) | ||||
|                 FROM chill_main_address AS aa JOIN chill_person_persons_to_addresses AS pa_a ON aa.id = pa_a.address_id | ||||
|             ) | ||||
|             UPDATE chill_main_address AS b | ||||
|             SET validto = ( | ||||
|                 SELECT validfrom | ||||
|                 SELECT validfrom - INTERVAL \'1 DAY\' | ||||
|                 FROM hydrated_addresses | ||||
|                 WHERE hydrated_addresses.id = ( | ||||
|                     SELECT a1.id | ||||
|   | ||||
| @@ -1,39 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace Chill\Migrations\Main; | ||||
|  | ||||
| use Doctrine\DBAL\Schema\Schema; | ||||
| use Doctrine\Migrations\AbstractMigration; | ||||
|  | ||||
| final class Version20220711150006 extends AbstractMigration | ||||
| { | ||||
|     public function down(Schema $schema): void | ||||
|     { | ||||
|         $this->addSql('ALTER TABLE chill_main_workflow_entity_step | ||||
|             DROP CONSTRAINT chill_custom_only_one_step_opened'); | ||||
|     } | ||||
|  | ||||
|     public function getDescription(): string | ||||
|     { | ||||
|         return 'Add a constraint to ensure that only one step is available at a time'; | ||||
|     } | ||||
|  | ||||
|     public function up(Schema $schema): void | ||||
|     { | ||||
|         $this->addSql('ALTER TABLE chill_main_workflow_entity_step | ||||
|             ADD CONSTRAINT chill_custom_only_one_step_opened | ||||
|                 EXCLUDE ( | ||||
|                     entityworkflow_id WITH = | ||||
|                 ) WHERE (transitionafter IS NULL) | ||||
|                 DEFERRABLE INITIALLY DEFERRED'); | ||||
|     } | ||||
| } | ||||
| @@ -1,459 +1,9 @@ | ||||
| "This program is free software: you can redistribute it and/or modify it under the terms of the <strong>GNU Affero General Public License</strong>": "Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou le modifier selon les termes de la licence <strong>GNU Affero GPL</strong>" | ||||
| User manual: Gebruikershandleiding | ||||
| Search: Zoeken | ||||
| "Search persons, ...": "Zoek personen, ..." | ||||
| Person name: Naam / voornaam persoon | ||||
| Login: Inloggen | ||||
| Logout: Uitloggen | ||||
| Bad credentials.: Een verkeerd wachtwoord of gebruikersnaam werd opgegeven. | ||||
| Invalid CSRF token.: Uw sessie is verlopen. | ||||
| Search: Zoek | ||||
| 'Search persons, ...': 'Zoek persoons, ...' | ||||
| Search a person: Zoek een persoon | ||||
| Login: Log in | ||||
| Logout: Log out | ||||
| Username: Gebruikersnaam | ||||
| username: gebruikersnaam | ||||
| Password: Wachtwoord | ||||
| Welcome to %installation_name%: Welkom bij %installation_name% | ||||
| Login to %installation_name%: Inloggen op %installation_name% | ||||
| Enabled: Ingeschakeld | ||||
| enabled: ingeschakeld | ||||
| disabled: uitgeschakeld | ||||
| Disabled: Uitgeschakeld | ||||
| Id: Id | ||||
| Homepage: Hoofdpagina | ||||
| Welcome: Welkom | ||||
| Export Menu: Export | ||||
| Admin Menu: Admin menu | ||||
| Details: Details | ||||
| yes: ja | ||||
| no: nee | ||||
| valid: geldig | ||||
| Valid: Geldig | ||||
| Not valid: Ongeldig | ||||
| not valid: ongeldig | ||||
| Confirm: Bevestigen | ||||
| Cancel: Annuleren | ||||
| Save: Opslaan | ||||
| This form contains errors: Dit formulier bevat fouten | ||||
| Choose an user: Kies een gebruiker | ||||
| "You are going to leave a page with unsubmitted data. Are you sure you want to leave ?": "U verlaat een pagina waarvan de gegevens niet werden opgeslagen. Bent u zeker deze pagina te willen verlaten?" | ||||
| No value: Geen informatie | ||||
| Last updated by: Laatste update door | ||||
| on: "op " | ||||
| Last updated on: Laatste update op | ||||
| by_user: "door " | ||||
|  | ||||
| Edit: Bewerken | ||||
| Update: Updaten | ||||
| Back to the list: Terug naar overzicht | ||||
|  | ||||
| #interval | ||||
| Years: Jaren | ||||
|  | ||||
| # misc date | ||||
| Since %date%: Sinds %date% | ||||
| since %date%: sinds %date% | ||||
| Until %date%: Tot %date% | ||||
| until %date%: tot %date% | ||||
| Since: Sinds | ||||
| Until: Tot | ||||
| #elements used in software | ||||
| centers: centra | ||||
| Centers: Centra | ||||
| comment: opmerkingen | ||||
| Comment: Opmerkingen | ||||
| Pinned comment: Gepinde opmerking | ||||
| Any comment: Geen opmerkingen | ||||
| Read more: Meer lezen | ||||
|  | ||||
| # comment embeddable | ||||
| No comment associated: Geen opmerkingen | ||||
|  | ||||
| #pagination | ||||
| Previous: Vorige | ||||
| Next: Volgende | ||||
|  | ||||
| #addresses | ||||
| Street address1: Adres regel 1 | ||||
| Street address2: Adres regel 2 | ||||
| Postal code: Postcode | ||||
| Valid from: Geldig vanaf | ||||
| Choose a postal code: Kies een postcode | ||||
| address: | ||||
|   address_homeless: Betreft dit een domicilie adres ? | ||||
|   real address: Domicilie adres | ||||
|   consider homeless: Dit adres is onvolledig | ||||
| address more: | ||||
|   floor: verd. | ||||
|   corridor: gang | ||||
|   steps: trap | ||||
|   flat: appart. | ||||
|   buildingName: residentie | ||||
|   extra: "" | ||||
|   distribution: cedex | ||||
| Create a new address: Maak een nieuw adres aan | ||||
| Create an address: Maak een adres aan | ||||
| Update address: Bewerk het adres | ||||
| City or postal code: Stad of postcode | ||||
|  | ||||
| # contact | ||||
| Part of the phonenumber: Deel van het telefoonnummer | ||||
|  | ||||
| #serach | ||||
| Your search is empty. Please provide search terms.: De zoekopdracht is leeg. Gelieve een zoekterm op te geven. | ||||
| The domain %domain% is unknow. Please check your search.: Het zoekgebied "%domain%" is ongekend. Gelieve uw zoekopdracht te verifiëren. | ||||
| Invalid terms: Ongeldige zoekopdracht | ||||
| You should not have more than one domain.: Gelieve slechts één zoekgebied op te geven. | ||||
| #used for page title | ||||
| Search %pattern%: Zoek "%pattern%" | ||||
| Results %start%-%end% of %total%: Resultaten %start%-%end% van %total% | ||||
| See all results: Alle resultaten zien | ||||
| Advanced search: Geavanceerde zoekopdracht | ||||
| results: resultaten | ||||
|  | ||||
| # timeline | ||||
| Global timeline: Globale tijdslijn | ||||
|  | ||||
| #admin | ||||
| Create: Aanmaken | ||||
| show: bekijken | ||||
| Show: Bekijken | ||||
| edit: bewerken | ||||
| Main admin menu: Hoofdmenu admin | ||||
| Actions: Acties | ||||
| Users and permissions: Gebruikers en rechten | ||||
| Location and location type: Vestigingen en vestiging types | ||||
|  | ||||
| #permissions | ||||
| Permissions Menu: Beheer rechten | ||||
| Permissions management of your chill installation: Beheer rechten voor deze Chill installatie. | ||||
|  | ||||
| #location | ||||
| Location Menu: Vestigingen en vestiging types | ||||
| Management of location: Beheer vestigingen en vestiging types | ||||
|  | ||||
| #admin section | ||||
| "Administration interface": Admin paneel | ||||
| Welcome to the admin section !: > | ||||
|   Welkom op het admin paneel ! | ||||
|  | ||||
| #admin section for center's administration | ||||
| Create a new center: Maak een nieuw centrum aan | ||||
| Center list: Overzicht centra | ||||
| Center edit: Bewerk een centrum | ||||
| Center creation: Aanmaak centrum | ||||
| New center: Nieuw centrum | ||||
| Center: Centrum | ||||
|  | ||||
| #admin section for permissions group | ||||
| Permissions group list: Groepsrechten | ||||
| Create a new permissions group: Maak een nieuw groepsrecht aan | ||||
| Permission group "%name%": Groepsrecht "%name%" | ||||
| Grant those permissions: Rechten toekennen | ||||
| Which implies: Wat impliceert | ||||
| Permission group: Groepsrecht | ||||
| Permissionsgroup: Groepsrecht | ||||
| New permission group: Nieuw groepsrecht | ||||
| PermissionsGroup "%name%" edit: Bewerk groepsrecht '%name%' | ||||
| Role: Rol | ||||
| Choose amongst roles: Kies een rol | ||||
| Add permission: Rechten toevoegen | ||||
| This group does not provide any permission: Deze groep kent geen rechten toe. | ||||
| The role '%role%' has been removed: De rol "%role%" werd verwijdert uit dit groepsrecht. | ||||
| The role '%role%' on circle '%scope%' has been removed: De rol "%role%" binnen de cirkel "%scope%" werd verwijdert uit dit groepsrecht. | ||||
|  | ||||
| #admin section for users | ||||
| User edit: Gebruiker bewerken | ||||
| User'status: Gebruikersstatuut | ||||
| Disabled, the user is not allowed to login: Uitgeschakeld, de gebruiker krijgt geen toestemming om in te loggen. | ||||
| Enabled, the user is active: Ingeschakeld, de gebruiker kan zich inloggen. | ||||
| Edit password: Wachtwoord aanpassen | ||||
| Repeat the password: Wachtwoord herhalen | ||||
| Permissions granted: Rechten toegekend | ||||
| Any permissions granted to this user: Geen enkele rechten werden toegekend aan deze gebruiker | ||||
| Grant new permissions: Rechten toevoegen | ||||
| Add a new groupCenter: Rechten toevoegen | ||||
| The permissions have been successfully added to the user: De rechten werden toegekend aan de gebruiker | ||||
| The permissions where removed.: De rechten werden verwijdert voor dze gebruiker | ||||
| Center & groups: Centra en groepen | ||||
| User %username%: Gebruiker %username% | ||||
| Add a new user: Nieuwe gebruiker toevoegen | ||||
| The permissions have been added: De rechten werden toegevoegd | ||||
| Edit password for %username%: Wachtwoord voor %username% aanpassen | ||||
| Change password: Wachtwoord aanpassen | ||||
| Back to the user edition: Terugkeren naar bewerkingsformulier | ||||
| Password successfully updated!: Wachtwoord opgeslagen | ||||
| Flags: Vlaggen | ||||
|  | ||||
| # admin section for users jobs | ||||
| User jobs: Beroepen | ||||
|  | ||||
| # user page for current location | ||||
| Current location: Huidige vestiging | ||||
| Edit my current location: Mijn huidige vestiging bewerken | ||||
| Change current location: CMijn huidige vestiging vernanderen | ||||
| Set a location: Een vestiging instellen | ||||
| Current location successfully updated: Huidige vestiging werd opgeslagen | ||||
| Pick a location: Kies een vestiging. | ||||
|  | ||||
| #admin section for circles (old: scopes) | ||||
| List circles: Cirkels | ||||
| New circle: Nieuwe cirkel | ||||
| Circle: Cirkel | ||||
| Circle edit: Cirkel bewerken | ||||
| Circle creation: Cirkel aanmaken | ||||
| Create a new circle: Nieuwe cirkel aanmaken | ||||
|  | ||||
| #admin section for location | ||||
| Location: Vestigingen | ||||
| Location type list: Vestiging types | ||||
| Create a new location type: Nieuwe type vestiging aanmaken | ||||
| Available for users: Beschikbaar voor gebruikers | ||||
| Editable by users: Bewerkbaar door gebruikers | ||||
| Address required: Adres vereist? | ||||
| Contact data: Contactgegevens? | ||||
| optional: optioneel | ||||
| required: vereist | ||||
| never: nooit | ||||
| Create a new location: Nieuwe vestiging aanmaken | ||||
| Location list: Overzicht vestigingen | ||||
| Location type: Type vestiging | ||||
| Phonenumber1: Telefoonnummer 1 | ||||
| Phonenumber2: Telefoonnummer 2 | ||||
| Configure location and location type: Configureer vestigingen en types vestiging | ||||
| Default for: Standaard vestiging | ||||
| none: geen | ||||
| person: gebruiker | ||||
| thirdparty: externe partner | ||||
|  | ||||
| # circles / scopes | ||||
| Choose the circle: Kies een cirkel | ||||
| Scopes: Diensten | ||||
|  | ||||
| #export | ||||
|  | ||||
| # export creation step 0 : list of exports | ||||
| Exports list: Overzicht rapporten | ||||
| Create an export: Maak een rapport aan | ||||
| #export creation step 'center' : pick a center | ||||
| Pick centers: Kies centra | ||||
| Pick a center: Kies een centrum | ||||
| The export will contains only data from the picked centers.: het rapport zal enkel data bevatten voor het geselecteerde centrum. | ||||
| This will eventually restrict your possibilities in filtering the data.: De filterkeuzes zullen worden aangepast aan de rechten tot raadpleging van de geselecteerde centra. | ||||
| Go to export options: Ga naar de rapport opties | ||||
| Pick aggregated centers: Hergroepering centra | ||||
| # export creation step 'export' : choose aggregators, filtering and formatter | ||||
| Formatter: Formateren | ||||
| Choose the formatter: Kies het gewenste formaat voor dit rapport. | ||||
| Export parameters: Rapport parameters | ||||
| Filters: Filters | ||||
| Aggregators: Aggregaten | ||||
| Go to formatter options: Naar de formateeropties | ||||
| Choose a format: Kies een formaat | ||||
| #export creation step 'formatter' : choose formatter option | ||||
| Generate the report: Rapport genereren | ||||
| No options availables. Your report is fully configured.: Geen beschikbare opties. Dit rapport werd volledig geconfigureerd. | ||||
| Ungrouped exports: Overige expor | ||||
|  | ||||
| #export download | ||||
| Download export: Téléchargement du rapport | ||||
| Waiting for your report: En attente de votre rapport | ||||
| Download your report: Télécharger votre rapport | ||||
| Problem during download: Problème durant le téléchargement | ||||
| # sans valeur | ||||
| without data: sans valeur | ||||
|  | ||||
| #CSV List Formatter | ||||
| Add a number on first column: La première colonne est un numéro | ||||
| Number: Numéro | ||||
| # the label which appears in the UI | ||||
| CSV vertical list: Liste verticale au format CSV | ||||
| CSV horizontal list: Liste horizontale au format CSV | ||||
| Spreadsheet list formatter (.xlsx, .ods): Liste au format tableur (.xlsx, .ods) | ||||
| Order: Ordre | ||||
| Position: Position | ||||
| row: ligne | ||||
| column: colonne | ||||
| Comma separated values (CSV): Valeurs séparées par des virgules (CSV - tableur) | ||||
|  | ||||
| # spreadsheet formatter | ||||
| Choose the format: Choisir le  format | ||||
|  | ||||
| # select2 | ||||
| "select2.no_results": Aucun résultat | ||||
| "select2.error_loading": Erreur de chargement des résultats | ||||
| "select2.searching": Recherche en cours... | ||||
|  | ||||
| # change password | ||||
| Change my password: Modification du mot de passe | ||||
| Your actual password: Mot de passe actuel | ||||
|  | ||||
| # recover password | ||||
| Forgot your password ?: Mot de passe oublié ? | ||||
| Recover password: Remplacement du mot de passe | ||||
| Username or email: Nom d'utilisateur ou email | ||||
| Request recover: Demande de remplacement | ||||
| Check your email: Vérifiez votre courriel | ||||
| An email has been sent to your address. Click on the link inside this email to confirm that you are the owner of this account.: Un courriel a été envoyé à votre adresse. Cliquez sur le lien de cet email pour confirmer que vous êtes bien le propriétaire de ce compte. | ||||
| You requested to recover your password: Vous avez demandé à renouveler votre mot de passe. | ||||
| Click on the link below to recover your password: Cliquez sur le lien ci-dessous pour re-générer votre mot de passe | ||||
| Regards,: Cordialement, | ||||
| Your administrator: Votre administrateur | ||||
| Recover your password: Regénération du mot de passe | ||||
| New password set: Le nouveau mot de passe est enregistré | ||||
| Your password has been set.: Votre mot de passe a été changé. | ||||
| Log in with your new password: Connectez-vous avec votre nouveau mot de passe | ||||
|  | ||||
| # impersonate | ||||
| Exit impersonation: Retour Administrateur | ||||
| Impersonate: Incarner l'utilisateur | ||||
| Impersonate mode: Mode fantôme | ||||
|  | ||||
| crud: | ||||
|   # general items | ||||
|   new: | ||||
|     button_action_form: Créer | ||||
|     link_edit: Modifier | ||||
|     save_and_close: Créer & fermer | ||||
|     save_and_show: Créer & voir | ||||
|     save_and_new: Créer & nouveau | ||||
|     success: Les données ont été créées | ||||
|   edit: | ||||
|     button_action_form: Enregistrer | ||||
|     back_to_view: Voir | ||||
|     save_and_close: Enregistrer & fermer | ||||
|     save_and_show: Enregistrer & voir | ||||
|     success: Les données ont été modifiées | ||||
|   delete: | ||||
|     success: Les données ont été supprimées | ||||
|     link_to_form: Supprimer | ||||
|   default: | ||||
|     success: Les données ont été enregistrées | ||||
|   view: | ||||
|     link_duplicate: Dupliquer | ||||
|   admin_user: | ||||
|     index: | ||||
|       title: Utilisateurs | ||||
|       add_new: Créer | ||||
|   admin_user_job: | ||||
|     index: | ||||
|       title: Métiers | ||||
|       add_new: Créer | ||||
|     title_new: Nouveau métier | ||||
|     title_edit: Modifier un métier | ||||
|   main_location_type: | ||||
|     title_new: Nouveau type de localisation | ||||
|     title_edit: Modifier un type de localisation | ||||
|   main_location: | ||||
|     title_new: Nouvelle localisation | ||||
|     title_edit: Modifier une localisation | ||||
|  | ||||
| No entities: Aucun élément | ||||
|  | ||||
| CHILL_FOO_SEE: Voir un élément | ||||
| CHILL_FOO_EDIT: Modifier un élément | ||||
|  | ||||
| #Show templates | ||||
| Date: Date | ||||
| By: Par | ||||
| For: Pour | ||||
| Created for: Créé pour | ||||
| Created by: Créé par | ||||
| Created on: Créé le | ||||
|  | ||||
|  | ||||
| # Workflows 💊 | ||||
| Workflow: Workflow — chemin de décision | ||||
| Workflow n°%id%: 'Workflow (n°%id%)' | ||||
| workflow_: Workflow | ||||
| target: ' (cible)' | ||||
| Decision: Décision | ||||
| Join a comment: Laisser un commentaire | ||||
| Follow workflow: Suivre la décision | ||||
| Workflow history: Historique de la décision | ||||
|  | ||||
| workflow: | ||||
|     Created by: Créé par | ||||
|     My decision: Ma décision | ||||
|     Next step: Prochaine étape | ||||
|     dest for next steps: Utilisateurs qui valideront la prochaine étape | ||||
|     Freeze: Geler | ||||
|     Freezed: Gelé | ||||
|     freezed document: Le document est gelé | ||||
|     The associated element will be freezed: L'élément associé sera gelé et ne pourra plus être modifié après cette décision. | ||||
|     Finalize: Étape finale | ||||
|     The workflow will be finalized: Le suivi est clôturé lors de cette décision. | ||||
|     No transitions: Aucune transition | ||||
|     Comment added: Commentaire ajouté | ||||
|     This workflow is finalized: Ce suivi est finalisé. | ||||
|     You are not allowed to apply a transition on this workflow: Vous n'êtes pas autorisé à appliquer une décision pour ce suivi | ||||
|     Only those users are allowed: Seuls ces utilisateurs sont autorisés | ||||
|     My workflows: Mes workflows | ||||
|     No workflow: Aucun workflow | ||||
|     Evaluation (n°%eval%): "Évaluation (n°%eval%)" | ||||
|     Document (n°%doc%): "Document (n°%doc%)" | ||||
|     Work (n°%w%): "Action d'accompagnement (n°%w%)" | ||||
|     subscribed: Workflows suivis | ||||
|     dest: Workflows en attente d'action | ||||
|     you subscribed to all steps: Vous recevrez une notification à chaque étape | ||||
|     you subscribed to final step: Vous recevrez une notification à l'étape finale | ||||
|     Current step: Étape actuelle | ||||
|     Comment on last change: Commentaire à la transition précédente | ||||
|     Users allowed to apply transition: Utilisateurs pouvant valider cette étape | ||||
|     Workflow deleted with success: Le workflow a été supprimé | ||||
|     Delete workflow ?: Supprimer le workflow ? | ||||
|     Are you sure you want to delete this workflow ?: Êtes-vous sûr·e de vouloir supprimer ce workflow ? | ||||
|     Delete workflow: Supprimer le workflow | ||||
|     Steps is not waiting for transition. Maybe someone apply the transition before you ?: L'étape que vous cherchez a déjà été modifiée par un autre utilisateur. Peut-être quelqu'un a-t-il modifié cette étape avant vous ? | ||||
|     You get access to this step: Vous avez acquis les droits pour appliquer une transition sur ce workflow. | ||||
|     Those users are also granted to apply a transition by using an access key: Ces utilisateurs peuvent également valider cette étape, grâce à un lien d'accès | ||||
|     dest by email: Liens d'autorisation par email | ||||
|     dest by email help: Les adresses email mentionnées ici recevront un lien d'accès. Ce lien d'accès permettra à l'utilisateur de valider cette étape. | ||||
|     Add an email: Ajouter une adresse email | ||||
|     Remove an email: Enlever cette adresse email | ||||
|     Any email: Aucune adresse email | ||||
|     Previous dest without reaction: Workflows clotûrés après action d'un autre utilisateur | ||||
|     Previous workflow without reaction help: Liste des workflows où vous avez été cité comme pouvant réagir à une étape, mais où un autre utilisateur a exécuté une action avant vous. | ||||
|     Previous transitionned: Anciens workflows | ||||
|     Previous workflow transitionned help: Workflows où vous avez exécuté une action. | ||||
|     For: Pour | ||||
|  | ||||
|  | ||||
| Subscribe final: Recevoir une notification à l'étape finale | ||||
| Subscribe all steps: Recevoir une notification à chaque étape | ||||
|  | ||||
| notification: | ||||
|     Notification: Notification | ||||
|     Notifications: Notifications | ||||
|     My own notifications: Mes notifications | ||||
|     Notify: Envoyer une notification | ||||
|     Send: Envoyer | ||||
|     Edit notification: Modifier une notification | ||||
|     Notification created: Notification envoyée | ||||
|     Notification updated: La notification a été mise à jour | ||||
|     Any notification received: Aucune notification reçue | ||||
|     Any notification sent: Aucune notification envoyée | ||||
|     Notifications received: Notifications reçues | ||||
|     Notifications sent: Notifications envoyées | ||||
|     comment_appended: Commentaire ajouté | ||||
|     append_comment: Ajouter un commentaire | ||||
|     comment_updated: Commentaire mis à jour | ||||
|     comments_list: Fil de commentaires | ||||
|     show notification from %sender%: Voir la notification de %sender% | ||||
|     is_unread: Non-lue | ||||
|     is_system: notification automatique | ||||
|     list: Notifications | ||||
|     Sent: Envoyé | ||||
|     to: À | ||||
|     sent_to: Destinataire(s) | ||||
|     from: De | ||||
|     received_from: Expéditeur | ||||
|     you were notified by %sender%:  Vous avez été notifié par %sender% | ||||
|     you were notified by system: Vous avez été notifié automatiquement | ||||
|     subject: Objet | ||||
|     see_comments_thread: Voir le fil de commentaires associé | ||||
|     object_prefix: "[CHILL] notification - " | ||||
|     dest by email: Lien d'accès par email | ||||
|     Any email: Aucun email | ||||
|     Add an email: Ajouter un email | ||||
|     dest by email help: Les adresses email mentionnées ici recevront un lien d'accès. Un compte utilisateur sera toujours nécessaire. | ||||
|     Remove an email: Supprimer l'adresse email | ||||
|     Email with access link: Adresse email ayant reçu un lien d'accès | ||||
|  | ||||
| Password: Wachtworrd | ||||
| Login to %installation_name%: Log in bij %installation_name% | ||||
| Welcome to %installation_name%: Welkom bij %installation_name% | ||||
| @@ -177,7 +177,7 @@ class AccompanyingCourseController extends Controller | ||||
|      */ | ||||
|     public function editAction(AccompanyingPeriod $accompanyingCourse): Response | ||||
|     { | ||||
|         $this->denyAccessUnlessGranted(AccompanyingPeriodVoter::EDIT, $accompanyingCourse); | ||||
|         $this->denyAccessUnlessGranted(AccompanyingPeriodVoter::SEE, $accompanyingCourse); | ||||
|  | ||||
|         return $this->render('@ChillPerson/AccompanyingCourse/edit.html.twig', [ | ||||
|             'accompanyingCourse' => $accompanyingCourse, | ||||
| @@ -215,7 +215,7 @@ class AccompanyingCourseController extends Controller | ||||
|         // get persons without household | ||||
|         $withoutHousehold = []; | ||||
|  | ||||
|         foreach ($accompanyingCourse->getCurrentParticipations() as $p) { | ||||
|         foreach ($accompanyingCourse->getParticipations() as $p) { | ||||
|             if (false === $p->getPerson()->isSharingHousehold()) { | ||||
|                 $withoutHousehold[] = $p->getPerson(); | ||||
|             } | ||||
|   | ||||
| @@ -36,49 +36,49 @@ class Comment implements TrackCreationInterface, TrackUpdateInterface | ||||
|      * inversedBy="comments") | ||||
|      * @ORM\JoinColumn(nullable=false, onDelete="CASCADE") | ||||
|      */ | ||||
|     private ?AccompanyingPeriod $accompanyingPeriod; | ||||
|     private $accompanyingPeriod; | ||||
|  | ||||
|     /** | ||||
|      * @ORM\Column(type="text") | ||||
|      * @Groups({"read", "write", "docgen:read"}) | ||||
|      * @Groups({"read", "write"}) | ||||
|      * @Assert\NotBlank | ||||
|      * @Assert\NotNull | ||||
|      */ | ||||
|     private ?string $content; | ||||
|     private $content; | ||||
|  | ||||
|     /** | ||||
|      * @ORM\Column(type="datetime") | ||||
|      * @Groups({"read", "docgen:read"}) | ||||
|      * @Groups({"read"}) | ||||
|      */ | ||||
|     private ?DateTimeInterface $createdAt; | ||||
|     private $createdAt; | ||||
|  | ||||
|     /** | ||||
|      * @ORM\ManyToOne(targetEntity=User::class) | ||||
|      * @ORM\JoinColumn(nullable=false) | ||||
|      * @Groups({"read", "docgen:read"}) | ||||
|      * @Groups({"read"}) | ||||
|      */ | ||||
|     private ?User $creator; | ||||
|     private $creator; | ||||
|  | ||||
|     /** | ||||
|      * @ORM\Id | ||||
|      * @ORM\GeneratedValue | ||||
|      * @ORM\Column(type="integer") | ||||
|      * @Groups({"read", "docgen:read"}) | ||||
|      * @Groups({"read"}) | ||||
|      */ | ||||
|     private ?int $id; | ||||
|     private $id; | ||||
|  | ||||
|     /** | ||||
|      * @ORM\Column(type="datetime") | ||||
|      * @Groups({"read"}) | ||||
|      */ | ||||
|     private ?DateTimeInterface $updatedAt; | ||||
|     private $updatedAt; | ||||
|  | ||||
|     /** | ||||
|      * @ORM\ManyToOne(targetEntity=User::class) | ||||
|      * @ORM\JoinColumn(nullable=false) | ||||
|      * @Groups({"read"}) | ||||
|      */ | ||||
|     private ?User $updatedBy; | ||||
|     private $updatedBy; | ||||
|  | ||||
|     public function getAccompanyingPeriod(): ?AccompanyingPeriod | ||||
|     { | ||||
|   | ||||
| @@ -14,7 +14,6 @@ namespace Chill\PersonBundle\Entity\Household; | ||||
| use ArrayIterator; | ||||
| use Chill\MainBundle\Entity\Address; | ||||
| use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable; | ||||
| use Chill\PersonBundle\Entity\Person; | ||||
| use Chill\PersonBundle\Validator\Constraints\Household\MaxHolder; | ||||
| use DateTime; | ||||
| use DateTimeImmutable; | ||||
| @@ -355,12 +354,7 @@ class Household | ||||
|         return $this->members; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * get all the members during a given membership. | ||||
|      * | ||||
|      * @return Collection|HouseholdMember[] | ||||
|      */ | ||||
|     public function getMembersDuringMembership(HouseholdMember $membership): Collection | ||||
|     public function getMembersDuringMembership(HouseholdMember $membership) | ||||
|     { | ||||
|         return $this->getMembersOnRange( | ||||
|             $membership->getStartDate(), | ||||
| @@ -447,28 +441,6 @@ class Household | ||||
|         return $this->getNonCurrentMembers($now)->matching($criteria); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * get all the unique persons during a given membership. | ||||
|      * | ||||
|      * same as @see(self::getMembersDuringMembership}, except that the collection is filtered to | ||||
|      * return unique members. | ||||
|      * | ||||
|      * @return Collection|Person[] | ||||
|      */ | ||||
|     public function getPersonsDuringMembership(HouseholdMember $member): Collection | ||||
|     { | ||||
|         // make list unique | ||||
|         $membersByHash = []; | ||||
|  | ||||
|         foreach ($this->getMembersDuringMembership($member) as $m) { | ||||
|             if (null !== $m && null !== $m->getPerson()) { | ||||
|                 $membersByHash[spl_object_hash($m->getPerson())] = $m->getPerson(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return new ArrayCollection(array_values($membersByHash)); | ||||
|     } | ||||
|  | ||||
|     public function getPreviousAddressOf(Address $address): ?Address | ||||
|     { | ||||
|         $iterator = new ArrayIterator($this->getAddressesOrdered()); | ||||
|   | ||||
| @@ -1184,7 +1184,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @deprecated Use @see{Person::getCurrentPersonAddress} or @see{Person::getCurrentHouseholdAddress} instead | ||||
|      * @deprecated Use `getCurrentPersonAddress` instead | ||||
|      * | ||||
|      * @throws Exception | ||||
|      * | ||||
| @@ -1192,9 +1192,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI | ||||
|      */ | ||||
|     public function getLastAddress(?DateTime $from = null) | ||||
|     { | ||||
|         return $this->getCurrentHouseholdAddress( | ||||
|             null !== $from ? DateTimeImmutable::createFromMutable($from) : null | ||||
|         ); | ||||
|         return $this->getCurrentPersonAddress(); | ||||
|     } | ||||
|  | ||||
|     public function getLastName(): string | ||||
|   | ||||
| @@ -11,7 +11,6 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace Chill\PersonBundle\EventListener; | ||||
|  | ||||
| use Chill\MainBundle\Entity\User; | ||||
| use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork; | ||||
| use Symfony\Component\Security\Core\Security; | ||||
|  | ||||
| @@ -26,8 +25,10 @@ class AccompanyingPeriodWorkEventListener | ||||
|  | ||||
|     public function prePersistAccompanyingPeriodWork(AccompanyingPeriodWork $work): void | ||||
|     { | ||||
|         if ($this->security->getUser() instanceof User) { | ||||
|             $work->addReferrer($this->security->getUser()); | ||||
|         $referrer = $work->getAccompanyingPeriod()->getUser(); | ||||
|  | ||||
|         if (null !== $referrer) { | ||||
|             $work->addReferrer($referrer); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <div class="alert alert-warning alert-with-actions"> | ||||
|     <div class="float-button bottom"> | ||||
|         <div class="box"> | ||||
|             {% if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_UPDATE', accompanyingCourse) %} | ||||
|  | ||||
|             <div class="action"> | ||||
|                 <ul class="record_actions"> | ||||
|                     <li> | ||||
| @@ -13,8 +13,6 @@ | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|             {% endif %} | ||||
|  | ||||
|             <p>{{ 'Some peoples does not belong to any household currently. Add them to an household soon'|trans }}</p> | ||||
|         </div> | ||||
|     </div> | ||||
|   | ||||
| @@ -3,7 +3,6 @@ | ||||
| <div class="alert alert-danger {% if hasPersonLocation %}alert-with-actions{% endif %}"> | ||||
|     <div class="float-button bottom"> | ||||
|         <div class="box"> | ||||
|             {% if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_UPDATE', accompanyingCourse) %} | ||||
|             <div class="action"> | ||||
|                 <ul class="record_actions"> | ||||
|                     <li> | ||||
| @@ -15,7 +14,6 @@ | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|             {% endif %} | ||||
|                 <p> | ||||
|             {{ 'This course is located at a temporarily address. You should locate this course to an user'|trans }}</p> | ||||
|             {% if not hasPersonLocation %} | ||||
|   | ||||
| @@ -48,66 +48,13 @@ | ||||
| {% endmacro %} | ||||
|  | ||||
| {% block content %} | ||||
|  | ||||
|     {# WARNING: this list is rendered in either person context or houshold context #} | ||||
|  | ||||
|     {%- set acps = [] %} | ||||
|     {%- set acpsClosed = [] %} | ||||
|     {% for acp in accompanying_periods %} | ||||
|         {% if acp.step == 'CLOSED' or (person is defined and acp.requestorPerson is not same as(person) and acp.openParticipationContainsPerson(person) is null ) %} | ||||
|             {%- set acpsClosed = acpsClosed|merge([acp]) %} | ||||
|         {% else %} | ||||
|             {%- set acps = acps|merge([acp]) %} | ||||
|         {% endif %} | ||||
|     {% endfor %} | ||||
|  | ||||
|     <div class="flex-table accompanyingcourse-list"> | ||||
|         {% for period in acps %} | ||||
|         {% for period in accompanying_periods %} | ||||
|  | ||||
|             {% include 'ChillPersonBundle:AccompanyingPeriod:_list_item.html.twig' with { | ||||
|                 'recordAction': _self.recordAction(period, contextEntity) | ||||
|             } %} | ||||
|         {% else %} | ||||
|             <p class="chill-no-data-statement">{{ 'Any accompanying periods are open'|trans }}</p> | ||||
|  | ||||
|         {% endfor %} | ||||
|     </div> | ||||
|  | ||||
|     {% if acpsClosed|length > 0 %} | ||||
|         {% if person is defined %} | ||||
|             {% set identifier = person.id %} | ||||
|         {% else  %} | ||||
|             {% set identifier = household.id %} | ||||
|         {% endif %} | ||||
|  | ||||
|         <div class="accordion" id="member_{{ identifier }}"> | ||||
|             <div class="accordion-item"> | ||||
|                 <h2 class="accordion-header" id="heading_{{ identifier }}"> | ||||
|                     <button | ||||
|                         class="accordion-button collapsed" | ||||
|                         type="button" | ||||
|                         data-bs-toggle="collapse" | ||||
|                         data-bs-target="#collapse_{{ identifier }}" | ||||
|                         aria-expanded="false" | ||||
|                         aria-controls="collapse_{{ identifier }}"> | ||||
|                         <span class="folded">{{ 'periods.show closed periods'|trans({ 'nb_items': acpsClosed|length }) }}</span> | ||||
|                         <span class="unfolded text-secondary">{{ 'periods.hide closed periods'|trans({ 'nb_items': acpsClosed|length }) }}</span> | ||||
|                     </button> | ||||
|                 </h2> | ||||
|  | ||||
|                 <div id="collapse_{{ identifier }}" | ||||
|                      class="accordion-collapse collapse" | ||||
|                      aria-labelledby="heading_{{ identifier }}" | ||||
|                      data-bs-parent="#nonCurrent"> | ||||
|  | ||||
|                     <div class="flex-table accompanyingcourse-list"> | ||||
|                         {% for period in acpsClosed %} | ||||
|                             {% include 'ChillPersonBundle:AccompanyingPeriod:_list_item.html.twig' with { | ||||
|                                 'recordAction': _self.recordAction(period, contextEntity) | ||||
|                             } %} | ||||
|                         {% endfor %} | ||||
|                     </div> | ||||
|  | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     {% endif %} | ||||
| {% endblock content %} | ||||
|   | ||||
| @@ -180,16 +180,10 @@ | ||||
|               {% if members|length > 0 %} | ||||
|                 <div class="flex-table list-household-members"> | ||||
|                   {% for m in members %} | ||||
|                     {% if m.position.shareHousehold %} | ||||
|                       {% include '@ChillPerson/Household/_render_member.html.twig' with { | ||||
|                           'member': m, | ||||
|                           'customButtons': { 'before': _self.customButtons(m, household) } | ||||
|                       } %} | ||||
|                     {% else %} | ||||
|                         {% include '@ChillPerson/Household/_render_member.html.twig' with { | ||||
|                           'member': m, | ||||
|                       } %} | ||||
|                     {% endif %} | ||||
|                   {% endfor %} | ||||
|                 </div> | ||||
|               {% else %} | ||||
|   | ||||
| @@ -65,18 +65,18 @@ | ||||
|                     <h3>{{ 'household.Members at same time'|trans }}</h3> | ||||
|                 </div> | ||||
|                 <div class="wl-col list"> | ||||
|                     {% set simultaneous = p.household.getPersonsDuringMembership(p) %} | ||||
|                     {% set simultaneous = p.household.getMembersDuringMembership(p) %} | ||||
|                     {% if simultaneous|length == 0 %} | ||||
|                         <p class="chill-no-data-statement"> | ||||
|                             {{ 'household.Any simultaneous members'|trans }} | ||||
|                         </p> | ||||
|                     {% else %} | ||||
|                         {% for person in simultaneous -%} | ||||
|                         {% for m in simultaneous -%} | ||||
|                             {% include '@ChillMain/OnTheFly/_insert_vue_onthefly.html.twig' with { | ||||
|                                 action: 'show', displayBadge: true, | ||||
|                                 targetEntity: { name: 'person', id: person.id }, | ||||
|                                 buttonText: person|chill_entity_render_string, | ||||
|                                 isDead: person.deathdate is not null | ||||
|                                 targetEntity: { name: 'person', id: m.person.id }, | ||||
|                                 buttonText: m.person|chill_entity_render_string, | ||||
|                                 isDead: m.person.deathdate is not null | ||||
|                             } %} | ||||
|                         {%- endfor -%} | ||||
|                     {% endif %} | ||||
|   | ||||
| @@ -1,15 +1,13 @@ | ||||
| {% macro button_person_after(person) %} | ||||
|     {% set household = person.getCurrentHousehold %} | ||||
|     {% if household is not null and is_granted('CHILL_PERSON_HOUSEHOLD_SEE', household) %} | ||||
|     {% if household is not null %} | ||||
|         <li> | ||||
|             <a href="{{ path('chill_person_household_summary', { 'household_id': household.id }) }}" class="btn btn-sm btn-chill-beige"><i class="fa fa-home"></i></a> | ||||
|         </li> | ||||
|     {% endif %} | ||||
|     {% if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_CREATE', person) %} | ||||
|         <li> | ||||
|             <a href="{{ path('chill_person_accompanying_course_new', { 'person_id': [ person.id ]}) }}" class="btn btn-sm btn-create change-icon" title="{{ 'Create an accompanying period'|trans }}"><i class="fa fa-random"></i></a> | ||||
|         </li> | ||||
|     {% endif %} | ||||
|     <li> | ||||
|         <a href="{{ path('chill_person_accompanying_course_new', { 'person_id': [ person.id ]}) }}" class="btn btn-sm btn-create change-icon" title="{{ 'Create an accompanying period'|trans }}"><i class="fa fa-random"></i></a> | ||||
|     </li> | ||||
| {% endmacro %} | ||||
|  | ||||
| {% macro accompanying_period(acp, person) %} | ||||
| @@ -235,8 +233,7 @@ | ||||
|                     {%- set acpsClosed = [] %} | ||||
|                     {%- for acp in person.accompanyingPeriodInvolved %} | ||||
|                         {%- if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_SEE', acp) %} | ||||
|                             {# filter for "current" periods: either the person is a requestor, or is member of the period and not closed #} | ||||
|                             {% if acp.step == 'CLOSED' or (acp.requestorPerson is not same as(person) and acp.openParticipationContainsPerson(person) is null ) %} | ||||
|                             {% if acp.step == 'CLOSED' %} | ||||
|                                 {%- set acpsClosed = acpsClosed|merge([acp]) %} | ||||
|                             {% else %} | ||||
|                                 {%- set acps = acps|merge([acp]) %} | ||||
|   | ||||
| @@ -113,7 +113,7 @@ class AccompanyingPeriodVoter extends AbstractChillVoter implements ProvideRoleH | ||||
|             ->generate(self::class) | ||||
|             ->addCheckFor(null, [self::CREATE, self::REASSIGN_BULK]) | ||||
|             ->addCheckFor(AccompanyingPeriod::class, [self::TOGGLE_CONFIDENTIAL, ...self::ALL]) | ||||
|             ->addCheckFor(Person::class, [self::SEE, self::CREATE]) | ||||
|             ->addCheckFor(Person::class, [self::SEE]) | ||||
|             ->build(); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -71,7 +71,6 @@ class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterf | ||||
|         'location' => Address::class, | ||||
|         'locationPerson' => Person::class, | ||||
|         'administrativeLocation' => Location::class, | ||||
|         'pinnedComment' => AccompanyingPeriod\Comment::class, | ||||
|     ]; | ||||
|  | ||||
|     private ClosingMotiveRender $closingMotiveRender; | ||||
| @@ -165,8 +164,6 @@ class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterf | ||||
|                 'location' => $this->normalizer->normalize($period->getLocation(), $format, $addressContext), | ||||
|                 'administrativeLocation' => $this->normalizer->normalize($period->getAdministrativeLocation(), $format, $administrativeLocationContext), | ||||
|                 'works' => $this->normalizer->normalize($period->getWorks(), $format, $workContext), | ||||
|                 'comments' => $this->normalizer->normalize($period->getComments(), $format, array_merge($context, ['docgen:expects' => AccompanyingPeriod\Comment::class])), | ||||
|                 'pinnedComment' => $this->normalizer->normalize($period->getPinnedComment(), $format, array_merge($context, ['docgen:expects' => AccompanyingPeriod\Comment::class])), | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
| @@ -186,7 +183,6 @@ class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterf | ||||
|                     'hasLocationPerson' => false, | ||||
|                     'hasAdministrativeLocation' => false, | ||||
|                     'works' => [], | ||||
|                     'comments' => [], | ||||
|                 ] | ||||
|             ); | ||||
|         } | ||||
|   | ||||
| @@ -13,6 +13,7 @@ namespace Chill\PersonBundle\Tests\Controller; | ||||
|  | ||||
| use Chill\MainBundle\Test\PrepareClientTrait; | ||||
| use DateTime; | ||||
| use Doctrine\ORM\EntityManagerInterface; | ||||
| use Symfony\Bundle\FrameworkBundle\KernelBrowser; | ||||
| use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; | ||||
| use Symfony\Component\DomCrawler\Form; | ||||
| @@ -48,21 +49,21 @@ final class PersonControllerCreateTest extends WebTestCase | ||||
|     public static function tearDownAfterClass(): void | ||||
|     { | ||||
|         self::bootKernel(); | ||||
|         $em = self::$kernel->getContainer()->get('doctrine.orm.entity_manager'); | ||||
|         $em = self::$kernel->getContainer()->get(EntityManagerInterface::class); | ||||
|  | ||||
|         //remove two people created during test | ||||
|         $jesus = $em->getRepository(\Chill\PersonBundle\Entity\Person::class) | ||||
|             ->findOneBy(['firstName' => 'God']); | ||||
|  | ||||
|         if (null !== $jesus) { | ||||
|             $em->remove($jesus); | ||||
|             //$em->remove($jesus); | ||||
|         } | ||||
|  | ||||
|         $jesus2 = $em->getRepository(\Chill\PersonBundle\Entity\Person::class) | ||||
|             ->findOneBy(['firstName' => 'roger']); | ||||
|  | ||||
|         if (null !== $jesus2) { | ||||
|             $em->remove($jesus2); | ||||
|             //$em->remove($jesus2); | ||||
|         } | ||||
|         $em->flush(); | ||||
|     } | ||||
|   | ||||
| @@ -12,6 +12,7 @@ declare(strict_types=1); | ||||
| namespace Chill\PersonBundle\Tests\Controller; | ||||
|  | ||||
| use Chill\MainBundle\Entity\Center; | ||||
| use Chill\MainBundle\Repository\CenterRepository; | ||||
| use Chill\MainBundle\Test\PrepareClientTrait; | ||||
| use Chill\PersonBundle\Entity\Person; | ||||
| use Closure; | ||||
| @@ -60,9 +61,14 @@ final class PersonControllerUpdateTest extends WebTestCase | ||||
|         $this->em = self::$container | ||||
|             ->get(EntityManagerInterface::class); | ||||
|  | ||||
|         $center = $this->em->getRepository(Center::class) | ||||
|         $center = self::$container->get(CenterRepository::class) | ||||
|             ->findOneBy(['name' => 'Center A']); | ||||
|  | ||||
|         var_dump(array_map( | ||||
|             function (Center $c) { return $c->getName(); }, | ||||
|             self::$container->get(CenterRepository::class)->findAll() | ||||
|         )); | ||||
|  | ||||
|         $this->person = (new Person()) | ||||
|             ->setLastName('My Beloved') | ||||
|             ->setFirstName('Jesus') | ||||
|   | ||||
| @@ -135,51 +135,4 @@ final class HouseholdTest extends TestCase | ||||
|         $this->assertEquals(new DateTimeImmutable('2021-12-31'), $second->getStartDate()); | ||||
|         $this->assertEquals(new DateTimeImmutable('2021-12-31'), $inside->getEndDate()); | ||||
|     } | ||||
|  | ||||
|     public function testHouseholdGetPersonsDuringMembership() | ||||
|     { | ||||
|         $household = new Household(); | ||||
|         $person1 = new Person(); | ||||
|         $person2 = new Person(); | ||||
|         $personOut = new Person(); | ||||
|  | ||||
|         $household->addMember( | ||||
|             $member1 = (new HouseholdMember()) | ||||
|                 ->setStartDate(new DateTimeImmutable('2021-01-01')) | ||||
|                 ->setEndDate(new DateTimeImmutable('2021-12-01')) | ||||
|                 ->setPerson($person1) | ||||
|         ); | ||||
|  | ||||
|         $household->addMember( | ||||
|             $member2a = (new HouseholdMember()) | ||||
|                 ->setStartDate(new DateTimeImmutable('2021-01-01')) | ||||
|                 ->setEndDate(new DateTimeImmutable('2021-05-01')) | ||||
|                 ->setPerson($person2) | ||||
|         ); | ||||
|  | ||||
|         $household->addMember( | ||||
|             $member2b = (new HouseholdMember()) | ||||
|                 ->setStartDate(new DateTimeImmutable('2021-11-01')) | ||||
|                 ->setEndDate(new DateTimeImmutable('2022-06-01')) | ||||
|                 ->setPerson($person2) | ||||
|         ); | ||||
|  | ||||
|         $household->addMember( | ||||
|             $memberOut = (new HouseholdMember()) | ||||
|                 ->setStartDate(new DateTimeImmutable('2019-01-01')) | ||||
|                 ->setEndDate(new DateTimeImmutable('2019-12-01')) | ||||
|                 ->setPerson($personOut) | ||||
|         ); | ||||
|  | ||||
|         $this->assertCount(0, $household->getPersonsDuringMembership($memberOut)); | ||||
|  | ||||
|         $this->assertCount(1, $household->getPersonsDuringMembership($member1)); | ||||
|         $this->assertContains($person2, $household->getPersonsDuringMembership($member1)); | ||||
|  | ||||
|         $this->assertCount(1, $household->getPersonsDuringMembership($member2a)); | ||||
|         $this->assertContains($person1, $household->getPersonsDuringMembership($member2a)); | ||||
|  | ||||
|         $this->assertCount(1, $household->getPersonsDuringMembership($member2b)); | ||||
|         $this->assertContains($person1, $household->getPersonsDuringMembership($member2b)); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -68,8 +68,6 @@ final class AccompanyingPeriodDocGenNormalizerTest extends KernelTestCase | ||||
|             'closingMotive' => '@ignored', | ||||
|             'confidential' => true, | ||||
|             'confidentialText' => 'confidentiel', | ||||
|             'comments' => '@ignored', | ||||
|             'pinnedComment' => '@ignored', | ||||
|             'createdAt' => '@ignored', | ||||
|             'createdBy' => '@ignored', | ||||
|             'emergency' => true, | ||||
|   | ||||
| @@ -39,7 +39,6 @@ class RelationshipNoDuplicateValidator extends ConstraintValidator | ||||
|  | ||||
|         $fromPerson = $value->getFromPerson(); | ||||
|         $toPerson = $value->getToPerson(); | ||||
|         $relationType = $value->getRelation(); | ||||
|  | ||||
|         $relationships = $this->relationshipRepository->findBy([ | ||||
|             'fromPerson' => [$fromPerson, $toPerson], | ||||
| @@ -47,11 +46,11 @@ class RelationshipNoDuplicateValidator extends ConstraintValidator | ||||
|         ]); | ||||
|  | ||||
|         foreach ($relationships as $r) { | ||||
|             if ($r->getRelation()->getId() !== $relationType->getId() | ||||
|                 && ($r->getFromPerson() === $fromPerson | ||||
|             if ( | ||||
|                 $r->getFromPerson() === $fromPerson | ||||
|                 || $r->getFromPerson() === $toPerson | ||||
|                 || $r->getToPerson() === $fromPerson | ||||
|                 || $r->getToPerson() === $toPerson) | ||||
|                 || $r->getToPerson() === $toPerson | ||||
|             ) { | ||||
|                 $this->context->buildViolation($constraint->message) | ||||
|                     ->addViolation(); | ||||
|   | ||||
| @@ -1,587 +1,69 @@ | ||||
| Edit: Wijzigen | ||||
| 'First name': Voornaam | ||||
| firstname: voornaam | ||||
| firstName: voornaam | ||||
| 'Last name': Familienaam | ||||
| lastname: familienaam | ||||
| lastName: familienaam | ||||
| Name: Naam | ||||
| First name or Last name: Voornaam of familienaam | ||||
| id: identificatienummer | ||||
| Birthdate: Geboortedatum | ||||
| birthdate: geboortedatum | ||||
| deathdate: sterfdatum | ||||
| Date of death: Sterfdatum | ||||
| 'Date of birth': 'Geboortedatum' | ||||
| dateOfBirth: geboortedatum | ||||
| dateofbirth: geboortedatum | ||||
| 'Unknown date of birth': 'Geboortedatum ongekend' | ||||
| Birthdate before: Geboortedatum voor | ||||
| Birthdate after: Geboortedatum na | ||||
| 'Date of birth': Geboortedatum | ||||
| 'Unknown date of birth': 'Geboortedatum onbekend' | ||||
| Nationality: Nationaliteit | ||||
| nationality: nationaliteit | ||||
| 'Without nationality': 'Zonder nationaliteit' | ||||
| Gender: Gender | ||||
| gender: gender | ||||
| Gender comment: Opmerkingen gender | ||||
| 'Creation date': Aanmaakdatum | ||||
| 'Not given': 'Niet opgegeven' | ||||
| 'Place of birth': 'Geboorteplaats' | ||||
| placeOfBirth: geboorteplaats | ||||
| 'Country of birth': 'Geboorteland' | ||||
| 'Continent of birth': Continent van geboorte | ||||
| countryOfBirth: 'Geboorteland' | ||||
| Gender: Geslacht | ||||
| 'Creation date': Opmaakdatum | ||||
| 'Not given': 'Niet gegeven' | ||||
| 'Place of birth': Geboorteplaats | ||||
| 'Country of birth': Geboorteland | ||||
| 'Unknown country of birth': 'Geboorteland onbekend' | ||||
| 'Marital status': 'Burgerlijke staat' | ||||
| Date of last marital status change: Burgerlijke staat sinds | ||||
| Comment on the marital status: Opmerkingen burgerlijke staat | ||||
| 'Number of children': 'Aantal kinderen' | ||||
| '{0} No child|{1} One child | ]1,Inf] %nb% children': '{0} Geen kinderen|{1} Één kind | ]1,Inf] %nb% kinderen' | ||||
| 'National number': 'Rijksregisternummer' | ||||
| Email: 'Email' | ||||
| Accept emails ?: Accepteert emails? | ||||
| Accept emails: Mag per mail gecontacteerd worden | ||||
| '{0} No child|{1} One child | ]1,Inf] %nb% children': '{0} geen kinderen|{1} 1 kind | ]1,Inf] %nb% kinderen' | ||||
| 'National number': 'Nationale nummer' | ||||
| Email: Emailadres | ||||
| Address: Adres | ||||
| Memo: Mémo | ||||
| Phonenumber: 'Telefoonnummer' | ||||
| phonenumber: telefoonnummer | ||||
| Mobilenumber: 'Gsm nummer' | ||||
| mobilenumber: gsm nummer | ||||
| Accept short text message ?: Persoon geeft toestemming om berichten te ontvangen op dit nummer? | ||||
| Accept short text message: Persoon geeft toestemming om berichten te ontvangen op dit nummer. | ||||
| Other phonenumber: Andere telefoonnummers | ||||
| Others phone numbers: Andere telefoonnummers | ||||
| No additional phone numbers: Geen andere telefoonnummers | ||||
| Description: beschrijving | ||||
| Add new phone: Voeg een nieuw telefoonnummer toe | ||||
| Remove phone: Verwijderen | ||||
| 'Notes on contact information': 'Opmerkingen contactinformatie' | ||||
| 'Remarks': 'Opmerkingen' | ||||
| 'Spoken languages': 'Gesproken talen' | ||||
| 'Unknown spoken languages': 'Gesproken talen ongekend' | ||||
| Memo: Memo | ||||
| Phonenumber: Telefoonnummer | ||||
| '{0} Born the %date% | {1} Born the %date%': '{0} Geboren op %date% | {1} Geboren op %date%' | ||||
| 'Spoken languages': Spreektalen | ||||
| 'Unkown spoken language': 'Spreektalen onbekend' | ||||
| Male: Man | ||||
| Female: Vrouw | ||||
| Neuter: Non-binair | ||||
| man: Man | ||||
| woman: Vrouw | ||||
| neuter: Non-binair | ||||
| Man: Man | ||||
| Woman: Vrouw | ||||
| both: Onbepaald | ||||
| Both: Onbepaald | ||||
| Divorced: Gescheiden | ||||
| Separated: Uit elkaar | ||||
| Widow: Weduwe/weduwnaar | ||||
| 'Unknow marital status': Burgerlijke staat ongekend | ||||
| 'Legal cohabitant': 'Wettelijk samenwonend' | ||||
| Single: Single | ||||
| Married: Getrouwd | ||||
| 'General information': Algemene informatie | ||||
| 'Birth information': Geboortegegevens | ||||
| 'Family information': Familiale gegevens | ||||
| 'Contact information': 'Contactinformatie' | ||||
| 'Administrative information': Administratieve gegevens | ||||
| Course number: Traject n° | ||||
| Civility: Aanspreektitel | ||||
| choose civility: -- | ||||
| All genders: alle genderkeuzes | ||||
| Any person selected: Geen persoon geselecteerd | ||||
|  | ||||
| # dédoublonnage | ||||
| Old person: Dubbel | ||||
| Old person explain: zal verwijdert worden na de samenvoeging | ||||
| New person: Doelpersoon | ||||
| New person explain: zal bewaard worden na de samenvoeging | ||||
| I confirm the merger of these 2 people : Ik bevestig de fusie van deze twee persoonsdossiers. | ||||
| Person duplicate explained: Chill heeft mogelijke duplicaten gedetecteerd! U kunt bevestigen, weigeren, of handmatig een ander duplicaat aanwijzen. | ||||
| Person flaged as duplicate: Dossiers gesignaleerd als vals-positief | ||||
| Person flaged as duplicate explained: De volgende dossiers werden gesignaleerd als vals-positieven en zijn geen duplicaten! | ||||
| Associate manually a duplicate person: Manueel een duplicaat aanduiden | ||||
| Invert: Richting fusie omkeren. | ||||
| Find duplicate: Duplicaten zoeken | ||||
| Person duplicate: Duplicaten behandelen | ||||
| Open in another window: Openen in een nieuw scherm | ||||
| Deleted datas: Gegevens verwijderen | ||||
| Keeped datas: Gegevens bewaren | ||||
| Moved links: Verplaatste relaties | ||||
| Keeped links: Bewaarde relaties | ||||
| Merge duplicate persons folders: Samenvoegen van dossiers | ||||
| Merge: Samenvoegen | ||||
| duplicate: Duplicaat | ||||
| not-duplicate: Vals-positief | ||||
| Switch to truefalse: Aanduiden als vals-positief | ||||
| Switch to duplicate: Aanduiden als een duplicaat | ||||
| No duplicate candidates: Er werden geen duplicaten of vals-positieve dossiers gedetecteerd | ||||
|  | ||||
| # addresses part | ||||
| address_street_address_1: Adres regel 1 | ||||
| address_street_address_2: Adres regel 2 | ||||
| address_valid_from: Begindatum validiteit adres | ||||
| address_postcode_label: Gemeente | ||||
| address_postcode_code: Postcode | ||||
| address_country_name: Land | ||||
| address_country_code: Landscode | ||||
|  | ||||
| 'Alreay existing person': 'Reeds bestaand persoonsdossier' | ||||
| 'Add the person': 'Persoon toevoegen' | ||||
| 'Add the person and create an accompanying period': "Persoon & hulpverleningstraject aanmaken" | ||||
| 'Add the person and create a household': "Persoon & gezin aanmaken" | ||||
| Show person: Toon persoonsdossier | ||||
| 'Confirm the creation': 'Aanmaak dossier bevestigen' | ||||
| 'You will create this person': 'U zal het volgende dossier aanmaken' | ||||
| Return: Terugkeren | ||||
| Submit: Versturen | ||||
| Reset: 'Resetten' | ||||
| 'The person data has been updated': 'De gegevens zijn bijgewerkt' | ||||
| 'The person data provided are not valid': 'De ingevoerde gegevens zijn niet geldig' | ||||
| '{1} The person field %field% is incorrect. Please check. | ]1, Inf] Several person fields are incorrect. Please check.': '{1} Het veld %field% is niet correct. Gelieve deze te corrigeren. | ]1, Inf] Verschillende velden zijn niet correct. Gelieve deze te verifiëren.' | ||||
| 'Add a person': 'Persoon toevoegen' | ||||
| 'Person Menu': 'Menu persoon' | ||||
| 'The person data are not valid': 'De gegevens van het formulier zijn ongeldig' | ||||
| '%nb% person with similar name. Please verify that this is a new person': '{1} Een persoon werd gevonden met dezelfde naam. Verifieer dat het niet om dezelfde persoon gaat. | ]1, Inf] %nb% personen werden gevonden met eenzelfde naam. Verifieer dat het niet om dezelfde personen gaat.' | ||||
| 'The person has been created': 'Het dossier werd aangemaakt' | ||||
| 'Person search results': 'Resultaten zoekactie' | ||||
| Person search results by phonenumber: Zoek personen aan de hand van een telefoonnummer | ||||
| 'Search within persons': 'Persoon zoeken' | ||||
| Open person file: Open persoonsdossier. | ||||
| and %number% other: '{0} en geen andere| {1} en één andere |]1, Inf] en %number% anderen' | ||||
| '%total% persons matching the search pattern:': '{0} Geen enkele persoon voldoet aan de zoekcriteria : | {1} Één persoon werd gevonden die voldoet aan de zoekcriteria : | ]1,Inf] %total% werden gevonden die voldoen aan de zoekcriteria :' | ||||
| 'Last opening since %last_opening%': 'Laatste opening %last_opening%.' | ||||
| 'Person accompanying period - %name%': 'Geschiedenis traject - %name%' | ||||
| 'Opening date': 'Openingsdatum' | ||||
| 'Closing date': 'Afrondingsdatum' | ||||
| 'Period opened': 'Open periode' | ||||
| 'Close accompanying period': 'Hulpverleningstraject afsluiten' | ||||
| 'Open accompanying period': 'Hulpverleningstraject openen' | ||||
| Period number %number%: 'Hulpverleningstraject n° %number%' | ||||
| 'Add an accompanying period in the past': Hulpverleningstraject in het verleden aanmaken | ||||
| Begin a new accompanying period: Nieuw hulpverleningstraject starten | ||||
| Create an accompanying period: Nieuw hulpverleningstraject aanmaken | ||||
| 'A period has been created.': Een hulpverleningstraject werd aangemaakt | ||||
| 'Error! Period not created!': Foutmelding! Dit hulpverleningstraject werd niet aangemaakt. | ||||
| Update accompanying period: Hulpverleningstraject bijwerken | ||||
| 'An accompanying period has been updated.': Een hulpverleningstraject werd bijgewerkt | ||||
| 'Error when updating the period': Foutmelding tijdens bijwerken van hulpverleningstraject | ||||
| 'An accompanying period has been closed.': Een hulpverleningstraject werd afgesloten. | ||||
| 'Error! Period not closed!': "Foutmelding: het hulpverleningstraject werd niet afgesloten" | ||||
| 'An accompanying period has been opened.': Een hulpverleningstraject werd geopend. | ||||
| 'No remark': Geen opmerkingen | ||||
| 'Period not opened': "Het hulpverleningstraject werd niet geopend" | ||||
| "Period not opened : form is invalid": "Het hulpverleningstraject werd niet geopend, het formulier bevat fouten" | ||||
| 'Closing motive': 'Reden van afsluiten' | ||||
| Close accompanying course: Hulpverleningstraject sluiten | ||||
| Re-open accompanying course: Hulpverleningstraject heropenen | ||||
| 'Person details': 'Details persoon' | ||||
| 'Update details for %name%': 'Gegevens van %name% bijwerken' | ||||
| An accompanying period ends: Een hulpverleningstraject loopt op zijn einde | ||||
| An accompanying period starts: Een hulpverleningstraject gaat van start | ||||
| Any accompanying periods are open: Geen enkel hulpverleningstraject open | ||||
| An accompanying period is open: Een hulpverleningstraject staat open | ||||
| Accompanying period list: Hulpverleningstraject | ||||
| Accompanying period list for person: Hulpverleningstrajecten van persoon | ||||
| Accompanying period: Hulpverleningstraject | ||||
| Any accompanying period: Geen enkel hulpverleningstraject | ||||
| period: Hulpverleningstraject | ||||
| New accompanying course: Nieuw hulpverleningstraject | ||||
| Choose a motive: Reden van afsluiten | ||||
| Re-open accompanying period: Heropenen | ||||
| Re-Open a period: Heropenen | ||||
| Are you sure you want to re-open this period ?: Bent u zeker dit hulpverleningstraject terug te willen openen? | ||||
| 'The period has been re-opened': Het hulpverleningstraject is terug geopend | ||||
| Pediod closing form is not valid: Het formulier is niet leeg | ||||
| Accompanying user: Begeleiding | ||||
| No accompanying user: Geen begeleiding | ||||
| No data given: Geen informatie | ||||
| Participants: Betrokken personen | ||||
| Create an accompanying course: Een hulpverleningstraject aanmaken | ||||
| Accompanying courses of users: Hulpverleningstrajecten gebruiker | ||||
| This accompanying course is still a draft: Dit hulpverleningstraject is nog in de ontwerpfase. | ||||
| Associated peoples: Betrokken personen | ||||
| Resources: Hulpverlening partners | ||||
| Any requestor to this accompanying course: Er is geen aanvrager voor dit hulpverleningstraject | ||||
| Social actions: Ondersteuningsmaatregelen | ||||
| Last social actions: Laatste ondersteuningsmaatregelen | ||||
| Social issue: Hulpvraag | ||||
| Social issues: Hulpvragen | ||||
| Last events on accompanying course: Laatste follow-up maatregelen | ||||
| Edit & activate accompanying course: Bijwerken en valideren | ||||
| See accompanying periods: Alle hulpverleningstrajecten bekijken | ||||
| See accompanying period: Hulpverleningstraject bekijken | ||||
| Edit accompanying period: Hulpverleningstraject bijwerken | ||||
| See this period: Dit hulpverleningstraject bekijken | ||||
| Requestor: Aanvrager | ||||
| No requestor: Geen aanvrager | ||||
| No resources: "Geen hulpverlening partners" | ||||
| Persons associated: Betrokken personen | ||||
| Referrer: Doorverwijzer | ||||
| Referrers: Doorverwijzers | ||||
| Some peoples does not belong to any household currently. Add them to an household soon: Sommige personen maken nog geen deel uit van een gezin. Voeg ze zo snel mogelijk aan gezin toe. | ||||
| Add to household now: Toevoegen aan een gezin | ||||
| Any resource for this accompanying course: Geen enkele hulpverlening partner | ||||
| course.draft: Ontwerp | ||||
| course.closed: Afgesloten | ||||
| Origin: Oorsprong van de aanvraag | ||||
| Delete accompanying period: Hulpverleningstraject verwijderen | ||||
| Are you sure you want to remove the accompanying period "%id%" ?:  Bent u zeker het hulpverleningstraject %id% te willen verwijderen? | ||||
| The accompanying course has been successfully removed.: Het hulpverleningstraject werd verwijdert. | ||||
| Concerned scopes: Betrokken werkingen | ||||
|  | ||||
| # person resource | ||||
|  | ||||
| person_resources_menu: "Steunfiguren" | ||||
| Person resources: "Steunfiguren persoon" | ||||
| Add a person resource: "Steunfiguur toevoegen" | ||||
| edit resource: "Steunfiguur bijwerken" | ||||
| Remove resource: "Steunfiguur verwijderen" | ||||
| Are you sure you want to remove the resource for "%name%" ?: Bent u zeker dat u %name% wil verwijderen als steunfiguur? | ||||
| The resource has been successfully removed.: "De steunfiguur werd verwijdert" | ||||
| List of resources: "Overzicht steunfiguren" | ||||
| There are no available resources: "Nog geen steunfiguur" | ||||
| no comment found: "Geen enkele opmerking" | ||||
| Select a type: "Kies een type" | ||||
| Select a person: "Kies een persoon" | ||||
| Select a thirdparty: "Kies een externe partner" | ||||
| Contact person: "Kies een contactpersoon" | ||||
| Kind: "Type" | ||||
|  | ||||
|  | ||||
| # pickAPersonType | ||||
| Pick a person: Kies een persoon | ||||
|  | ||||
| # Address | ||||
| No address given: Geen adres toegewezen | ||||
| The address has been successfully updated: Het adres werd succesvol bijgewerkt | ||||
| Update address for %name%: Adres voor %name% bijwerken | ||||
| Modify address for %name%: Adres voor %name% bijwerken | ||||
| Edit an address: Adres bijwerken | ||||
| Edit address: Adres bijwerken | ||||
| Addresses history for %name%: Historiek adressen voor %name% | ||||
| Addresses history: Historiek van adressen | ||||
| New address : Nieuw adres | ||||
| New address for %name% : Nieuw adres voor %name% | ||||
| The new address was created successfully: Het nieuwe adres werd aangemaakt | ||||
| Add an address: Een adres toevoegen | ||||
| Back to the person details: Terugkeren naar persoonsgegevens | ||||
|  | ||||
| # Residential address | ||||
| Residential addresses history for %name%: Historiek verblijfsadressen voor %name% | ||||
| Residential addresses history: Historiek verblijfsadressen | ||||
| Add a residential address: Verblijfsadres toevoegen | ||||
| Which kind of residential address would you create ?: Welk type verblijfsadres wil u toevoegen? | ||||
| The address of another person: Het adres van een ander persoon | ||||
| The address of a third party: Het adres van een externe partner | ||||
| A new address: Een nieuw adres | ||||
| residential_address_person_explanation: Het adres wordt gelinked aan dat van een persoon. Zodra deze persoon verhuist zal het verblijfsadres deze persoon volgen. | ||||
| residential_address_third_party_explanation: Het adres wordt gelinked aan dat van een externe partner. | ||||
| residential_address_new_address_explanation: Nieuw adres aanmaken. Dit zal een vast adres zijn. | ||||
| New residential address: Nieuw verblijfsadres | ||||
| Host person: Kies het adres van een persoon | ||||
| Host third party: Kies het adres van een externe partner | ||||
| The new residential address was created successfully: Het nieuwe verblijfsadres werd aangemaakt | ||||
| Edit a residential address: Verblijfsadres bijwerken | ||||
| The residential address was updated successfully: Het verblijfsadres werd bijgewerkt. | ||||
| Residential addresses: Verblijfsadres | ||||
| Address of: Adres van | ||||
| Delete residential address: Verwijder het verblijfsadres | ||||
| Delete residential address ?: Het verblijfsadres verwijderen ? | ||||
| Are you sure you want to remove this residential address for %name% ?: Bent u zeker het verblijfsadres van %name% te willen verwijderen? | ||||
| Residential address had been deleted: Het verblijfsadres werd verwijdert. | ||||
|  | ||||
|  | ||||
| #timeline | ||||
| Timeline: Historiek | ||||
| Closing the accompanying period: Afsluiting hulpverleningstraject | ||||
| Opening the accompanying period: Opening hulpverleningstraject | ||||
| 'Timeline for %name%': 'Historiek van %name%' | ||||
|  | ||||
| #roles | ||||
| CHILL_PERSON_SEE: Personen bekijken | ||||
| CHILL_PERSON_UPDATE: Personen bijwerken | ||||
| CHILL_PERSON_CREATE: Personen toevoegen | ||||
| CHILL_PERSON_STATS: Statistieken van personen | ||||
| CHILL_PERSON_LISTS: Overzicht van personen | ||||
| CHILL_PERSON_DUPLICATE: Duplicaten persoon behandelen | ||||
| CHILL_PERSON_ACCOMPANYING_PERIOD_SEE: Hulpverleningstrajecten bekijken | ||||
|  | ||||
| #period | ||||
| Period closed!: Hulpverleningstraject afgesloten! | ||||
| Pediod closing form is not valide: Het formulier voor het afsluiten van het hulpverleningstraject is niet geldig. | ||||
|  | ||||
| #widget | ||||
|  | ||||
| ## widget person_list | ||||
| Accompanyied people: Begeleide personen | ||||
|  | ||||
| ## exports | ||||
| Count peoples by various parameters.: Aantal personen tellen die voldoen aan vershillende criteria. | ||||
| Count peoples: Aantal personen | ||||
| List peoples: Overzicht personen | ||||
| Create a list of people according to various filters.: Overzicht geven van personen die voldoen aan bepaalde criteria. | ||||
| Fields to include in export: Velden die toegevoegd moeten worden in de export van gegevens. | ||||
| Address valid at this date: Adres dat geldig is op deze datum. | ||||
|  | ||||
| ## filters | ||||
| Filter by person gender: Filteren op basis van gender | ||||
| Accepted genders: Aanvaarde genderkeuzes | ||||
| 'Filtering by genders: only %genders%': 'Filteren op basis van gender: enkel %genders%' | ||||
|  | ||||
| Filter by person's nationality: Filteren op basis van nationaliteit | ||||
| Nationalities: Nationaliteiten | ||||
| Choose countries: Nationaliteiten kiezen | ||||
| 'Filtered by nationality : %nationalities%': 'Filteren op basis van nationaliteit: enkel %nationalities%' | ||||
|  | ||||
| Filter by person's birthdate: Filteren op basis van geboortedatum | ||||
| Born after this date: Geboren na | ||||
| Born before this date: Geboren voor | ||||
| This field should not be empty: Dit veld mag niet leeg zijn | ||||
| This date should be after the date given in "born after" field: Deze datum moet vallen na de datum in het veld 'geboren na' | ||||
| "Filtered by person's birtdate: between %date_from% and %date_to%": "Filteren op basis van geboortedatum: enkel geboren tussen %date_from% en %date_to%" | ||||
|  | ||||
| "Filter by accompanying period: active period": "Filteren op basis van actieve hulpverleningstrajecten" | ||||
| Having an accompanying period opened after this date: Met een hulpverleningstraject dat geopend werd na deze datum | ||||
| Having an accompanying period ending before this date, or still opened at this date: Met een hulpverleningstraject dat gesloten werd voor deze datum, of nog steeds actief op deze datum | ||||
| "Filtered by accompanying period: persons having an accompanying period opened after the %date_from% and closed before the %date_to% (or still opened at the %date_to%)": "Filteren op basis van hulpverleningstraject: personen die een actief hulpverleningstraject hebben na %date_from%, en gesloten voor %date_to% (of nog steeds actief op %date_to%)" | ||||
|  | ||||
| "Filter by accompanying period: starting between two dates": "Filteren op basis van hulpverleningstraject: start van traject tussen twee data" | ||||
| "Having an accompanying period opened before this date": "Met een hulpverleningstraject actief voor deze datum" | ||||
| "Filtered by accompanying period: persons having an accompanying period opened between the %date_from% and %date_to%": "Filteren op basis van hulpverleningstraject: actief tussen %date_from% en %date_to%" | ||||
|  | ||||
| "Filter by accompanying period: closed between two dates": "Filteren op basis van hulpverleningstraject: traject afgesloten tussen twee data" | ||||
| Having an accompanying period closed after this date: Met een hulpverleningstraject afgesloten na deze datum | ||||
| "Having an accompanying period closed before this date": "Met een hulpverleningstraject afgesloten voor deze datum" | ||||
| "Filtered by accompanying period: persons having an accompanying period closed between the %date_from% and %date_to%": "Filteren op basis van hulpverleningstraject: met een traject dat afgesloten werd tussen %date_from% en %date_to%" | ||||
|  | ||||
| ## aggregators | ||||
| Group people by nationality: Personen groeperen per nationaliteit | ||||
| Group by level: Groeperen per niveau | ||||
| Group by continents: Groeperen per continent | ||||
| Group by country: Groeperen per land | ||||
|  | ||||
| Group people by gender: Groeperen op basis van gender | ||||
|  | ||||
| Aggregate by age: Groeperen op basis van | ||||
| Calculate age in relation to this date: Leeftijd bereken relatief tot deze datum | ||||
|  | ||||
| Group people by country of birth: Personen groeperen op bais van geboorteland | ||||
| Similar persons: Gelijkaardige personen | ||||
|  | ||||
| crud: | ||||
|     closing_motive: | ||||
|         index: | ||||
|             title: Overzicht redenen tot afsluiten | ||||
|             add_new: Een nieuwe toevoegen | ||||
|         title_new: Nieuwe reden tot afsluiten | ||||
|         title_edit: Reden tot afsluiten bijwerken | ||||
|     marital_status: | ||||
|         index: | ||||
|             title: Overzicht burgerlijke staat | ||||
|             add_new: Een nieuwe toevoegen | ||||
|         title_new: Nieuwe burgerlijke staat | ||||
|         title_edit: Burgerlijke staat bijwerken | ||||
|     social_issue: | ||||
|         index: | ||||
|             title: Overzicht hulpverleningsvragen | ||||
|             add_new: Een nieuwe hulpverleningsvraag toevoegen | ||||
|         title_new: Nieuwe hulpverleningsvraag | ||||
|         title_edit: hulpverleningsvraag bijwerken | ||||
|     social_action: | ||||
|         index: | ||||
|             title: Overzicht hulpverleningsmaatregelen | ||||
|             add_new: Nieuwe hulpverleningsmaatregel toevoegen | ||||
|         title_new: Nieuwe hulpverleningsmaatregel | ||||
|         title_edit: Hulpverleningsmaatregel bijwerken | ||||
|         title_link: Hulpverleningsmaatregel bekijken | ||||
|     social_goal: | ||||
|         index: | ||||
|             title: Overzicht objectieven hulpverleningsmaatregel | ||||
|             add_new: Nieuw objectief hulpverleningsmaatregel toevoegen | ||||
|         title_new: Nieuw objectief | ||||
|         title_edit: Objectief bijwerken | ||||
|     social_result: | ||||
|         index: | ||||
|             title: Overzicht resultaten hulpverleningsmaatregel | ||||
|             add_new: Nieuw resultaat hulpverleningsmaatregel toevoegen | ||||
|         title_new: Nieuw resultaat | ||||
|         title_edit: Resultaat bijwerken | ||||
|  | ||||
|  | ||||
| # specific to closing motive | ||||
| closing_motive: | ||||
|     any parent: Geen ouder | ||||
|     new child: Nieuw kind | ||||
|  | ||||
| Configuration of person bundle: Configuratie module "Persoon" | ||||
| person_admin: | ||||
|     What would you like to configure ?: Wat wil u graag configureren ? | ||||
|     closing motives: Redenen tot afsluiten | ||||
|     closing motives list: Overzicht redenen tot afsluiten | ||||
|     closing motive explanation: > | ||||
|         De redenen tot afsluiten geven een indicatie over waarom een hulpverleningstraject werd afgesloten. | ||||
|     marital status: Burgerlijke staat | ||||
|     marital status list: Overzicht burgerlijke staat | ||||
|     marital status explanation: > | ||||
|         Configureer lijst voor het aanduiden van de burgerlijke staat | ||||
|     social_issue: Hulpverleningsvragen | ||||
|     social_action: Hulpverleningsmaatregelen | ||||
|     social_goal: Doelen | ||||
|     social_result: Resultaten | ||||
|     social_evaluation: Evaluaties | ||||
|  | ||||
| # specific to accompanying period | ||||
| accompanying_period: | ||||
|     dates: Periode | ||||
|     dates_from_%opening_date%: Actief sinds %opening_date% | ||||
|     dates_from_%opening_date%_to_%closing_date%: Actief van %opening_date% tot %closing_date% | ||||
|     DRAFT: Ontwerp | ||||
|     CONFIRMED: Bevestigd | ||||
|     CLOSED: Afgesloten | ||||
|     emergency: Dringend | ||||
| occasional: éénmalig | ||||
| regular: regelmatig | ||||
| Confidential: vertrouwelijk | ||||
| confidential: vertrouwelijk | ||||
| Draft: ontwerp | ||||
| Confirmed: actief | ||||
| Closed: Afgesloten | ||||
|  | ||||
| # Accompanying Course | ||||
| Accompanying Course: Hulpverleningstraject | ||||
| Accompanying Course History: Historiek hulpverleningstraject | ||||
| Resume Accompanying Course: Samenvatting hulpverleningstraject | ||||
| Show Accompanying Course: Hulpverleningstraject bekijken | ||||
| Edit Accompanying Course: Hulpverleningstraject bijwerken | ||||
| Close Accompanying Course: Hulpverleningstraject afsluiten | ||||
| Create Accompanying Course: Nieuw hulpverleningstraject aanmaken | ||||
| Drop Accompanying Course: Hulpverleningstraject verwijderen | ||||
| This course is located at a temporarily address. You should locate this course to an user: Het hulpverleningstraject is een voorlopig adres toegewezen. Het zou toegewezen moeten worden aan het adres van een persoon. | ||||
| Accompanying course location: Locatie van hulpverleningstraject | ||||
| This course is located by: Locatie bij | ||||
| This course has a temporarily location: Voorlopige locatie | ||||
| Choose a person to locate by: Adres van persoon toewijzen | ||||
| Associate at least one member with an household, and set an address to this household: Associeer minstens één betrokken persoon in dit hulpverleningstraject met een gezin en wijs een adres toe aan dit gezin. | ||||
| Locate by: Adres toewijzen | ||||
| fix it: Aanvullen | ||||
| accompanying_course: | ||||
|     administrative_location: Administratieve locatie | ||||
|     comment is pinned: Deze opmerking is gepinned | ||||
|  | ||||
| # Accompanying Course comments | ||||
| Accompanying Course Comment: Opmerking | ||||
| Accompanying Course Comment list: Opmerkingen hulpverleningstraject | ||||
| pinned: pinnen | ||||
| Pin comment: Pinnen | ||||
| Post a new comment: Een nieuwe opmerking posten | ||||
| Write a new comment: Een nieuwe opmerking schrijven | ||||
| Edit a comment: Opmerking bijwerken | ||||
| accompanying_course_comment: | ||||
|     Comment removed: Opmerking verwijdert | ||||
|     Remove comment: Opmerking verwijdert | ||||
|     Are you sure you want to remove comment ?: Bent u zeker deze opmerking te willen verwijderen? | ||||
| Read more: Meer lezen.. | ||||
|  | ||||
| # Household | ||||
| Household: Gezin | ||||
| Summary: Samenvatting | ||||
| Members: Gezinsleden | ||||
| Addresses: Addressen | ||||
| Move household: Nieuwe verhuis | ||||
| Addresses history for household: Historiek adressen | ||||
| Household accompanying period: Hulpverleningstrajecten van gezin | ||||
| Household summary: Samenvatting gezin | ||||
| Edit household address: Adres gezin bijwerken | ||||
| Show household: Gezin bekijken | ||||
| Back to household: Terugkeren naar gezin | ||||
| Remove household composition: Gezinssamenstelling verwijderen | ||||
| Are you sure you want to remove this composition?: Bent u zeker deze gezinssamenstelling te willen verwijderen? | ||||
| Concerns household n°%id%: Betrokken gezin n°%id% | ||||
| Composition: Gezinssamenstelling | ||||
| Budget: Budget | ||||
| The composition has been successfully removed.: De gezinssamenstelling werd verwijdert. | ||||
|  | ||||
| # accompanying course work | ||||
| Accompanying Course Actions: Hulpverleningsmaatregelen | ||||
| Accompanying Course Action: Hulpverleningsmaatregel | ||||
| Are you sure you want to remove this work of the accompanying period %name% ?: Bent u zeker de hulpverleningsmaatregel voor het traject %name% te willen verwijderen? | ||||
| The accompanying period work has been successfully removed.: De hulpverleningsmaatregel werd verwijdert | ||||
| accompanying_course_work: | ||||
|     create: Voeg een hulpverleningsmaatregel toe | ||||
|     Create accompanying course work: Voeg een hulpverleningsmaatregel toe | ||||
|     Edit accompanying course work: Hulpverleningsmaatregel bijwerken | ||||
|     List accompanying course work: Overzicht hulpverleningsmaatregelen | ||||
|     action: Hulpverleningsmaatregel | ||||
|     create_date: Aanmaakdatum | ||||
|     start_date: Aanvangsdatum | ||||
|     end_date: Einddatum | ||||
|     max_date: Vervaldatum | ||||
|     warning_interval: Herinnering | ||||
|     '%days% days before max_date': "%days% dag(en) voor de vervaldatum" | ||||
|     results without objective: Geen enkel objectief - motief | ||||
|     no_results: Geen enkel resultaat - oriëntering | ||||
|     results: Resultaten - oriënteringen | ||||
|     goal: Objectieven - motieven | ||||
|     evaluations: Evaluaties | ||||
|     Any work: Geen enkele hulpverleningsmaatregel | ||||
|     remove: Hulpverleningsmaatregel verwijderen | ||||
|     social_evaluation: Evaluatie | ||||
|  | ||||
| # | ||||
| Person addresses: Verblijfsadres | ||||
| Household addresses: Domicilie adres | ||||
| Insert an address: Insérer une adresse | ||||
| see social issues: Hulpverleningsvragen bekijken | ||||
| see persons associated: Betrokken personen bekijken | ||||
|  | ||||
| docgen: | ||||
|     Accompanying Period basic: "Hulpverleningstraject (basis)" | ||||
|     Accompanying period work: "Hulpverleningsmaatregel" | ||||
|     Accompanying period work context: "Evaluatie hulpverleningsmaatregel" | ||||
|     Main person: Hoofdpersoon | ||||
|     person 1: Persoon één | ||||
|     person 2: Persoon twee | ||||
|     Ask for main person: Vraag aan de gebruiker om de hoofdpersoon te identificeren | ||||
|     Ask for person 1: Vraag aan de gebruiker om de eerste persoon te identificeren | ||||
|     Ask for person 2: Vraag aan de gebruiker om de tweede persoon te identificeren | ||||
|     A basic context for accompanying period: context van het hulpverleningstraject | ||||
|     A context for accompanying period work: Context voor de hulpverleningsmaatregelen | ||||
|     A context for accompanying period work evaluation: Context voor de evaluatie van de hulpverleningsmaatregel | ||||
|     Person basic: Persoon (basis) | ||||
|     A basic context for person: Context voor de personen | ||||
|  | ||||
| period_notification: | ||||
|     period_designated_subject: U bent de doorverwijzer voor dit huplverleningstraject | ||||
|     You are designated to a new period: U bent de doorverwijzer voor dit huplverleningstraject | ||||
|     Persons are: De betrokken personen zijn de volgende | ||||
|     Social issues are: De hulpverleningsvragen zijn de volgende | ||||
|     See it online: Het hulpverleningstraject bekijken | ||||
|     Person locating period has moved: De persoon aan wie dit hulpverleningstraject werd toegewezen is verhuisd. | ||||
|  | ||||
| You are getting a notification for a period which does not exists any more: Deze notificatie komt niet overeen met een bestaand hulpverleningstraject. | ||||
| You are getting a notification for a period you are not allowed to see: De notificatie verwijst naar een hulpverleningstraject waartoe u geen toegang heeft. | ||||
| This is the minimal period details: Hulpverleningstraject n° | ||||
|  | ||||
| household_composition: | ||||
|     No composition yet: Geen enkele gezinssamenstelling toegewezen | ||||
|     Compositions: Gezinssamenstelling | ||||
|     endDate: Einddatum | ||||
|     numberOfChildren: Aantal kinderen in het gezin | ||||
|     Household composition: Gezinssamenstelling | ||||
|     Composition added: Informatie over de gezinssamenstelling toegevoegd | ||||
|     Currently no composition: Geen enkele gezinssamenstelling toegewezen | ||||
|     Add a composition: Een gezinssamenstelling toevoegen | ||||
|     Update composition: Gezinssamenstelling bijwerken | ||||
|     Create: Een nieuwe gezinssamenstelling toewijzen | ||||
|  | ||||
| # docgen | ||||
| Linked evaluations: Gerelateerde evaluaties | ||||
|  | ||||
| # Accompanying period per user | ||||
| My accompanying periods: Mijn hulpverleningstrajecten | ||||
| My accompanying periods in draft: Mijn hulpverleningstrajecten in ontwerp | ||||
|  | ||||
| workflow: | ||||
|     Doc for evaluation (n°%eval%): Evaluatiedocument n°%eval% | ||||
|  | ||||
| period_by_user_list: | ||||
|     Period by user: Hulpverleningstrajecten per gebruiker | ||||
|     Pick a user: Selecteer een gebruiker om zijn/haar hulpverleningstrajecten te zien | ||||
|     Any course or no authorization to see them: Deze gebruiker heeft geen hulpverleningstrajecten of geen waartoe u toegang heeft. | ||||
| Divorced: 'Officieel gescheiden' | ||||
| Separated: 'Feitelijk gescheiden' | ||||
| Widow: Weduwschap | ||||
| 'Unknow marital status': Onbekend | ||||
| 'Legal cohabitant': 'Wettige samenwoonst' | ||||
| Single: Alleenstaand | ||||
| Married: Gehuwd | ||||
| 'General information': 'Algemene informatie' | ||||
| 'Birth information': Geboorte | ||||
| 'Family information': Familie | ||||
| 'Contact information': Contactgegevens | ||||
| 'Administrative information': 'Administratieve gegevens' | ||||
| 'Alreay existing person': 'Geregistreerd dossier' | ||||
| 'Add the person': 'Maak nieuw personendossier aan' | ||||
| 'Confirm the creation': 'Bevestig de aanmaak' | ||||
| 'You will create this person': 'U hebt volgend dossier aangemaakt' | ||||
| Return: Vorige | ||||
| Submit: Opslaan | ||||
| Reset: Delete | ||||
| 'The person data has been updated': 'De persoongegevens zijn aangepast' | ||||
| 'Add a person': 'Voeg een persoon toe' | ||||
| 'Person Menu': Personenmenu | ||||
| 'Your query is empty. Be more explicive': 'Er ontbreekt informatie. Gelieve meer informatie in te vullen.' | ||||
| 'The person data are not valid': 'De gegevens zijn niet correct' | ||||
| '%nb% person with similar name. Please verify that this is a new person': '%nb% meerdere personen met dezelfde naam. Check of dit echt een nieuw dossier is.' | ||||
| 'The person has been created': 'Dossier is aangemaakt' | ||||
| 'Person search results': Personengezocht | ||||
| 'No persons matching search %pattern%': 'Geen personen stemmen met het gezocht "%pattern%" overeen.' | ||||
| '%total% persons matching the search %pattern%': '{0} Geen personen stemmen met het gezocht "%pattern%" overeen. | {1} Één persoon stemd met het gezocht "%pattern%" overeen. | ]1,Inf] %total% personen stemmen met het gezocht "%pattern%" overeen.' | ||||
| 'Person details': 'Details van de persoon' | ||||
| 'Last opening since %last_opening%': '__Last opening since %last_opening%' | ||||
| 'Person accompanying period - %name%': '__Person accompanying period - %name%' | ||||
| 'Opening date': '__Opening date' | ||||
| 'Closing date': '__Closing date' | ||||
| 'Still open': '__Still open' | ||||
| 'Create accompanying period': '__Create accompanying period' | ||||
| 'Close accompanying period ': '__Close accompanying period ' | ||||
| 'Open accompanying period': '__Open accompanying period' | ||||
| 'Unknown spoken languages': 'Spreektalen onbekend' | ||||
|   | ||||
| @@ -13,9 +13,7 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator; | ||||
|  | ||||
| use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlGeneratorInterface; | ||||
| use ChampsLibres\WopiBundle\Service\Wopi as CLWopi; | ||||
| use ChampsLibres\WopiLib\Contract\Service\DocumentLockManagerInterface; | ||||
| use ChampsLibres\WopiLib\Contract\Service\DocumentManagerInterface; | ||||
| use Chill\WopiBundle\Service\Wopi\ChillDocumentLockManager; | ||||
| use Chill\WopiBundle\Service\Wopi\ChillDocumentManager; | ||||
| use Chill\WopiBundle\Service\Wopi\ChillWopi; | ||||
|  | ||||
| @@ -43,10 +41,6 @@ return static function (ContainerConfigurator $container) { | ||||
|     $services | ||||
|         ->alias(DocumentManagerInterface::class, ChillDocumentManager::class); | ||||
|  | ||||
|     $services | ||||
|         ->set(ChillDocumentLockManager::class) | ||||
|         ->decorate(DocumentLockManagerInterface::class); | ||||
|  | ||||
|     // TODO: Move this into the async bundle (low priority) | ||||
|     $services | ||||
|         ->alias(TempUrlGeneratorInterface::class, 'async_uploader.temp_url_generator'); | ||||
|   | ||||
| @@ -1,66 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace Chill\WopiBundle\Service\Wopi; | ||||
|  | ||||
| use ChampsLibres\WopiLib\Contract\Entity\Document; | ||||
| use ChampsLibres\WopiLib\Contract\Service\DocumentLockManagerInterface; | ||||
| use Chill\MainBundle\Redis\ChillRedis; | ||||
| use Psr\Http\Message\RequestInterface; | ||||
| use RuntimeException; | ||||
|  | ||||
| class ChillDocumentLockManager implements DocumentLockManagerInterface | ||||
| { | ||||
|     private const LOCK_DURATION = 60 * 30; | ||||
|  | ||||
|     private int $postDeleteLockDurationMs; | ||||
|  | ||||
|     private ChillRedis $redis; | ||||
|  | ||||
|     public function __construct(ChillRedis $redis) | ||||
|     { | ||||
|         $this->redis = $redis; | ||||
|     } | ||||
|  | ||||
|     public function deleteLock(Document $document, RequestInterface $request): bool | ||||
|     { | ||||
|         $this->redis->del($this->getCacheId($document)); | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     public function getLock(Document $document, RequestInterface $request): string | ||||
|     { | ||||
|         if (false !== $value = $this->redis->get($this->getCacheId($document))) { | ||||
|             return $value; | ||||
|         } | ||||
|  | ||||
|         throw new RuntimeException('wopi key does not exists'); | ||||
|     } | ||||
|  | ||||
|     public function hasLock(Document $document, RequestInterface $request): bool | ||||
|     { | ||||
|         return $this->redis->exists($this->getCacheId($document)) > 0; | ||||
|     } | ||||
|  | ||||
|     public function setLock(Document $document, string $lockId, RequestInterface $request): bool | ||||
|     { | ||||
|         $key = $this->getCacheId($document); | ||||
|         $this->redis->setex($key, self::LOCK_DURATION, $lockId); | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     private function getCacheId(Document $document): string | ||||
|     { | ||||
|         return sprintf('wopi_lib_lock_%s', $document->getWopiDocId()); | ||||
|     } | ||||
| } | ||||
| @@ -147,7 +147,8 @@ final class ChillDocumentManager implements DocumentManagerInterface | ||||
|      */ | ||||
|     public function getLastModifiedDate(Document $document): DateTimeInterface | ||||
|     { | ||||
|         return $this->storedObjectManager->getLastModified($document); | ||||
|         // TODO: Add column 'LastModifiedDate' in StoredObject entity | ||||
|         return $document->getCreationDate(); | ||||
|     } | ||||
|  | ||||
|     public function getLock(Document $document): string | ||||
|   | ||||
| @@ -13,15 +13,12 @@ namespace Chill\WopiBundle\Service\Wopi; | ||||
|  | ||||
| use ChampsLibres\WopiLib\Contract\Service\DocumentManagerInterface; | ||||
| use ChampsLibres\WopiLib\Contract\Service\WopiInterface; | ||||
| use DateTimeImmutable; | ||||
| use DateTimeInterface; | ||||
| use loophp\psr17\Psr17Interface; | ||||
| use Psr\Cache\CacheItemPoolInterface; | ||||
| use Psr\Http\Message\RequestInterface; | ||||
| use Psr\Http\Message\ResponseInterface; | ||||
| use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; | ||||
| use Symfony\Component\Security\Core\User\UserProviderInterface; | ||||
| use function strlen; | ||||
|  | ||||
| final class ChillWopi implements WopiInterface | ||||
| { | ||||
| @@ -91,14 +88,11 @@ final class ChillWopi implements WopiInterface | ||||
|                     'UserFriendlyName' => $userIdentifier, | ||||
|                     'SupportsUpdate' => true, | ||||
|                     'SupportsRename' => true, | ||||
|                     'SupportsFolder' => false, | ||||
|                     'DisablePrint' => false, | ||||
|                     'AllowExternalMarketplace' => true, | ||||
|                     'SupportedShareUrlTypes' => [ | ||||
|                         'ReadOnly', | ||||
|                     ], | ||||
|                     'LastModifiedTime' => $this->documentManager->getLastModifiedDate($document) | ||||
|                         ->format(DateTimeInterface::ATOM), | ||||
|                     'SHA256' => $this->documentManager->getSha256($document), | ||||
|                     'UserInfo' => (string) $this->cache->getItem($userCacheKey)->get(), | ||||
|                 ] | ||||
| @@ -152,97 +146,7 @@ final class ChillWopi implements WopiInterface | ||||
|         string $xWopiEditors, | ||||
|         RequestInterface $request | ||||
|     ): ResponseInterface { | ||||
|         $document = $this->documentManager->findByDocumentId($fileId); | ||||
|         $version = $this->documentManager->getVersion($document); | ||||
|  | ||||
|         // File is unlocked, we must reject the document, except if collabora is autosaving | ||||
|         if (false === $this->documentManager->hasLock($document) && 'true' !== ($request->getHeader('x-lool-wopi-isexitsave') ?? ['false'])[0]) { | ||||
|             if (0 !== $this->documentManager->getSize($document)) { | ||||
|                 return $this | ||||
|                     ->psr17 | ||||
|                     ->createResponse(409) | ||||
|                     ->withHeader( | ||||
|                         WopiInterface::HEADER_ITEM_VERSION, | ||||
|                         sprintf('v%s', $version) | ||||
|                     ); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // File is locked, we check for the lock | ||||
|         if ($this->documentManager->hasLock($document)) { | ||||
|             if ($xWopiLock !== $currentLock = $this->documentManager->getLock($document)) { | ||||
|                 return $this | ||||
|                     ->psr17 | ||||
|                     ->createResponse(409) | ||||
|                     ->withHeader( | ||||
|                         WopiInterface::HEADER_LOCK, | ||||
|                         $currentLock | ||||
|                     ) | ||||
|                     ->withHeader( | ||||
|                         WopiInterface::HEADER_ITEM_VERSION, | ||||
|                         sprintf('v%s', $version) | ||||
|                     ); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // for collabora online editor, check timestamp if present | ||||
|         /*  delete because it seems that collabora send always the first wopi-timestamp, not the last known one | ||||
|         // example: | ||||
|         // load the doc: the last-wopi is 12:00 in FileInfo | ||||
|         // save the doc: x-cool-wopi-timestamp is 12:00, but we replace the ts with the time of save (12:05) | ||||
|         // save the doc again: x-cool-wopi-timestamp is still 12:00... | ||||
|         if ($request->hasHeader('x-cool-wopi-timestamp')) { | ||||
|             $date = DateTimeImmutable::createFromFormat( | ||||
|                 DateTimeImmutable::ATOM, | ||||
|                 $request->getHeader('x-cool-wopi-timestamp')[0] | ||||
|             ); | ||||
|  | ||||
|             if (false === $date) { | ||||
|                 throw new RuntimeException('Error parsing date: ' . implode('', DateTimeImmutable::getLastErrors())); | ||||
|             } | ||||
|  | ||||
|             if ($this->documentManager->getLastModifiedDate($document)->getTimestamp() < $date->getTimestamp()) { | ||||
|                 return $this | ||||
|                     ->psr17 | ||||
|                     ->createResponse(409) | ||||
|                     ->withHeader( | ||||
|                         WopiInterface::HEADER_LOCK, | ||||
|                         $currentLock | ||||
|                     ) | ||||
|                     ->withHeader( | ||||
|                         WopiInterface::HEADER_ITEM_VERSION, | ||||
|                         sprintf('v%s', $version) | ||||
|                     ) | ||||
|                     ->withBody( | ||||
|                         $this->psr17->createStream( | ||||
|                             json_encode(['COOLStatusCode' => 1010]) | ||||
|                         ) | ||||
|                     ); | ||||
|             } | ||||
|         } | ||||
|          */ | ||||
|  | ||||
|         $body = (string) $request->getBody(); | ||||
|         $this->documentManager->write( | ||||
|             $document, | ||||
|             [ | ||||
|                 'content' => $body, | ||||
|                 'size' => (string) strlen($body), | ||||
|             ] | ||||
|         ); | ||||
|         $version = $this->documentManager->getVersion($document); | ||||
|  | ||||
|         return $this | ||||
|             ->psr17 | ||||
|             ->createResponse() | ||||
|             ->withHeader( | ||||
|                 WopiInterface::HEADER_LOCK, | ||||
|                 $xWopiLock | ||||
|             ) | ||||
|             ->withHeader( | ||||
|                 WopiInterface::HEADER_ITEM_VERSION, | ||||
|                 sprintf('v%s', $version) | ||||
|             ); | ||||
|         return $this->wopi->putFile($fileId, $accessToken, $xWopiLock, $xWopiEditors, $request); | ||||
|     } | ||||
|  | ||||
|     public function putRelativeFile(string $fileId, string $accessToken, ?string $suggestedTarget, ?string $relativeTarget, bool $overwriteRelativeTarget, int $size, RequestInterface $request): ResponseInterface | ||||
|   | ||||
| @@ -1,99 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| declare(strict_types=1); | ||||
|  | ||||
| namespace Chill\WopiBundle\Tests\Service\Wopi; | ||||
|  | ||||
| use Chill\DocStoreBundle\Entity\StoredObject; | ||||
| use Chill\MainBundle\Redis\ChillRedis; | ||||
| use Chill\WopiBundle\Service\Wopi\ChillDocumentLockManager; | ||||
| use Prophecy\PhpUnit\ProphecyTrait; | ||||
| use Psr\Http\Message\RequestInterface; | ||||
| use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; | ||||
|  | ||||
| /** | ||||
|  * @internal | ||||
|  * @coversNothing | ||||
|  */ | ||||
| final class ChillDocumentLockManagerTest extends KernelTestCase | ||||
| { | ||||
|     use ProphecyTrait; | ||||
|  | ||||
|     protected function setUp(): void | ||||
|     { | ||||
|         self::bootKernel(); | ||||
|     } | ||||
|  | ||||
|     public function testMultipleLoops() | ||||
|     { | ||||
|         $manager = $this->makeManager(1); | ||||
|         $document = new StoredObject(); | ||||
|         $request = $this->prophesize(RequestInterface::class); | ||||
|  | ||||
|         $i = 0; | ||||
|  | ||||
|         while (50 > ++$i) { | ||||
|             $this->assertFalse($manager->hasLock($document, $request->reveal())); | ||||
|  | ||||
|             $this->assertTrue($manager->setLock($document, 'dummy', $request->reveal())); | ||||
|  | ||||
|             $this->assertEquals('dummy', $manager->getLock($document, $request->reveal())); | ||||
|  | ||||
|             $this->assertTrue($manager->deleteLock($document, $request->reveal())); | ||||
|  | ||||
|             $this->assertFalse($manager->hasLock($document, $request->reveal())); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function testRelock() | ||||
|     { | ||||
|         $manager = $this->makeManager(1); | ||||
|         $document = new StoredObject(); | ||||
|         $request = $this->prophesize(RequestInterface::class); | ||||
|  | ||||
|         $this->assertFalse($manager->hasLock($document, $request->reveal())); | ||||
|  | ||||
|         $this->assertTrue($manager->setLock($document, 'dummy', $request->reveal())); | ||||
|  | ||||
|         $this->assertEquals('dummy', $manager->getLock($document, $request->reveal())); | ||||
|  | ||||
|         $this->assertTrue($manager->setLock($document, 'bar', $request->reveal())); | ||||
|  | ||||
|         $this->assertEquals('bar', $manager->getLock($document, $request->reveal())); | ||||
|  | ||||
|         $this->assertTrue($manager->deleteLock($document, $request->reveal())); | ||||
|  | ||||
|         $this->assertFalse($manager->hasLock($document, $request->reveal())); | ||||
|     } | ||||
|  | ||||
|     public function testSingleLock() | ||||
|     { | ||||
|         $manager = $this->makeManager(1); | ||||
|         $document = new StoredObject(); | ||||
|         $request = $this->prophesize(RequestInterface::class); | ||||
|  | ||||
|         $this->assertFalse($manager->hasLock($document, $request->reveal())); | ||||
|  | ||||
|         $this->assertTrue($manager->setLock($document, 'dummy', $request->reveal())); | ||||
|  | ||||
|         $this->assertEquals('dummy', $manager->getLock($document, $request->reveal())); | ||||
|  | ||||
|         $this->assertTrue($manager->deleteLock($document, $request->reveal())); | ||||
|  | ||||
|         $this->assertFalse($manager->hasLock($document, $request->reveal())); | ||||
|     } | ||||
|  | ||||
|     private function makeManager(int $ttlAfterDeleteSeconds): ChillDocumentLockManager | ||||
|     { | ||||
|         $redis = self::$container->get(ChillRedis::class); | ||||
|  | ||||
|         return new ChillDocumentLockManager($redis, $ttlAfterDeleteSeconds); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user