mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-09-27 09:05:01 +00:00
Compare commits
54 Commits
test/fixes
...
fix_filiat
Author | SHA1 | Date | |
---|---|---|---|
34801dcd5f | |||
cc2bee8188 | |||
99154eaa99 | |||
b28677fac9 | |||
fb0135a0af | |||
88961e3e7e | |||
85796c2271 | |||
83ee3c7cfd | |||
8809abedf6 | |||
5896a77ae9 | |||
11d1b26efc | |||
5f6c11bde9 | |||
b3da9611ce | |||
ba8a80a202 | |||
6998043159 | |||
ce17c15d41 | |||
93560a62ef | |||
3785e5096e | |||
3748eb99c6 | |||
c69af351cc | |||
692c2bdac0 | |||
6bcc28b4bb | |||
a79a2b6ee9 | |||
09b2c9a14e | |||
4ef48216ed | |||
16fed67dd0 | |||
87a9d48bdf | |||
f3ca01fd88 | |||
5962d3f233 | |||
ab08dab88a | |||
3bb8b713d1 | |||
94c258e914 | |||
1d8f25e2c8 | |||
b4b67c6f0d | |||
|
9978e76a87 | ||
|
36e35f2e8f | ||
|
389f014d36 | ||
135b385c11 | |||
|
3cf8609e8f | ||
c82e128c5c | |||
3ddab4f6e2 | |||
|
31e1bfdf80 | ||
|
c76f2a81c9 | ||
|
f48e197e0b | ||
|
f70e3b7997 | ||
66baf0391c | |||
4f81bffa67 | |||
5432ce2b0f | |||
03bc94178f | |||
bf536aab38 | |||
df593c7c7f | |||
|
07f4aaa590 | ||
10095343ec | |||
1742dd4951 |
@@ -94,8 +94,7 @@ unit_tests:
|
|||||||
- php -d memory_limit=2G tests/app/bin/console cache:clear --env=dev
|
- 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=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=2G tests/app/bin/console cache:clear --env=test
|
||||||
- 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
|
||||||
- php -d memory_limit=4G bin/phpunit --colors=never --testdox
|
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 30 min
|
expire_in: 30 min
|
||||||
paths:
|
paths:
|
||||||
|
@@ -16,7 +16,8 @@ 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
|
* [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.
|
* [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)
|
* [workflow]: Constraint added to workflow (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/675)
|
||||||
* [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)
|
* [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)
|
||||||
|
|
||||||
## Test releases
|
## Test releases
|
||||||
|
|
||||||
|
@@ -10,8 +10,8 @@
|
|||||||
"require": {
|
"require": {
|
||||||
"php": "^7.4",
|
"php": "^7.4",
|
||||||
"champs-libres/async-uploader-bundle": "dev-sf4#d57134aee8e504a83c902ff0cf9f8d36ac418290",
|
"champs-libres/async-uploader-bundle": "dev-sf4#d57134aee8e504a83c902ff0cf9f8d36ac418290",
|
||||||
"champs-libres/wopi-bundle": "dev-master#59b468503b9413f8d588ef9e626e7675560db3d8",
|
"champs-libres/wopi-bundle": "dev-master#6dd8e0a14e00131eb4b889ecc30270ee4a0e5224",
|
||||||
"champs-libres/wopi-lib": "dev-master#0e1da19bb6de820080b8651867a7e475be590060",
|
"champs-libres/wopi-lib": "dev-master#8615f4a45a39fc2b6a98765ea835fcfd39618787",
|
||||||
"doctrine/doctrine-bundle": "^2.1",
|
"doctrine/doctrine-bundle": "^2.1",
|
||||||
"doctrine/doctrine-migrations-bundle": "^3.0",
|
"doctrine/doctrine-migrations-bundle": "^3.0",
|
||||||
"doctrine/orm": "^2.7",
|
"doctrine/orm": "^2.7",
|
||||||
@@ -96,7 +96,8 @@
|
|||||||
"autoload-dev": {
|
"autoload-dev": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"App\\": "tests/app/src/",
|
"App\\": "tests/app/src/",
|
||||||
"Chill\\DocGeneratorBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests"
|
"Chill\\DocGeneratorBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests",
|
||||||
|
"Chill\\WopiBundle\\Tests\\": "src/Bundle/ChillDocGeneratorBundle/tests"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
|
@@ -65,6 +65,17 @@ This script will :
|
|||||||
4. build assets
|
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
|
4. Start the project
|
||||||
====================
|
====================
|
||||||
|
|
||||||
|
@@ -24,6 +24,7 @@ parameters:
|
|||||||
- "/spec/"
|
- "/spec/"
|
||||||
- "/var/"
|
- "/var/"
|
||||||
- "/vendor/"
|
- "/vendor/"
|
||||||
|
- "/tests/app"
|
||||||
|
|
||||||
# Psalm
|
# Psalm
|
||||||
tasks.psalm.blocking: true
|
tasks.psalm.blocking: true
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -25,16 +25,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Bundle/ChillActivityBundle/Form/ActivityType.php
|
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\\.$#"
|
message: "#^Only booleans are allowed in an if condition, mixed given\\.$#"
|
||||||
count: 3
|
count: 3
|
||||||
|
@@ -40,6 +40,9 @@
|
|||||||
<testsuite name="DocGeneratorBundle">
|
<testsuite name="DocGeneratorBundle">
|
||||||
<directory suffix="Test.php">src/Bundle/ChillDocGeneratorBundle/tests/</directory>
|
<directory suffix="Test.php">src/Bundle/ChillDocGeneratorBundle/tests/</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
|
<testsuite name="WopiBundle">
|
||||||
|
<directory suffix="Test.php">src/Bundle/ChillWopiBundle/tests/</directory>
|
||||||
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
|
|
||||||
<listeners>
|
<listeners>
|
||||||
|
@@ -21,6 +21,7 @@ use Chill\ActivityBundle\Repository\ActivityTypeRepository;
|
|||||||
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
|
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
|
||||||
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
|
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
|
||||||
use Chill\MainBundle\Repository\LocationRepository;
|
use Chill\MainBundle\Repository\LocationRepository;
|
||||||
|
use Chill\MainBundle\Security\Resolver\CenterResolverManagerInterface;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
use Chill\PersonBundle\Privacy\PrivacyEvent;
|
use Chill\PersonBundle\Privacy\PrivacyEvent;
|
||||||
@@ -56,6 +57,8 @@ final class ActivityController extends AbstractController
|
|||||||
|
|
||||||
private ActivityTypeRepository $activityTypeRepository;
|
private ActivityTypeRepository $activityTypeRepository;
|
||||||
|
|
||||||
|
private CenterResolverManagerInterface $centerResolver;
|
||||||
|
|
||||||
private EntityManagerInterface $entityManager;
|
private EntityManagerInterface $entityManager;
|
||||||
|
|
||||||
private EventDispatcherInterface $eventDispatcher;
|
private EventDispatcherInterface $eventDispatcher;
|
||||||
@@ -82,7 +85,8 @@ final class ActivityController extends AbstractController
|
|||||||
EntityManagerInterface $entityManager,
|
EntityManagerInterface $entityManager,
|
||||||
EventDispatcherInterface $eventDispatcher,
|
EventDispatcherInterface $eventDispatcher,
|
||||||
LoggerInterface $logger,
|
LoggerInterface $logger,
|
||||||
SerializerInterface $serializer
|
SerializerInterface $serializer,
|
||||||
|
CenterResolverManagerInterface $centerResolver
|
||||||
) {
|
) {
|
||||||
$this->activityACLAwareRepository = $activityACLAwareRepository;
|
$this->activityACLAwareRepository = $activityACLAwareRepository;
|
||||||
$this->activityTypeRepository = $activityTypeRepository;
|
$this->activityTypeRepository = $activityTypeRepository;
|
||||||
@@ -96,6 +100,7 @@ final class ActivityController extends AbstractController
|
|||||||
$this->eventDispatcher = $eventDispatcher;
|
$this->eventDispatcher = $eventDispatcher;
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
$this->serializer = $serializer;
|
$this->serializer = $serializer;
|
||||||
|
$this->centerResolver = $centerResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -198,7 +203,7 @@ final class ActivityController extends AbstractController
|
|||||||
// $this->denyAccessUnlessGranted('CHILL_ACTIVITY_UPDATE', $entity);
|
// $this->denyAccessUnlessGranted('CHILL_ACTIVITY_UPDATE', $entity);
|
||||||
|
|
||||||
$form = $this->createForm(ActivityType::class, $entity, [
|
$form = $this->createForm(ActivityType::class, $entity, [
|
||||||
'center' => $entity->getCenter(),
|
'center' => $this->centerResolver->resolveCenters($entity)[0] ?? null,
|
||||||
'role' => new Role('CHILL_ACTIVITY_UPDATE'),
|
'role' => new Role('CHILL_ACTIVITY_UPDATE'),
|
||||||
'activityType' => $entity->getActivityType(),
|
'activityType' => $entity->getActivityType(),
|
||||||
'accompanyingPeriod' => $accompanyingPeriod,
|
'accompanyingPeriod' => $accompanyingPeriod,
|
||||||
@@ -416,7 +421,7 @@ final class ActivityController extends AbstractController
|
|||||||
$this->denyAccessUnlessGranted(ActivityVoter::CREATE, $entity);
|
$this->denyAccessUnlessGranted(ActivityVoter::CREATE, $entity);
|
||||||
|
|
||||||
$form = $this->createForm(ActivityType::class, $entity, [
|
$form = $this->createForm(ActivityType::class, $entity, [
|
||||||
'center' => $entity->getCenter(),
|
'center' => $this->centerResolver->resolveCenters($entity)[0] ?? null,
|
||||||
'role' => new Role('CHILL_ACTIVITY_CREATE'),
|
'role' => new Role('CHILL_ACTIVITY_CREATE'),
|
||||||
'activityType' => $entity->getActivityType(),
|
'activityType' => $entity->getActivityType(),
|
||||||
'accompanyingPeriod' => $accompanyingPeriod,
|
'accompanyingPeriod' => $accompanyingPeriod,
|
||||||
|
@@ -61,8 +61,6 @@ class ChillActivityExtension extends Extension implements PrependExtensionInterf
|
|||||||
ActivityVoter::DELETE => [ActivityVoter::SEE_DETAILS],
|
ActivityVoter::DELETE => [ActivityVoter::SEE_DETAILS],
|
||||||
ActivityVoter::SEE_DETAILS => [ActivityVoter::SEE],
|
ActivityVoter::SEE_DETAILS => [ActivityVoter::SEE],
|
||||||
ActivityVoter::FULL => [
|
ActivityVoter::FULL => [
|
||||||
ActivityVoter::CREATE_PERSON,
|
|
||||||
ActivityVoter::CREATE_ACCOMPANYING_COURSE,
|
|
||||||
ActivityVoter::DELETE,
|
ActivityVoter::DELETE,
|
||||||
ActivityVoter::UPDATE,
|
ActivityVoter::UPDATE,
|
||||||
],
|
],
|
||||||
|
@@ -16,8 +16,8 @@ use Chill\DocStoreBundle\Entity\StoredObject;
|
|||||||
use Chill\MainBundle\Entity\Center;
|
use Chill\MainBundle\Entity\Center;
|
||||||
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
|
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
|
||||||
use Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable;
|
use Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable;
|
||||||
use Chill\MainBundle\Entity\HasCenterInterface;
|
use Chill\MainBundle\Entity\HasCentersInterface;
|
||||||
use Chill\MainBundle\Entity\HasScopeInterface;
|
use Chill\MainBundle\Entity\HasScopesInterface;
|
||||||
use Chill\MainBundle\Entity\Location;
|
use Chill\MainBundle\Entity\Location;
|
||||||
use Chill\MainBundle\Entity\Scope;
|
use Chill\MainBundle\Entity\Scope;
|
||||||
use Chill\MainBundle\Entity\User;
|
use Chill\MainBundle\Entity\User;
|
||||||
@@ -55,7 +55,7 @@ use Symfony\Component\Validator\Constraints as Assert;
|
|||||||
* getUserFunction="getUser",
|
* getUserFunction="getUser",
|
||||||
* path="scope")
|
* path="scope")
|
||||||
*/
|
*/
|
||||||
class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterface, HasCenterInterface, HasScopeInterface
|
class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterface, HasCentersInterface, HasScopesInterface
|
||||||
{
|
{
|
||||||
public const SENTRECEIVED_RECEIVED = 'received';
|
public const SENTRECEIVED_RECEIVED = 'received';
|
||||||
|
|
||||||
@@ -306,13 +306,17 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
* get the center
|
* get the center
|
||||||
* center is extracted from person.
|
* center is extracted from person.
|
||||||
*/
|
*/
|
||||||
public function getCenter(): ?Center
|
public function getCenters(): iterable
|
||||||
{
|
{
|
||||||
if ($this->person instanceof Person) {
|
if ($this->person instanceof Person) {
|
||||||
return $this->person->getCenter();
|
return [$this->person->getCenter()];
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
if ($this->getAccompanyingPeriod() instanceof AccompanyingPeriod) {
|
||||||
|
return $this->getAccompanyingPeriod()->getCenters() ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getComment(): CommentEmbeddable
|
public function getComment(): CommentEmbeddable
|
||||||
@@ -422,6 +426,19 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
|
|||||||
return $this->scope;
|
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
|
public function getSentReceived(): string
|
||||||
{
|
{
|
||||||
return $this->sentReceived;
|
return $this->sentReceived;
|
||||||
|
@@ -14,17 +14,20 @@ namespace Chill\ActivityBundle\Form;
|
|||||||
use Chill\ActivityBundle\Entity\Activity;
|
use Chill\ActivityBundle\Entity\Activity;
|
||||||
use Chill\ActivityBundle\Entity\ActivityPresence;
|
use Chill\ActivityBundle\Entity\ActivityPresence;
|
||||||
use Chill\ActivityBundle\Entity\ActivityReason;
|
use Chill\ActivityBundle\Entity\ActivityReason;
|
||||||
|
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
|
||||||
use Chill\DocStoreBundle\Form\StoredObjectType;
|
use Chill\DocStoreBundle\Form\StoredObjectType;
|
||||||
|
use Chill\MainBundle\Entity\Center;
|
||||||
use Chill\MainBundle\Entity\Location;
|
use Chill\MainBundle\Entity\Location;
|
||||||
use Chill\MainBundle\Entity\User;
|
use Chill\MainBundle\Entity\User;
|
||||||
use Chill\MainBundle\Form\Type\ChillCollectionType;
|
use Chill\MainBundle\Form\Type\ChillCollectionType;
|
||||||
use Chill\MainBundle\Form\Type\ChillDateType;
|
use Chill\MainBundle\Form\Type\ChillDateType;
|
||||||
use Chill\MainBundle\Form\Type\CommentType;
|
use Chill\MainBundle\Form\Type\CommentType;
|
||||||
|
use Chill\MainBundle\Form\Type\PickUserDynamicType;
|
||||||
use Chill\MainBundle\Form\Type\PrivateCommentType;
|
use Chill\MainBundle\Form\Type\PrivateCommentType;
|
||||||
use Chill\MainBundle\Form\Type\ScopePickerType;
|
use Chill\MainBundle\Form\Type\ScopePickerType;
|
||||||
use Chill\MainBundle\Form\Type\UserPickerType;
|
|
||||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
|
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
|
||||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
|
use Chill\MainBundle\Templating\TranslatableStringHelper;
|
||||||
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
use Chill\PersonBundle\Entity\SocialWork\SocialAction;
|
use Chill\PersonBundle\Entity\SocialWork\SocialAction;
|
||||||
use Chill\PersonBundle\Entity\SocialWork\SocialIssue;
|
use Chill\PersonBundle\Entity\SocialWork\SocialIssue;
|
||||||
@@ -50,6 +53,7 @@ use Symfony\Component\Form\FormEvents;
|
|||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
||||||
|
|
||||||
|
use Symfony\Component\Security\Core\Role\Role;
|
||||||
use function in_array;
|
use function in_array;
|
||||||
|
|
||||||
class ActivityType extends AbstractType
|
class ActivityType extends AbstractType
|
||||||
@@ -109,19 +113,18 @@ class ActivityType extends AbstractType
|
|||||||
$activityType = $options['activityType'];
|
$activityType = $options['activityType'];
|
||||||
|
|
||||||
// TODO revoir la gestion des center au niveau du form des activité.
|
// TODO revoir la gestion des center au niveau du form des activité.
|
||||||
if ($options['center']) {
|
if ($options['center'] instanceof Center && null !== $options['data']->getPerson()) {
|
||||||
$builder->add('scope', ScopePickerType::class, [
|
$builder->add('scope', ScopePickerType::class, [
|
||||||
'center' => $options['center'],
|
'center' => $options['center'],
|
||||||
'role' => $options['role'],
|
'role' => ActivityVoter::CREATE === (string) $options['role'] ? ActivityVoter::CREATE_PERSON : (string) $options['role'],
|
||||||
// TODO make required again once scope and rights are fixed
|
'required' => true,
|
||||||
'required' => false,
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var ? \Chill\PersonBundle\Entity\AccompanyingPeriod $accompanyingPeriod */
|
/** @var ? \Chill\PersonBundle\Entity\AccompanyingPeriod $accompanyingPeriod */
|
||||||
$accompanyingPeriod = null;
|
$accompanyingPeriod = null;
|
||||||
|
|
||||||
if ($options['accompanyingPeriod']) {
|
if ($options['accompanyingPeriod'] instanceof AccompanyingPeriod) {
|
||||||
$accompanyingPeriod = $options['accompanyingPeriod'];
|
$accompanyingPeriod = $options['accompanyingPeriod'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,12 +221,10 @@ class ActivityType extends AbstractType
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($activityType->isVisible('user') && $options['center']) {
|
if ($activityType->isVisible('user') && $options['center'] instanceof Center) {
|
||||||
$builder->add('user', UserPickerType::class, [
|
$builder->add('user', PickUserDynamicType::class, [
|
||||||
'label' => $activityType->getLabel('user'),
|
'label' => $activityType->getLabel('user'),
|
||||||
'required' => $activityType->isRequired('user'),
|
'required' => $activityType->isRequired('user'),
|
||||||
'center' => $options['center'],
|
|
||||||
'role' => $options['role'],
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -442,8 +443,8 @@ class ActivityType extends AbstractType
|
|||||||
|
|
||||||
$resolver
|
$resolver
|
||||||
->setRequired(['center', 'role', 'activityType', 'accompanyingPeriod'])
|
->setRequired(['center', 'role', 'activityType', 'accompanyingPeriod'])
|
||||||
->setAllowedTypes('center', ['null', 'Chill\MainBundle\Entity\Center'])
|
->setAllowedTypes('center', ['null', Center::class])
|
||||||
->setAllowedTypes('role', 'Symfony\Component\Security\Core\Role\Role')
|
->setAllowedTypes('role', [Role::class, 'string'])
|
||||||
->setAllowedTypes('activityType', \Chill\ActivityBundle\Entity\ActivityType::class)
|
->setAllowedTypes('activityType', \Chill\ActivityBundle\Entity\ActivityType::class)
|
||||||
->setAllowedTypes('accompanyingPeriod', [\Chill\PersonBundle\Entity\AccompanyingPeriod::class, 'null']);
|
->setAllowedTypes('accompanyingPeriod', [\Chill\PersonBundle\Entity\AccompanyingPeriod::class, 'null']);
|
||||||
}
|
}
|
||||||
|
@@ -120,3 +120,11 @@
|
|||||||
|
|
||||||
{{ form_end(edit_form) }}
|
{{ form_end(edit_form) }}
|
||||||
{# {{ form(delete_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'} %}
|
{% include 'ChillActivityBundle:Activity:list.html.twig' with {'context': 'person'} %}
|
||||||
|
|
||||||
{% if is_granted('CHILL_ACTIVITY_CREATE_PERSON', person) %}
|
{% if is_granted('CHILL_ACTIVITY_CREATE', person) %}
|
||||||
<ul class="record_actions sticky-form-buttons">
|
<ul class="record_actions sticky-form-buttons">
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ path('chill_activity_activity_new', {'person_id': person_id, 'accompanying_period_id': accompanying_course_id}) }}"
|
<a href="{{ path('chill_activity_activity_new', {'person_id': person_id, 'accompanying_period_id': accompanying_course_id}) }}"
|
||||||
|
@@ -119,3 +119,11 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
{{ form_end(form) }}
|
{{ 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
|
// change attribute CREATE
|
||||||
if (self::CREATE === $attribute) {
|
if (self::CREATE === $attribute) {
|
||||||
$attribute = self::CREATE_PERSON;
|
return $this->voterHelper->voteOnAttribute(self::CREATE_PERSON, $subject->getPerson(), $token);
|
||||||
}
|
}
|
||||||
} elseif ($subject->getAccompanyingPeriod() instanceof AccompanyingPeriod) {
|
} elseif ($subject->getAccompanyingPeriod() instanceof AccompanyingPeriod) {
|
||||||
if (!$this->security->isGranted(AccompanyingPeriodVoter::SEE, $subject->getAccompanyingPeriod())) {
|
if (!$this->security->isGranted(AccompanyingPeriodVoter::SEE, $subject->getAccompanyingPeriod())) {
|
||||||
@@ -144,7 +144,8 @@ class ActivityVoter extends AbstractChillVoter implements ProvideRoleHierarchyIn
|
|||||||
if (AccompanyingPeriod::STEP_CLOSED === $subject->getAccompanyingPeriod()->getStep()) {
|
if (AccompanyingPeriod::STEP_CLOSED === $subject->getAccompanyingPeriod()->getStep()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$attribute = self::CREATE_ACCOMPANYING_COURSE;
|
|
||||||
|
return $this->voterHelper->voteOnAttribute(self::CREATE_ACCOMPANYING_COURSE, $subject->getAccompanyingPeriod(), $token);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException('Could not determine context of activity.');
|
throw new RuntimeException('Could not determine context of activity.');
|
||||||
@@ -158,12 +159,12 @@ class ActivityVoter extends AbstractChillVoter implements ProvideRoleHierarchyIn
|
|||||||
|
|
||||||
// transform the attribute
|
// transform the attribute
|
||||||
if (self::CREATE === $attribute) {
|
if (self::CREATE === $attribute) {
|
||||||
$attribute = self::CREATE_ACCOMPANYING_COURSE;
|
return $this->voterHelper->voteOnAttribute(self::CREATE_ACCOMPANYING_COURSE, $subject, $token);
|
||||||
}
|
}
|
||||||
} elseif ($subject instanceof Person) {
|
} elseif ($subject instanceof Person) {
|
||||||
// transform the attribute
|
// transform the attribute
|
||||||
if (self::CREATE === $attribute) {
|
if (self::CREATE === $attribute) {
|
||||||
$attribute = self::CREATE_PERSON;
|
return $this->voterHelper->voteOnAttribute(self::CREATE_PERSON, $subject, $token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -130,8 +130,10 @@ class ActivityContext implements
|
|||||||
return $this->personRender->renderString($p, []);
|
return $this->personRender->renderString($p, []);
|
||||||
},
|
},
|
||||||
'multiple' => false,
|
'multiple' => false,
|
||||||
|
'required' => false,
|
||||||
'expanded' => true,
|
'expanded' => true,
|
||||||
'label' => $options[$key . 'Label'],
|
'label' => $options[$key . 'Label'],
|
||||||
|
'placeholder' => $this->translator->trans('Any person selected'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
234
src/Bundle/ChillActivityBundle/translations/messages.nl.yaml
Normal file
234
src/Bundle/ChillActivityBundle/translations/messages.nl.yaml
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
#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
|
@@ -0,0 +1,23 @@
|
|||||||
|
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".
|
@@ -0,0 +1,167 @@
|
|||||||
|
#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
|
@@ -0,0 +1 @@
|
|||||||
|
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)
|
@@ -0,0 +1,8 @@
|
|||||||
|
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 resources registered: Aucune ressource passée
|
||||||
No past charges registered: Aucune charge passée
|
No past charges registered: Aucune charge passée
|
||||||
No future resources registered: Aucune ressource future enregistrée
|
No future resources registered: Aucune ressource future enregistrée
|
||||||
No future charges registered: Aucune ressource future enregistrée
|
No future charges registered: Aucune charge future enregistrée
|
||||||
No current budget element registered: Pas des éléments de budget actuelles enregistrés
|
No current budget element registered: Pas des éléments de budget actuelles enregistrés
|
||||||
|
|
||||||
New resource: Nouvelle ressource
|
New resource: Nouvelle ressource
|
||||||
|
76
src/Bundle/ChillBudgetBundle/translations/messages.nl.yml
Normal file
76
src/Bundle/ChillBudgetBundle/translations/messages.nl.yml
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
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%
|
@@ -0,0 +1,2 @@
|
|||||||
|
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
|
28
src/Bundle/ChillCalendarBundle/translations/messages.nl.yml
Normal file
28
src/Bundle/ChillCalendarBundle/translations/messages.nl.yml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
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,6 +11,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Chill\DocStoreBundle\Entity;
|
namespace Chill\DocStoreBundle\Entity;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Entity\HasScopesInterface;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
|
||||||
@@ -18,7 +19,7 @@ use Doctrine\ORM\Mapping as ORM;
|
|||||||
* @ORM\Entity
|
* @ORM\Entity
|
||||||
* @ORM\Table("chill_doc.accompanyingcourse_document")
|
* @ORM\Table("chill_doc.accompanyingcourse_document")
|
||||||
*/
|
*/
|
||||||
class AccompanyingCourseDocument extends Document
|
class AccompanyingCourseDocument extends Document implements HasScopesInterface
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity=AccompanyingPeriod::class)
|
* @ORM\ManyToOne(targetEntity=AccompanyingPeriod::class)
|
||||||
@@ -31,6 +32,15 @@ class AccompanyingCourseDocument extends Document
|
|||||||
return $this->course;
|
return $this->course;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getScopes(): iterable
|
||||||
|
{
|
||||||
|
if (null !== $this->course) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->course->getScopes();
|
||||||
|
}
|
||||||
|
|
||||||
public function setCourse(?AccompanyingPeriod $course): self
|
public function setCourse(?AccompanyingPeriod $course): self
|
||||||
{
|
{
|
||||||
$this->course = $course;
|
$this->course = $course;
|
||||||
|
@@ -16,8 +16,6 @@ use Chill\MainBundle\Doctrine\Model\TrackCreationInterface;
|
|||||||
use Chill\MainBundle\Doctrine\Model\TrackCreationTrait;
|
use Chill\MainBundle\Doctrine\Model\TrackCreationTrait;
|
||||||
use Chill\MainBundle\Doctrine\Model\TrackUpdateInterface;
|
use Chill\MainBundle\Doctrine\Model\TrackUpdateInterface;
|
||||||
use Chill\MainBundle\Doctrine\Model\TrackUpdateTrait;
|
use Chill\MainBundle\Doctrine\Model\TrackUpdateTrait;
|
||||||
use Chill\MainBundle\Entity\HasScopeInterface;
|
|
||||||
use Chill\MainBundle\Entity\Scope;
|
|
||||||
use Chill\MainBundle\Entity\User;
|
use Chill\MainBundle\Entity\User;
|
||||||
use DateTimeInterface;
|
use DateTimeInterface;
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
@@ -26,7 +24,7 @@ use Symfony\Component\Validator\Constraints as Assert;
|
|||||||
/**
|
/**
|
||||||
* @ORM\MappedSuperclass
|
* @ORM\MappedSuperclass
|
||||||
*/
|
*/
|
||||||
class Document implements HasScopeInterface, TrackCreationInterface, TrackUpdateInterface
|
class Document implements TrackCreationInterface, TrackUpdateInterface
|
||||||
{
|
{
|
||||||
use TrackCreationTrait;
|
use TrackCreationTrait;
|
||||||
|
|
||||||
@@ -70,13 +68,6 @@ class Document implements HasScopeInterface, TrackCreationInterface, TrackUpdate
|
|||||||
*/
|
*/
|
||||||
private $object;
|
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")
|
* @ORM\ManyToOne(targetEntity="Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate")
|
||||||
*/
|
*/
|
||||||
@@ -122,16 +113,6 @@ class Document implements HasScopeInterface, TrackCreationInterface, TrackUpdate
|
|||||||
return $this->object;
|
return $this->object;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get scope.
|
|
||||||
*
|
|
||||||
* @return \Chill\MainBundle\Entity\Scope
|
|
||||||
*/
|
|
||||||
public function getScope(): ?Scope
|
|
||||||
{
|
|
||||||
return $this->scope;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTemplate(): ?DocGeneratorTemplate
|
public function getTemplate(): ?DocGeneratorTemplate
|
||||||
{
|
{
|
||||||
return $this->template;
|
return $this->template;
|
||||||
@@ -175,13 +156,6 @@ class Document implements HasScopeInterface, TrackCreationInterface, TrackUpdate
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setScope($scope): self
|
|
||||||
{
|
|
||||||
$this->scope = $scope;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setTemplate(?DocGeneratorTemplate $template): self
|
public function setTemplate(?DocGeneratorTemplate $template): self
|
||||||
{
|
{
|
||||||
$this->template = $template;
|
$this->template = $template;
|
||||||
|
@@ -13,6 +13,7 @@ namespace Chill\DocStoreBundle\Entity;
|
|||||||
|
|
||||||
use Chill\MainBundle\Entity\HasCenterInterface;
|
use Chill\MainBundle\Entity\HasCenterInterface;
|
||||||
use Chill\MainBundle\Entity\HasScopeInterface;
|
use Chill\MainBundle\Entity\HasScopeInterface;
|
||||||
|
use Chill\MainBundle\Entity\Scope;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
|
||||||
@@ -27,6 +28,13 @@ class PersonDocument extends Document implements HasCenterInterface, HasScopeInt
|
|||||||
*/
|
*/
|
||||||
private Person $person;
|
private Person $person;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Scope")
|
||||||
|
*
|
||||||
|
* @var \Chill\MainBundle\Entity\Scope The document's center
|
||||||
|
*/
|
||||||
|
private $scope;
|
||||||
|
|
||||||
public function getCenter()
|
public function getCenter()
|
||||||
{
|
{
|
||||||
return $this->getPerson()->getCenter();
|
return $this->getPerson()->getCenter();
|
||||||
@@ -37,10 +45,22 @@ class PersonDocument extends Document implements HasCenterInterface, HasScopeInt
|
|||||||
return $this->person;
|
return $this->person;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getScope(): ?Scope
|
||||||
|
{
|
||||||
|
return $this->scope;
|
||||||
|
}
|
||||||
|
|
||||||
public function setPerson($person): self
|
public function setPerson($person): self
|
||||||
{
|
{
|
||||||
$this->person = $person;
|
$this->person = $person;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setScope($scope): self
|
||||||
|
{
|
||||||
|
$this->scope = $scope;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -88,10 +88,5 @@ class AccompanyingCourseDocumentType extends AbstractType
|
|||||||
$resolver->setDefaults([
|
$resolver->setDefaults([
|
||||||
'data_class' => Document::class,
|
'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);
|
$this->addACL($qb, $person);
|
||||||
|
|
||||||
foreach ($orderBy as $field => $order) {
|
foreach ($orderBy as $field => $order) {
|
||||||
$qb->addOrderBy($field, $order);
|
$qb->addOrderBy('d.' . $field, $order);
|
||||||
}
|
}
|
||||||
|
|
||||||
$qb->setFirstResult($offset)->setMaxResults($limit);
|
$qb->setFirstResult($offset)->setMaxResults($limit);
|
||||||
|
@@ -106,6 +106,10 @@ class AccompanyingCourseDocumentVoter extends AbstractChillVoter implements Prov
|
|||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (self::CREATE === $attribute && null !== $subject->getCourse()) {
|
||||||
|
return $this->voterHelper->voteOnAttribute($attribute, $subject->getCourse(), $token);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->voterHelper->voteOnAttribute($attribute, $subject, $token);
|
return $this->voterHelper->voteOnAttribute($attribute, $subject, $token);
|
||||||
|
@@ -15,12 +15,18 @@ use Base64Url\Base64Url;
|
|||||||
use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlGeneratorInterface;
|
use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlGeneratorInterface;
|
||||||
use Chill\DocStoreBundle\Entity\StoredObject;
|
use Chill\DocStoreBundle\Entity\StoredObject;
|
||||||
use Chill\DocStoreBundle\Exception\StoredObjectManagerException;
|
use Chill\DocStoreBundle\Exception\StoredObjectManagerException;
|
||||||
|
use DateTimeImmutable;
|
||||||
|
use DateTimeInterface;
|
||||||
|
use DateTimeZone;
|
||||||
|
use RuntimeException;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
|
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
|
||||||
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
||||||
|
use Symfony\Contracts\HttpClient\ResponseInterface;
|
||||||
use Throwable;
|
use Throwable;
|
||||||
|
use function array_key_exists;
|
||||||
use const OPENSSL_RAW_DATA;
|
use const OPENSSL_RAW_DATA;
|
||||||
|
|
||||||
final class StoredObjectManager implements StoredObjectManagerInterface
|
final class StoredObjectManager implements StoredObjectManagerInterface
|
||||||
@@ -29,6 +35,8 @@ final class StoredObjectManager implements StoredObjectManagerInterface
|
|||||||
|
|
||||||
private HttpClientInterface $client;
|
private HttpClientInterface $client;
|
||||||
|
|
||||||
|
private array $inMemory = [];
|
||||||
|
|
||||||
private TempUrlGeneratorInterface $tempUrlGenerator;
|
private TempUrlGeneratorInterface $tempUrlGenerator;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
@@ -39,28 +47,35 @@ final class StoredObjectManager implements StoredObjectManagerInterface
|
|||||||
$this->tempUrlGenerator = $tempUrlGenerator;
|
$this->tempUrlGenerator = $tempUrlGenerator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function read(StoredObject $document): string
|
public function getLastModified(StoredObject $document): DateTimeInterface
|
||||||
{
|
{
|
||||||
try {
|
if ($this->hasCache($document)) {
|
||||||
$response = $this
|
$response = $this->getResponseFromCache($document);
|
||||||
->client
|
} else {
|
||||||
->request(
|
try {
|
||||||
Request::METHOD_GET,
|
$response = $this
|
||||||
$this
|
->client
|
||||||
->tempUrlGenerator
|
->request(
|
||||||
->generate(
|
Request::METHOD_HEAD,
|
||||||
Request::METHOD_GET,
|
$this
|
||||||
$document->getFilename()
|
->tempUrlGenerator
|
||||||
)
|
->generate(
|
||||||
->url
|
Request::METHOD_PUT,
|
||||||
);
|
$document->getFilename()
|
||||||
} catch (Throwable $e) {
|
)
|
||||||
throw StoredObjectManagerException::errorDuringHttpRequest($e);
|
->url
|
||||||
|
);
|
||||||
|
} catch (TransportExceptionInterface $exception) {
|
||||||
|
throw StoredObjectManagerException::errorDuringHttpRequest($exception);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($response->getStatusCode() !== Response::HTTP_OK) {
|
return $this->extractLastModifiedFromResponse($response);
|
||||||
throw StoredObjectManagerException::invalidStatusCode($response->getStatusCode());
|
}
|
||||||
}
|
|
||||||
|
public function read(StoredObject $document): string
|
||||||
|
{
|
||||||
|
$response = $this->getResponseFromCache($document);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$data = $response->getContent();
|
$data = $response->getContent();
|
||||||
@@ -90,6 +105,10 @@ final class StoredObjectManager implements StoredObjectManagerInterface
|
|||||||
|
|
||||||
public function write(StoredObject $document, string $clearContent): void
|
public function write(StoredObject $document, string $clearContent): void
|
||||||
{
|
{
|
||||||
|
if ($this->hasCache($document)) {
|
||||||
|
unset($this->inMemory[$document->getUuid()->toString()]);
|
||||||
|
}
|
||||||
|
|
||||||
$encryptedContent = $this->hasKeysAndIv($document)
|
$encryptedContent = $this->hasKeysAndIv($document)
|
||||||
? openssl_encrypt(
|
? openssl_encrypt(
|
||||||
$clearContent,
|
$clearContent,
|
||||||
@@ -126,6 +145,64 @@ 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
|
private function hasKeysAndIv(StoredObject $storedObject): bool
|
||||||
{
|
{
|
||||||
return ([] !== $storedObject->getKeyInfos()) && ([] !== $storedObject->getIv());
|
return ([] !== $storedObject->getKeyInfos()) && ([] !== $storedObject->getIv());
|
||||||
|
@@ -12,9 +12,12 @@ declare(strict_types=1);
|
|||||||
namespace Chill\DocStoreBundle\Service;
|
namespace Chill\DocStoreBundle\Service;
|
||||||
|
|
||||||
use Chill\DocStoreBundle\Entity\StoredObject;
|
use Chill\DocStoreBundle\Entity\StoredObject;
|
||||||
|
use DateTimeInterface;
|
||||||
|
|
||||||
interface StoredObjectManagerInterface
|
interface StoredObjectManagerInterface
|
||||||
{
|
{
|
||||||
|
public function getLastModified(StoredObject $document): DateTimeInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the content of a StoredObject.
|
* Get the content of a StoredObject.
|
||||||
*
|
*
|
||||||
|
@@ -12,6 +12,7 @@ declare(strict_types=1);
|
|||||||
namespace Chill\EventBundle\Controller;
|
namespace Chill\EventBundle\Controller;
|
||||||
|
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class AdminController
|
* Class AdminController
|
||||||
@@ -20,18 +21,12 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|||||||
class AdminController extends AbstractController
|
class AdminController extends AbstractController
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @return \Symfony\Component\HttpFoundation\Response
|
* Event admin.
|
||||||
|
*
|
||||||
|
* @Route("/{_locale}/admin/event", name="chill_event_admin_index")
|
||||||
*/
|
*/
|
||||||
public function indexAction()
|
public function indexAdminAction()
|
||||||
{
|
{
|
||||||
return $this->render('ChillEventBundle:Admin:layout.html.twig');
|
return $this->render('ChillEventBundle:Admin:index.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
|
* @var Center $centers
|
||||||
*/
|
*/
|
||||||
$centers = $this->authorizationHelper->getReachableCenters($this->getUser(), $role);
|
$centers = $this->authorizationHelper->getReachableCenters($this->getUser(), (string) $role);
|
||||||
|
|
||||||
if (count($centers) === 1) {
|
if (count($centers) === 1) {
|
||||||
return $this->redirectToRoute('chill_event__event_new', [
|
return $this->redirectToRoute('chill_event__event_new', [
|
||||||
|
@@ -151,7 +151,7 @@ class PickEventType extends AbstractType
|
|||||||
} else {
|
} else {
|
||||||
$centers = $this->authorizationHelper->getReachableCenters(
|
$centers = $this->authorizationHelper->getReachableCenters(
|
||||||
$this->user,
|
$this->user,
|
||||||
$options['role']
|
(string) $options['role']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
61
src/Bundle/ChillEventBundle/Menu/AdminMenuBuilder.php
Normal file
61
src/Bundle/ChillEventBundle/Menu/AdminMenuBuilder.php
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
<?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'];
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,13 @@
|
|||||||
|
{% 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 %}
|
@@ -1,31 +0,0 @@
|
|||||||
{#
|
|
||||||
* 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,21 +1,3 @@
|
|||||||
{#
|
|
||||||
* 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" %}
|
{% extends "@ChillMain/Menu/verticalMenu.html.twig" %}
|
||||||
{% block v_menu_title %}{{ 'Events configuration menu'|trans }}{% endblock %}
|
{% block v_menu_title %}{{ 'Events configuration menu'|trans }}{% endblock %}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
<h1>{{ 'Role edit'|trans }}</h1>
|
<h1>{{ 'Role edit'|trans }}</h1>
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% extends "ChillEventBundle:Admin:layout.html.twig" %}
|
{% extends "ChillEventBundle:Admin:index.html.twig" %}
|
||||||
|
|
||||||
{% block admin_content -%}
|
{% block admin_content -%}
|
||||||
|
|
||||||
|
@@ -9,24 +9,24 @@ chill_event_participation:
|
|||||||
|
|
||||||
## ADMIN
|
## ADMIN
|
||||||
|
|
||||||
chill_event_admin:
|
chill_event_admin_index:
|
||||||
path: /{_locale}/admin/event
|
path: /{_locale}/admin/event
|
||||||
controller: Chill\EventBundle\Controller\AdminController::indexAction
|
controller: Chill\EventBundle\Controller\AdminController::indexAdminAction
|
||||||
options:
|
# options:
|
||||||
menus:
|
# menus:
|
||||||
admin_section:
|
# admin_section:
|
||||||
order: 2100
|
# order: 2100
|
||||||
label: "Events"
|
# label: "Events"
|
||||||
icons: ['calendar']
|
# icons: ['calendar']
|
||||||
|
|
||||||
chill_event_admin_redirect_to_admin_index:
|
# chill_event_admin_redirect_to_admin_index:
|
||||||
path: /{_locale}/admin/event_redirect_to_main
|
# path: /{_locale}/admin/event_redirect_to_main
|
||||||
controller: Chill\EventBundle\Controller\AdminController::redirectToAdminIndexAction
|
# controller: Chill\EventBundle\Controller\AdminController::redirectToAdminIndexAction
|
||||||
options:
|
# options:
|
||||||
menus:
|
# menus:
|
||||||
admin_events:
|
# admin_events:
|
||||||
order: 0
|
# order: 0
|
||||||
label: Main admin menu
|
# label: Main admin menu
|
||||||
|
|
||||||
chill_event_admin_status:
|
chill_event_admin_status:
|
||||||
resource: "@ChillEventBundle/config/routes/status.yaml"
|
resource: "@ChillEventBundle/config/routes/status.yaml"
|
||||||
@@ -39,4 +39,4 @@ chill_event_admin_role:
|
|||||||
chill_event_admin_event_type:
|
chill_event_admin_event_type:
|
||||||
resource: "@ChillEventBundle/config/routes/eventtype.yaml"
|
resource: "@ChillEventBundle/config/routes/eventtype.yaml"
|
||||||
prefix: /{_locale}/admin/event/event_type
|
prefix: /{_locale}/admin/event/event_type
|
||||||
|
|
||||||
|
@@ -1,2 +1,11 @@
|
|||||||
services:
|
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 '
|
$this->addSql('ALTER TABLE chill_event_participation '
|
||||||
. 'ADD CONSTRAINT FK_4E7768AC217BBB47 '
|
. 'ADD CONSTRAINT FK_4E7768AC217BBB47 '
|
||||||
. 'FOREIGN KEY (person_id) '
|
. 'FOREIGN KEY (person_id) '
|
||||||
. 'REFERENCES Person (id) '
|
. 'REFERENCES chill_person_person(id) '
|
||||||
. 'NOT DEFERRABLE INITIALLY IMMEDIATE');
|
. 'NOT DEFERRABLE INITIALLY IMMEDIATE');
|
||||||
$this->addSql('ALTER TABLE chill_event_participation '
|
$this->addSql('ALTER TABLE chill_event_participation '
|
||||||
. 'ADD CONSTRAINT FK_4E7768ACD60322AC '
|
. 'ADD CONSTRAINT FK_4E7768ACD60322AC '
|
||||||
|
@@ -405,7 +405,7 @@ class ExportController extends AbstractController
|
|||||||
'alias' => $alias,
|
'alias' => $alias,
|
||||||
];
|
];
|
||||||
unset($parameters['_token']);
|
unset($parameters['_token']);
|
||||||
$key = md5(uniqid(mt_rand(), false));
|
$key = md5(uniqid((string) mt_rand(), false));
|
||||||
|
|
||||||
$this->redis->setEx($key, 3600, serialize($parameters));
|
$this->redis->setEx($key, 3600, serialize($parameters));
|
||||||
|
|
||||||
|
@@ -92,5 +92,8 @@ final class PostalCodeAPIController extends ApiController
|
|||||||
$qb->where('e.country = :country')
|
$qb->where('e.country = :country')
|
||||||
->setParameter('country', $request->query->get('country'));
|
->setParameter('country', $request->query->get('country'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$qb->andWhere('e.origin = :zero')
|
||||||
|
->setParameter('zero', 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -12,7 +12,9 @@ declare(strict_types=1);
|
|||||||
namespace Chill\MainBundle\Controller;
|
namespace Chill\MainBundle\Controller;
|
||||||
|
|
||||||
use Chill\MainBundle\CRUD\Controller\ApiController;
|
use Chill\MainBundle\CRUD\Controller\ApiController;
|
||||||
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\Routing\Annotation\Route;
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
|
||||||
class UserApiController extends ApiController
|
class UserApiController extends ApiController
|
||||||
@@ -58,4 +60,14 @@ class UserApiController extends ApiController
|
|||||||
['groups' => ['read']]
|
['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'"));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,25 @@
|
|||||||
|
<?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,6 +19,7 @@ use Chill\MainBundle\Controller\LanguageController;
|
|||||||
use Chill\MainBundle\Controller\LocationController;
|
use Chill\MainBundle\Controller\LocationController;
|
||||||
use Chill\MainBundle\Controller\LocationTypeController;
|
use Chill\MainBundle\Controller\LocationTypeController;
|
||||||
use Chill\MainBundle\Controller\UserController;
|
use Chill\MainBundle\Controller\UserController;
|
||||||
|
use Chill\MainBundle\Controller\UserJobApiController;
|
||||||
use Chill\MainBundle\Controller\UserJobController;
|
use Chill\MainBundle\Controller\UserJobController;
|
||||||
use Chill\MainBundle\DependencyInjection\Widget\Factory\WidgetFactoryInterface;
|
use Chill\MainBundle\DependencyInjection\Widget\Factory\WidgetFactoryInterface;
|
||||||
use Chill\MainBundle\Doctrine\DQL\GetJsonFieldByKey;
|
use Chill\MainBundle\Doctrine\DQL\GetJsonFieldByKey;
|
||||||
@@ -501,6 +502,7 @@ class ChillMainExtension extends Extension implements
|
|||||||
'name' => 'user_job',
|
'name' => 'user_job',
|
||||||
'base_path' => '/api/1.0/main/user-job',
|
'base_path' => '/api/1.0/main/user-job',
|
||||||
'base_role' => 'ROLE_USER',
|
'base_role' => 'ROLE_USER',
|
||||||
|
'controller' => UserJobApiController::class,
|
||||||
'actions' => [
|
'actions' => [
|
||||||
'_index' => [
|
'_index' => [
|
||||||
'methods' => [
|
'methods' => [
|
||||||
|
@@ -87,7 +87,7 @@ class ComposedRoleScopeType extends AbstractType
|
|||||||
},
|
},
|
||||||
])
|
])
|
||||||
->add('scope', EntityType::class, [
|
->add('scope', EntityType::class, [
|
||||||
'class' => 'ChillMainBundle:Scope',
|
'class' => Scope::class,
|
||||||
'choice_label' => static function (Scope $scope) use ($translatableStringHelper) {
|
'choice_label' => static function (Scope $scope) use ($translatableStringHelper) {
|
||||||
return $translatableStringHelper->localize($scope->getName());
|
return $translatableStringHelper->localize($scope->getName());
|
||||||
},
|
},
|
||||||
|
@@ -78,11 +78,11 @@ class PickCenterType extends AbstractType
|
|||||||
$export = $this->exportManager->getExport($options['export_alias']);
|
$export = $this->exportManager->getExport($options['export_alias']);
|
||||||
$centers = $this->authorizationHelper->getReachableCenters(
|
$centers = $this->authorizationHelper->getReachableCenters(
|
||||||
$this->user,
|
$this->user,
|
||||||
$export->requiredRole()
|
(string) $export->requiredRole()
|
||||||
);
|
);
|
||||||
|
|
||||||
$builder->add(self::CENTERS_IDENTIFIERS, EntityType::class, [
|
$builder->add(self::CENTERS_IDENTIFIERS, EntityType::class, [
|
||||||
'class' => 'ChillMainBundle:Center',
|
'class' => Center::class,
|
||||||
'query_builder' => static function (EntityRepository $er) use ($centers) {
|
'query_builder' => static function (EntityRepository $er) use ($centers) {
|
||||||
$qb = $er->createQueryBuilder('c');
|
$qb = $er->createQueryBuilder('c');
|
||||||
$ids = array_map(
|
$ids = array_map(
|
||||||
|
@@ -43,6 +43,7 @@ class UserCurrentLocationType extends AbstractType
|
|||||||
},
|
},
|
||||||
'placeholder' => 'Pick a location',
|
'placeholder' => 'Pick a location',
|
||||||
'required' => false,
|
'required' => false,
|
||||||
|
'attr' => ['class' => 'select2'],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -119,8 +119,8 @@ final class PostalCodeRepository implements ObjectRepository
|
|||||||
|
|
||||||
$pertinenceClause = ['STRICT_WORD_SIMILARITY(canonical, UNACCENT(?))'];
|
$pertinenceClause = ['STRICT_WORD_SIMILARITY(canonical, UNACCENT(?))'];
|
||||||
$pertinenceArgs = [$pattern];
|
$pertinenceArgs = [$pattern];
|
||||||
$orWhere = ['canonical %>> UNACCENT(?)'];
|
$andWhere = ['canonical %>> UNACCENT(?)'];
|
||||||
$orWhereArgs = [$pattern];
|
$andWhereArgs = [$pattern];
|
||||||
|
|
||||||
foreach (explode(' ', $pattern) as $part) {
|
foreach (explode(' ', $pattern) as $part) {
|
||||||
$part = trim($part);
|
$part = trim($part);
|
||||||
@@ -129,8 +129,8 @@ final class PostalCodeRepository implements ObjectRepository
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$orWhere[] = "canonical LIKE '%' || UNACCENT(LOWER(?)) || '%'";
|
$andWhere[] = "canonical LIKE '%' || UNACCENT(LOWER(?)) || '%'";
|
||||||
$orWhereArgs[] = $part;
|
$andWhereArgs[] = $part;
|
||||||
$pertinenceClause[] =
|
$pertinenceClause[] =
|
||||||
"(EXISTS (SELECT 1 FROM unnest(string_to_array(canonical, ' ')) AS t WHERE starts_with(t, UNACCENT(LOWER(?)))))::int";
|
"(EXISTS (SELECT 1 FROM unnest(string_to_array(canonical, ' ')) AS t WHERE starts_with(t, UNACCENT(LOWER(?)))))::int";
|
||||||
$pertinenceClause[] =
|
$pertinenceClause[] =
|
||||||
@@ -139,7 +139,7 @@ final class PostalCodeRepository implements ObjectRepository
|
|||||||
}
|
}
|
||||||
$query
|
$query
|
||||||
->setSelectPertinence(implode(' + ', $pertinenceClause), $pertinenceArgs)
|
->setSelectPertinence(implode(' + ', $pertinenceClause), $pertinenceArgs)
|
||||||
->andWhereClause(implode(' OR ', $orWhere), $orWhereArgs);
|
->andWhereClause(implode(' AND ', $andWhere), $andWhereArgs);
|
||||||
|
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
@@ -121,7 +121,9 @@ export default {
|
|||||||
this.entity.selected.city = value;
|
this.entity.selected.city = value;
|
||||||
this.entity.selected.postcode.name = value.name;
|
this.entity.selected.postcode.name = value.name;
|
||||||
this.entity.selected.postcode.code = value.code;
|
this.entity.selected.postcode.code = value.code;
|
||||||
this.entity.selected.postcode.coordinates = value.center.coordinates;
|
if (value.center) {
|
||||||
|
this.entity.selected.postcode.coordinates = value.center.coordinates;
|
||||||
|
}
|
||||||
this.entity.selected.writeNew.postcode = false;
|
this.entity.selected.writeNew.postcode = false;
|
||||||
this.$emit('getReferenceAddresses', value);
|
this.$emit('getReferenceAddresses', value);
|
||||||
this.focusOnAddress();
|
this.focusOnAddress();
|
||||||
|
@@ -16,6 +16,7 @@ use Chill\MainBundle\Notification\Counter\NotificationByUserCounter;
|
|||||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
|
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
|
||||||
use Chill\MainBundle\Workflow\Counter\WorkflowByUserCounter;
|
use Chill\MainBundle\Workflow\Counter\WorkflowByUserCounter;
|
||||||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
||||||
|
use Symfony\Component\HttpFoundation\RequestStack;
|
||||||
use Symfony\Component\Security\Core\Security;
|
use Symfony\Component\Security\Core\Security;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
@@ -25,6 +26,8 @@ class UserMenuBuilder implements LocalMenuBuilderInterface
|
|||||||
|
|
||||||
private NotificationByUserCounter $notificationByUserCounter;
|
private NotificationByUserCounter $notificationByUserCounter;
|
||||||
|
|
||||||
|
private RequestStack $requestStack;
|
||||||
|
|
||||||
private Security $security;
|
private Security $security;
|
||||||
|
|
||||||
private TranslatorInterface $translator;
|
private TranslatorInterface $translator;
|
||||||
@@ -36,13 +39,15 @@ class UserMenuBuilder implements LocalMenuBuilderInterface
|
|||||||
WorkflowByUserCounter $workflowByUserCounter,
|
WorkflowByUserCounter $workflowByUserCounter,
|
||||||
Security $security,
|
Security $security,
|
||||||
TranslatorInterface $translator,
|
TranslatorInterface $translator,
|
||||||
ParameterBagInterface $parameterBag
|
ParameterBagInterface $parameterBag,
|
||||||
|
RequestStack $requestStack
|
||||||
) {
|
) {
|
||||||
$this->notificationByUserCounter = $notificationByUserCounter;
|
$this->notificationByUserCounter = $notificationByUserCounter;
|
||||||
$this->workflowByUserCounter = $workflowByUserCounter;
|
$this->workflowByUserCounter = $workflowByUserCounter;
|
||||||
$this->security = $security;
|
$this->security = $security;
|
||||||
$this->translator = $translator;
|
$this->translator = $translator;
|
||||||
$this->parameterBag = $parameterBag;
|
$this->parameterBag = $parameterBag;
|
||||||
|
$this->requestStack = $requestStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildMenu($menuId, \Knp\Menu\MenuItem $menu, array $parameters)
|
public function buildMenu($menuId, \Knp\Menu\MenuItem $menu, array $parameters)
|
||||||
@@ -59,7 +64,12 @@ class UserMenuBuilder implements LocalMenuBuilderInterface
|
|||||||
$menu
|
$menu
|
||||||
->addChild(
|
->addChild(
|
||||||
$locationTextMenu,
|
$locationTextMenu,
|
||||||
['route' => 'chill_main_user_currentlocation_edit']
|
[
|
||||||
|
'route' => 'chill_main_user_currentlocation_edit',
|
||||||
|
'routeParameters' => [
|
||||||
|
'returnPath' => $this->requestStack->getCurrentRequest()->getRequestUri(),
|
||||||
|
],
|
||||||
|
]
|
||||||
)
|
)
|
||||||
->setExtras([
|
->setExtras([
|
||||||
'order' => -9999999,
|
'order' => -9999999,
|
||||||
|
@@ -47,12 +47,12 @@ final class Version20210505153727 extends AbstractMigration
|
|||||||
');
|
');
|
||||||
$this->addSql('
|
$this->addSql('
|
||||||
WITH hydrated_addresses AS (
|
WITH hydrated_addresses AS (
|
||||||
SELECT *, rank() OVER (PARTITION BY pa_a.person_id ORDER BY validfrom)
|
SELECT *, rank() OVER (PARTITION BY pa_a.person_id ORDER BY validfrom, id)
|
||||||
FROM chill_main_address AS aa JOIN chill_person_persons_to_addresses AS pa_a ON aa.id = pa_a.address_id
|
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
|
UPDATE chill_main_address AS b
|
||||||
SET validto = (
|
SET validto = (
|
||||||
SELECT validfrom - INTERVAL \'1 DAY\'
|
SELECT validfrom
|
||||||
FROM hydrated_addresses
|
FROM hydrated_addresses
|
||||||
WHERE hydrated_addresses.id = (
|
WHERE hydrated_addresses.id = (
|
||||||
SELECT a1.id
|
SELECT a1.id
|
||||||
|
@@ -0,0 +1,39 @@
|
|||||||
|
<?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,9 +1,459 @@
|
|||||||
Search: Zoek
|
"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>"
|
||||||
'Search persons, ...': 'Zoek persoons, ...'
|
User manual: Gebruikershandleiding
|
||||||
Search a person: Zoek een persoon
|
Search: Zoeken
|
||||||
Login: Log in
|
"Search persons, ...": "Zoek personen, ..."
|
||||||
Logout: Log out
|
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.
|
||||||
Username: Gebruikersnaam
|
Username: Gebruikersnaam
|
||||||
Password: Wachtworrd
|
username: gebruikersnaam
|
||||||
Login to %installation_name%: Log in bij %installation_name%
|
Password: Wachtwoord
|
||||||
Welcome to %installation_name%: Welkom bij %installation_name%
|
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
|
||||||
|
|
||||||
|
@@ -177,7 +177,7 @@ class AccompanyingCourseController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function editAction(AccompanyingPeriod $accompanyingCourse): Response
|
public function editAction(AccompanyingPeriod $accompanyingCourse): Response
|
||||||
{
|
{
|
||||||
$this->denyAccessUnlessGranted(AccompanyingPeriodVoter::SEE, $accompanyingCourse);
|
$this->denyAccessUnlessGranted(AccompanyingPeriodVoter::EDIT, $accompanyingCourse);
|
||||||
|
|
||||||
return $this->render('@ChillPerson/AccompanyingCourse/edit.html.twig', [
|
return $this->render('@ChillPerson/AccompanyingCourse/edit.html.twig', [
|
||||||
'accompanyingCourse' => $accompanyingCourse,
|
'accompanyingCourse' => $accompanyingCourse,
|
||||||
@@ -215,7 +215,7 @@ class AccompanyingCourseController extends Controller
|
|||||||
// get persons without household
|
// get persons without household
|
||||||
$withoutHousehold = [];
|
$withoutHousehold = [];
|
||||||
|
|
||||||
foreach ($accompanyingCourse->getParticipations() as $p) {
|
foreach ($accompanyingCourse->getCurrentParticipations() as $p) {
|
||||||
if (false === $p->getPerson()->isSharingHousehold()) {
|
if (false === $p->getPerson()->isSharingHousehold()) {
|
||||||
$withoutHousehold[] = $p->getPerson();
|
$withoutHousehold[] = $p->getPerson();
|
||||||
}
|
}
|
||||||
|
@@ -36,49 +36,49 @@ class Comment implements TrackCreationInterface, TrackUpdateInterface
|
|||||||
* inversedBy="comments")
|
* inversedBy="comments")
|
||||||
* @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
|
* @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
|
||||||
*/
|
*/
|
||||||
private $accompanyingPeriod;
|
private ?AccompanyingPeriod $accompanyingPeriod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="text")
|
* @ORM\Column(type="text")
|
||||||
* @Groups({"read", "write"})
|
* @Groups({"read", "write", "docgen:read"})
|
||||||
* @Assert\NotBlank
|
* @Assert\NotBlank
|
||||||
* @Assert\NotNull
|
* @Assert\NotNull
|
||||||
*/
|
*/
|
||||||
private $content;
|
private ?string $content;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="datetime")
|
* @ORM\Column(type="datetime")
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private $createdAt;
|
private ?DateTimeInterface $createdAt;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity=User::class)
|
* @ORM\ManyToOne(targetEntity=User::class)
|
||||||
* @ORM\JoinColumn(nullable=false)
|
* @ORM\JoinColumn(nullable=false)
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private $creator;
|
private ?User $creator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Id
|
* @ORM\Id
|
||||||
* @ORM\GeneratedValue
|
* @ORM\GeneratedValue
|
||||||
* @ORM\Column(type="integer")
|
* @ORM\Column(type="integer")
|
||||||
* @Groups({"read"})
|
* @Groups({"read", "docgen:read"})
|
||||||
*/
|
*/
|
||||||
private $id;
|
private ?int $id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(type="datetime")
|
* @ORM\Column(type="datetime")
|
||||||
* @Groups({"read"})
|
* @Groups({"read"})
|
||||||
*/
|
*/
|
||||||
private $updatedAt;
|
private ?DateTimeInterface $updatedAt;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity=User::class)
|
* @ORM\ManyToOne(targetEntity=User::class)
|
||||||
* @ORM\JoinColumn(nullable=false)
|
* @ORM\JoinColumn(nullable=false)
|
||||||
* @Groups({"read"})
|
* @Groups({"read"})
|
||||||
*/
|
*/
|
||||||
private $updatedBy;
|
private ?User $updatedBy;
|
||||||
|
|
||||||
public function getAccompanyingPeriod(): ?AccompanyingPeriod
|
public function getAccompanyingPeriod(): ?AccompanyingPeriod
|
||||||
{
|
{
|
||||||
|
@@ -14,6 +14,7 @@ namespace Chill\PersonBundle\Entity\Household;
|
|||||||
use ArrayIterator;
|
use ArrayIterator;
|
||||||
use Chill\MainBundle\Entity\Address;
|
use Chill\MainBundle\Entity\Address;
|
||||||
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
|
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
|
||||||
|
use Chill\PersonBundle\Entity\Person;
|
||||||
use Chill\PersonBundle\Validator\Constraints\Household\MaxHolder;
|
use Chill\PersonBundle\Validator\Constraints\Household\MaxHolder;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use DateTimeImmutable;
|
use DateTimeImmutable;
|
||||||
@@ -354,7 +355,12 @@ class Household
|
|||||||
return $this->members;
|
return $this->members;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getMembersDuringMembership(HouseholdMember $membership)
|
/**
|
||||||
|
* get all the members during a given membership.
|
||||||
|
*
|
||||||
|
* @return Collection|HouseholdMember[]
|
||||||
|
*/
|
||||||
|
public function getMembersDuringMembership(HouseholdMember $membership): Collection
|
||||||
{
|
{
|
||||||
return $this->getMembersOnRange(
|
return $this->getMembersOnRange(
|
||||||
$membership->getStartDate(),
|
$membership->getStartDate(),
|
||||||
@@ -441,6 +447,28 @@ class Household
|
|||||||
return $this->getNonCurrentMembers($now)->matching($criteria);
|
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
|
public function getPreviousAddressOf(Address $address): ?Address
|
||||||
{
|
{
|
||||||
$iterator = new ArrayIterator($this->getAddressesOrdered());
|
$iterator = new ArrayIterator($this->getAddressesOrdered());
|
||||||
|
@@ -1184,7 +1184,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated Use `getCurrentPersonAddress` instead
|
* @deprecated Use @see{Person::getCurrentPersonAddress} or @see{Person::getCurrentHouseholdAddress} instead
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*
|
*
|
||||||
@@ -1192,7 +1192,9 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI
|
|||||||
*/
|
*/
|
||||||
public function getLastAddress(?DateTime $from = null)
|
public function getLastAddress(?DateTime $from = null)
|
||||||
{
|
{
|
||||||
return $this->getCurrentPersonAddress();
|
return $this->getCurrentHouseholdAddress(
|
||||||
|
null !== $from ? DateTimeImmutable::createFromMutable($from) : null
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLastName(): string
|
public function getLastName(): string
|
||||||
|
@@ -11,6 +11,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Chill\PersonBundle\EventListener;
|
namespace Chill\PersonBundle\EventListener;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Entity\User;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork;
|
||||||
use Symfony\Component\Security\Core\Security;
|
use Symfony\Component\Security\Core\Security;
|
||||||
|
|
||||||
@@ -25,10 +26,8 @@ class AccompanyingPeriodWorkEventListener
|
|||||||
|
|
||||||
public function prePersistAccompanyingPeriodWork(AccompanyingPeriodWork $work): void
|
public function prePersistAccompanyingPeriodWork(AccompanyingPeriodWork $work): void
|
||||||
{
|
{
|
||||||
$referrer = $work->getAccompanyingPeriod()->getUser();
|
if ($this->security->getUser() instanceof User) {
|
||||||
|
$work->addReferrer($this->security->getUser());
|
||||||
if (null !== $referrer) {
|
|
||||||
$work->addReferrer($referrer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<div class="alert alert-warning alert-with-actions">
|
<div class="alert alert-warning alert-with-actions">
|
||||||
<div class="float-button bottom">
|
<div class="float-button bottom">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
|
{% if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_UPDATE', accompanyingCourse) %}
|
||||||
<div class="action">
|
<div class="action">
|
||||||
<ul class="record_actions">
|
<ul class="record_actions">
|
||||||
<li>
|
<li>
|
||||||
@@ -13,6 +13,8 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<p>{{ 'Some peoples does not belong to any household currently. Add them to an household soon'|trans }}</p>
|
<p>{{ 'Some peoples does not belong to any household currently. Add them to an household soon'|trans }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<div class="alert alert-danger {% if hasPersonLocation %}alert-with-actions{% endif %}">
|
<div class="alert alert-danger {% if hasPersonLocation %}alert-with-actions{% endif %}">
|
||||||
<div class="float-button bottom">
|
<div class="float-button bottom">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
|
{% if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_UPDATE', accompanyingCourse) %}
|
||||||
<div class="action">
|
<div class="action">
|
||||||
<ul class="record_actions">
|
<ul class="record_actions">
|
||||||
<li>
|
<li>
|
||||||
@@ -14,6 +15,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
<p>
|
<p>
|
||||||
{{ 'This course is located at a temporarily address. You should locate this course to an user'|trans }}</p>
|
{{ 'This course is located at a temporarily address. You should locate this course to an user'|trans }}</p>
|
||||||
{% if not hasPersonLocation %}
|
{% if not hasPersonLocation %}
|
||||||
|
@@ -48,13 +48,66 @@
|
|||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="flex-table accompanyingcourse-list">
|
|
||||||
{% for period in accompanying_periods %}
|
|
||||||
|
|
||||||
|
{# 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 %}
|
||||||
{% include 'ChillPersonBundle:AccompanyingPeriod:_list_item.html.twig' with {
|
{% include 'ChillPersonBundle:AccompanyingPeriod:_list_item.html.twig' with {
|
||||||
'recordAction': _self.recordAction(period, contextEntity)
|
'recordAction': _self.recordAction(period, contextEntity)
|
||||||
} %}
|
} %}
|
||||||
|
{% else %}
|
||||||
|
<p class="chill-no-data-statement">{{ 'Any accompanying periods are open'|trans }}</p>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</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 %}
|
{% endblock content %}
|
||||||
|
@@ -180,10 +180,16 @@
|
|||||||
{% if members|length > 0 %}
|
{% if members|length > 0 %}
|
||||||
<div class="flex-table list-household-members">
|
<div class="flex-table list-household-members">
|
||||||
{% for m in members %}
|
{% for m in members %}
|
||||||
|
{% if m.position.shareHousehold %}
|
||||||
{% include '@ChillPerson/Household/_render_member.html.twig' with {
|
{% include '@ChillPerson/Household/_render_member.html.twig' with {
|
||||||
'member': m,
|
'member': m,
|
||||||
'customButtons': { 'before': _self.customButtons(m, household) }
|
'customButtons': { 'before': _self.customButtons(m, household) }
|
||||||
} %}
|
} %}
|
||||||
|
{% else %}
|
||||||
|
{% include '@ChillPerson/Household/_render_member.html.twig' with {
|
||||||
|
'member': m,
|
||||||
|
} %}
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
@@ -65,18 +65,18 @@
|
|||||||
<h3>{{ 'household.Members at same time'|trans }}</h3>
|
<h3>{{ 'household.Members at same time'|trans }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="wl-col list">
|
<div class="wl-col list">
|
||||||
{% set simultaneous = p.household.getMembersDuringMembership(p) %}
|
{% set simultaneous = p.household.getPersonsDuringMembership(p) %}
|
||||||
{% if simultaneous|length == 0 %}
|
{% if simultaneous|length == 0 %}
|
||||||
<p class="chill-no-data-statement">
|
<p class="chill-no-data-statement">
|
||||||
{{ 'household.Any simultaneous members'|trans }}
|
{{ 'household.Any simultaneous members'|trans }}
|
||||||
</p>
|
</p>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% for m in simultaneous -%}
|
{% for person in simultaneous -%}
|
||||||
{% include '@ChillMain/OnTheFly/_insert_vue_onthefly.html.twig' with {
|
{% include '@ChillMain/OnTheFly/_insert_vue_onthefly.html.twig' with {
|
||||||
action: 'show', displayBadge: true,
|
action: 'show', displayBadge: true,
|
||||||
targetEntity: { name: 'person', id: m.person.id },
|
targetEntity: { name: 'person', id: person.id },
|
||||||
buttonText: m.person|chill_entity_render_string,
|
buttonText: person|chill_entity_render_string,
|
||||||
isDead: m.person.deathdate is not null
|
isDead: person.deathdate is not null
|
||||||
} %}
|
} %}
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@@ -1,13 +1,15 @@
|
|||||||
{% macro button_person_after(person) %}
|
{% macro button_person_after(person) %}
|
||||||
{% set household = person.getCurrentHousehold %}
|
{% set household = person.getCurrentHousehold %}
|
||||||
{% if household is not null %}
|
{% if household is not null and is_granted('CHILL_PERSON_HOUSEHOLD_SEE', household) %}
|
||||||
<li>
|
<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>
|
<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>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li>
|
{% if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_CREATE', person) %}
|
||||||
<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>
|
||||||
</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 %}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro accompanying_period(acp, person) %}
|
{% macro accompanying_period(acp, person) %}
|
||||||
@@ -233,7 +235,8 @@
|
|||||||
{%- set acpsClosed = [] %}
|
{%- set acpsClosed = [] %}
|
||||||
{%- for acp in person.accompanyingPeriodInvolved %}
|
{%- for acp in person.accompanyingPeriodInvolved %}
|
||||||
{%- if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_SEE', acp) %}
|
{%- if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_SEE', acp) %}
|
||||||
{% if acp.step == 'CLOSED' %}
|
{# 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 ) %}
|
||||||
{%- set acpsClosed = acpsClosed|merge([acp]) %}
|
{%- set acpsClosed = acpsClosed|merge([acp]) %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{%- set acps = acps|merge([acp]) %}
|
{%- set acps = acps|merge([acp]) %}
|
||||||
|
@@ -113,7 +113,7 @@ class AccompanyingPeriodVoter extends AbstractChillVoter implements ProvideRoleH
|
|||||||
->generate(self::class)
|
->generate(self::class)
|
||||||
->addCheckFor(null, [self::CREATE, self::REASSIGN_BULK])
|
->addCheckFor(null, [self::CREATE, self::REASSIGN_BULK])
|
||||||
->addCheckFor(AccompanyingPeriod::class, [self::TOGGLE_CONFIDENTIAL, ...self::ALL])
|
->addCheckFor(AccompanyingPeriod::class, [self::TOGGLE_CONFIDENTIAL, ...self::ALL])
|
||||||
->addCheckFor(Person::class, [self::SEE])
|
->addCheckFor(Person::class, [self::SEE, self::CREATE])
|
||||||
->build();
|
->build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -71,6 +71,7 @@ class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterf
|
|||||||
'location' => Address::class,
|
'location' => Address::class,
|
||||||
'locationPerson' => Person::class,
|
'locationPerson' => Person::class,
|
||||||
'administrativeLocation' => Location::class,
|
'administrativeLocation' => Location::class,
|
||||||
|
'pinnedComment' => AccompanyingPeriod\Comment::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
private ClosingMotiveRender $closingMotiveRender;
|
private ClosingMotiveRender $closingMotiveRender;
|
||||||
@@ -164,6 +165,8 @@ class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterf
|
|||||||
'location' => $this->normalizer->normalize($period->getLocation(), $format, $addressContext),
|
'location' => $this->normalizer->normalize($period->getLocation(), $format, $addressContext),
|
||||||
'administrativeLocation' => $this->normalizer->normalize($period->getAdministrativeLocation(), $format, $administrativeLocationContext),
|
'administrativeLocation' => $this->normalizer->normalize($period->getAdministrativeLocation(), $format, $administrativeLocationContext),
|
||||||
'works' => $this->normalizer->normalize($period->getWorks(), $format, $workContext),
|
'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])),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,6 +186,7 @@ class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterf
|
|||||||
'hasLocationPerson' => false,
|
'hasLocationPerson' => false,
|
||||||
'hasAdministrativeLocation' => false,
|
'hasAdministrativeLocation' => false,
|
||||||
'works' => [],
|
'works' => [],
|
||||||
|
'comments' => [],
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -13,7 +13,6 @@ namespace Chill\PersonBundle\Tests\Controller;
|
|||||||
|
|
||||||
use Chill\MainBundle\Test\PrepareClientTrait;
|
use Chill\MainBundle\Test\PrepareClientTrait;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
|
||||||
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
|
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
|
||||||
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
|
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
|
||||||
use Symfony\Component\DomCrawler\Form;
|
use Symfony\Component\DomCrawler\Form;
|
||||||
@@ -49,21 +48,21 @@ final class PersonControllerCreateTest extends WebTestCase
|
|||||||
public static function tearDownAfterClass(): void
|
public static function tearDownAfterClass(): void
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
$em = self::$kernel->getContainer()->get(EntityManagerInterface::class);
|
$em = self::$kernel->getContainer()->get('doctrine.orm.entity_manager');
|
||||||
|
|
||||||
//remove two people created during test
|
//remove two people created during test
|
||||||
$jesus = $em->getRepository(\Chill\PersonBundle\Entity\Person::class)
|
$jesus = $em->getRepository(\Chill\PersonBundle\Entity\Person::class)
|
||||||
->findOneBy(['firstName' => 'God']);
|
->findOneBy(['firstName' => 'God']);
|
||||||
|
|
||||||
if (null !== $jesus) {
|
if (null !== $jesus) {
|
||||||
//$em->remove($jesus);
|
$em->remove($jesus);
|
||||||
}
|
}
|
||||||
|
|
||||||
$jesus2 = $em->getRepository(\Chill\PersonBundle\Entity\Person::class)
|
$jesus2 = $em->getRepository(\Chill\PersonBundle\Entity\Person::class)
|
||||||
->findOneBy(['firstName' => 'roger']);
|
->findOneBy(['firstName' => 'roger']);
|
||||||
|
|
||||||
if (null !== $jesus2) {
|
if (null !== $jesus2) {
|
||||||
//$em->remove($jesus2);
|
$em->remove($jesus2);
|
||||||
}
|
}
|
||||||
$em->flush();
|
$em->flush();
|
||||||
}
|
}
|
||||||
|
@@ -12,7 +12,6 @@ declare(strict_types=1);
|
|||||||
namespace Chill\PersonBundle\Tests\Controller;
|
namespace Chill\PersonBundle\Tests\Controller;
|
||||||
|
|
||||||
use Chill\MainBundle\Entity\Center;
|
use Chill\MainBundle\Entity\Center;
|
||||||
use Chill\MainBundle\Repository\CenterRepository;
|
|
||||||
use Chill\MainBundle\Test\PrepareClientTrait;
|
use Chill\MainBundle\Test\PrepareClientTrait;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
use Closure;
|
use Closure;
|
||||||
@@ -61,14 +60,9 @@ final class PersonControllerUpdateTest extends WebTestCase
|
|||||||
$this->em = self::$container
|
$this->em = self::$container
|
||||||
->get(EntityManagerInterface::class);
|
->get(EntityManagerInterface::class);
|
||||||
|
|
||||||
$center = self::$container->get(CenterRepository::class)
|
$center = $this->em->getRepository(Center::class)
|
||||||
->findOneBy(['name' => 'Center A']);
|
->findOneBy(['name' => 'Center A']);
|
||||||
|
|
||||||
var_dump(array_map(
|
|
||||||
function (Center $c) { return $c->getName(); },
|
|
||||||
self::$container->get(CenterRepository::class)->findAll()
|
|
||||||
));
|
|
||||||
|
|
||||||
$this->person = (new Person())
|
$this->person = (new Person())
|
||||||
->setLastName('My Beloved')
|
->setLastName('My Beloved')
|
||||||
->setFirstName('Jesus')
|
->setFirstName('Jesus')
|
||||||
|
@@ -135,4 +135,51 @@ final class HouseholdTest extends TestCase
|
|||||||
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $second->getStartDate());
|
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $second->getStartDate());
|
||||||
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $inside->getEndDate());
|
$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,6 +68,8 @@ final class AccompanyingPeriodDocGenNormalizerTest extends KernelTestCase
|
|||||||
'closingMotive' => '@ignored',
|
'closingMotive' => '@ignored',
|
||||||
'confidential' => true,
|
'confidential' => true,
|
||||||
'confidentialText' => 'confidentiel',
|
'confidentialText' => 'confidentiel',
|
||||||
|
'comments' => '@ignored',
|
||||||
|
'pinnedComment' => '@ignored',
|
||||||
'createdAt' => '@ignored',
|
'createdAt' => '@ignored',
|
||||||
'createdBy' => '@ignored',
|
'createdBy' => '@ignored',
|
||||||
'emergency' => true,
|
'emergency' => true,
|
||||||
|
@@ -39,6 +39,7 @@ class RelationshipNoDuplicateValidator extends ConstraintValidator
|
|||||||
|
|
||||||
$fromPerson = $value->getFromPerson();
|
$fromPerson = $value->getFromPerson();
|
||||||
$toPerson = $value->getToPerson();
|
$toPerson = $value->getToPerson();
|
||||||
|
$relationType = $value->getRelation();
|
||||||
|
|
||||||
$relationships = $this->relationshipRepository->findBy([
|
$relationships = $this->relationshipRepository->findBy([
|
||||||
'fromPerson' => [$fromPerson, $toPerson],
|
'fromPerson' => [$fromPerson, $toPerson],
|
||||||
@@ -46,11 +47,11 @@ class RelationshipNoDuplicateValidator extends ConstraintValidator
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
foreach ($relationships as $r) {
|
foreach ($relationships as $r) {
|
||||||
if (
|
if ($r->getRelation()->getId() !== $relationType->getId()
|
||||||
$r->getFromPerson() === $fromPerson
|
&& ($r->getFromPerson() === $fromPerson
|
||||||
|| $r->getFromPerson() === $toPerson
|
|| $r->getFromPerson() === $toPerson
|
||||||
|| $r->getToPerson() === $fromPerson
|
|| $r->getToPerson() === $fromPerson
|
||||||
|| $r->getToPerson() === $toPerson
|
|| $r->getToPerson() === $toPerson)
|
||||||
) {
|
) {
|
||||||
$this->context->buildViolation($constraint->message)
|
$this->context->buildViolation($constraint->message)
|
||||||
->addViolation();
|
->addViolation();
|
||||||
|
@@ -1,69 +1,587 @@
|
|||||||
Edit: Wijzigen
|
Edit: Wijzigen
|
||||||
'First name': Voornaam
|
'First name': Voornaam
|
||||||
|
firstname: voornaam
|
||||||
|
firstName: voornaam
|
||||||
'Last name': Familienaam
|
'Last name': Familienaam
|
||||||
|
lastname: familienaam
|
||||||
|
lastName: familienaam
|
||||||
Name: Naam
|
Name: Naam
|
||||||
|
First name or Last name: Voornaam of familienaam
|
||||||
|
id: identificatienummer
|
||||||
Birthdate: Geboortedatum
|
Birthdate: Geboortedatum
|
||||||
'Date of birth': Geboortedatum
|
birthdate: geboortedatum
|
||||||
'Unknown date of birth': 'Geboortedatum onbekend'
|
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
|
||||||
Nationality: Nationaliteit
|
Nationality: Nationaliteit
|
||||||
|
nationality: nationaliteit
|
||||||
'Without nationality': 'Zonder nationaliteit'
|
'Without nationality': 'Zonder nationaliteit'
|
||||||
Gender: Geslacht
|
Gender: Gender
|
||||||
'Creation date': Opmaakdatum
|
gender: gender
|
||||||
'Not given': 'Niet gegeven'
|
Gender comment: Opmerkingen gender
|
||||||
'Place of birth': Geboorteplaats
|
'Creation date': Aanmaakdatum
|
||||||
'Country of birth': Geboorteland
|
'Not given': 'Niet opgegeven'
|
||||||
|
'Place of birth': 'Geboorteplaats'
|
||||||
|
placeOfBirth: geboorteplaats
|
||||||
|
'Country of birth': 'Geboorteland'
|
||||||
|
'Continent of birth': Continent van geboorte
|
||||||
|
countryOfBirth: 'Geboorteland'
|
||||||
'Unknown country of birth': 'Geboorteland onbekend'
|
'Unknown country of birth': 'Geboorteland onbekend'
|
||||||
'Marital status': 'Burgerlijke staat'
|
'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'
|
'Number of children': 'Aantal kinderen'
|
||||||
'{0} No child|{1} One child | ]1,Inf] %nb% children': '{0} geen kinderen|{1} 1 kind | ]1,Inf] %nb% kinderen'
|
'{0} No child|{1} One child | ]1,Inf] %nb% children': '{0} Geen kinderen|{1} Één kind | ]1,Inf] %nb% kinderen'
|
||||||
'National number': 'Nationale nummer'
|
'National number': 'Rijksregisternummer'
|
||||||
Email: Emailadres
|
Email: 'Email'
|
||||||
|
Accept emails ?: Accepteert emails?
|
||||||
|
Accept emails: Mag per mail gecontacteerd worden
|
||||||
Address: Adres
|
Address: Adres
|
||||||
Memo: Memo
|
Memo: Mémo
|
||||||
Phonenumber: Telefoonnummer
|
Phonenumber: 'Telefoonnummer'
|
||||||
'{0} Born the %date% | {1} Born the %date%': '{0} Geboren op %date% | {1} Geboren op %date%'
|
phonenumber: telefoonnummer
|
||||||
'Spoken languages': Spreektalen
|
Mobilenumber: 'Gsm nummer'
|
||||||
'Unkown spoken language': 'Spreektalen onbekend'
|
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'
|
||||||
Male: Man
|
Male: Man
|
||||||
Female: Vrouw
|
Female: Vrouw
|
||||||
|
Neuter: Non-binair
|
||||||
man: Man
|
man: Man
|
||||||
woman: Vrouw
|
woman: Vrouw
|
||||||
Divorced: 'Officieel gescheiden'
|
neuter: Non-binair
|
||||||
Separated: 'Feitelijk gescheiden'
|
Man: Man
|
||||||
Widow: Weduwschap
|
Woman: Vrouw
|
||||||
'Unknow marital status': Onbekend
|
both: Onbepaald
|
||||||
'Legal cohabitant': 'Wettige samenwoonst'
|
Both: Onbepaald
|
||||||
Single: Alleenstaand
|
Divorced: Gescheiden
|
||||||
Married: Gehuwd
|
Separated: Uit elkaar
|
||||||
'General information': 'Algemene informatie'
|
Widow: Weduwe/weduwnaar
|
||||||
'Birth information': Geboorte
|
'Unknow marital status': Burgerlijke staat ongekend
|
||||||
'Family information': Familie
|
'Legal cohabitant': 'Wettelijk samenwonend'
|
||||||
'Contact information': Contactgegevens
|
Single: Single
|
||||||
'Administrative information': 'Administratieve gegevens'
|
Married: Getrouwd
|
||||||
'Alreay existing person': 'Geregistreerd dossier'
|
'General information': Algemene informatie
|
||||||
'Add the person': 'Maak nieuw personendossier aan'
|
'Birth information': Geboortegegevens
|
||||||
'Confirm the creation': 'Bevestig de aanmaak'
|
'Family information': Familiale gegevens
|
||||||
'You will create this person': 'U hebt volgend dossier aangemaakt'
|
'Contact information': 'Contactinformatie'
|
||||||
Return: Vorige
|
'Administrative information': Administratieve gegevens
|
||||||
Submit: Opslaan
|
Course number: Traject n°
|
||||||
Reset: Delete
|
Civility: Aanspreektitel
|
||||||
'The person data has been updated': 'De persoongegevens zijn aangepast'
|
choose civility: --
|
||||||
'Add a person': 'Voeg een persoon toe'
|
All genders: alle genderkeuzes
|
||||||
'Person Menu': Personenmenu
|
Any person selected: Geen persoon geselecteerd
|
||||||
'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'
|
# dédoublonnage
|
||||||
'%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.'
|
Old person: Dubbel
|
||||||
'The person has been created': 'Dossier is aangemaakt'
|
Old person explain: zal verwijdert worden na de samenvoeging
|
||||||
'Person search results': Personengezocht
|
New person: Doelpersoon
|
||||||
'No persons matching search %pattern%': 'Geen personen stemmen met het gezocht "%pattern%" overeen.'
|
New person explain: zal bewaard worden na de samenvoeging
|
||||||
'%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.'
|
I confirm the merger of these 2 people : Ik bevestig de fusie van deze twee persoonsdossiers.
|
||||||
'Person details': 'Details van de persoon'
|
Person duplicate explained: Chill heeft mogelijke duplicaten gedetecteerd! U kunt bevestigen, weigeren, of handmatig een ander duplicaat aanwijzen.
|
||||||
'Last opening since %last_opening%': '__Last opening since %last_opening%'
|
Person flaged as duplicate: Dossiers gesignaleerd als vals-positief
|
||||||
'Person accompanying period - %name%': '__Person accompanying period - %name%'
|
Person flaged as duplicate explained: De volgende dossiers werden gesignaleerd als vals-positieven en zijn geen duplicaten!
|
||||||
'Opening date': '__Opening date'
|
Associate manually a duplicate person: Manueel een duplicaat aanduiden
|
||||||
'Closing date': '__Closing date'
|
Invert: Richting fusie omkeren.
|
||||||
'Still open': '__Still open'
|
Find duplicate: Duplicaten zoeken
|
||||||
'Create accompanying period': '__Create accompanying period'
|
Person duplicate: Duplicaten behandelen
|
||||||
'Close accompanying period ': '__Close accompanying period '
|
Open in another window: Openen in een nieuw scherm
|
||||||
'Open accompanying period': '__Open accompanying period'
|
Deleted datas: Gegevens verwijderen
|
||||||
'Unknown spoken languages': 'Spreektalen onbekend'
|
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.
|
||||||
|
@@ -13,7 +13,9 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator;
|
|||||||
|
|
||||||
use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlGeneratorInterface;
|
use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlGeneratorInterface;
|
||||||
use ChampsLibres\WopiBundle\Service\Wopi as CLWopi;
|
use ChampsLibres\WopiBundle\Service\Wopi as CLWopi;
|
||||||
|
use ChampsLibres\WopiLib\Contract\Service\DocumentLockManagerInterface;
|
||||||
use ChampsLibres\WopiLib\Contract\Service\DocumentManagerInterface;
|
use ChampsLibres\WopiLib\Contract\Service\DocumentManagerInterface;
|
||||||
|
use Chill\WopiBundle\Service\Wopi\ChillDocumentLockManager;
|
||||||
use Chill\WopiBundle\Service\Wopi\ChillDocumentManager;
|
use Chill\WopiBundle\Service\Wopi\ChillDocumentManager;
|
||||||
use Chill\WopiBundle\Service\Wopi\ChillWopi;
|
use Chill\WopiBundle\Service\Wopi\ChillWopi;
|
||||||
|
|
||||||
@@ -41,6 +43,10 @@ return static function (ContainerConfigurator $container) {
|
|||||||
$services
|
$services
|
||||||
->alias(DocumentManagerInterface::class, ChillDocumentManager::class);
|
->alias(DocumentManagerInterface::class, ChillDocumentManager::class);
|
||||||
|
|
||||||
|
$services
|
||||||
|
->set(ChillDocumentLockManager::class)
|
||||||
|
->decorate(DocumentLockManagerInterface::class);
|
||||||
|
|
||||||
// TODO: Move this into the async bundle (low priority)
|
// TODO: Move this into the async bundle (low priority)
|
||||||
$services
|
$services
|
||||||
->alias(TempUrlGeneratorInterface::class, 'async_uploader.temp_url_generator');
|
->alias(TempUrlGeneratorInterface::class, 'async_uploader.temp_url_generator');
|
||||||
|
@@ -0,0 +1,66 @@
|
|||||||
|
<?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,8 +147,7 @@ final class ChillDocumentManager implements DocumentManagerInterface
|
|||||||
*/
|
*/
|
||||||
public function getLastModifiedDate(Document $document): DateTimeInterface
|
public function getLastModifiedDate(Document $document): DateTimeInterface
|
||||||
{
|
{
|
||||||
// TODO: Add column 'LastModifiedDate' in StoredObject entity
|
return $this->storedObjectManager->getLastModified($document);
|
||||||
return $document->getCreationDate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLock(Document $document): string
|
public function getLock(Document $document): string
|
||||||
|
@@ -13,12 +13,15 @@ namespace Chill\WopiBundle\Service\Wopi;
|
|||||||
|
|
||||||
use ChampsLibres\WopiLib\Contract\Service\DocumentManagerInterface;
|
use ChampsLibres\WopiLib\Contract\Service\DocumentManagerInterface;
|
||||||
use ChampsLibres\WopiLib\Contract\Service\WopiInterface;
|
use ChampsLibres\WopiLib\Contract\Service\WopiInterface;
|
||||||
|
use DateTimeImmutable;
|
||||||
|
use DateTimeInterface;
|
||||||
use loophp\psr17\Psr17Interface;
|
use loophp\psr17\Psr17Interface;
|
||||||
use Psr\Cache\CacheItemPoolInterface;
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
use Psr\Http\Message\RequestInterface;
|
use Psr\Http\Message\RequestInterface;
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
|
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
|
||||||
use Symfony\Component\Security\Core\User\UserProviderInterface;
|
use Symfony\Component\Security\Core\User\UserProviderInterface;
|
||||||
|
use function strlen;
|
||||||
|
|
||||||
final class ChillWopi implements WopiInterface
|
final class ChillWopi implements WopiInterface
|
||||||
{
|
{
|
||||||
@@ -88,11 +91,14 @@ final class ChillWopi implements WopiInterface
|
|||||||
'UserFriendlyName' => $userIdentifier,
|
'UserFriendlyName' => $userIdentifier,
|
||||||
'SupportsUpdate' => true,
|
'SupportsUpdate' => true,
|
||||||
'SupportsRename' => true,
|
'SupportsRename' => true,
|
||||||
|
'SupportsFolder' => false,
|
||||||
'DisablePrint' => false,
|
'DisablePrint' => false,
|
||||||
'AllowExternalMarketplace' => true,
|
'AllowExternalMarketplace' => true,
|
||||||
'SupportedShareUrlTypes' => [
|
'SupportedShareUrlTypes' => [
|
||||||
'ReadOnly',
|
'ReadOnly',
|
||||||
],
|
],
|
||||||
|
'LastModifiedTime' => $this->documentManager->getLastModifiedDate($document)
|
||||||
|
->format(DateTimeInterface::ATOM),
|
||||||
'SHA256' => $this->documentManager->getSha256($document),
|
'SHA256' => $this->documentManager->getSha256($document),
|
||||||
'UserInfo' => (string) $this->cache->getItem($userCacheKey)->get(),
|
'UserInfo' => (string) $this->cache->getItem($userCacheKey)->get(),
|
||||||
]
|
]
|
||||||
@@ -146,7 +152,97 @@ final class ChillWopi implements WopiInterface
|
|||||||
string $xWopiEditors,
|
string $xWopiEditors,
|
||||||
RequestInterface $request
|
RequestInterface $request
|
||||||
): ResponseInterface {
|
): ResponseInterface {
|
||||||
return $this->wopi->putFile($fileId, $accessToken, $xWopiLock, $xWopiEditors, $request);
|
$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)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function putRelativeFile(string $fileId, string $accessToken, ?string $suggestedTarget, ?string $relativeTarget, bool $overwriteRelativeTarget, int $size, RequestInterface $request): ResponseInterface
|
public function putRelativeFile(string $fileId, string $accessToken, ?string $suggestedTarget, ?string $relativeTarget, bool $overwriteRelativeTarget, int $size, RequestInterface $request): ResponseInterface
|
||||||
|
@@ -0,0 +1,99 @@
|
|||||||
|
<?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