Merge remote-tracking branch 'origin/master' into fix-phpstan-issues-202303

This commit is contained in:
Julien Fastré 2023-04-11 11:36:11 +02:00
commit d9dd8d7317
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
54 changed files with 572 additions and 465 deletions

View File

@ -195,7 +195,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
* @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User") * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User")
* @Groups({"docgen:read"}) * @Groups({"docgen:read"})
*/ */
private User $user; private ?User $user;
/** /**
* @ORM\ManyToMany(targetEntity="Chill\MainBundle\Entity\User") * @ORM\ManyToMany(targetEntity="Chill\MainBundle\Entity\User")
@ -494,7 +494,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
return $this->activityType; return $this->activityType;
} }
public function getUser(): User public function getUser(): ?User
{ {
return $this->user; return $this->user;
} }
@ -681,14 +681,14 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
return $this; return $this;
} }
public function setUser(UserInterface $user): self public function setUser(?User $user): self
{ {
$this->user = $user; $this->user = $user;
return $this; return $this;
} }
public function setUsers(?Collection $users): self public function setUsers(Collection $users): self
{ {
$this->users = $users; $this->users = $users;

View File

@ -225,6 +225,7 @@ class ActivityType extends AbstractType
$builder->add('user', PickUserDynamicType::class, [ $builder->add('user', PickUserDynamicType::class, [
'label' => $activityType->getLabel('user'), 'label' => $activityType->getLabel('user'),
'required' => $activityType->isRequired('user'), 'required' => $activityType->isRequired('user'),
'multiple' => false,
]); ]);
} }

View File

@ -48,7 +48,7 @@ final class PersonMenuBuilder implements LocalMenuBuilderInterface
if ($this->authorizationChecker->isGranted(ActivityVoter::SEE, $person)) { if ($this->authorizationChecker->isGranted(ActivityVoter::SEE, $person)) {
$menu->addChild( $menu->addChild(
$this->translator->trans('Activity list'), $this->translator->trans('Activities'),
[ [
'route' => 'chill_activity_activity_list', 'route' => 'chill_activity_activity_list',
'routeParameters' => ['person_id' => $person->getId()], 'routeParameters' => ['person_id' => $person->getId()],

View File

@ -63,7 +63,7 @@
</div> </div>
{% endif %} {% endif %}
{% if activity.user and t.userVisible %} {% if activity.user is not null and t.userVisible %}
<div class="wl-row"> <div class="wl-row">
<div class="wl-col title"><h3>{{ 'Referrer'|trans }}</h3></div> <div class="wl-col title"><h3>{{ 'Referrer'|trans }}</h3></div>
<div class="wl-col list"> <div class="wl-col list">

View File

@ -5,7 +5,7 @@
Maybe should we think about abstracting this file a bit more ? Moving it to PersonBundle ? Maybe should we think about abstracting this file a bit more ? Moving it to PersonBundle ?
#} #}
{% if context == 'calendar_accompanyingCourse' %} {% if context == 'calendar_accompanyingCourse' or context == 'calendar_person' %}
{% import "@ChillCalendar/_invite.html.twig" as invite %} {% import "@ChillCalendar/_invite.html.twig" as invite %}
{% endif %} {% endif %}

View File

@ -34,10 +34,12 @@
<div class="item-row separator"> <div class="item-row separator">
<dl class="chill_view_data"> <dl class="chill_view_data">
<dt class="inline">{{ 'Referrer'|trans|capitalize }}</dt> {%- if entity.user is not null %}
<dd> <dt class="inline">{{ 'Referrer'|trans|capitalize }}</dt>
<span class="badge-user">{{ entity.user|chill_entity_render_box }}</span> <dd>
</dd> <span class="badge-user">{{ entity.user|chill_entity_render_box }}</span>
</dd>
{% endif %}
{%- if entity.scope -%} {%- if entity.scope -%}
<dt class="inline">{{ 'Scope'|trans }}</dt> <dt class="inline">{{ 'Scope'|trans }}</dt>

View File

@ -121,14 +121,14 @@ final class ActivityControllerTest extends WebTestCase
$client->getResponse()->getStatusCode(), $client->getResponse()->getStatusCode(),
'Unexpected HTTP status code for GET /activity/' 'Unexpected HTTP status code for GET /activity/'
); );
$crawler = $client->click($crawler->selectLink('Ajouter une nouvelle activité') $crawler = $client->click($crawler->selectLink('Ajouter un nouvel échange')
->link()); ->link());
$reason1 = $this->getRandomActivityReason(); $reason1 = $this->getRandomActivityReason();
$reason2 = $this->getRandomActivityReason([$reason1->getId()]); $reason2 = $this->getRandomActivityReason([$reason1->getId()]);
// Fill in the form and submit it // Fill in the form and submit it
$form = $crawler->selectButton('Ajouter une nouvelle activité')->form([ $form = $crawler->selectButton('Ajouter un nouvel échange')->form([
'chill_activitybundle_activity' => [ 'chill_activitybundle_activity' => [
'date' => '15-01-2015', 'date' => '15-01-2015',
'durationTime' => 600, 'durationTime' => 600,
@ -152,9 +152,9 @@ final class ActivityControllerTest extends WebTestCase
); );
// Edit the entity // Edit the entity
$crawler = $client->click($crawler->selectLink("Modifier l'activité")->link()); $crawler = $client->click($crawler->selectLink("Modifier l'échange")->link());
$form = $crawler->selectButton("Sauver l'activité")->form([ $form = $crawler->selectButton("Sauver l'échange")->form([
'chill_activitybundle_activity' => [ 'chill_activitybundle_activity' => [
'date' => '25-01-2015', 'date' => '25-01-2015',
// 'remark' => 'Foo' // 'remark' => 'Foo'

View File

@ -1,41 +1,41 @@
#general #general
Show the activity: Voir l'activité Show the activity: Voir l'échange
Edit the activity: Modifier l'activité Edit the activity: Modifier l'échange
Activity: Activité Activity: Échange
Duration time: Durée Duration time: Durée
Duration Time: Durée Duration Time: Durée
durationTime: durée durationTime: durée
Travel time: Durée de déplacement Travel time: Durée de déplacement
Attendee: Présence de la personne Attendee: Présence de l'usager
attendee: présence de la personne attendee: présence de l'usager
list_reasons: liste des sujets list_reasons: liste des sujets
user_username: nom de l'utilisateur user_username: nom de l'utilisateur
circle_name: nom du cercle circle_name: nom du cercle
Remark: Commentaire Remark: Commentaire
No comments: Aucun commentaire No comments: Aucun commentaire
Add a new activity: Ajouter une nouvelle activité Add a new activity: Ajouter une nouvel échange
Activity list: Liste des activités Activity list: Liste des échanges
present: présent present: présent
not present: absent not present: absent
Delete: Supprimer Delete: Supprimer
Update: Mettre à jour Update: Mettre à jour
Update activity: Modifier l'activité Update activity: Modifier l'échange
Scope: Cercle Scope: Cercle
Activity data: Données de l'activité Activity data: Données de l'échange
Activity location: Localisation de l'activité Activity location: Localisation de l'échange
No reason associated: Aucun sujet No reason associated: Aucun sujet
No social issues associated: Aucune problématique sociale No social issues associated: Aucune problématique sociale
No social actions associated: Aucune action d'accompagnement No social actions associated: Aucune action d'accompagnement
There isn't any activities.: Aucune activité enregistrée. There isn't any activities.: Aucun échange enregistré.
type_name: type de l'activité type_name: type de l'échange
person_firstname: prénom person_firstname: prénom
person_lastname: nom de famille person_lastname: nom de famille
person_id: identifiant de la personne person_id: identifiant de l'usager
Type: Type Type: Type
Invisible: Invisible Invisible: Invisible
Optional: Optionnel Optional: Optionnel
Required: Obligatoire Required: Obligatoire
Persons: Personnes Persons: Usagers
Users: Utilisateurs Users: Utilisateurs
Emergency: Urgent Emergency: Urgent
Sent received: Entrant / Sortant Sent received: Entrant / Sortant
@ -50,10 +50,10 @@ received: Reçu
#forms #forms
Activity creation: Nouvelle activité Activity creation: Nouvel échange
Create: Créer Create: Créer
Back to the list: Retour à la liste Back to the list: Retour à la liste
Save activity: Sauver l'activité Save activity: Sauver l'échange
Reset form: Remise à zéro du formulaire Reset form: Remise à zéro du formulaire
Choose the duration: Choisir la durée Choose the duration: Choisir la durée
Choose a type: Choisir un type Choose a type: Choisir un type
@ -90,40 +90,40 @@ activity:
No documents: Aucun document No documents: Aucun document
#timeline #timeline
'%user% has done an %activity_type%': '%user% a effectué une activité de type "%activity_type%"' '%user% has done an %activity_type%': '%user% a effectué un échange de type "%activity_type%"'
#controller #controller
'Success : activity created!': L'activité a été créée. 'Success : activity created!': L'échange a été créé.
'The form is not valid. The activity has not been created !': Le formulaire est invalide. L'activité n'a pas été créée. 'The form is not valid. The activity has not been created !': Le formulaire est invalide. L'échange n'a pas été créé.
'Success : activity updated!': L'activité a été mise à jour. 'Success : activity updated!': L'échange a été mis à jour.
'The form is not valid. The activity has not been updated !': Le formulaire est invalide. L'activité n'a pas été mise à jour. 'The form is not valid. The activity has not been updated !': Le formulaire est invalide. L'échange n'a pas été mise à jour.
# ROLES # ROLES
CHILL_ACTIVITY_CREATE: Créer une activité CHILL_ACTIVITY_CREATE: Créer un échange
CHILL_ACTIVITY_UPDATE: Modifier une activité CHILL_ACTIVITY_UPDATE: Modifier un échange
CHILL_ACTIVITY_SEE: Voir une activité CHILL_ACTIVITY_SEE: Voir un échange
CHILL_ACTIVITY_SEE_DETAILS: Voir le détail des activités CHILL_ACTIVITY_SEE_DETAILS: Voir le détail des échanges
CHILL_ACTIVITY_DELETE: Supprimer une activité CHILL_ACTIVITY_DELETE: Supprimer un échange
CHILL_ACTIVITY_STATS: Statistique des activités CHILL_ACTIVITY_STATS: Statistique des échanges
CHILL_ACTIVITY_LIST: Liste des activités CHILL_ACTIVITY_LIST: Liste des échanges
# admin # admin
Activities: Activités Activities: Échanges
Activity configuration: Configuration des activités Activity configuration: Configuration des échanges
Activity configuration menu: Configuration des activités Activity configuration menu: Configuration des échanges
Activity types: Types d'activité Activity types: Types d'échange
Activity type configuration: Configuration des categories d'activités Activity type configuration: Configuration des catégories d'échanges
Activity Reasons: Sujets d'une activité Activity Reasons: Sujets d'un échange
Activity Reasons Category: Catégories de sujet d'activités Activity Reasons Category: Catégories de sujet d'échanges
Activity Types Categories: Catégories des types d'activité Activity Types Categories: Catégories des types d'échange
Activity Presences: Presences aux activités Activity Presences: Presences aux échanges
Associated activity reason category is inactive: La catégorie de sujet attachée est inactive Associated activity reason category is inactive: La catégorie de sujet attachée est inactive
# Crud # Crud
crud: crud:
activity_type: activity_type:
title_new: Nouveau type d'activité title_new: Nouveau type d'échange
title_edit: Edition d'un type d'activité title_edit: Edition d'un type d'activité
activity_type_category: activity_type_category:
title_new: Nouvelle catégorie de type d'activité title_new: Nouvelle catégorie de type d'activité
@ -159,8 +159,8 @@ Create a new activity presence: Créer une nouvelle "Présence aux activités"
# activity type type admin # activity type type admin
ActivityType list: Types d'activités ActivityType list: Types d'activités
Create a new activity type: Créer un nouveau type d'activité Create a new activity type: Créer un nouveau type d'activité
Persons visible: Visibilité du champ Personnes Persons visible: Visibilité du champ Usagers
Persons label: Libellé du champ Personnes Persons label: Libellé du champ Usagers
User visible: Visibilité du champ Utilisateur User visible: Visibilité du champ Utilisateur
User label: Libellé du champ Utilisateur User label: Libellé du champ Utilisateur
Date visible: Visibilité du champ Date Date visible: Visibilité du champ Date
@ -183,8 +183,8 @@ Private comment visible: Visibilité du champ Commentaire Privé
Private comment label: Libellé du champ Commentaire Privé Private comment label: Libellé du champ Commentaire Privé
Emergency visible: Visibilité du champ Urgent Emergency visible: Visibilité du champ Urgent
Emergency label: Libellé du champ Urgent Emergency label: Libellé du champ Urgent
Accompanying period visible: Visibilité du champ Période d'accompagnement Accompanying period visible: Visibilité du champ parcours d'accompagnement
Accompanying period label: Libellé du champ Période d'accompagnement Accompanying period label: Libellé du champ parcours d'accompagnement
Social issues visible: Visibilité du champ Problématiques sociales Social issues visible: Visibilité du champ Problématiques sociales
Social issues label: Libellé du champ Problématiques sociales Social issues label: Libellé du champ Problématiques sociales
Social actions visible: Visibilité du champ Action sociale Social actions visible: Visibilité du champ Action sociale
@ -206,10 +206,10 @@ Are you sure you want to remove the activity about "%name%" ?: Êtes-vous sûr d
The activity has been successfully removed.: L'activité a été supprimée. The activity has been successfully removed.: L'activité a été supprimée.
# exports # exports
Exports of activities linked to a person: Exports des activités liées à une personne Exports of activities linked to a person: Exports des activités liées à un usager
Number of activities linked to a person: Nombre d'activités liées à une personne Number of activities linked to a person: Nombre d'activités liées à un usager
Count activities linked to a person: Nombre d'activités Count activities linked to a person: Nombre d'activités
Count activities linked to a person by various parameters.: Compte le nombre d'activités enregistrées et liées à une personne en fonction de différents paramètres. Count activities linked to a person by various parameters.: Compte le nombre d'activités enregistrées et liées à un usager en fonction de différents paramètres.
Sum activity linked to a person duration: Durée des activités Sum activity linked to a person duration: Durée des activités
Sum activities linked to a person duration: Durée des activités liés à un usager Sum activities linked to a person duration: Durée des activités liés à un usager
Sum activities linked to a person duration by various parameters.: Additionne la durée des activités en fonction de différents paramètres. Sum activities linked to a person duration by various parameters.: Additionne la durée des activités en fonction de différents paramètres.
@ -244,10 +244,10 @@ 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%" "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" 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 Filtered by person having an activity in a period: Uniquement les usagers 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 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 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% Filtered by person having an activity between %date_from% and %date_to% with reasons %reasons_name%: Filtré par usager 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 Activity reasons for those activities: Sujets de ces activités
Filter by activity type: Filtrer les activités par type Filter by activity type: Filtrer les activités par type
@ -336,8 +336,8 @@ export:
users name: Nom des utilisateurs users name: Nom des utilisateurs
users ids: Identifiant des utilisateurs users ids: Identifiant des utilisateurs
third parties ids: Identifiant des tiers third parties ids: Identifiant des tiers
persons ids: Identifiant des personnes persons ids: Identifiant des usagers
persons name: Nom des personnes persons name: Nom des usagers
thirds parties: Tiers thirds parties: Tiers
date: Date de l'activité date: Date de l'activité
locationName: Localisation locationName: Localisation

View File

@ -47,10 +47,10 @@ Reasons: Onderwerpen
#forms #forms
Activity creation: Nouvelle activité Activity creation: Nouvel échange
Create: Créer Create: Créer
Back to the list: Retour à la liste Back to the list: Retour à la liste
Save activity: Sauver l'activité Save activity: Sauver l'échange
Reset form: Remise à zéro du formulaire Reset form: Remise à zéro du formulaire
Choose the duration: Choisir la durée Choose the duration: Choisir la durée
Choose a type: Choisir un type Choose a type: Choisir un type
@ -79,43 +79,43 @@ activity:
No documents: Aucun document No documents: Aucun document
#timeline #timeline
'%user% has done an %activity_type%': '%user% a effectué une activité de type "%activity_type%"' '%user% has done an %activity_type%': '%user% a effectué un échange de type "%activity_type%"'
#controller #controller
'Success : activity created!': L'activité a été créée. 'Success : activity created!': L'échange a été créé.
'The form is not valid. The activity has not been created !': Le formulaire est invalide. L'activité n'a pas été créée. 'The form is not valid. The activity has not been created !': Le formulaire est invalide. L'échange n'a pas été créé.
'Success : activity updated!': L'activité a été mise à jour. 'Success : activity updated!': L'échange a été mis à jour.
'The form is not valid. The activity has not been updated !': Le formulaire est invalide. L'activité n'a pas été mise à jour. 'The form is not valid. The activity has not been updated !': Le formulaire est invalide. L'échange n'a pas été mis à jour.
# ROLES # ROLES
CHILL_ACTIVITY_CREATE: Créer une activité CHILL_ACTIVITY_CREATE: Créer un échange
CHILL_ACTIVITY_UPDATE: Modifier une activité CHILL_ACTIVITY_UPDATE: Modifier un échange
CHILL_ACTIVITY_SEE: Voir une activité CHILL_ACTIVITY_SEE: Voir un échange
CHILL_ACTIVITY_SEE_DETAILS: Voir le détail des activités CHILL_ACTIVITY_SEE_DETAILS: Voir le détail des échanges
CHILL_ACTIVITY_DELETE: Supprimer une activité CHILL_ACTIVITY_DELETE: Supprimer un échange
CHILL_ACTIVITY_STATS: Statistique des activités CHILL_ACTIVITY_STATS: Statistique des échanges
CHILL_ACTIVITY_LIST: Liste des activités CHILL_ACTIVITY_LIST: Liste des échanges
# admin # admin
Activities: Activités Activities: Échanges
Activity configuration: Configuration des activités Activity configuration: Configuration des échanges
Activity configuration menu: Configuration des activités Activity configuration menu: Configuration des échanges
Activity types: Types d'activité Activity types: Types d'échange
Activity type configuration: Configuration des categories d'activités Activity type configuration: Configuration des categories d'échanges
Activity Reasons: Sujets d'une activité Activity Reasons: Sujets d'un échange
Activity Reasons Category: Catégories de sujet d'activités Activity Reasons Category: Catégories de sujet d'échanges
Activity Types Categories: Catégories des types d'activité Activity Types Categories: Catégories des types d'échanges
Activity Presences: Presences des activités Activity Presences: Presences des échanges
# Crud # Crud
crud: crud:
activity_type: activity_type:
title_new: Nouveau type d'activité title_new: Nouveau type d'échange
title_edit: Edition d'un type d'activité title_edit: Edition d'un type d'échange
activity_type_category: activity_type_category:
title_new: Nouvelle catégorie de type d'activité title_new: Nouvelle catégorie de type d'échange
title_edit: Edition d'une catégorie de type d'activité title_edit: Edition d'une catégorie de type d'échange
# activity reason admin # activity reason admin
ActivityReason list: Liste des sujets ActivityReason list: Liste des sujets
@ -124,7 +124,7 @@ Active: Actif
Category: Catégorie Category: Catégorie
ActivityReason creation: Nouveau sujet ActivityReason creation: Nouveau sujet
ActivityReason edit: Modification d'un sujet ActivityReason edit: Modification d'un sujet
ActivityReason: Sujet d'activité ActivityReason: Sujet d'échange
The entity is inactive and won't be proposed: Le sujet est inactif et ne sera pas proposé 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é The entity is active and will be proposed: Le sujet est actif et sera proposé
@ -133,13 +133,13 @@ ActivityReasonCategory list: Catégories de sujets
Create a new activity category reason: Créer une nouvelle catégorie Create a new activity category reason: Créer une nouvelle catégorie
ActivityReasonCategory creation: Nouvelle catégorie de sujet ActivityReasonCategory creation: Nouvelle catégorie de sujet
ActivityReasonCategory edit: Modification d'une catégorie de sujet ActivityReasonCategory edit: Modification d'une catégorie de sujet
ActivityReasonCategory: Catégorie de sujet d'activité ActivityReasonCategory: Catégorie de sujet d'échange
ActivityReasonCategory is active and will be proposed: La catégorie est active et sera proposée 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 ActivityReasonCategory is inactive and won't be proposed: La catégorie est inactive et ne sera pas proposée
# activity type type admin # activity type type admin
ActivityType list: Types d'activités ActivityType list: Types d'échanges
Create a new activity type: Créer un nouveau type d'activité Create a new activity type: Créer un nouveau type d'échange
Persons visible: Visibilité du champ Personnes Persons visible: Visibilité du champ Personnes
Persons label: Libellé du champ Personnes Persons label: Libellé du champ Personnes
User visible: Visibilité du champ Utilisateur User visible: Visibilité du champ Utilisateur
@ -177,20 +177,20 @@ Documents label: Libellé du champ Documents
# activity type category admin # activity type category admin
ActivityTypeCategory list: Liste des catégories des types d'activité 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é Create a new activity type category: Créer une nouvelle catégorie de type d'échange
# activity delete # activity delete
Remove activity: Supprimer une activité Remove activity: Supprimer un échange
Are you sure you want to remove the activity about "%name%" ?: Êtes-vous sûr de vouloir supprimer une activité qui concerne "%name%" ? Are you sure you want to remove the activity about "%name%" ?: Êtes-vous sûr de vouloir supprimer un échange qui concerne "%name%" ?
The activity has been successfully removed.: L'activité a été supprimée. The activity has been successfully removed.: L'échange a été supprimée.
# exports # exports
Count activities: Nombre d'activités Count activities: Nombre d'échanges
Count activities by various parameters.: Compte le nombre d'activités enregistrées en fonction de différents paramètres. Count activities by various parameters.: Compte le nombre d'échanges enregistrées en fonction de différents paramètres.
Sum activity duration: Total de la durée des activités Sum activity duration: Total de la durée des échanges
Sum activities duration by various parameters.: Additionne la durée des activités en fonction de différents paramètres. Sum activities duration by various parameters.: Additionne la durée des échanges en fonction de différents paramètres.
List activities: Liste les activités List activities: Liste les échanges
Number of activities: Nombre d'activités Number of activities: Nombre d'échanges
#filters #filters
Filter by reason: Filtrer par sujet d'activité Filter by reason: Filtrer par sujet d'activité

View File

@ -1,22 +1,22 @@
The reasons's level should not be empty: Le niveau du sujet ne peut pas être vide The reasons's level should not be empty: Le niveau du sujet ne peut pas être vide
At least one reason must be choosen: Au moins un sujet doit être choisi At least one reason must be choosen: Au moins un sujet doit être choisi
For this type of activity, you must add at least one person: Pour ce type d'activité, vous devez ajouter au moins un usager For this type of activity, you must add at least one person: Pour ce type d'échange, vous devez ajouter au moins un usager
For this type of activity, you must add at least one user: Pour ce type d'activité, vous devez ajouter au moins un utilisateur For this type of activity, you must add at least one user: Pour ce type d'échange, vous devez ajouter au moins un utilisateur
For this type of activity, you must add at least one third party: Pour ce type d'activité, vous devez ajouter au moins un tiers For this type of activity, you must add at least one third party: Pour ce type d'échange, vous devez ajouter au moins un tiers
For this type of activity, user is required: Pour ce type d'activité, l'utilisateur est requis For this type of activity, user is required: Pour ce type d'échange, l'utilisateur est requis
For this type of activity, date is required: Pour ce type d'activité, la date est requise For this type of activity, date is required: Pour ce type d'échange, la date est requise
For this type of activity, location is required: Pour ce type d'activité, la localisation est requise For this type of activity, location is required: Pour ce type d'échange, la localisation est requise
For this type of activity, attendee is required: Pour ce type d'activité, le champ "Présence de la personne" est requis For this type of activity, attendee is required: Pour ce type d'échange, le champ "Présence de l'usager" est requis
For this type of activity, duration time is required: Pour ce type d'activité, la durée est requise For this type of activity, duration time is required: Pour ce type d'échange, la durée est requise
For this type of activity, travel time is required: Pour ce type d'activité, la durée du trajet est requise For this type of activity, travel time is required: Pour ce type d'échange, la durée du trajet est requise
For this type of activity, reasons is required: Pour ce type d'activité, le champ "sujet" est requis For this type of activity, reasons is required: Pour ce type d'échange, le champ "sujet" est requis
For this type of activity, comment is required: Pour ce type d'activité, un commentaire est requis For this type of activity, comment is required: Pour ce type d'échange, un commentaire est requis
For this type of activity, sent/received is required: Pour ce type d'activité, le champ Entrant/Sortant est requis For this type of activity, sent/received is required: Pour ce type d'échange, le champ Entrant/Sortant est requis
For this type of activity, document is required: Pour ce type d'activité, un document est requis For this type of activity, document is required: Pour ce type d'échange, un document est requis
For this type of activity, emergency is required: Pour ce type d'activité, le champ "Urgent" est requis For this type of activity, emergency is required: Pour ce type d'échange, le champ "Urgent" est requis
For this type of activity, accompanying period is required: Pour ce type d'activité, le parcours d'accompagnement est requis For this type of activity, accompanying period is required: Pour ce type d'échange, le parcours d'accompagnement est requis
For this type of activity, you must add at least one social issue: Pour ce type d'activité, vous devez ajouter au moins une problématique sociale For this type of activity, you must add at least one social issue: Pour ce type d'échange, vous devez ajouter au moins une problématique sociale
For this type of activity, you must add at least one social action: Pour ce type d'activité, vous devez indiquer au moins une action sociale For this type of activity, you must add at least one social action: Pour ce type d'échange, vous devez indiquer au moins une action sociale
# admin # admin
This parameter must be equal to social issue parameter: Ce paramètre doit être égal au paramètre "Visibilité du champs Problématiques sociales" This parameter must be equal to social issue parameter: Ce paramètre doit être égal au paramètre "Visibilité du champs Problématiques sociales"

View File

@ -44,17 +44,6 @@ class SectionMenuBuilder implements LocalMenuBuilderInterface
'order' => 11, 'order' => 11,
'icons' => ['plus'], 'icons' => ['plus'],
]); ]);
$menu->addChild($this->translator->trans('Phonecall'), [
'route' => 'chill_crud_aside_activity_new',
'routeParameters' => [
'type' => 1,
'duration' => 900,
],
])
->setExtras([
'order' => 12,
'icons' => ['plus'],
]);
} }
} }

View File

@ -21,7 +21,7 @@ Type: Type
Invisible: Invisible Invisible: Invisible
Optional: Optionnel Optional: Optionnel
Required: Obligatoire Required: Obligatoire
Persons: Personnes Persons: Usagers
Users: Utilisateurs Users: Utilisateurs
Emergency: Urgent Emergency: Urgent
by: "Par " by: "Par "
@ -50,7 +50,7 @@ For agent: Pour l'utilisateur
date: Date date: Date
Duration: Durée Duration: Durée
Note: Note Note: Note
Choose the agent for whom this activity is created: Choisissez l'agent pour qui l'activité est créée Choose the agent for whom this activity is created: Choisissez l'agent pour qui l'échange est créé
Choose the activity category: Choisir la catégorie Choose the activity category: Choisir la catégorie
#Duration #Duration

View File

@ -29,7 +29,7 @@ End of validity period: Fin de la période de validité
Total: Total Total: Total
Create new resource: Créer une nouvelle ressource Create new resource: Créer une nouvelle ressource
Create new charge: Créer une nouvelle charge Create new charge: Créer une nouvelle charge
See person: Voir personne See person: Voir usagers
There isn't any element recorded: Aucun élément enregistré There isn't any element recorded: Aucun élément enregistré
No resources registered: Aucune ressource enregistrée No resources registered: Aucune ressource enregistrée

View File

@ -207,6 +207,7 @@ class CalendarController extends AbstractController
'entityClassName' => Calendar::class, 'entityClassName' => Calendar::class,
'entityId' => $entity->getId(), 'entityId' => $entity->getId(),
'template' => $template->getId(), 'template' => $template->getId(),
'returnPath' => $request->getRequestUri(),
]); ]);
} }
} }
@ -377,7 +378,9 @@ class CalendarController extends AbstractController
$this->addFlash('success', $this->translator->trans('Success : calendar item created!')); $this->addFlash('success', $this->translator->trans('Success : calendar item created!'));
if ($form->get('save_and_upload_doc')->isClicked()) { if ($form->get('save_and_upload_doc')->isClicked()) {
return $this->redirectToRoute('chill_calendar_calendardoc_new', ['id' => $entity->getId()]); return $this->redirectToRoute('chill_calendar_calendardoc_new', [
'id' => $entity->getId()
]);
} }
foreach ($templates as $template) { foreach ($templates as $template) {
@ -386,6 +389,7 @@ class CalendarController extends AbstractController
'entityClassName' => Calendar::class, 'entityClassName' => Calendar::class,
'entityId' => $entity->getId(), 'entityId' => $entity->getId(),
'template' => $template->getId(), 'template' => $template->getId(),
'returnPath' => $this->generateUrl('chill_calendar_calendar_edit', ['id' => $entity->getId()]),
]); ]);
} }
} }
@ -526,14 +530,20 @@ class CalendarController extends AbstractController
'comment' => $calendar->getComment()->getComment(), 'comment' => $calendar->getComment()->getComment(),
]; ];
return $this->redirectToRoute( $routeParams = [
'chill_activity_activity_new', 'activityData' => $activityData,
[ 'returnPath' => $request->query->get('returnPath', null),
'accompanying_period_id' => $calendar->getAccompanyingPeriod()->getId(), ];
'activityData' => $activityData,
'returnPath' => $request->query->get('returnPath', null), if ($calendar->getContext() === 'accompanying_period') {
] $routeParams['accompanying_period_id'] = $calendar->getAccompanyingPeriod()->getId();
); } elseif ($calendar->getContext() === 'person') {
$routeParams['person_id'] = $calendar->getPerson()->getId();
} else {
throw new RuntimeException('context not found for this calendar');
}
return $this->redirectToRoute('chill_activity_activity_new', $routeParams);
} }
private function buildListFilterOrder(): FilterOrderHelper private function buildListFilterOrder(): FilterOrderHelper

View File

@ -93,6 +93,7 @@ class Calendar implements TrackCreationInterface, TrackUpdateInterface, HasCente
/** /**
* @ORM\ManyToOne(targetEntity="Chill\PersonBundle\Entity\AccompanyingPeriod", inversedBy="calendars") * @ORM\ManyToOne(targetEntity="Chill\PersonBundle\Entity\AccompanyingPeriod", inversedBy="calendars")
* @Serializer\Groups({"calendar:read", "read"})
*/ */
private ?AccompanyingPeriod $accompanyingPeriod = null; private ?AccompanyingPeriod $accompanyingPeriod = null;

View File

@ -26,9 +26,6 @@ class CalendarDocEditType extends AbstractType
->add('title', TextType::class, [ ->add('title', TextType::class, [
'label' => 'chill_calendar.Document title', 'label' => 'chill_calendar.Document title',
'required' => true, 'required' => true,
])
->add('doc', StoredObjectType::class, [
'label' => 'chill_calendar.Document object',
]); ]);
} }

View File

@ -15,6 +15,7 @@
:picked="null !== this.$store.getters.getMainUser ? [this.$store.getters.getMainUser] : []" :picked="null !== this.$store.getters.getMainUser ? [this.$store.getters.getMainUser] : []"
:removableIfSet="false" :removableIfSet="false"
:displayPicked="false" :displayPicked="false"
:suggested="this.suggestedUsers"
@addNewEntity="setMainUser" @addNewEntity="setMainUser"
></pick-entity> ></pick-entity>
</div> </div>
@ -143,6 +144,7 @@ export default {
slotMinTime: '09:00:00', slotMinTime: '09:00:00',
slotMaxTime: '18:00:00', slotMaxTime: '18:00:00',
hideWeekEnds: true, hideWeekEnds: true,
previousUser: [],
} }
}, },
computed: { computed: {
@ -188,11 +190,23 @@ export default {
users.push(this.$store.getters.getUserDataById(id).user); users.push(this.$store.getters.getUserDataById(id).user);
} }
return users; return users;
} },
suggestedUsers() {
const suggested = [];
this.$data.previousUser.forEach(u => {
if (u.id !== this.$store.getters.getMainUser.id) {
suggested.push(u)
}
});
return suggested;
},
}, },
methods: { methods: {
setMainUser(user) { setMainUser({entity}) {
console.log('setMainUser APP', user); const user = entity;
console.log('setMainUser APP', entity);
if (user.id !== this.$store.getters.getMainUser && ( if (user.id !== this.$store.getters.getMainUser && (
this.$store.state.activity.calendarRange !== null this.$store.state.activity.calendarRange !== null
@ -205,6 +219,14 @@ export default {
} }
} }
// add the previous user, if any, in the previous user list (in use for suggestion)
if (null !== this.$store.getters.getMainUser) {
const suggestedUids = new Set(this.$data.previousUser.map(u => u.id));
if (!suggestedUids.has(this.$store.getters.getMainUser.id)){
this.$data.previousUser.push(this.$store.getters.getMainUser);
}
}
this.$store.dispatch('setMainUser', user); this.$store.dispatch('setMainUser', user);
this.$store.commit('showUserOnCalendar', {user, ranges: true, remotes: true}); this.$store.commit('showUserOnCalendar', {user, ranges: true, remotes: true});
}, },

View File

@ -202,6 +202,8 @@ export default {
return dispatch('associateCalendarToRange', { range: null }).then(() => { return dispatch('associateCalendarToRange', { range: null }).then(() => {
commit('setMainUser', mainUser); commit('setMainUser', mainUser);
return dispatch('fetchCalendarEvents');
}); });
}, },

View File

@ -54,7 +54,7 @@ export const mapEntity = (entity: EventInput): EventInput => {
export const createUserData = (user: User, colorIndex: number): UserData => { export const createUserData = (user: User, colorIndex: number): UserData => {
const colorId = colorIndex % COLORS.length; const colorId = colorIndex % COLORS.length;
console.log('colorId', colorId);
return { return {
user: user, user: user,
calendarRanges: [], calendarRanges: [],

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="row"> <div class="row">
<div class="col-sm"> <div class="col-sm">
<label class="form-label">Lieu des plages de disponibilités créées</label> <label class="form-label">{{ $t('created_availabilities') }}</label>
<vue-multiselect <vue-multiselect
v-model="pickedLocation" v-model="pickedLocation"
:options="locations" :options="locations"

View File

@ -1,5 +1,6 @@
const appMessages = { const appMessages = {
fr: { fr: {
created_availabilities: "Lieu des plages de disponibilités créées",
edit_your_calendar_range: "Planifiez vos plages de disponibilités", edit_your_calendar_range: "Planifiez vos plages de disponibilités",
show_my_calendar: "Afficher mon calendrier", show_my_calendar: "Afficher mon calendrier",
show_weekends: "Afficher les week-ends", show_weekends: "Afficher les week-ends",

View File

@ -20,15 +20,24 @@
<div class="row"> <div class="row">
<div class="col text-start"> <div class="col text-start">
{{ d.storedObject.title }} {{ d.storedObject.title }}
{% if d.dateTimeVersion < d.calendar.dateTimeVersion %} </div>
{% if d.dateTimeVersion < d.calendar.dateTimeVersion %}
<div class="col text-start">
<span class="badge bg-danger">{{ 'chill_calendar.Document outdated'|trans }}</span> <span class="badge bg-danger">{{ 'chill_calendar.Document outdated'|trans }}</span>
{% endif %}
</div>
<div class="col-md-auto text-center">
{{ mm.mimeIcon(d.storedObject.type) }}
</div> </div>
{% endif %}
<div class="col col-lg-4 text-end"> <div class="col col-lg-4 text-end">
{{ d.storedObject|chill_document_button_group(d.storedObject.title, is_granted('CHILL_CALENDAR_DOC_EDIT', d), {'small': true}) }} <ul class="record_actions">
<li>
{{ d.storedObject|chill_document_button_group(d.storedObject.title, is_granted('CHILL_CALENDAR_DOC_EDIT', d), {'small': true}) }}
</li>
<li>
<a href="{{ chill_path_add_return_path('chill_calendar_calendardoc_edit', {id: d.id}) }}" class="btn btn-sm btn-edit"></a>
</li>
<li>
<a href="{{ chill_path_add_return_path('chill_calendar_calendardoc_delete', {id: d.id}) }}" class="btn btn-sm btn-delete"></a>
</li>
</ul>
</div> </div>
</div> </div>
</li> </li>

View File

@ -110,7 +110,46 @@
</div> </div>
</div> </div>
<div class="item-row"> {% if calendar.activity is not null %}
<div class="item-row separator">
<div class="item-col">
<div class="wrap-list">
<div class="wl-row">
<div class="wl-col title"><h3>{{ 'Activity'|trans }}</h3></div>
<div class="wl-col list activity-linked">
<h2 class="badge-title">
<span class="title_label"></span>
<span class="title_action">
{{ calendar.activity.type.name | localize_translatable_string }}
{% if calendar.activity.emergency %}
<span class="badge bg-danger rounded-pill fs-6 float-end">{{ 'Emergency'|trans|upper }}</span>
{% endif %}
</span>
</h2>
<ul class="record_actions">
<li class="cancel">
<span class="createdBy">
{{ 'Created by'|trans }}
<b>{{ calendar.activity.createdBy|chill_entity_render_string }}</b>, {{ 'on'|trans }} {{ calendar.activity.createdAt|format_datetime('short', 'short') }}
</span>
</li>
{% if is_granted('CHILL_ACTIVITY_SEE', calendar.activity) %}
<li>
<a href="{{ chill_path_add_return_path('chill_activity_activity_show', {'id': calendar.activity.id}) }}" class="btn btn-sm btn-show" ></a>
</li>
{% endif %}
</ul>
</div>
</div>
</div>
</div>
</div>
{% endif %}
<div class="item-row separator">
<ul class="record_actions"> <ul class="record_actions">
{% if is_granted('CHILL_CALENDAR_CALENDAR_SEE', calendar) %} {% if is_granted('CHILL_CALENDAR_CALENDAR_SEE', calendar) %}
{% if templates|length == 0 %} {% if templates|length == 0 %}
@ -147,7 +186,12 @@
</li> </li>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if accompanyingCourse is defined and is_granted('CHILL_ACTIVITY_CREATE', accompanyingCourse) and calendar.activity is null %} {% if calendar.activity is null and (
(calendar.context == 'accompanying_period' and is_granted('CHILL_ACTIVITY_CREATE', calendar.accompanyingPeriod))
or
(calendar.context == 'person' and is_granted('CHILL_ACTIVITY_CREATE', calendar.person))
)
%}
<li> <li>
<a class="btn btn-create" <a class="btn btn-create"
href="{{ chill_path_add_return_path('chill_calendar_calendar_to_activity', { 'id': calendar.id }) }}"> href="{{ chill_path_add_return_path('chill_calendar_calendar_to_activity', { 'id': calendar.id }) }}">

View File

@ -9,13 +9,13 @@
{% block js %} {% block js %}
{{ parent() }} {{ parent() }}
{{ encore_entry_script_tags('mod_answer') }} {{ encore_entry_script_tags('mod_answer') }}
{{ encore_entry_script_tags('mod_async_upload') }} {{ encore_entry_script_tags('mod_document_action_buttons_group') }}
{% endblock %} {% endblock %}
{% block css %} {% block css %}
{{ parent() }} {{ parent() }}
{{ encore_entry_link_tags('mod_answer') }} {{ encore_entry_link_tags('mod_answer') }}
{{ encore_entry_link_tags('mod_async_upload') }} {{ encore_entry_link_tags('mod_document_action_buttons_group') }}
{% endblock %} {% endblock %}
{% block content %} {% block content %}

View File

@ -24,7 +24,6 @@
{{ form_start(form) }} {{ form_start(form) }}
{{ form_row(form.title) }} {{ form_row(form.title) }}
{{ form_row(form.doc) }}
<ul class="record_actions sticky-form-buttons"> <ul class="record_actions sticky-form-buttons">
<li class="cancel"> <li class="cancel">

View File

@ -23,7 +23,6 @@
{{ form_start(form) }} {{ form_start(form) }}
{{ form_row(form.title) }} {{ form_row(form.title) }}
{{ form_row(form.doc) }}
<ul class="record_actions sticky-form-buttons"> <ul class="record_actions sticky-form-buttons">
<li class="cancel"> <li class="cancel">

View File

@ -28,7 +28,7 @@
<ul class="record_actions sticky-form-buttons"> <ul class="record_actions sticky-form-buttons">
<li class="cancel"> <li class="cancel">
<a class="btn btn-cancel" href="{{ chill_return_path_or('chill_calendar_calendar_list_by_accompanying_period', {'id': accompanyingCourse.id }) }}">{{ 'Cancel'|trans|chill_return_path_label }}</a> <a class="btn btn-cancel" href="{{ chill_return_path_or('chill_calendar_calendar_edit', {'id': calendar_doc.calendar.id }) }}">{{ 'Cancel'|trans|chill_return_path_label }}</a>
</li> </li>
<li> <li>

View File

@ -132,8 +132,8 @@ docgen:
Base context for calendar: 'Rendez-vous: contexte de base' Base context for calendar: 'Rendez-vous: contexte de base'
A base context for generating document on calendar: Contexte pour générer des documents à partir des rendez-vous A base context for generating document on calendar: Contexte pour générer des documents à partir des rendez-vous
Track changes on datetime and warn user if date time is updated after the doc generation: Suivre les changements sur le document et prévenir les utilisateurs que la date et l'heure ont été modifiée après la génération du document Track changes on datetime and warn user if date time is updated after the doc generation: Suivre les changements sur le document et prévenir les utilisateurs que la date et l'heure ont été modifiée après la génération du document
Ask main person: Demander de choisir une personne parmi les participants aux rendez-vous Ask main person: Demander de choisir un usager parmi les participants aux rendez-vous
Main person label: Label pour choisir la personne Main person label: Label pour choisir l'usager
Ask third party: Demander de choisir un tiers parmi les participants aux rendez-vous Ask third party: Demander de choisir un tiers parmi les participants aux rendez-vous
Third party label: Label pour choisir le tiers Third party label: Label pour choisir le tiers
Destinee: Destinataire Destinee: Destinataire

View File

@ -1,5 +1,5 @@
calendar: calendar:
At least {{ limit }} person is required.: Au moins {{ limit }} personne doit être associée à ce rendez-vous At least {{ limit }} person is required.: Au moins {{ limit }} usager doit être associée à ce rendez-vous
An end date is required: Indiquez une date et heure de fin An end date is required: Indiquez une date et heure de fin
A start date is required: Indiquez une date et heure de début A start date is required: Indiquez une date et heure de début
A location is required: Indiquez un lieu A location is required: Indiquez un lieu

View File

@ -11,6 +11,7 @@ declare(strict_types=1);
namespace Chill\DocStoreBundle\Entity; namespace Chill\DocStoreBundle\Entity;
use Chill\MainBundle\Entity\HasCentersInterface;
use Chill\MainBundle\Entity\HasScopesInterface; 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;
@ -19,7 +20,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 implements HasScopesInterface class AccompanyingCourseDocument extends Document implements HasScopesInterface, HasCentersInterface
{ {
/** /**
* @ORM\ManyToOne(targetEntity=AccompanyingPeriod::class) * @ORM\ManyToOne(targetEntity=AccompanyingPeriod::class)
@ -27,6 +28,11 @@ class AccompanyingCourseDocument extends Document implements HasScopesInterface
*/ */
private ?AccompanyingPeriod $course = null; private ?AccompanyingPeriod $course = null;
public function getCenters(): ?iterable
{
return $this->course->getCenters();
}
public function getCourse(): ?AccompanyingPeriod public function getCourse(): ?AccompanyingPeriod
{ {
return $this->course; return $this->course;

View File

@ -51,16 +51,9 @@
</div> </div>
<ul class="item-col record_actions flex-shrink-1"> <ul class="item-col record_actions flex-shrink-1">
{% if document.course is defined %} {% if document.course is defined %}
{% if is_granted('CHILL_ACCOMPANYING_COURSE_DOCUMENT_DELETE', document) %} <li>
<li class="delete"> {{ chill_entity_workflow_list('Chill\\DocStoreBundle\\Entity\\AccompanyingCourseDocument', document.id) }}
<a href="{{ chill_return_path_or('chill_docstore_accompanying_course_document_delete', {'course': accompanyingCourse.id, 'id': document.id}) }}" class="btn btn-delete"></a> </li>
</li>
{% endif %}
{% if is_granted('CHILL_ACCOMPANYING_COURSE_DOCUMENT_UPDATE', document) %}
<li>
<a href="{{ path('accompanying_course_document_edit', {'course': accompanyingCourse.id, 'id': document.id }) }}" class="btn btn-update"></a>
</li>
{% endif %}
{% if is_granted('CHILL_ACCOMPANYING_COURSE_DOCUMENT_SEE_DETAILS', document) %} {% if is_granted('CHILL_ACCOMPANYING_COURSE_DOCUMENT_SEE_DETAILS', document) %}
<li> <li>
{{ document.object|chill_document_button_group(document.title, is_granted('CHILL_ACCOMPANYING_COURSE_DOCUMENT_UPDATE', document)) }} {{ document.object|chill_document_button_group(document.title, is_granted('CHILL_ACCOMPANYING_COURSE_DOCUMENT_UPDATE', document)) }}
@ -69,20 +62,17 @@
<a href="{{ chill_path_add_return_path('accompanying_course_document_show', {'course': accompanyingCourse.id, 'id': document.id}) }}" class="btn btn-show"></a> <a href="{{ chill_path_add_return_path('accompanying_course_document_show', {'course': accompanyingCourse.id, 'id': document.id}) }}" class="btn btn-show"></a>
</li> </li>
{% endif %} {% endif %}
<li> {% if is_granted('CHILL_ACCOMPANYING_COURSE_DOCUMENT_UPDATE', document) %}
{{ chill_entity_workflow_list('Chill\\DocStoreBundle\\Entity\\AccompanyingCourseDocument', document.id) }}
</li>
{% else %}
{% if is_granted('CHILL_PERSON_DOCUMENT_DELETE', document) %}
<li class="delete">
<a href="{{ chill_return_path_or('chill_docstore_person_document_delete', {'person': person.id, 'id': document.id}) }}" class="btn btn-delete"></a>
</li>
{% endif %}
{% if is_granted('CHILL_PERSON_DOCUMENT_UPDATE', document) %}
<li> <li>
<a href="{{ path('person_document_edit', {'person': person.id, 'id': document.id}) }}" class="btn btn-update"></a> <a href="{{ path('accompanying_course_document_edit', {'course': accompanyingCourse.id, 'id': document.id }) }}" class="btn btn-update"></a>
</li> </li>
{% endif %} {% endif %}
{% if is_granted('CHILL_ACCOMPANYING_COURSE_DOCUMENT_DELETE', document) %}
<li class="delete">
<a href="{{ chill_return_path_or('chill_docstore_accompanying_course_document_delete', {'course': accompanyingCourse.id, 'id': document.id}) }}" class="btn btn-delete"></a>
</li>
{% endif %}
{% else %}
{% if is_granted('CHILL_PERSON_DOCUMENT_SEE_DETAILS', document) %} {% if is_granted('CHILL_PERSON_DOCUMENT_SEE_DETAILS', document) %}
<li> <li>
{{ document.object|chill_document_button_group(document.title, is_granted('CHILL_PERSON_DOCUMENT_UPDATE', document)) }} {{ document.object|chill_document_button_group(document.title, is_granted('CHILL_PERSON_DOCUMENT_UPDATE', document)) }}
@ -91,6 +81,16 @@
<a href="{{ path('person_document_show', {'person': person.id, 'id': document.id}) }}" class="btn btn-show"></a> <a href="{{ path('person_document_show', {'person': person.id, 'id': document.id}) }}" class="btn btn-show"></a>
</li> </li>
{% endif %} {% endif %}
{% if is_granted('CHILL_PERSON_DOCUMENT_UPDATE', document) %}
<li>
<a href="{{ path('person_document_edit', {'person': person.id, 'id': document.id}) }}" class="btn btn-update"></a>
</li>
{% endif %}
{% if is_granted('CHILL_PERSON_DOCUMENT_DELETE', document) %}
<li class="delete">
<a href="{{ chill_return_path_or('chill_docstore_person_document_delete', {'person': person.id, 'id': document.id}) }}" class="btn btn-delete"></a>
</li>
{% endif %}
{% endif %} {% endif %}
</ul> </ul>

View File

@ -78,12 +78,12 @@ class AccompanyingCourseDocumentVoter extends AbstractChillVoter implements Prov
return []; return [];
} }
protected function supports($attribute, $subject) protected function supports($attribute, $subject): bool
{ {
return $this->voterHelper->supports($attribute, $subject); return $this->voterHelper->supports($attribute, $subject);
} }
protected function voteOnAttribute($attribute, $subject, TokenInterface $token) protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{ {
if (!$token->getUser() instanceof User) { if (!$token->getUser() instanceof User) {
return false; return false;

View File

@ -34,7 +34,7 @@ Edit the participation: Modifier la participation
Participation Edit: Modifier une participation Participation Edit: Modifier une participation
Add a participation: Ajouter un participant Add a participation: Ajouter un participant
Participation creation: Ajouter une participation Participation creation: Ajouter une participation
Associated person: Personne associée Associated person: Usager associé
Associated event: Événement associé Associated event: Événement associé
Back to the event: Retour à l'événement Back to the event: Retour à l'événement
The participation was created: La participation a été créée The participation was created: La participation a été créée
@ -108,4 +108,4 @@ csv: csv
Create a new role: Créer un nouveau rôle Create a new role: Créer un nouveau rôle
Create a new type: Créer un nouveau type Create a new type: Créer un nouveau type
Create a new status: Créer un nouveau statut Create a new status: Créer un nouveau statut

View File

@ -18,6 +18,7 @@ function loadDynamicPicker(element) {
isMultiple = parseInt(el.dataset.multiple) === 1, isMultiple = parseInt(el.dataset.multiple) === 1,
uniqId = el.dataset.uniqid, uniqId = el.dataset.uniqid,
input = element.querySelector('[data-input-uniqid="'+ el.dataset.uniqid +'"]'), input = element.querySelector('[data-input-uniqid="'+ el.dataset.uniqid +'"]'),
// the "picked" will always be an array, even if multiple is false
picked = isMultiple ? picked = isMultiple ?
JSON.parse(input.value) : ( JSON.parse(input.value) : (
(input.value === '[]' || input.value === '') ? (input.value === '[]' || input.value === '') ?
@ -54,15 +55,11 @@ function loadDynamicPicker(element) {
}, },
computed: { computed: {
notPickedSuggested() { notPickedSuggested() {
if (this.multiple) { const pickedIds = new Set();
const pickedIds = new Set(); for (const p of this.picked) {
for (const p of this.picked) { pickedIds.add(`${p.type}${p.id}`);
pickedIds.add(`${p.type}${p.id}`);
}
return this.suggested.filter(e => !pickedIds.has(`${e.type}${e.id}`))
} }
return this.suggested.filter(e => !pickedIds.has(`${e.type}${e.id}`))
return this.suggested.filter(e => e.type !== this.picked.type && e.id !== e.picked.id);
} }
}, },
methods: { methods: {
@ -90,7 +87,11 @@ function loadDynamicPicker(element) {
this.suggested.push(entity); this.suggested.push(entity);
} }
this.picked = this.picked.filter(e => !(e.type === entity.type && e.id === entity.id)); this.picked = this.picked.filter(e => !(e.type === entity.type && e.id === entity.id));
input.value = JSON.stringify(this.picked); if (this.multiple) {
input.value = JSON.stringify(this.picked);
} else {
input.value = "";
}
}, },
} }
}) })

View File

@ -66,6 +66,7 @@
{{ form_row(transition_form.future_dest_users) }} {{ form_row(transition_form.future_dest_users) }}
{{ form_row(transition_form.future_dest_emails) }} {{ form_row(transition_form.future_dest_emails) }}
{{ form_errors(transition_form.future_dest_users) }}
</div> </div>
<p>{{ form_label(transition_form.comment) }}</p> <p>{{ form_label(transition_form.comment) }}</p>

View File

@ -30,7 +30,7 @@ class SearchApi
private PaginatorFactory $paginator; private PaginatorFactory $paginator;
private iterable $providers = []; private iterable $providers;
public function __construct( public function __construct(
EntityManagerInterface $em, EntityManagerInterface $em,
@ -42,9 +42,6 @@ class SearchApi
$this->paginator = $paginator; $this->paginator = $paginator;
} }
/**
* @return Model/Result[]
*/
public function getResults(string $pattern, array $types, array $parameters): Collection public function getResults(string $pattern, array $types, array $parameters): Collection
{ {
$queries = $this->findQueries($pattern, $types, $parameters); $queries = $this->findQueries($pattern, $types, $parameters);
@ -53,10 +50,10 @@ class SearchApi
throw new SearchApiNoQueryException($pattern, $types, $parameters); throw new SearchApiNoQueryException($pattern, $types, $parameters);
} }
$total = $this->countItems($queries, $types, $parameters); $total = $this->countItems($queries);
$paginator = $this->paginator->create($total); $paginator = $this->paginator->create($total);
$rawResults = $this->fetchRawResult($queries, $types, $parameters, $paginator); $rawResults = $this->fetchRawResult($queries, $types, $paginator);
$this->prepareProviders($rawResults); $this->prepareProviders($rawResults);
$results = $this->buildResults($rawResults); $results = $this->buildResults($rawResults);
@ -64,7 +61,7 @@ class SearchApi
return new Collection($results, $paginator); return new Collection($results, $paginator);
} }
private function buildCountQuery(array $queries, $types, $parameters) private function buildCountQuery(array $queries): array
{ {
$query = 'SELECT SUM(c) AS count FROM ({union_unordered}) AS sq'; $query = 'SELECT SUM(c) AS count FROM ({union_unordered}) AS sq';
$unions = []; $unions = [];
@ -88,7 +85,7 @@ class SearchApi
$items = []; $items = [];
foreach ($rawResults as $r) { foreach ($rawResults as $r) {
foreach ($this->providers as $k => $p) { foreach ($this->providers as $p) {
if ($p->supportsResult($r['key'], $r['metadata'])) { if ($p->supportsResult($r['key'], $r['metadata'])) {
$items[] = (new SearchApiResult($r['pertinence'])) $items[] = (new SearchApiResult($r['pertinence']))
->setResult( ->setResult(
@ -103,7 +100,7 @@ class SearchApi
return $items; return $items;
} }
private function buildUnionQuery(array $queries, $types, $parameters, Paginator $paginator) private function buildUnionQuery(array $queries, Paginator $paginator): array
{ {
$query = '{unions} ORDER BY pertinence DESC LIMIT ? OFFSET ?'; $query = '{unions} ORDER BY pertinence DESC LIMIT ? OFFSET ?';
$unions = []; $unions = [];
@ -126,9 +123,9 @@ class SearchApi
]; ];
} }
private function countItems($providers, $types, $parameters): int private function countItems($providers): int
{ {
[$countQuery, $parameters] = $this->buildCountQuery($providers, $types, $parameters); [$countQuery, $parameters] = $this->buildCountQuery($providers);
$rsmCount = new ResultSetMappingBuilder($this->em); $rsmCount = new ResultSetMappingBuilder($this->em);
$rsmCount->addScalarResult('count', 'count'); $rsmCount->addScalarResult('count', 'count');
$countNq = $this->em->createNativeQuery($countQuery, $rsmCount); $countNq = $this->em->createNativeQuery($countQuery, $rsmCount);
@ -137,9 +134,9 @@ class SearchApi
return (int) $countNq->getSingleScalarResult(); return (int) $countNq->getSingleScalarResult();
} }
private function fetchRawResult($queries, $types, $parameters, Paginator $paginator): array private function fetchRawResult($queries, $types, Paginator $paginator): array
{ {
[$union, $parameters] = $this->buildUnionQuery($queries, $types, $parameters, $paginator); [$union, $parameters] = $this->buildUnionQuery($queries, $paginator);
$rsm = new ResultSetMappingBuilder($this->em); $rsm = new ResultSetMappingBuilder($this->em);
$rsm->addScalarResult('key', 'key', Types::STRING) $rsm->addScalarResult('key', 'key', Types::STRING)
->addScalarResult('metadata', 'metadata', Types::JSON) ->addScalarResult('metadata', 'metadata', Types::JSON)
@ -172,7 +169,7 @@ class SearchApi
); );
} }
private function prepareProviders(array $rawResults) private function prepareProviders(array $rawResults): void
{ {
$metadatas = []; $metadatas = [];
$providers = []; $providers = [];

View File

@ -16,6 +16,18 @@ use function count;
use function implode; use function implode;
use function strtr; use function strtr;
/**
* This create a query optimized for searching for the api response.
*
* When build, this class generate a SQL string and a list of a parameters which is suitable for running
* a native SQL query. This have usually the form of
*
* `SELECT '<key>' as key, <metadata> as metadata, <pertinence> as pertinence FROM <from clause> WHERE <where clause>`.
*
* The clause between `<>` are provided through the dedicated method in this class (@link{self::setSelectKey},
* @link{self::setFromClause}), etc.).
*
*/
class SearchApiQuery class SearchApiQuery
{ {
private ?string $fromClause = null; private ?string $fromClause = null;

View File

@ -16,7 +16,7 @@ use Chill\MainBundle\Entity\Scope;
use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Repository\UserACLAwareRepositoryInterface; use Chill\MainBundle\Repository\UserACLAwareRepositoryInterface;
use Chill\MainBundle\Security\ParentRoleHelper; use Chill\MainBundle\Security\ParentRoleHelper;
use Chill\MainBundle\Security\Resolver\CenterResolverDispatcherInterface; use Chill\MainBundle\Security\Resolver\CenterResolverManagerInterface;
use Chill\MainBundle\Security\Resolver\ScopeResolverDispatcher; use Chill\MainBundle\Security\Resolver\ScopeResolverDispatcher;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Core\Role\Role; use Symfony\Component\Security\Core\Role\Role;
@ -34,7 +34,7 @@ use function get_class;
*/ */
class AuthorizationHelper implements AuthorizationHelperInterface class AuthorizationHelper implements AuthorizationHelperInterface
{ {
private CenterResolverDispatcherInterface $centerResolverDispatcher; private CenterResolverManagerInterface $centerResolverManager;
private LoggerInterface $logger; private LoggerInterface $logger;
@ -45,13 +45,13 @@ class AuthorizationHelper implements AuthorizationHelperInterface
private UserACLAwareRepositoryInterface $userACLAwareRepository; private UserACLAwareRepositoryInterface $userACLAwareRepository;
public function __construct( public function __construct(
CenterResolverDispatcherInterface $centerResolverDispatcher, CenterResolverManagerInterface $centerResolverManager,
LoggerInterface $logger, LoggerInterface $logger,
ScopeResolverDispatcher $scopeResolverDispatcher, ScopeResolverDispatcher $scopeResolverDispatcher,
UserACLAwareRepositoryInterface $userACLAwareRepository, UserACLAwareRepositoryInterface $userACLAwareRepository,
ParentRoleHelper $parentRoleHelper ParentRoleHelper $parentRoleHelper
) { ) {
$this->centerResolverDispatcher = $centerResolverDispatcher; $this->centerResolverManager = $centerResolverManager;
$this->logger = $logger; $this->logger = $logger;
$this->scopeResolverDispatcher = $scopeResolverDispatcher; $this->scopeResolverDispatcher = $scopeResolverDispatcher;
$this->userACLAwareRepository = $userACLAwareRepository; $this->userACLAwareRepository = $userACLAwareRepository;
@ -63,7 +63,7 @@ class AuthorizationHelper implements AuthorizationHelperInterface
* *
* @param User $user The user * @param User $user The user
* @param array $centers a list of centers which are going to be filtered * @param array $centers a list of centers which are going to be filtered
* @param Center|string $role * @param string $role
*/ */
public function filterReachableCenters(User $user, array $centers, $role): array public function filterReachableCenters(User $user, array $centers, $role): array
{ {
@ -113,13 +113,14 @@ class AuthorizationHelper implements AuthorizationHelperInterface
* Get reachable Centers for the given user, role, * Get reachable Centers for the given user, role,
* and optionally Scope. * and optionally Scope.
* *
* @return array|Center[] * @return list<Center>
*/ */
public function getReachableCenters(UserInterface $user, string $role, ?Scope $scope = null): array public function getReachableCenters(UserInterface $user, string $role, ?Scope $scope = null): array
{ {
if ($role instanceof Role) { if ($role instanceof Role) {
$role = $role->getRole(); $role = $role->getRole();
} }
/** @var array<string, Center> $centers */
$centers = []; $centers = [];
foreach ($user->getGroupCenters() as $groupCenter) { foreach ($user->getGroupCenters() as $groupCenter) {
@ -129,13 +130,13 @@ class AuthorizationHelper implements AuthorizationHelperInterface
//check that the role is in the reachable roles //check that the role is in the reachable roles
if ($this->isRoleReached($role, $roleScope->getRole())) { if ($this->isRoleReached($role, $roleScope->getRole())) {
if (null === $scope) { if (null === $scope) {
$centers[] = $groupCenter->getCenter(); $centers[spl_object_hash($groupCenter->getCenter())] = $groupCenter->getCenter();
break; break;
} }
if ($scope->getId() === $roleScope->getScope()->getId()) { if ($scope->getId() === $roleScope->getScope()->getId()) {
$centers[] = $groupCenter->getCenter(); $centers[spl_object_hash($groupCenter->getCenter())] = $groupCenter->getCenter();
break; break;
} }
@ -143,7 +144,7 @@ class AuthorizationHelper implements AuthorizationHelperInterface
} }
} }
return $centers; return array_values($centers);
} }
/** /**
@ -194,7 +195,7 @@ class AuthorizationHelper implements AuthorizationHelperInterface
* *
* @return array|Scope[] * @return array|Scope[]
*/ */
public function getReachableScopes(UserInterface $user, string $role, $center): array public function getReachableScopes(UserInterface $user, string $role, Center|array $center): array
{ {
if ($role instanceof Role) { if ($role instanceof Role) {
$role = $role->getRole(); $role = $role->getRole();
@ -252,27 +253,15 @@ class AuthorizationHelper implements AuthorizationHelperInterface
*/ */
public function userHasAccess(User $user, $entity, $attribute) public function userHasAccess(User $user, $entity, $attribute)
{ {
$center = $this->centerResolverDispatcher->resolveCenter($entity); $centers = $this->centerResolverManager->resolveCenters($entity);
if (is_iterable($center)) { foreach ($centers as $c) {
foreach ($center as $c) { if ($this->userHasAccessForCenter($user, $c, $entity, $attribute)) {
if ($this->userHasAccessForCenter($user, $c, $entity, $attribute)) { return true;
return true;
}
} }
return false;
} }
if ($center instanceof Center) { return false;
return $this->userHasAccessForCenter($user, $center, $entity, $attribute);
}
if (null === $center) {
return false;
}
throw new UnexpectedValueException('could not resolver a center');
} }
/** /**

View File

@ -21,12 +21,12 @@ interface AuthorizationHelperInterface
* Get reachable Centers for the given user, role, * Get reachable Centers for the given user, role,
* and optionnaly Scope. * and optionnaly Scope.
* *
* @return Center[] * @return list<Center>
*/ */
public function getReachableCenters(UserInterface $user, string $role, ?Scope $scope = null): array; public function getReachableCenters(UserInterface $user, string $role, ?Scope $scope = null): array;
/** /**
* @param array|Center|Center[] $center * @param Center|list<Center> $center
*/ */
public function getReachableScopes(UserInterface $user, string $role, $center): array; public function getReachableScopes(UserInterface $user, string $role, Center|array $center): array;
} }

View File

@ -1,8 +1,8 @@
"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>" "This program is free software: you can redistribute it and/or modify it under the terms of the <strong>GNU Affero General Public License</strong>": "Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou le modifier selon les termes de la licence <strong>GNU Affero GPL</strong>"
User manual: Manuel d'utilisation User manual: Manuel d'utilisation
Search: Rechercher Search: Rechercher
"Search persons, ...": "Recherche des personnes, ..." "Search persons, ...": "Recherche des usagers, ..."
Person name: Nom / Prénom de la personne Person name: Nom / Prénom de l'usager
Login: Connexion Login: Connexion
Logout: Se déconnecter Logout: Se déconnecter
Bad credentials.: Le mot de passe et le nom d'utilisateur ne correspondent pas. Bad credentials.: Le mot de passe et le nom d'utilisateur ne correspondent pas.

View File

@ -11,6 +11,8 @@ declare(strict_types=1);
namespace Chill\PersonBundle\Controller; namespace Chill\PersonBundle\Controller;
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
use Chill\MainBundle\Security\Authorization\AuthorizationHelperInterface;
use Chill\PersonBundle\Config\ConfigPersonAltNamesHelper; use Chill\PersonBundle\Config\ConfigPersonAltNamesHelper;
use Chill\PersonBundle\Entity\Household\Household; use Chill\PersonBundle\Entity\Household\Household;
use Chill\PersonBundle\Entity\Household\HouseholdMember; use Chill\PersonBundle\Entity\Household\HouseholdMember;
@ -20,6 +22,7 @@ use Chill\PersonBundle\Form\PersonType;
use Chill\PersonBundle\Privacy\PrivacyEvent; use Chill\PersonBundle\Privacy\PrivacyEvent;
use Chill\PersonBundle\Repository\PersonRepository; use Chill\PersonBundle\Repository\PersonRepository;
use Chill\PersonBundle\Search\SimilarPersonMatcher; use Chill\PersonBundle\Search\SimilarPersonMatcher;
use Chill\PersonBundle\Security\Authorization\PersonVoter;
use DateTimeImmutable; use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
@ -44,6 +47,8 @@ use function is_array;
final class PersonController extends AbstractController final class PersonController extends AbstractController
{ {
private AuthorizationHelperInterface $authorizationHelper;
/** /**
* @var ConfigPersonAltNamesHelper * @var ConfigPersonAltNamesHelper
*/ */
@ -87,6 +92,7 @@ final class PersonController extends AbstractController
private $validator; private $validator;
public function __construct( public function __construct(
AuthorizationHelperInterface $authorizationHelper,
SimilarPersonMatcher $similarPersonMatcher, SimilarPersonMatcher $similarPersonMatcher,
TranslatorInterface $translator, TranslatorInterface $translator,
EventDispatcherInterface $eventDispatcher, EventDispatcherInterface $eventDispatcher,
@ -97,6 +103,7 @@ final class PersonController extends AbstractController
EntityManagerInterface $em, EntityManagerInterface $em,
Security $security Security $security
) { ) {
$this->authorizationHelper = $authorizationHelper;
$this->similarPersonMatcher = $similarPersonMatcher; $this->similarPersonMatcher = $similarPersonMatcher;
$this->translator = $translator; $this->translator = $translator;
$this->eventDispatcher = $eventDispatcher; $this->eventDispatcher = $eventDispatcher;
@ -206,22 +213,15 @@ final class PersonController extends AbstractController
* *
* The next post compare the data with previous one and, if yes, show a * The next post compare the data with previous one and, if yes, show a
* review page if there are "alternate persons". * review page if there are "alternate persons".
*
* @return Response|\Symfony\Component\HttpFoundation\RedirectResponse
*/ */
public function newAction(Request $request) public function newAction(Request $request): Response
{ {
$person = new Person(); $person = new Person();
if ( $authorizedCenters =$this->authorizationHelper->getReachableCenters($this->getUser(), PersonVoter::CREATE);
1 === count($this->security->getUser()
->getGroupCenters()) if (1 === count($authorizedCenters)) {
) { $person->setCenter($authorizedCenters[0]);
$person->setCenter(
$this->security->getUser()
->getGroupCenters()[0]
->getCenter()
);
} }
$form = $this->createForm(CreationPersonType::class, $person) $form = $this->createForm(CreationPersonType::class, $person)

View File

@ -94,8 +94,8 @@ class AccompanyingPeriodWork implements AccompanyingPeriodLinkedWithSocialIssues
* @Serializer\Groups({"accompanying_period_work:create"}) * @Serializer\Groups({"accompanying_period_work:create"})
* @Serializer\Groups({"accompanying_period_work:edit"}) * @Serializer\Groups({"accompanying_period_work:edit"})
* @Serializer\Groups({"read", "docgen:read", "read:accompanyingPeriodWork:light"}) * @Serializer\Groups({"read", "docgen:read", "read:accompanyingPeriodWork:light"})
* @Assert\GreaterThan(propertyPath="startDate", * @Assert\GreaterThanOrEqual(propertyPath="startDate",
* message="accompanying_course_work.The endDate should be greater than the start date" * message="accompanying_course_work.The endDate should be greater or equal than the start date"
* ) * )
*/ */
private ?DateTimeImmutable $endDate = null; private ?DateTimeImmutable $endDate = null;

View File

@ -75,7 +75,8 @@ final class PersonACLAwareRepository implements PersonACLAwareRepositoryInterfac
$birthdateAfter, $birthdateAfter,
$gender, $gender,
$countryCode, $countryCode,
$phonenumber $phonenumber,
$city
); );
return $this->addAuthorizations($query); return $this->addAuthorizations($query);

View File

@ -1,15 +1,22 @@
import { createApp } from 'vue'; import {createApp} from 'vue';
import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n'; import {_createI18n} from 'ChillMainAssets/vuejs/_js/i18n';
import { store } from './store'; import {store} from './store';
import { personMessages } from 'ChillPersonAssets/vuejs/_js/i18n' import {personMessages} from 'ChillPersonAssets/vuejs/_js/i18n'
import App from './App.vue'; import App from './App.vue';
import VueToast from "vue-toast-notification";
const i18n = _createI18n(personMessages); const i18n = _createI18n(personMessages);
const app = createApp({ const app = createApp({
template: `<app></app>`, template: `<app></app>`,
}) })
.use(store) .use(store)
.use(i18n) .use(i18n)
.component('app', App) .use(VueToast, {
.mount('#accompanying_course_work_create'); position: "bottom-right",
type: "error",
duration: 10000,
dismissible: true,
})
.component('app', App)
.mount('#accompanying_course_work_create');

View File

@ -107,6 +107,9 @@ const store = createStore({
setPostingWork(state) { setPostingWork(state) {
state.isPostingWork = true; state.isPostingWork = true;
}, },
setPostingWorkDone(state) {
state.isPostingWork = false;
},
setStartDate(state, date) { setStartDate(state, date) {
state.startDate = date; state.startDate = date;
}, },
@ -150,11 +153,12 @@ const store = createStore({
const url = `/api/1.0/person/accompanying-course/${state.accompanyingCourse.id}/work.json`; const url = `/api/1.0/person/accompanying-course/${state.accompanyingCourse.id}/work.json`;
commit('setPostingWork'); commit('setPostingWork');
makeFetch('POST', url, payload) return makeFetch('POST', url, payload)
.then((response) => { .then((response) => {
window.location.assign(`/fr/person/accompanying-period/work/${response.id}/edit`) window.location.assign(`/fr/person/accompanying-period/work/${response.id}/edit`)
}) })
.catch((error) => { .catch((error) => {
commit('setPostingWorkDone');
throw error; throw error;
}); });
}, },

View File

@ -549,7 +549,14 @@ export default {
.catch(e => { console.log(e); throw e; }); .catch(e => { console.log(e); throw e; });
}, },
submit() { submit() {
this.$store.dispatch('submit'); this.$store.dispatch('submit').catch((error) => {
if (error.name === 'ValidationException' || error.name === 'AccessException') {
error.violations.forEach((violation) => this.$toast.open({message: violation}));
} else {
this.$toast.open({message: 'An error occurred'});
throw error;
}
});
}, },
saveFormOnTheFly(payload) { saveFormOnTheFly(payload) {
console.log('saveFormOnTheFly: type', payload.type, ', data', payload.data); console.log('saveFormOnTheFly: type', payload.type, ', data', payload.data);

View File

@ -15,7 +15,7 @@ const app = createApp({
.use(VueToast, { .use(VueToast, {
position: "bottom-right", position: "bottom-right",
type: "error", type: "error",
duration: 5000, duration: 10000,
dismissible: true dismissible: true
}) })
.use(i18n) .use(i18n)

View File

@ -500,9 +500,8 @@ const store = createStore({
window.location.assign(`/fr/person/accompanying-period/${state.work.accompanyingPeriod.id}/work`); window.location.assign(`/fr/person/accompanying-period/${state.work.accompanyingPeriod.id}/work`);
} }
}).catch(error => { }).catch(error => {
console.log('error on submit', error);
commit('setIsPosting', false); commit('setIsPosting', false);
commit('setErrors', error.violations); throw error;
}); });
}, },
updateDocumentTitle({commit}, payload) { updateDocumentTitle({commit}, payload) {

View File

@ -36,7 +36,7 @@
{%- macro links(person, options) -%} {%- macro links(person, options) -%}
<ul> <ul>
<li><b>{{ person.counters.nb_activity }}</b> {{ (person.counters.nb_activity > 1)? 'activités' : 'activité' }}</li> <li><b>{{ person.counters.nb_activity }}</b> {{ (person.counters.nb_activity > 1)? 'échanges' : 'échange' }}</li>
<li><b>{{ person.counters.nb_task }}</b> {{ (person.counters.nb_task > 1)? 'tâches' : 'tâche' }}</li> <li><b>{{ person.counters.nb_task }}</b> {{ (person.counters.nb_task > 1)? 'tâches' : 'tâche' }}</li>
<li><b>{{ person.counters.nb_document }}</b> {{ (person.counters.nb_document > 1)? 'documents' : 'document' }}</li> <li><b>{{ person.counters.nb_document }}</b> {{ (person.counters.nb_document > 1)? 'documents' : 'document' }}</li>
<li><b>{{ person.counters.nb_event }}</b> {{ (person.counters.nb_event > 1)? 'événements' : 'événement' }}</li> <li><b>{{ person.counters.nb_event }}</b> {{ (person.counters.nb_event > 1)? 'événements' : 'événement' }}</li>

View File

@ -84,15 +84,19 @@ class SearchHouseholdApiProvider implements SearchApiInterface
count($phoneResult->getFound()) > 0 ? $phoneResult->getFound()[0] : null count($phoneResult->getFound()) > 0 ? $phoneResult->getFound()[0] : null
); );
$previousFrom = $query->getFromClause();
$previousParams = $query->getFromParams();
$query $query
->setDistinct(true, 'household_id') ->setDistinct(true, 'cpphm.household_id')
->setFromClause( ->setFromClause(
'view_chill_person_household_address AS vcpha ' . $previousFrom . ' '.
'JOIN chill_person_person AS person ON vcpha.person_id = person.id' 'JOIN chill_person_household_members AS cpphm ON cpphm.person_id = person.id',
$previousParams
) )
->andWhereClause('(cpphm.startDate <= NOW() AND (cpphm.endDate IS NULL or cpphm.endDate > NOW()))')
->setSelectKey('household') ->setSelectKey('household')
->andWhereClause('vcpha.validTo IS NULL', []) ->setSelectJsonbMetadata("jsonb_build_object('id', cpphm.household_id)");
->setSelectJsonbMetadata("jsonb_build_object('id', vcpha.household_id)");
return $query; return $query;
} }

View File

@ -47,8 +47,8 @@ Phonenumber: 'Numéro de téléphone'
phonenumber: numéro de téléphone phonenumber: numéro de téléphone
Mobilenumber: 'Numéro de téléphone portable' Mobilenumber: 'Numéro de téléphone portable'
mobilenumber: numéro de téléphone portable mobilenumber: numéro de téléphone portable
Accept short text message ?: La personne a donné l'autorisation d'utiliser ce no de téléphone pour l'envoi de rappel par SMS Accept short text message ?: L'usager a donné l'autorisation d'utiliser ce no de téléphone pour l'envoi de rappel par SMS
Accept short text message: La personne a donné l'autorisation d'utiliser ce no de téléphone pour l'envoi de rappel par SMS Accept short text message: L'usager a donné l'autorisation d'utiliser ce no de téléphone pour l'envoi de rappel par SMS
Other phonenumber: Autre numéro de téléphone Other phonenumber: Autre numéro de téléphone
Others phone numbers: Autres numéros de téléphone Others phone numbers: Autres numéros de téléphone
No additional phone numbers: Aucun numéro de téléphone supplémentaire No additional phone numbers: Aucun numéro de téléphone supplémentaire
@ -85,9 +85,9 @@ Course number: Parcours n°
Civility: Civilité Civility: Civilité
choose civility: -- choose civility: --
All genders: tous les genres All genders: tous les genres
Any person selected: Aucune personne sélectionnée Any person selected: Aucun usager sélectionné
Create a household and add an address: Ajouter une adresse pour une personne non suivie et seule dans un ménage Create a household and add an address: Ajouter une adresse pour un usager non suivie et seule dans un ménage
A new household will be created. The person will be member of this household.: Un nouveau ménage va être créé. La personne sera membre de ce ménage. A new household will be created. The person will be member of this household.: Un nouveau ménage va être créé. L'usager sera membre de ce ménage.
Comment on the gender: Commentaire sur le genre Comment on the gender: Commentaire sur le genre
genderComment: Commentaire sur le genre genderComment: Commentaire sur le genre
maritalStatus: État civil maritalStatus: État civil
@ -136,10 +136,10 @@ address_country_name: Pays
address_country_code: Code pays address_country_code: Code pays
'Alreay existing person': 'Dossiers déjà encodés' 'Alreay existing person': 'Dossiers déjà encodés'
'Add the person': 'Ajouter la personne' 'Add the person': "Ajouter l'usager"
'Add the person and create an accompanying period': "Créer la personne ET créer une période d'accompagnement" 'Add the person and create an accompanying period': "Créer l'usager et créer un parcours d'accompagnement"
'Add the person and create a household': "Créer la personne ET créer un ménage" 'Add the person and create a household': "Créer l'usager et créer un ménage"
Show person: Voir le dossier de la personne Show person: Voir le dossier de l'usager
'Confirm the creation': 'Confirmer la création' 'Confirm the creation': 'Confirmer la création'
'You will create this person': 'Vous allez créer le dossier suivant' 'You will create this person': 'Vous allez créer le dossier suivant'
Return: Retour Return: Retour
@ -148,51 +148,51 @@ Reset: 'Remise à zéro'
'The person data has been updated': 'Les données ont été mises à jour.' 'The person data has been updated': 'Les données ont été mises à jour.'
'The person data provided are not valid': 'Les données introduites ne sont pas valides' 'The person data provided are not valid': 'Les données introduites ne sont pas valides'
'{1} The person field %field% is incorrect. Please check. | ]1, Inf] Several person fields are incorrect. Please check.': '{1} Le champs %field% est incorrect. Veuillez le corriger. | ]1, Inf] Plusieurs champs sont incorrects. Veuillez les vérifier.' '{1} The person field %field% is incorrect. Please check. | ]1, Inf] Several person fields are incorrect. Please check.': '{1} Le champs %field% est incorrect. Veuillez le corriger. | ]1, Inf] Plusieurs champs sont incorrects. Veuillez les vérifier.'
'Add a person': 'Ajout d''une personne' 'Add a person': 'Ajout d''un usager'
'Person Menu': 'Menu personne' 'Person Menu': 'Menu usager'
'The person data are not valid': 'Les données de votre formulaire sont invalides.' 'The person data are not valid': 'Les données de votre formulaire sont invalides.'
'%nb% person with similar name. Please verify that this is a new person': '{1} Une personne a un nom similaire. Vérifiez qu''il ne s''agit pas d''elle. | ]1, Inf] %nb% personnes ont un nom similaire. Vérifiez qu''il ne s''agit pas de l''une d''elles.' '%nb% person with similar name. Please verify that this is a new person': '{1} Une usager a un nom similaire. Vérifiez qu''il ne s''agit pas d''elle. | ]1, Inf] %nb% usagers ont un nom similaire. Vérifiez qu''il ne s''agit pas de l''une d''elles.'
'The person has been created': 'Le dossier a été créé' 'The person has been created': 'Le dossier a été créé'
'Person search results': 'Recherche de personnes' 'Person search results': 'Recherche de usagers'
Person search results by phonenumber: Recherche de personnes par numéro de téléphone Person search results by phonenumber: Recherche d'usager par numéro de téléphone
'Search within persons': 'Recherche parmi les personnes' 'Search within persons': 'Recherche parmi les usagers'
Open person file: Ouvrir le dossier de la personne Open person file: Ouvrir le dossier de l'usager
and %number% other: '{0} et aucun autre| {1} et une autre |]1, Inf] et %number% autres' and %number% other: '{0} et aucun autre| {1} et une autre |]1, Inf] et %number% autres'
'%total% persons matching the search pattern:': '{0} Aucune personne ne correspond aux termes de recherche : | {1} Une personne a été trouvée par la recherche : | ]1,Inf] %total% personnes correspondent aux termes de recherche :' '%total% persons matching the search pattern:': '{0} Aucune usager ne correspond aux termes de recherche : | {1} Un usager a été trouvé par la recherche : | ]1,Inf] %total% usagers correspondent aux termes de recherche :'
'Last opening since %last_opening%': 'Dernière ouverture le %last_opening%.' 'Last opening since %last_opening%': 'Dernière ouverture le %last_opening%.'
'Person accompanying period - %name%': 'Historique du dossier - %name%' 'Person accompanying period - %name%': 'Historique du dossier - %name%'
'Opening date': 'Date d''ouverture' 'Opening date': 'Date d''ouverture'
'Closing date': 'Date de clôture' 'Closing date': 'Date de clôture'
'Period opened': 'Période ouverte' 'Period opened': 'Période ouverte'
'Close accompanying period': 'Clôre la période' 'Close accompanying period': 'Clôre le parcours'
'Open accompanying period': 'Ouvrir la période' 'Open accompanying period': 'Ouvrir le parcours'
Period number %number%: 'Période n° %number%' Period number %number%: 'Période n° %number%'
'Add an accompanying period in the past': Ajouter une période d'accompagnement dans le passé 'Add an accompanying period in the past': Ajouter un parcours d'accompagnement dans le passé
Begin a new accompanying period: Commencer une nouvelle période d'accompagnement Begin a new accompanying period: Commencer un nouveau parcours d'accompagnement
Create an accompanying period: Créer une période d'accompagnement Create an accompanying period: Créer un parcours d'accompagnement
'A period has been created.': Une période d'accompagnement a été créée. 'A period has been created.': Un parcours d'accompagnement a été créé.
'Error! Period not created!': La période d'accompagnement n'a pas été créée. 'Error! Period not created!': Le parcours d'accompagnement n'a pas été créé.
Update accompanying period: Mettre à jour une période d'accompagnement Update accompanying period: Mettre à jour un parcours d'accompagnement
'An accompanying period has been updated.': Une période d'accompagnement a été mise à jour 'An accompanying period has been updated.': Un parcours d'accompagnement a été mise à jour
'Error when updating the period': Erreur pendant la mise à jour de la période d'accompagnement. 'Error when updating the period': Erreur pendant la mise à jour du parcours d'accompagnement.
'An accompanying period has been closed.': Une période d'accompagnement a été fermée. 'An accompanying period has been closed.': Un parcours d'accompagnement a été fermée.
'Error! Period not closed!': "Erreur: la période d'accompagnement n'a pas été fermée." 'Error! Period not closed!': "Erreur: le parcours d'accompagnement n'a pas été fermé."
'An accompanying period has been opened.': Une période d'accompagnement a été ouverte. 'An accompanying period has been opened.': Un parcours d'accompagnement a été ouvert.
'No remark': Pas de remarque 'No remark': Pas de remarque
'Period not opened': "La période d'accompagnement n'a pas été ouverte" 'Period not opened': "Le parcours d'accompagnement n'a pas été ouvert"
"Period not opened : form is invalid": "La période n'a pas été ouverte: le formulaire est invalide." "Period not opened : form is invalid": "Le parcours d'accompagnement n'a pas été ouverte: le formulaire est invalide."
'Closing motive': 'Motif de clôture' 'Closing motive': 'Motif de clôture'
This course is closed: Ce parcours est clôturé This course is closed: Ce parcours est clôturé
Close accompanying course: Clôturer le parcours Close accompanying course: Clôturer le parcours
Re-open accompanying course: Ré-ouvrir le parcours Re-open accompanying course: Ré-ouvrir le parcours
'Person details': 'Détails de la personne' 'Person details': "Détails de l'usager"
'Update details for %name%': 'Modifier détails de %name%' 'Update details for %name%': 'Modifier détails de %name%'
An accompanying period ends: Une periode d'accompagnement se clôture An accompanying period ends: Un parcours d'accompagnement se clôture
An accompanying period starts: Une période d'accompagnement est ouverte An accompanying period starts: Un parcours d'accompagnement est ouvert
Any accompanying periods are open: Aucune période d'accompagnement ouverte Any accompanying periods are open: Aucune parcours d'accompagnement ouvert
An accompanying period is open: Une période d'accompagnement est ouverte An accompanying period is open: Un parcours d'accompagnement est ouvert
Accompanying period list: Périodes d'accompagnement Accompanying period list: Parcours d'accompagnement
Accompanying period list for person: Périodes d'accompagnement de la personne Accompanying period list for person: Parcours d'accompagnement de l'usager
Accompanying period: Parcours d'accompagnement Accompanying period: Parcours d'accompagnement
Any accompanying period: Aucun parcours d'accompagnement Any accompanying period: Aucun parcours d'accompagnement
period: Parcours period: Parcours
@ -200,17 +200,17 @@ New accompanying course: Nouveau parcours d'accompagnement
Choose a motive: Motif de fermeture Choose a motive: Motif de fermeture
Re-open accompanying period: Ré-ouvrir Re-open accompanying period: Ré-ouvrir
Re-Open a period: Ré-ouvrir Re-Open a period: Ré-ouvrir
Are you sure you want to re-open this period ?: Êtes-vous sûr de vouloir ré-ouvrir cette période d'accompagnement ? Are you sure you want to re-open this period ?: Êtes-vous sûr de vouloir ré-ouvrir cet parcours d'accompagnement ?
'The period has been re-opened': La période d'accompagnement a été ré-ouverte. 'The period has been re-opened': Le parcours d'accompagnement a été ré-ouverte.
Pediod closing form is not valid: Le formulaire n'est pas valide Pediod closing form is not valid: Le formulaire n'est pas valide
Accompanying user: Accompagnant Accompanying user: Accompagnant
No accompanying user: Aucun accompagnant No accompanying user: Aucun accompagnant
No data given: Pas d'information No data given: Pas d'information
Participants: Personnes impliquées Participants: Usagers impliquées
Create an accompanying course: Créer un parcours Create an accompanying course: Créer un parcours
Accompanying courses of users: Parcours des utilisateurs Accompanying courses of users: Parcours des utilisateurs
This accompanying course is still a draft: Ce parcours est encore à l'état brouillon. This accompanying course is still a draft: Ce parcours est encore à l'état brouillon.
Associated peoples: Personnes concernées Associated peoples: Usagers concernées
Resources: Interlocuteurs privilégiés Resources: Interlocuteurs privilégiés
Any requestor to this accompanying course: Aucun demandeur pour ce parcours Any requestor to this accompanying course: Aucun demandeur pour ce parcours
Social action: Action d'accompagnement Social action: Action d'accompagnement
@ -222,47 +222,47 @@ Social issues: Problématiques sociales
Pick a social issue: Choisir une problématique sociale Pick a social issue: Choisir une problématique sociale
Last events on accompanying course: Dernières actions de suivi Last events on accompanying course: Dernières actions de suivi
Edit & activate accompanying course: Modifier et valider Edit & activate accompanying course: Modifier et valider
See accompanying periods: Voir toutes les périodes d'accompagnement See accompanying periods: Voir tous les parcours d'accompagnement
See accompanying period: Voir la période See accompanying period: Voir le parcours
Edit accompanying period: Modifier la période Edit accompanying period: Modifier le parcours
See this period: Voir cette période See this period: Voir cet parcours
Requestor: Demandeur Requestor: Demandeur
No requestor: Pas de demandeur No requestor: Pas de demandeur
No resources: "Pas d'interlocuteurs privilégiés" No resources: "Pas d'interlocuteurs privilégiés"
Persons associated: Personnes concernés Persons associated: Usagers concernés
Referrer: Référent Referrer: Référent
Referrers: Agents traitants Referrers: Agents traitants
Referrer2: Agent traitant Referrer2: Agent traitant
No referrer: Pas d'agent traitant No referrer: Pas d'agent traitant
Some peoples does not belong to any household currently. Add them to an household soon: Certaines personnes n'appartiennent à aucun ménage actuellement. Renseignez leur ménage dès que possible. Some peoples does not belong to any household currently. Add them to an household soon: Certains usagers n'appartiennent à aucun ménage actuellement. Renseignez leur ménage dès que possible.
Add to household now: Ajouter à un ménage Add to household now: Ajouter à un ménage
Any resource for this accompanying course: Aucun interlocuteur privilégié pour ce parcours Any resource for this accompanying course: Aucun interlocuteur privilégié pour ce parcours
course.draft: Brouillon course.draft: Brouillon
course.closed: Clôturé course.closed: Clôturé
Origin: Origine de la demande Origin: Origine de la demande
Delete accompanying period: Supprimer la période d'accompagnement Delete accompanying period: Supprimer le parcours d'accompagnement
Are you sure you want to remove the accompanying period "%id%" ?: Êtes-vous sûr de vouloir supprimer la période d'accompagnement %id% ? Are you sure you want to remove the accompanying period "%id%" ?: Êtes-vous sûr de vouloir supprimer le parcours d'accompagnement %id% ?
The accompanying course has been successfully removed.: La période d'accompagnement a été supprimée. The accompanying course has been successfully removed.: Le parcours d'accompagnement a été supprimé.
Concerned scopes: Services concernés Concerned scopes: Services concernés
# person resource # person resource
person_resources_menu: "Personnes ressources" person_resources_menu: "Personnes ressources"
Person resources: "Ressources de la personne" Person resources: "Personnes ressources de l'usager"
Add a person resource: "Ajouter une ressource" Add a person resource: "Ajouter une person ressource"
edit resource: "Modifier ressource" edit resource: "Modifier la ressource"
Remove resource: "Supprimer ressource" Remove resource: "Supprimer la ressource"
Are you sure you want to remove the resource for "%name%" ?: Étes-vous sûr de vouloir supprimer cette ressource de %name%? Are you sure you want to remove the resource for "%name%" ?: Étes-vous sûr de vouloir supprimer cette ressource de %name%?
The resource has been successfully removed.: "La ressource a été supprimée." The resource has been successfully removed.: "La ressource a été supprimée."
List of resources: "Liste des ressources" List of resources: "Liste des personnes ressources"
There are no available resources: "Aucun ressource" There are no available resources: "Aucun personne ressource"
no comment found: "Aucun commentaire" no comment found: "Aucun commentaire"
Select a type: "Choisissez un type" Select a type: "Choisissez un type"
Select a person: "Choisissez une personne" Select a person: "Choisissez un usager"
Kind: "Type" Kind: "Type"
# pickAPersonType # pickAPersonType
Pick a person: Choisir une personne Pick a person: Choisir un usager
# Address # Address
No address given: Pas d'adresse renseignée No address given: Pas d'adresse renseignée
@ -277,19 +277,19 @@ New address : Nouvelle adresse
New address for %name% : Nouvelle adresse pour %name% New address for %name% : Nouvelle adresse pour %name%
The new address was created successfully: La nouvelle adresse a été créée The new address was created successfully: La nouvelle adresse a été créée
Add an address: Ajouter une adresse Add an address: Ajouter une adresse
Back to the person details: Retour aux détails de la personne Back to the person details: Retour aux détails de l'usager
# Residential address # Residential address
Residential addresses history for %name%: Historique des adresses de résidence de %name% Residential addresses history for %name%: Historique des adresses de résidence de %name%
Residential addresses history: Historique des adresses de résidence Residential addresses history: Historique des adresses de résidence
Add a residential address: Ajouter une adresse de résidence Add a residential address: Ajouter une adresse de résidence
Which kind of residential address would you create ?: Quel type d'adresse de résidence voulez-vous créer? Which kind of residential address would you create ?: Quel type d'adresse de résidence voulez-vous créer?
The address of another person: L'adresse d'une autre personne The address of another person: L'adresse d'une autre usager
A new address: Une nouvelle adresse A new address: Une nouvelle adresse
residential_address_person_explanation: L'adresse sera positionnée auprès d'une personne. Lorsque la personne déménage, l'adresse de résidence suivra également cette personne residential_address_person_explanation: L'adresse sera positionnée auprès d'un usager. Lorsque l'usager déménage, l'adresse de résidence suivra également cette usager
residential_address_new_address_explanation: Créer une nouvelle adresse. L'adresse sera fixe. residential_address_new_address_explanation: Créer une nouvelle adresse. L'adresse sera fixe.
New residential address: Nouvelle adresse de résidence New residential address: Nouvelle adresse de résidence
Host person: Choisir l'adresse d'une personne Host person: Choisir l'adresse d'un usager
The new residential address was created successfully: La nouvelle adresse de résidence a été créée The new residential address was created successfully: La nouvelle adresse de résidence a été créée
Edit a residential address: Modifier l'addresse de résidence Edit a residential address: Modifier l'addresse de résidence
The residential address was updated successfully: L'adresse de résidence a été mise à jour The residential address was updated successfully: L'adresse de résidence a été mise à jour
@ -303,29 +303,29 @@ Residential address had been deleted: L'adresse de résidence a été supprimée
#timeline #timeline
Timeline: Historique Timeline: Historique
Closing the accompanying period: Fermeture de la période d'accompagnement Closing the accompanying period: Fermeture du parcours d'accompagnement
Opening the accompanying period: Ouverture d'une période d'accompagnement Opening the accompanying period: Ouverture d'un parcours d'accompagnement
'Timeline for %name%': 'Historique de %name%' 'Timeline for %name%': 'Historique de %name%'
# ROLES # ROLES
CHILL_PERSON_SEE: Voir les personnes CHILL_PERSON_SEE: Voir les usagers
CHILL_PERSON_UPDATE: Modifier les personnes CHILL_PERSON_UPDATE: Modifier les usagers
CHILL_PERSON_CREATE: Ajouter des personnes CHILL_PERSON_CREATE: Ajouter des usagers
CHILL_PERSON_STATS: Statistiques sur les personnes CHILL_PERSON_STATS: Statistiques sur les usagers
CHILL_PERSON_LISTS: Liste des personnes CHILL_PERSON_LISTS: Liste des usagers
CHILL_PERSON_DUPLICATE: Gérer les doublons de personnes CHILL_PERSON_DUPLICATE: Gérer les doublons d'usagers
CHILL_PERSON_ACCOMPANYING_PERIOD_SEE: Vision simplifiée d'une période d'accompagnement CHILL_PERSON_ACCOMPANYING_PERIOD_SEE: Vision simplifiée d'un parcours d'accompagnement
CHILL_PERSON_ACCOMPANYING_PERIOD_CONFIDENTIAL: Voir et modifier les périodes d'accompagnement confidentielles CHILL_PERSON_ACCOMPANYING_PERIOD_CONFIDENTIAL: Voir et modifier les parcours d'accompagnement confidentielles
CHILL_PERSON_ACCOMPANYING_PERIOD_DELETE: Supprimer une période d'accompagnement CHILL_PERSON_ACCOMPANYING_PERIOD_DELETE: Supprimer un pacours d'accompagnement
CHILL_PERSON_ACCOMPANYING_PERIOD_RE_OPEN: Ré-ouvrir un parcours clotûré CHILL_PERSON_ACCOMPANYING_PERIOD_RE_OPEN: Ré-ouvrir un parcours clotûré
CHILL_PERSON_ACCOMPANYING_PERIOD_TOGGLE_CONFIDENTIAL_ALL: Modifier la confidentialité de tous les parcours CHILL_PERSON_ACCOMPANYING_PERIOD_TOGGLE_CONFIDENTIAL_ALL: Modifier la confidentialité de tous les parcours
CHILL_PERSON_ACCOMPANYING_PERIOD_CRUD_CONFIDENTIAL: Voir les périodes d'accompagnement confidentielles CHILL_PERSON_ACCOMPANYING_PERIOD_CRUD_CONFIDENTIAL: Voir les parcours d'accompagnement confidentiels
CHILL_PERSON_ACCOMPANYING_PERIOD_CREATE: Créer une période d'accompagnement CHILL_PERSON_ACCOMPANYING_PERIOD_CREATE: Créer un parcours d'accompagnement
CHILL_PERSON_ACCOMPANYING_PERIOD_UPDATE: Modifier une période d'accompagnement CHILL_PERSON_ACCOMPANYING_PERIOD_UPDATE: Modifier un parcours d'accompagnement
CHILL_PERSON_ACCOMPANYING_PERIOD_FULL: Voir les détails, créer, supprimer et mettre à jour une période d'accompagnement CHILL_PERSON_ACCOMPANYING_PERIOD_FULL: Voir les détails, créer, supprimer et mettre à jour un parcours d'accompagnement
CHILL_PERSON_ACCOMPANYING_COURSE_REASSIGN_BULK: Réassigner les parcours en lot CHILL_PERSON_ACCOMPANYING_COURSE_REASSIGN_BULK: Réassigner les parcours en lot
CHILL_PERSON_ACCOMPANYING_PERIOD_SEE_DETAILS: Voir les détails d'une période d'accompagnement CHILL_PERSON_ACCOMPANYING_PERIOD_SEE_DETAILS: Voir les détails d'un parcours d'accompagnement
CHILL_PERSON_ACCOMPANYING_PERIOD_STATS: Statistiques sur les parcours d'accompagnement CHILL_PERSON_ACCOMPANYING_PERIOD_STATS: Statistiques sur les parcours d'accompagnement
CHILL_MAIN_ACCOMPANYING_PERIOD_WORK_CREATE: Créer une action d'accompagnement CHILL_MAIN_ACCOMPANYING_PERIOD_WORK_CREATE: Créer une action d'accompagnement
@ -342,28 +342,28 @@ CHILL_PERSON_HOUSEHOLD_EDIT: Modifier les ménages
CHILL_PERSON_HOUSEHOLD_STATS: Statistiques sur les ménages CHILL_PERSON_HOUSEHOLD_STATS: Statistiques sur les ménages
#period #period
Period closed!: Période clôturée! Period closed!: Parcours clôturé!
Pediod closing form is not valide: Le formulaire de fermeture n'est pas valide Pediod closing form is not valide: Le formulaire de fermeture n'est pas valide
#widget #widget
## widget person_list ## widget person_list
Accompanyied people: Personnes accompagnées Accompanyied people: Usagers accompagnés
## exports ## exports
Exports of persons: Exports des personnes Exports of persons: Exports des usagers
Count people by various parameters.: Compte le nombre de personnes en fonction de différents filtres. Count people by various parameters.: Compte le nombre d'usagers en fonction de différents filtres.
Count people: Nombre de personnes Count people: Nombre d'usagers
List peoples: Liste des personnes List peoples: Liste des usagers
Create a list of people according to various filters.: Crée une liste des personnes selon différents filtres. Create a list of people according to various filters.: Crée une liste d'usagers selon différents filtres.
Fields to include in export: Champs à inclure dans l'export Fields to include in export: Champs à inclure dans l'export
Address valid at this date: Addresse valide à cette date Address valid at this date: Addresse valide à cette date
Data valid at this date: Données valides à cette date Data valid at this date: Données valides à cette date
Data regarding center, addresses, and so on will be computed at this date: Les données concernant le centre, l'adresse, le ménage, sera calculé à cette date. Data regarding center, addresses, and so on will be computed at this date: Les données concernant le centre, l'adresse, le ménage, sera calculé à cette date.
List duplicates: Liste des doublons List duplicates: Liste des doublons
Create a list of duplicate people: Créer la liste des personnes détectées comme doublons. Create a list of duplicate people: Créer la liste des usagers détectés comme doublons.
Count people participating in an accompanying course: Nombre de personnes concernées par un parcours Count people participating in an accompanying course: Nombre d'usagers concernés par un parcours
Count people participating in an accompanying course by various parameters.: Compte le nombre de personnes concernées par un parcours Count people participating in an accompanying course by various parameters.: Compte le nombre d'usagers concernées par un parcours
Exports of accompanying courses: Exports des parcours d'accompagnement Exports of accompanying courses: Exports des parcours d'accompagnement
Count accompanying courses: Nombre de parcours Count accompanying courses: Nombre de parcours
@ -384,33 +384,33 @@ Count evaluation by various parameters.: Compte le nombre d'évaluations selon d
Exports of households: Exports des ménages Exports of households: Exports des ménages
## persons filters ## persons filters
Filter by person gender: Filtrer les personnes par genre Filter by person gender: Filtrer les usagers par genre
Accepted genders: Genres acceptés Accepted genders: Genres acceptés
'Filtering by genders: only %genders%': 'Filtré par genre: seulement %genders%' 'Filtering by genders: only %genders%': 'Filtré par genre: seulement %genders%'
Filter by person's nationality: Filtrer les personnes par nationalité Filter by person's nationality: Filtrer les usagers par nationalité
Nationalities: Nationalités Nationalities: Nationalités
Choose countries: Choisir les nationalités Choose countries: Choisir les nationalités
'Filtered by nationality : %nationalities%': 'Filtré par nationalité : seulement %nationalities%' 'Filtered by nationality : %nationalities%': 'Filtré par nationalité : seulement %nationalities%'
Filter by person's birthdate: Filtrer les personnes par date de naissance Filter by person's birthdate: Filtrer les usagers par date de naissance
Born after this date: Nés après cette date Born after this date: Nés après cette date
Born before this date: Nés avant cette date Born before this date: Nés avant cette date
This field should not be empty: Ce champ ne peut pas être vide This field should not be empty: Ce champ ne peut pas être vide
This date should be after the date given in "born after" field: Cette date doit être après la date donnée du le champ "nés après le" This date should be after the date given in "born after" field: Cette date doit être après la date donnée du le champ "nés après le"
"Filtered by person's birthdate: between %date_from% and %date_to%": "Filtré par date de naissance de la personne: uniquement nés entre le %date_from% et %date_to%" "Filtered by person's birthdate: between %date_from% and %date_to%": "Filtré par date de naissance de l'usager: uniquement nés entre le %date_from% et %date_to%"
Filter by person's deathdate: Filtrer les personnes par date de décès Filter by person's deathdate: Filtrer les usagers par date de décès.
"Filtered by person's deathdate: between %date_from% and %date_to%": "Filtré par date de naissance de la personne: uniquement nés entre le %date_from% et %date_to%" "Filtered by person's deathdate: between %date_from% and %date_to%": "Filtré par date de naissance de l'usager: uniquement nés entre le %date_from% et %date_to%"
Death after this date: Décédé après cette date Death after this date: Décédé après cette date
Deathdate before: Décédé avant cette date Deathdate before: Décédé avant cette date
Alive: Vivant Alive: Vivant
Deceased: Décédé Deceased: Décédé
Filter in relation to this date: Filtrer par rapport à cette date Filter in relation to this date: Filtrer par rapport à cette date
"Filtered by a state of %deadOrAlive%: at this date %date_calc%": Filtré par personnes qui sont %deadOrAlive% à cette date %date_calc% "Filtered by a state of %deadOrAlive%: at this date %date_calc%": Filtré par usagers qui sont %deadOrAlive% à cette date %date_calc%
Filter by person's age: Filtrer les personnes par age Filter by person's age: Filtrer les usagers par age.
"Filtered by person's age: between %min_age% and %max_age%": "Filtré par âge de la personne entre %min_age% et %max_age%" "Filtered by person's age: between %min_age% and %max_age%": "Filtré par âge de l'usager entre %min_age% et %max_age%"
Minimum age: Âge minimum Minimum age: Âge minimum
Maximum age: Âge maximum Maximum age: Âge maximum
The minimum age should be less than the maximum age.: L'âge minimum doit être plus bas que l'âge maximum. The minimum age should be less than the maximum age.: L'âge minimum doit être plus bas que l'âge maximum.
@ -420,38 +420,38 @@ Date during which residential address was valid: Date de validité
Family composition: Composition familiale Family composition: Composition familiale
Family composition at this time: Composition familiale à cette date. Family composition at this time: Composition familiale à cette date.
Filter by person's marital status: Filtrer les personnes par état matrimonial Filter by person's marital status: Filtrer les usagers par état matrimonial
Filtered by person's marital status: Filtré par état matrimonial Filtered by person's marital status: Filtré par état matrimonial
Marital status at this time: État matrimonial par rapport à cette date Marital status at this time: État matrimonial par rapport à cette date
Filter by entrusted child status: Filtrer les personnes "enfant confié" Filter by entrusted child status: Filtrer les usagers "enfant confié"
Filtered by entrusted child status: Uniquement les personnes qui sont "enfant confié" Filtered by entrusted child status: Uniquement les usagers qui sont "enfant confié"
Filter by nomadic status: Filtrer les personnes "gens du voyage" Filter by nomadic status: Filtrer les usagers "gens du voyage"
Filtered by nomadic status: Uniquement les personnes qui sont "gens du voyage" Filtered by nomadic status: Uniquement les usagers qui sont "gens du voyage"
"Filter by person's who have a residential address located at another user": Filtrer les personnes qui ont une addresse de résidence chez une autre personne "Filter by person's who have a residential address located at another user": Filtrer les usagers qui ont une addresse de résidence chez une autre usager
"Filtered by person's who have a residential address located at another user": Uniquement les personnes qui ont une addresse de résidence chez une autre personne "Filtered by person's who have a residential address located at another user": Uniquement les usagers qui ont une addresse de résidence chez une autre usager
Filter by person's that are alive or have deceased at a certain date: Filtrer les personnes qui sont décédées ou vivantes à une certaine date Filter by person's that are alive or have deceased at a certain date: Filtrer les usagers qui sont décédés ou vivantes à une certaine date
Filtered by person's that are alive or have deceased at a certain date: Uniquement les personnes qui sont décédées ou vivantes à une certaine date Filtered by person's that are alive or have deceased at a certain date: Uniquement les usagers qui sont décédés ou vivantes à une certaine date
"Filter by accompanying period: active period": "Filtrer les personnes par période d'accompagnement: en file active" "Filter by accompanying period: active period": "Filtrer les usagers par parcours d'accompagnement: en file active"
Having an accompanying period opened after this date: Ayant une période d'accompagnement ouverte après cette date Having an accompanying period opened after this date: Ayant un parcours d'accompagnement ouverte après cette date
Having an accompanying period ending before this date, or still opened at this date: Ayant une période d'accompagnement fermée après cette date, ou toujours ouverte à cette date Having an accompanying period ending before this date, or still opened at this date: Ayant un parcours d'accompagnement fermée après cette date, ou toujours ouverte à cette date
"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%)": "Filtré par période d'accompagnement: personnes ayant une période d'accompagnement ouverte après le %date_from%, et cloturée le %date_to% (ou toujours ouverte le %date_to%)" "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%)": "Filtré par parcours d'accompagnement: usagers ayant un parcours d'accompagnement ouvert après le %date_from%, et cloturé le %date_to% (ou toujours ouvert le %date_to%)"
"Filter by accompanying period: starting between two dates": "Filtrer les personnes par période d'accompagnement: début de la période entre deux dates" "Filter by accompanying period: starting between two dates": "Filtrer les usagers par parcours d'accompagnement: début de la période entre deux dates"
"Having an accompanying period opened before this date": "Ayant une période d'accompagnement ouverte avant cette date" "Having an accompanying period opened before this date": "Ayant un parcours d'accompagnement ouvert avant cette date"
"Filtered by accompanying period: persons having an accompanying period opened between the %date_from% and %date_to%": "Filtrer par période d'accompagnement: ayant une période ouverte entre le %date_from% et le %date_to%" "Filtered by accompanying period: persons having an accompanying period opened between the %date_from% and %date_to%": "Filtrer par parcours d'accompagnement: ayant un parcours ouvert entre le %date_from% et le %date_to%"
"Filter by accompanying period: closed between two dates": "Filtrer les personnes par période d'accompagnement: période fermée entre deux dates" "Filter by accompanying period: closed between two dates": "Filtrer les usagers par parcours d'accompagnement: parcours fermé entre deux dates"
Having an accompanying period closed after this date: Ayant une période d'accompagnement fermée après cette date Having an accompanying period closed after this date: Ayant un parcours d'accompagnement fermé après cette date
"Having an accompanying period closed before this date": "Ayant une période d'accompagnement fermée avant cette date" "Having an accompanying period closed before this date": "Ayant un parcours d'accompagnement fermé avant cette date"
"Filtered by accompanying period: persons having an accompanying period closed between the %date_from% and %date_to%": "Filtrer par période d'accompagnement: ayant une période fermée entre le %date_from% et le %date_to%" "Filtered by accompanying period: persons having an accompanying period closed between the %date_from% and %date_to%": "Filtrer par parcours d'accompagnement: ayant un parcours fermé entre le %date_from% et le %date_to%"
Filter by person having an activity in a period: Filtrer les personnes ayant eu une échange pendant la période donnée Filter by person having an activity in a period: Filtrer les usagers ayant eu un échange pendant la période donnée
Filtered by person having an activity between %date_from% and %date_to% with reasons %reasons_name%: Uniquement les personnes associées à une échange entre %date_from% et %date_to% avec les sujets %reasons_name% Filtered by person having an activity between %date_from% and %date_to% with reasons %reasons_name%: Uniquement les usagers associés à un échange entre %date_from% et %date_to% avec les sujets %reasons_name%
## accompanying course filters/aggr ## accompanying course filters/aggr
@ -483,8 +483,8 @@ acp_geog_agg_unitname: Zone géographique
acp_geog_agg_unitrefid: Clé de la zone géographique acp_geog_agg_unitrefid: Clé de la zone géographique
Geographical layer: Couche géographique Geographical layer: Couche géographique
Select a geographical layer: Choisir une couche géographique Select a geographical layer: Choisir une couche géographique
Group people by geographical unit based on his address: Grouper les personnes par zone géographique (sur base de l'adresse) Group people by geographical unit based on his address: Grouper les usagers par zone géographique (sur base de l'adresse)
Filter by person's geographical unit (based on address): Filter les personnes par zone géographique (sur base de l'adresse) Filter by person's geographical unit (based on address): Filter les usagers par zone géographique (sur base de l'adresse)
Filter by socialaction: Filtrer les parcours par action d'accompagnement Filter by socialaction: Filtrer les parcours par action d'accompagnement
Accepted socialactions: Actions d'accompagnement Accepted socialactions: Actions d'accompagnement
@ -500,9 +500,9 @@ Evaluation: Évaluation
"Filtered by evaluations: only %evals%": "Filtré par évaluation: uniquement %evals%" "Filtered by evaluations: only %evals%": "Filtré par évaluation: uniquement %evals%"
Group by evaluation: Grouper les parcours par évaluation Group by evaluation: Grouper les parcours par évaluation
Filter accompanying course by activity type: Filtrer les parcours par type d'activité Filter accompanying course by activity type: Filtrer les parcours par type d'échange
Accepted activitytypes: Types d'activités Accepted activitytypes: Types d'échanges
"Filtered by activity types: only %activitytypes%": "Filtré par type d'activité: seulement %activitytypes%" "Filtered by activity types: only %activitytypes%": "Filtré par type d'échange: seulement %activitytypes%"
Filter by origin: Filtrer les parcours par origine du parcours Filter by origin: Filtrer les parcours par origine du parcours
Accepted origins: Origines Accepted origins: Origines
@ -520,12 +520,12 @@ Administrative location: Localisation administrative
"Filtered by administratives locations: only %locations%": "Filtré par localisation administrative: uniquement %locations%" "Filtered by administratives locations: only %locations%": "Filtré par localisation administrative: uniquement %locations%"
Group by administrative location: Grouper les parcours par localisation administrative Group by administrative location: Grouper les parcours par localisation administrative
Filter by requestor: Filtrer les parcours selon la présence du demandeur au sein des personnes concernées Filter by requestor: Filtrer les parcours selon la présence du demandeur au sein des usagers concernés
Accepted choices: '' Accepted choices: ''
is person concerned: Le demandeur est une personne concernée is person concerned: Le demandeur est un usager concerné
is other person: Le demandeur est une personne, mais n'est pas concernée is other person: Le demandeur est un usager, mais n'est pas concerné
no requestor: Le parcours ne comporte pas de demandeur no requestor: Le parcours ne comporte pas de demandeur
"Filtered by requestor: only %choice%": "Filtré par présence du demandeur au sein des personnes concernées: uniquement si %choice%" "Filtered by requestor: only %choice%": "Filtré par présence du demandeur au sein des usagers concernés: uniquement si %choice%"
Group by requestor: Grouper les parcours selon la nature du demandeur Group by requestor: Grouper les parcours selon la nature du demandeur
Filter by confidential: Filtrer les parcours par confidentialité Filter by confidential: Filtrer les parcours par confidentialité
@ -647,24 +647,24 @@ Rounded month duration: Durée en mois (arrondie)
current duration: en cours current duration: en cours
duration 0 month: 0 mois (<15 jours) duration 0 month: 0 mois (<15 jours)
' months': ' mois' ' months': ' mois'
Group people by nationality: Grouper les personnes par nationalités Group people by nationality: Grouper les usagers par nationalités
Group by level: Grouper par niveau Group by level: Grouper par niveau
Group by continents: Grouper par continent Group by continents: Grouper par continent
Group by country: Grouper par pays Group by country: Grouper par pays
Group people by gender: Grouper les personnes par genre Group people by gender: Grouper les usagers par genre
Group people by their professional situation: Grouper les personnes par situation professionelle Group people by their professional situation: Grouper les usagers par situation professionelle
Group people by marital status: Grouper les personnes par état matrimonial Group people by marital status: Grouper les usagers par état matrimonial
Aggregate by household position: Grouper les personnes par position dans le ménage Aggregate by household position: Grouper les usagers par position dans le ménage
Household position in relation to this date: Position dans le ménage par rapport à cette date Household position in relation to this date: Position dans le ménage par rapport à cette date
Household position: Position dans le ménage Household position: Position dans le ménage
Aggregate by age: Grouper les personnes par âge Aggregate by age: Grouper les usagers par âge
Calculate age in relation to this date: Calculer l'âge par rapport à cette date Calculate age in relation to this date: Calculer l'âge par rapport à cette date
Group people by country of birth: Grouper les personnes par pays de naissance Group people by country of birth: Grouper les usagers par pays de naissance
Similar persons: Personnes similaires Similar persons: Usagers similaires
crud: crud:
closing_motive: closing_motive:
@ -775,8 +775,8 @@ closing_motive:
any parent: Aucun parent any parent: Aucun parent
new child: Nouvel enfant new child: Nouvel enfant
Person configuration: Configuration du module "Personnes" Person configuration: Configuration du module "Usagers"
Configuration of person bundle: Configuration du module "Personnes" Configuration of person bundle: Configuration du module "Usagers"
person_admin: person_admin:
accompanying_period: Parcours d'accompagnement accompanying_period: Parcours d'accompagnement
What would you like to configure ?: Que souhaitez-vous configurer ? What would you like to configure ?: Que souhaitez-vous configurer ?
@ -784,7 +784,7 @@ person_admin:
closing motives list: Liste des motifs de clotûre closing motives list: Liste des motifs de clotûre
closing motive explanation: > closing motive explanation: >
Les motifs de clotûre donnent des indications sur la fermeture Les motifs de clotûre donnent des indications sur la fermeture
d'une période d'accompagnement. d'un parcours d'accompagnement.
origin: Origines origin: Origines
marital status: États civils marital status: États civils
marital status list: Liste des états civils marital status list: Liste des états civils
@ -825,11 +825,11 @@ Edit Accompanying Course: Modifier le parcours
Close Accompanying Course: Clôturer le parcours Close Accompanying Course: Clôturer le parcours
Create Accompanying Course: Créer un nouveau parcours Create Accompanying Course: Créer un nouveau parcours
Drop Accompanying Course: Supprimer le parcours Drop Accompanying Course: Supprimer le parcours
This course is located at a temporarily address. You should locate this course to an user: Le parcours est localisé à une adresse temporaire. Il devrait être localisé auprès d'une personne concernée. This course is located at a temporarily address. You should locate this course to an user: Le parcours est localisé à une adresse temporaire. Il devrait être localisé auprès d'un usager concerné.
Accompanying course location: Localisation du parcours Accompanying course location: Localisation du parcours
This course is located by: Localisé auprès de This course is located by: Localisé auprès de
This course has a temporarily location: Localisation temporaire This course has a temporarily location: Localisation temporaire
Choose a person to locate by: Localiser auprès d'une personne concernée Choose a person to locate by: Localiser auprès d'un usager concerné
Associate at least one member with an household, and set an address to this household: Associez au moins un membre du parcours à un ménage, et indiquez une adresse à ce ménage. Associate at least one member with an household, and set an address to this household: Associez au moins un membre du parcours à un ménage, et indiquez une adresse à ce ménage.
Locate by: Localiser auprès de Locate by: Localiser auprès de
fix it: Compléter fix it: Compléter
@ -884,7 +884,7 @@ Household configuration: Gestion des ménages
# accompanying course work # accompanying course work
Accompanying Course Actions: Actions d'accompagnements Accompanying Course Actions: Actions d'accompagnements
Accompanying Course Action: Action d'accompagnement Accompanying Course Action: Action d'accompagnement
Are you sure you want to remove this work of the accompanying period %name% ?: Êtes-vous sûr de vouloir supprimer cette action de la période d'accompagnement %name% ? Are you sure you want to remove this work of the accompanying period %name% ?: Êtes-vous sûr de vouloir supprimer cette action du parcours d'accompagnement %name% ?
The accompanying period work has been successfully removed.: L'action d'accompagnement a été supprimée. The accompanying period work has been successfully removed.: L'action d'accompagnement a été supprimée.
accompanying_course_work: accompanying_course_work:
create: Créer une action create: Créer une action
@ -916,37 +916,37 @@ Person addresses: Adresses de résidence
Household addresses: Adresses de domicile Household addresses: Adresses de domicile
Insert an address: Insérer une adresse Insert an address: Insérer une adresse
see social issues: Voir les problématiques sociales see social issues: Voir les problématiques sociales
see persons associated: Voir les personnes concernées see persons associated: Voir les usagers concernés
docgen: docgen:
Accompanying Period basic: "Parcours d'accompagnement (basique)" Accompanying Period basic: "Parcours d'accompagnement (basique)"
Accompanying period work: "Action d'accompagnement" Accompanying period work: "Action d'accompagnement"
Accompanying period work context: "Evaluation des actions d'accompagnement" Accompanying period work context: "Evaluation des actions d'accompagnement"
Main person: Personne principale Main person: Usager principal
person 1: Première personne person 1: Premièr usager
person 2: Seconde personne person 2: Second usager
Ask for main person: Demander à l'utilisateur de préciser la personne principale Ask for main person: Demander à l'utilisateur de préciser l'usager principal
Ask for person 1: Demander à l'utilisateur de préciser la première personne Ask for person 1: Demander à l'utilisateur de préciser le premièr usager
Ask for person 2: Demander à l'utilisateur de préciser la seconde personne Ask for person 2: Demander à l'utilisateur de préciser le second usager
A basic context for accompanying period: Contexte pour les parcours A basic context for accompanying period: Contexte pour les parcours
A context for accompanying period work: Contexte pour les actions d'accompagnement A context for accompanying period work: Contexte pour les actions d'accompagnement
A context for accompanying period work evaluation: Contexte pour les évaluations dans les actions d'accompagnement A context for accompanying period work evaluation: Contexte pour les évaluations dans les actions d'accompagnement
Person basic: Personne (basique) Person basic: Usager (basique)
A basic context for person: Contexte pour les personnes A basic context for person: Contexte pour les usagers
Label for third party: Label à afficher aux utilisateurs Label for third party: Label à afficher aux utilisateurs
Document title: Titre du document généré Document title: Titre du document généré
period_notification: period_notification:
period_designated_subject: Vous êtes référent d'un parcours d'accompagnement period_designated_subject: Vous êtes référent d'un parcours d'accompagnement
You are designated to a new period: Vous avez été désigné référent d'un parcours d'accompagnement. You are designated to a new period: Vous avez été désigné référent d'un parcours d'accompagnement.
Persons are: Les personnes concernées sont les suivantes Persons are: Les usagers concernés sont les suivantes
Social issues are: Les problématiques sociales renseignées sont les suivantes Social issues are: Les problématiques sociales renseignées sont les suivantes
See it online: Visualisez le parcours en ligne See it online: Visualisez le parcours en ligne
Person locating period has moved: La personne qui localise un parcours a déménagé Person locating period has moved: L'usager qui localise un parcours a déménagé
You are getting a notification for a period which does not exists any more: Cette notification ne correspond pas à une période d'accompagnement valide. You are getting a notification for a period which does not exists any more: Cette notification ne correspond pas à un parcours d'accompagnement valide.
You are getting a notification for a period you are not allowed to see: La notification fait référence à une période d'accompagnement à laquelle vous n'avez pas accès. You are getting a notification for a period you are not allowed to see: La notification fait référence à un parcours d'accompagnement à laquelle vous n'avez pas accès.
This is the minimal period details: Période d'accompagnement n° This is the minimal period details: Parcours d'accompagnement n°
household_composition: household_composition:
No composition yet: Aucune composition familiale renseignée No composition yet: Aucune composition familiale renseignée
@ -1010,7 +1010,7 @@ export:
person: person:
by_household_composition: by_household_composition:
Household composition: Composition du ménage Household composition: Composition du ménage
Group course by household composition: Grouper les personnes par composition familiale Group course by household composition: Grouper les usagers par composition familiale
Calc date: Date de calcul de la composition du ménage Calc date: Date de calcul de la composition du ménage
course: course:
by_referrer: by_referrer:
@ -1054,13 +1054,13 @@ export:
Filtered by person's geographical unit (based on address) computed at %datecalc%, only %units%: Filtré par unité géographique (sur base de l'adresse), calculé le %datecalc%, seulement %units% Filtered by person's geographical unit (based on address) computed at %datecalc%, only %units%: Filtré par unité géographique (sur base de l'adresse), calculé le %datecalc%, seulement %units%
person: person:
by_composition: by_composition:
Filter by household composition: Filtrer les personnes par composition du ménage Filter by household composition: Filtrer les usagers par composition du ménage
Accepted compositions: Composition de ménages Accepted compositions: Composition de ménages
Date calc: Date de calcul Date calc: Date de calcul
'Filtered by composition at %date%: only %compositions%': 'Filtré par composition du ménage, le %date%, seulement %compositions%' 'Filtered by composition at %date%: only %compositions%': 'Filtré par composition du ménage, le %date%, seulement %compositions%'
by_no_composition: by_no_composition:
Filter persons without household composition: Filtrer les personnes sans composition de ménage (ni ménage) Filter persons without household composition: Filtrer les usagers sans composition de ménage (ni ménage)
Persons filtered by no composition at %date%: Uniquement les personnes sans composition de ménage à la date du %date% Persons filtered by no composition at %date%: Uniquement les usagers sans composition de ménage à la date du %date%
Date calc: Date de calcul Date calc: Date de calcul
course: course:
@ -1077,11 +1077,11 @@ export:
'Filtered by creator job: only %jobs%': 'Filtré par métier du créateur: seulement %jobs%' 'Filtered by creator job: only %jobs%': 'Filtré par métier du créateur: seulement %jobs%'
list: list:
person_with_acp: person_with_acp:
List peoples having an accompanying period: Liste des personnes ayant un parcours d'accompagnement List peoples having an accompanying period: Liste des usagers ayant un parcours d'accompagnement
Create a list of people having an accompaying periods, according to various filters.: Génère une liste des personnes ayant un parcours d'accompagnement, selon différents critères liés au parcours ou à l'usager Create a list of people having an accompaying periods, according to various filters.: Génère une liste des usagers ayant un parcours d'accompagnement, selon différents critères liés au parcours ou à l'usager
acp: acp:
List of accompanying periods: Liste de périodes d'accompagnements List of accompanying periods: Liste des parcours d'accompagnements
Generate a list of accompanying periods, filtered on different parameters.: Génère une liste des périodes d'accompagnement, filtrée sur différents paramètres. Generate a list of accompanying periods, filtered on different parameters.: Génère une liste des parcours d'accompagnement, filtrée sur différents paramètres.
Date of calculation for associated elements: Date de calcul des éléments associés Date of calculation for associated elements: Date de calcul des éléments associés
The associated referree, localisation, and other elements will be valid at this date: Les éléments associés, comme la localisation, le référent et d'autres éléments seront valides à cette date The associated referree, localisation, and other elements will be valid at this date: Les éléments associés, comme la localisation, le référent et d'autres éléments seront valides à cette date
id: Identifiant du parcours id: Identifiant du parcours
@ -1108,8 +1108,8 @@ export:
locationPersonId: Identifiant de l'usager auprès duquel le parcours est localisé locationPersonId: Identifiant de l'usager auprès duquel le parcours est localisé
acpaddress_fieldscountry: Pays de l'adresse acpaddress_fieldscountry: Pays de l'adresse
isRequestorPerson: Le demandeur est-il un usager ? isRequestorPerson: Le demandeur est-il un usager ?
requestorPersonId: Identifiant du demandeur personne requestorPersonId: Identifiant du demandeur usager
acprequestorPerson: Nom du demandeur personne acprequestorPerson: Nom du demandeur usager
scopes: Services scopes: Services
socialIssues: Problématiques sociales socialIssues: Problématiques sociales
eval: eval:

View File

@ -10,7 +10,7 @@
'Opening date can not be null': 'La date d''ouverure ne peut être nulle' 'Opening date can not be null': 'La date d''ouverure ne peut être nulle'
'Closing date is not valid': 'La date de fermeture n''est pas valide' 'Closing date is not valid': 'La date de fermeture n''est pas valide'
'Closing date can not be null': 'La date de fermeture ne peut être nulle' 'Closing date can not be null': 'La date de fermeture ne peut être nulle'
The date of closing is before the date of opening: La période de fermeture est avant la période d'ouverture The date of closing is before the date of opening: La date de fermeture est avant la date d'ouverture
The closing date must be later than the date of creation: La date de clôture doit être postérieure à la date de création du parcours The closing date must be later than the date of creation: La date de clôture doit être postérieure à la date de création du parcours
The birthdate must be before %date%: La date de naissance doit être avant le %date% The birthdate must be before %date%: La date de naissance doit être avant le %date%
'Invalid phone number: it should begin with the international prefix starting with "+", hold only digits and be smaller than 20 characters. Ex: +33123456789': 'Numéro de téléphone invalide: il doit commencer par le préfixe international précédé de "+", ne comporter que des chiffres et faire moins de 20 caractères. Ex: +31623456789' 'Invalid phone number: it should begin with the international prefix starting with "+", hold only digits and be smaller than 20 characters. Ex: +33123456789': 'Numéro de téléphone invalide: il doit commencer par le préfixe international précédé de "+", ne comporter que des chiffres et faire moins de 20 caractères. Ex: +31623456789'
@ -47,19 +47,19 @@ household:
max_holder_overflowed: Il ne peut y avoir plus de deux titulaires simultanément. Or, avec cette modification, ce nombre sera dépassé entre le {{ start }} et le {{ end }}. max_holder_overflowed: Il ne peut y avoir plus de deux titulaires simultanément. Or, avec cette modification, ce nombre sera dépassé entre le {{ start }} et le {{ end }}.
household_membership: household_membership:
The end date must be after start date: La date de la fin de l'appartenance doit être postérieure à la date de début. The end date must be after start date: La date de la fin de l'appartenance doit être postérieure à la date de début.
Person with membership covering: Une personne ne peut pas appartenir à deux ménages simultanément. Or, avec cette modification, %person_name% appartiendrait à %nbHousehold% ménages à partir du %from%. Person with membership covering: Un usager ne peut pas appartenir à deux ménages simultanément. Or, avec cette modification, %person_name% appartiendrait à %nbHousehold% ménages à partir du %from%.
# Accompanying period # Accompanying period
'{{ name }} is already associated to this accompanying course.': '{{ name }} est déjà associé à ce parcours.' '{{ name }} is already associated to this accompanying course.': '{{ name }} est déjà associé à ce parcours.'
A course must contains at least one social issue: 'Un parcours doit être associé à au moins une problématique sociale' A course must contains at least one social issue: 'Un parcours doit être associé à au moins une problématique sociale'
A course must be associated to at least one scope: 'Un parcours doit être associé à au moins un service' A course must be associated to at least one scope: 'Un parcours doit être associé à au moins un service'
The social %name% issue cannot be deleted because it is associated with an activity or an action: 'La problématique sociale "%name%" ne peut pas être supprimée car elle est associée à une activité ou une action' The social %name% issue cannot be deleted because it is associated with an activity or an action: 'La problématique sociale "%name%" ne peut pas être supprimée car elle est associée à un échange ou une action'
A confidential parcours must have a referrer: 'Un parcours confidentiel doit avoir un référent' A confidential parcours must have a referrer: 'Un parcours confidentiel doit avoir un référent'
Only the referrer can change the confidentiality of a parcours: 'Seul le référent peut modifier la confidentialité' Only the referrer can change the confidentiality of a parcours: 'Seul le référent peut modifier la confidentialité'
# resource # resource
You must associate at least one entity: Associez un usager, un tiers ou indiquez une description libre You must associate at least one entity: Associez un usager, un tiers ou indiquez une description libre
You cannot associate a resource with the same person: Vous ne pouvez pas ajouter la personne elle-même en tant que ressource. You cannot associate a resource with the same person: Vous ne pouvez pas ajouter l'usager lui-même en tant que ressource.
#location #location
The period must remain located: 'Un parcours doit être localisé' The period must remain located: 'Un parcours doit être localisé'
@ -67,7 +67,10 @@ The person where the course is located must be associated to the course. Change
#relationship #relationship
relationship: relationship:
duplicate: Une relation de filiation existe déjà entre ces 2 personnes duplicate: Une relation de filiation existe déjà entre ces 2 usagers
person_creation: person_creation:
If you want to create an household, an address is required: Pour la création d'un ménage, une adresse est requise If you want to create an household, an address is required: Pour la création d'un ménage, une adresse est requise
accompanying_course_work:
The endDate should be greater or equal than the start date: La date de fin doit être égale ou supérieure à la date de début

View File

@ -8,7 +8,7 @@
'Update the report': 'Modifier le rapport' 'Update the report': 'Modifier le rapport'
'Report list': 'Liste des rapports' 'Report list': 'Liste des rapports'
Details: Détails Details: Détails
Person: Personne Person: Usager
Scope: Cercle Scope: Cercle
Date: Date Date: Date
User: Utilisateur User: Utilisateur
@ -17,7 +17,7 @@ User: Utilisateur
Report data: Données du rapport Report data: Données du rapport
'Report view : %name%': 'Rapport : %name%' 'Report view : %name%': 'Rapport : %name%'
Report: Rapport Report: Rapport
No report registered for this person.: Aucun rapport pour cette personne. No report registered for this person.: Aucun rapport pour cet usager.
#Flash messages #Flash messages
'Success : report created!': "Succès : le rapport a bien été créé !" 'Success : report created!': "Succès : le rapport a bien été créé !"
@ -52,4 +52,4 @@ CHILL_REPORT_LISTS: Liste des rapports
"Report's question": Question du rapport "Report's question": Question du rapport
Filter by report's date: Filtrer par date de rapport Filter by report's date: Filtrer par date de rapport
Report is after this date: Rapports après cette date Report is after this date: Rapports après cette date
Report is before this date: Rapports avant cette date Report is before this date: Rapports avant cette date

View File

@ -14,7 +14,7 @@ Scope: Cercle
"Unit": "" "Unit": ""
Task: Tâche Task: Tâche
Details: Détails Details: Détails
Person: Personne Person: Usager
Date: Date Date: Date
Dates: Dates Dates: Dates
User: Utilisateur User: Utilisateur
@ -49,7 +49,7 @@ User: Utilisateur
"Tasks for {{ name }}": "Tâches pour {{ name }}" "Tasks for {{ name }}": "Tâches pour {{ name }}"
"No description": "Pas de description" "No description": "Pas de description"
"No dates specified": "Dates non spécifiées" "No dates specified": "Dates non spécifiées"
"No one assignee": "Aucune personne assignée" "No one assignee": "Aucune usager assigné"
"Task types": Types de tâches "Task types": Types de tâches
Days: Jour(s) Days: Jour(s)
Weeks: Semaine(s) Weeks: Semaine(s)
@ -59,7 +59,7 @@ Filter the tasks: Filtrer les tâches
Filter: Filtrer Filter: Filtrer
Any user: Tous les utilisateurs Any user: Tous les utilisateurs
Unassigned: Non assigné Unassigned: Non assigné
Associated person: Personne associée Associated person: Usager associé
Default task: Tâche par défaut Default task: Tâche par défaut
Not assigned: Aucun utilisateur assigné Not assigned: Aucun utilisateur assigné
For person: Pour For person: Pour
@ -117,5 +117,5 @@ CHILL_TASK_TASK_DELETE: Supprimer une tâche
CHILL_TASK_TASK_SHOW: Voir une tâche CHILL_TASK_TASK_SHOW: Voir une tâche
CHILL_TASK_TASK_UPDATE: Modifier une tâche CHILL_TASK_TASK_UPDATE: Modifier une tâche
CHILL_TASK_TASK_CREATE_FOR_COURSE: Créer une tâche pour un parcours CHILL_TASK_TASK_CREATE_FOR_COURSE: Créer une tâche pour un parcours
CHILL_TASK_TASK_CREATE_FOR_PERSON: Créer une tâche pour une personne CHILL_TASK_TASK_CREATE_FOR_PERSON: Créer une tâche pour un usager