Merge branch 'master' into VSR-issues

This commit is contained in:
2023-01-24 15:36:22 +01:00
201 changed files with 2768 additions and 708 deletions

View File

@@ -13,12 +13,13 @@ namespace Chill\PersonBundle\Controller;
use Chill\MainBundle\CRUD\Controller\ApiController;
use Chill\MainBundle\Entity\Address;
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
use Chill\PersonBundle\Config\ConfigPersonAltNamesHelper;
use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation;
use Chill\PersonBundle\Entity\Person;
use Chill\PersonBundle\Security\Authorization\PersonVoter;
use Chill\PersonBundle\Security\AuthorizedCenterOnPersonCreationInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
@@ -26,16 +27,37 @@ use function in_array;
class PersonApiController extends ApiController
{
private AuthorizationHelper $authorizationHelper;
private AuthorizedCenterOnPersonCreationInterface $authorizedCenterOnPersonCreation;
private ConfigPersonAltNamesHelper $configPersonAltNameHelper;
private bool $showCenters;
public function __construct(
AuthorizationHelper $authorizationHelper,
ConfigPersonAltNamesHelper $configPersonAltNameHelper
AuthorizedCenterOnPersonCreationInterface $authorizedCenterOnPersonCreation,
ConfigPersonAltNamesHelper $configPersonAltNameHelper,
ParameterBagInterface $parameterBag
) {
$this->authorizationHelper = $authorizationHelper;
$this->authorizedCenterOnPersonCreation = $authorizedCenterOnPersonCreation;
$this->configPersonAltNameHelper = $configPersonAltNameHelper;
$this->showCenters = $parameterBag->get('chill_main')['acl']['form_show_centers'];
}
/**
* @Route("/api/1.0/person/creation/authorized-centers",
* name="chill_person_person_creation_authorized_centers"
* )
*/
public function authorizedCentersForCreation(): Response
{
$centers = $this->authorizedCenterOnPersonCreation->getCenters();
return $this->json(
['showCenters' => $this->showCenters, 'centers' => $centers],
Response::HTTP_OK,
[],
['gropus' => ['read']]
);
}
/**

View File

@@ -13,10 +13,25 @@ namespace Chill\PersonBundle\Controller\SocialWork;
use Chill\MainBundle\CRUD\Controller\CRUDController;
use Chill\MainBundle\Pagination\PaginatorInterface;
use LogicException;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
class SocialIssueController extends CRUDController
{
protected function createFormFor(string $action, $entity, ?string $formClass = null, array $formOptions = []): FormInterface
{
if ('new' === $action) {
return parent::createFormFor($action, $entity, $formClass, ['step' => 'create']);
}
if ('edit' === $action) {
return parent::createFormFor($action, $entity, $formClass, ['step' => 'edit']);
}
throw new LogicException('action is not supported: ' . $action);
}
protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator)
{
$query->addOrderBy('e.ordering', 'ASC');

View File

@@ -1567,7 +1567,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI
*
* @return $this
*/
public function setCenter(Center $center): self
public function setCenter(?Center $center): self
{
$modification = new DateTimeImmutable('now');
@@ -1577,7 +1577,11 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI
}
}
$this->centerHistory[] = $new = new PersonCenterHistory($this, $center, $modification);
if (null === $center) {
return $this;
}
$this->centerHistory[] = new PersonCenterHistory($this, $center, $modification);
return $this;
}

View File

@@ -356,7 +356,9 @@ class SocialIssue
{
$this->parent = $parent;
$parent->addChild($this);
if (null !== $parent) {
$parent->addChild($this);
}
return $this;
}

View File

@@ -65,7 +65,7 @@ class AdministrativeLocationAggregator implements AggregatorInterface
return 'Administrative location';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -60,7 +60,7 @@ class ClosingMotiveAggregator implements AggregatorInterface
return 'Closing motive';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -65,7 +65,7 @@ class CreatorJobAggregator implements AggregatorInterface
return 'export.aggregator.course.by_creator_job.Creator\'s job';
}
if (null === $value || null === $j = $this->jobRepository->find($value)) {
if (null === $value || '' === $value || null === $j = $this->jobRepository->find($value)) {
return '';
}

View File

@@ -69,7 +69,7 @@ final class EvaluationAggregator implements AggregatorInterface
return 'Evaluation';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -143,7 +143,7 @@ final class GeographicalUnitStatAggregator implements AggregatorInterface
return 'acp_geog_agg_unitname';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -65,7 +65,7 @@ final class JobAggregator implements AggregatorInterface
return 'Job';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -67,7 +67,7 @@ final class OriginAggregator implements AggregatorInterface
return 'Origin';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -94,7 +94,7 @@ final class ReferrerAggregator implements AggregatorInterface
return 'Referrer';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -101,7 +101,7 @@ class ReferrerScopeAggregator implements AggregatorInterface
return 'export.aggregator.course.by_user_scope.Referrer\'s scope';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -65,11 +65,13 @@ final class ScopeAggregator implements AggregatorInterface
return 'Scope';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}
$s = $this->scopeRepository->find($value);
if (null === $s = $this->scopeRepository->find($value)) {
return '';
}
return $this->translatableStringHelper->localize(
$s->getName()

View File

@@ -66,11 +66,13 @@ final class SocialActionAggregator implements AggregatorInterface
return 'Social action';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}
$sa = $this->actionRepository->find($value);
if (null === $sa = $this->actionRepository->find($value)) {
return '';
}
return $this->actionRender->renderString($sa, []);
};

View File

@@ -66,6 +66,10 @@ final class SocialIssueAggregator implements AggregatorInterface
return 'Social issues';
}
if (null === $value || '' === $value) {
return '';
}
$i = $this->issueRepository->find($value);
return $this->issueRender->renderString($i, []);

View File

@@ -98,6 +98,7 @@ final class StepAggregator implements AggregatorInterface
return 'Step';
case null:
case '':
return '';
default:

View File

@@ -60,7 +60,7 @@ class EvaluationTypeAggregator implements AggregatorInterface
return 'Evaluation type';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -89,7 +89,7 @@ class CompositionAggregator implements AggregatorInterface
return 'Composition';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -105,7 +105,7 @@ class ByHouseholdCompositionAggregator implements AggregatorInterface
return 'export.aggregator.person.by_household_composition.Household composition';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -66,6 +66,7 @@ final class GenderAggregator implements AggregatorInterface
return $this->translator->trans('unknown');
case null:
case '':
return $this->translator->trans('Not given');
case '_header':

View File

@@ -101,7 +101,7 @@ final class HouseholdPositionAggregator implements AggregatorInterface, ExportEl
return 'Household position';
}
if (null === $value) {
if (null === $value || '' === $value) {
return $this->translator->trans('without data');
}

View File

@@ -63,6 +63,10 @@ final class MaritalStatusAggregator implements AggregatorInterface
return 'Marital status';
}
if (null === $value || '' === $value) {
return '';
}
$g = $this->maritalStatusRepository->find($value);
return $this->translatableStringHelper->localize($g->getName());

View File

@@ -85,7 +85,7 @@ final class ActionTypeAggregator implements AggregatorInterface
return 'Social Action Type';
}
if (null === $value || null === $sa = $this->socialActionRepository->find($value)) {
if (null === $value || '' === $value || null === $sa = $this->socialActionRepository->find($value)) {
return '';
}

View File

@@ -63,7 +63,7 @@ final class GoalAggregator implements AggregatorInterface
return 'Goal Type';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -72,7 +72,7 @@ class GoalResultAggregator implements AggregatorInterface
public function getLabels($key, array $values, $data)
{
return function ($value) use ($key): string {
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -65,7 +65,7 @@ final class JobAggregator implements AggregatorInterface
return 'Job';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -65,7 +65,7 @@ final class ReferrerAggregator implements AggregatorInterface
return 'Referrer';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -63,7 +63,7 @@ final class ResultAggregator implements AggregatorInterface
return 'Result Type';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -65,7 +65,7 @@ final class ScopeAggregator implements AggregatorInterface
return 'Scope';
}
if (null === $value) {
if (null === $value || '' === $value) {
return '';
}

View File

@@ -70,11 +70,11 @@ class GeographicalUnitStatFilter implements FilterInterface
LEFT JOIN acp_geog_filter_address.geographicalUnits acp_geog_filter_units
WHERE
(acp_geog_filter_location_history.startDate <= :acp_geog_filter_date AND (
acp_geog_filter_location_history.endDate IS NULL OR acp_geog_filter_location_history.endDate < :acp_geog_filter_date
acp_geog_filter_location_history.endDate IS NULL OR acp_geog_filter_location_history.endDate > :acp_geog_filter_date
))
AND
(acp_geog_filter_address_person_location.validFrom < :acp_geog_filter_date AND (
acp_geog_filter_address_person_location.validTo IS NULL OR acp_geog_filter_address_person_location.validTo < :acp_geog_filter_date
acp_geog_filter_address_person_location.validTo IS NULL OR acp_geog_filter_address_person_location.validTo > :acp_geog_filter_date
))
AND acp_geog_filter_units IN (:acp_geog_filter_units)
AND acp_geog_filter_location_history.period = acp.id

View File

@@ -111,10 +111,10 @@ class GeographicalUnitFilter implements \Chill\MainBundle\Export\FilterInterface
public function describeAction($data, $format = 'string')
{
return [
'exports.by_person.Filtered by person\'s geographical unit (based on address) computed at datecalc, only units',
'export.filter.by_geog_unit.Filtered by person\'s geographical unit (based on address) computed at %datecalc%, only %units%',
[
'datecalc' => $this->rollingDateConverter->convert($data['date_calc'])->format('Y-m-d'),
'units' => implode(
'%datecalc%' => $this->rollingDateConverter->convert($data['date_calc'])->format('Y-m-d'),
'%units%' => implode(
', ',
array_map(
function (SimpleGeographicalUnitDTO $item) {

View File

@@ -36,12 +36,19 @@ class SocialIssueType extends AbstractType
$builder
->add('title', TranslatableStringFormType::class, [
'label' => 'Nom',
])
->add('parent', EntityType::class, [
'class' => SocialIssue::class,
'required' => false,
'choice_label' => fn (SocialIssue $issue): ?string => $this->translatableStringHelper->localize($issue->getTitle()),
])
]);
if ('create' === $options['step']) {
$builder
->add('parent', EntityType::class, [
'class' => SocialIssue::class,
'required' => false,
'choice_label' => fn (SocialIssue $issue): ?string => $this->translatableStringHelper->localize($issue->getTitle()),
'mapped' => 'create' === $options['step'],
]);
}
$builder
->add('ordering', NumberType::class, [
'required' => true,
'scale' => 6,
@@ -55,5 +62,8 @@ class SocialIssueType extends AbstractType
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefault('class', SocialIssue::class);
$resolver->setRequired('step')
->setAllowedValues('step', ['create', 'edit']);
}
}

View File

@@ -144,7 +144,7 @@ class PickPersonType extends AbstractType
}, $this->user->getGroupCenters()->toArray());
} else {
$centers = $this->authorizationHelper
->getReachableCenters($this->user, $options['role']);
->getReachableCenters($this->user, $options['role']->getRole());
}
if (null === $options['centers']) {

View File

@@ -326,7 +326,7 @@ final class AccompanyingPeriodACLAwareRepository implements AccompanyingPeriodAC
$or = $qb->expr()->orX();
foreach ($services as $key => $service) {
$or->add($qb->expr()->isMemberOf('ap.scopes', ':scope_' . $key));
$or->add($qb->expr()->isMemberOf(':scope_' . $key, 'ap.scopes'));
$qb->setParameter('scope_' . $key, $service);
}
$qb->andWhere($or);

View File

@@ -164,7 +164,8 @@ export default {
id: this.accompanyingCourse.id
},
edit: false,
addressId: null
addressId: null,
defaults: window.addaddress
}
if (this.accompanyingCourse.location) {
context['edit'] = true;

View File

@@ -360,7 +360,7 @@ export default {
;
},
buildEditLink(storedObject) {
return `/wopi/edit/${storedObject.uuid}?returnPath=` + encodeURIComponent(
return `/chill/wopi/edit/${storedObject.uuid}?returnPath=` + encodeURIComponent(
window.location.pathname + window.location.search + window.location.hash);
},
submitBeforeGenerate({template}) {

View File

@@ -2,6 +2,8 @@ import { createApp } from 'vue';
import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n';
import { appMessages } from './js/i18n';
import { store } from './store';
import VueToast from 'vue-toast-notification';
import 'vue-toast-notification/dist/theme-sugar.css';
import App from './App.vue';
@@ -12,5 +14,11 @@ const app = createApp({
})
.use(store)
.use(i18n)
.use(VueToast, {
position: "bottom-right",
type: "error",
duration: 5000,
dismissible: true
})
.component('app', App)
.mount('#household_members_editor');

View File

@@ -5,6 +5,7 @@ import { fetchHouseholdByAddressReference } from 'ChillPersonAssets/lib/househol
import { datetimeToISO, dateToISO, ISOToDate } from 'ChillMainAssets/chill/js/date';
const debug = process.env.NODE_ENV !== 'production';
//console.log('AJAJAJA', window.addaddress);
const concerned = window.household_members_editor_data.persons.map(p => {
return {
@@ -115,6 +116,7 @@ const store = createStore({
name: state.household.type,
id: state.household.id
},
defaults: window.addaddress,
suggestions: state.addressesSuggestion
};
} else {
@@ -125,6 +127,7 @@ const store = createStore({
name: state.household.type,
id: state.household.id
},
defaults: window.addaddress,
};
}
},

View File

@@ -1,3 +1,5 @@
import {makeFetch} from 'ChillMainAssets/lib/api/apiMethods';
/*
* GET a person by id
*/
@@ -22,6 +24,8 @@ const getCivilities = () =>
throw Error('Error with request resource response');
});
const getCentersForPersonCreation = () => makeFetch('GET', '/api/1.0/person/creation/authorized-centers', null);
/*
* POST a new person
*/
@@ -59,6 +63,7 @@ const patchPerson = (id, body) => {
};
export {
getCentersForPersonCreation,
getPerson,
getPersonAltNames,
getCivilities,

View File

@@ -87,6 +87,18 @@
<label>{{ $t('person.gender.title') }}</label>
</div>
<div class="form-floating mb-3" v-if="showCenters && config.centers.length > 1">
<select
class="form-select form-select-lg"
id="center"
v-model="center"
>
<option selected disabled>{{ $t('person.center.placeholder') }}</option>
<option v-for="c in config.centers" :value="c" :key="c.id" >{{ c.name }}</option>
</select>
<label>{{ $t('person.center.title') }}</label>
</div>
<div class="form-floating mb-3">
<select
class="form-select form-select-lg"
@@ -166,7 +178,7 @@
</template>
<script>
import { getCivilities, getPerson, getPersonAltNames } from '../../_api/OnTheFly';
import { getCentersForPersonCreation, getCivilities, getPerson, getPersonAltNames } from '../../_api/OnTheFly';
import PersonRenderBox from '../Entity/PersonRenderBox.vue';
import AddAddress from "ChillMainAssets/vuejs/Address/components/AddAddress.vue";
@@ -182,13 +194,18 @@ export default {
return {
person: {
type: 'person',
lastName: '',
firstName: '',
altNames: [],
addressId: null
addressId: null,
center: null,
},
config: {
altNames: [],
civilities: []
civilities: [],
centers: [],
},
showCenters: false, // NOTE: must remains false if the form is not in create mode
showAddressFormValue: false,
addAddress: {
options: {
@@ -201,7 +218,8 @@ export default {
context: {
target: {}, // boilerplate for getting the address id
edit: false,
addressId: null
addressId: null,
defaults: window.addaddress
}
},
errors: []
@@ -254,6 +272,19 @@ export default {
set(value) { this.showAddressFormValue = value; },
get() { return this.showAddressFormValue; }
},
center: {
set(value) {
console.log('will set center', value);
this.person.center = {id: value.id, type: value.type};
},
get() {
const center = this.config.centers.find(c => this.person.center !== null && this.person.center.id === c.id);
console.log('center get', center);
return typeof center === 'undefined' ? null : center;
},
},
genderClass() {
switch (this.person.gender) {
case 'woman':
@@ -295,23 +326,36 @@ export default {
this.config.civilities = civilities.results;
}
});
if (this.action !== 'create') {
this.loadData();
} else {
console.log('show centers', this.showCenters);
getCentersForPersonCreation()
.then(params => {
this.config.centers = params.centers;
this.showCenters = params.showCenters;
console.log('show centers inside', this.showCenters);
if (this.showCenters && this.config.centers.length === 1) {
this.person.center = this.config.centers[0];
}
});
}
},
methods: {
checkErrors(e) {
this.errors = [];
if (!this.person.lastName) {
if (this.person.lastName === "") {
this.errors.push("Le nom ne doit pas être vide.");
}
if (!this.person.firstName) {
if (this.person.firstName === "") {
this.errors.push("Le prénom ne doit pas être vide.");
}
if (!this.person.gender) {
this.errors.push("Le genre doit être renseigné");
}
if (this.showCenters && this.person.center === null) {
this.errors.push("Le centre doit être renseigné");
}
},
loadData() {
getPerson(this.id)

View File

@@ -47,6 +47,10 @@ const personMessages = {
create_address: "Ajouter une adresse",
show_address_form: "Ajouter une adresse pour un usager non suivi et seul dans un ménage",
warning: "Un nouveau ménage va être créé. L'usager sera membre de ce ménage."
},
center: {
placeholder: "Choisissez un centre",
title: "Centre",
}
},
error_only_one_person: "Une seule personne peut être sélectionnée !"

View File

@@ -1,9 +1,5 @@
{% extends "@ChillMain/layoutWithVerticalMenu.html.twig" %}
{% block head_custom %}
<link rel="preload" href="{{ preload(path('chill_api_single_accompanying_course__entity', {'id': accompanyingCourse.id, '_format': 'json' }), {as: 'fetch'}) }}" as="fetch" />
{% endblock %}
{% block top_banner %}
{{ include('@ChillPerson/AccompanyingCourse/banner.html.twig', { title: block('title') }) }}
{% endblock %}

View File

@@ -8,15 +8,19 @@
{% embed '@ChillMain/CRUD/_edit_content.html.twig' %}
{% block crud_content_form_rows %}
{% for f in form %}
{% if f.vars.name == 'parent' %}
{{ form_row(f, { 'attr':{'disabled':'disabled'}}) }}
{% else %}
{{ form_row(f) }}
{% endif %}
{% endfor %}
{{ form_row(form.title) }}
<div class="mb-3 row">
<label class="col-form-label col-sm-4">
{{ 'Parent'|trans }}
</label>
<div class="col-sm-8">
{{ entity.parent|chill_entity_render_box }}
</div>
</div>
{{ form_row(form.ordering) }}
{{ form_row(form.desactivationDate) }}
{% endblock crud_content_form_rows %}
{% block content_form_actions_save_and_show %}{% endblock %}
{% endembed %}
{% endblock admin_content %}
{% endblock admin_content %}

View File

@@ -1,19 +1,16 @@
<div class="flex-table accompanying-course-work">
{% include '@ChillPerson/AccompanyingCourseWork/_item.html.twig' with {
'w': work,
'displayAction': false,
'displayContent': 'short',
'itemBlocClass': 'uniq colored'
} %}
</div>
{% if display_action is defined and display_action == true %}
<ul class="record_actions">
<li>
<a class="btn btn-update"
href="{{ chill_path_add_return_path('chill_person_accompanying_period_work_edit', { 'id': work.id }) }}">
{{ 'Edit'|trans }}
</a>
</li>
</ul>
{% endif %}
{% if work is null %}
<div class="alert alert-warning">
{{ 'workflow.SocialAction deleted'|trans }}
</div>
{% else %}
{% if display_action is defined and display_action == true %}
<ul class="record_actions">
<li>
<a class="btn btn-update"
href="{{ chill_path_add_return_path('chill_person_accompanying_period_work_edit', { 'id': work.id }) }}">
{{ 'Edit'|trans }}
</a>
</li>
</ul>
{% endif %}
{% endif %}

View File

@@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\PersonBundle\Security;
use Chill\MainBundle\Security\Authorization\AuthorizationHelperForCurrentUserInterface;
use Chill\PersonBundle\Security\Authorization\PersonVoter;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class AuthorizedCenterOnPersonCreation implements AuthorizedCenterOnPersonCreationInterface
{
private AuthorizationHelperForCurrentUserInterface $authorizationHelperForCurrentUser;
private bool $showCenters;
public function __construct(AuthorizationHelperForCurrentUserInterface $authorizationHelperForCurrentUser, ParameterBagInterface $parameterBag)
{
$this->authorizationHelperForCurrentUser = $authorizationHelperForCurrentUser;
$this->showCenter = $parameterBag->get('chill_main')['acl']['form_show_centers'];
}
public function getCenters(): array
{
if (!$this->showCenter) {
return [];
}
return $this->authorizationHelperForCurrentUser->getReachableCenters(PersonVoter::CREATE);
}
}

View File

@@ -0,0 +1,22 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\PersonBundle\Security;
use Chill\MainBundle\Entity\Center;
interface AuthorizedCenterOnPersonCreationInterface
{
/**
* @return array|Center[]
*/
public function getCenters(): array;
}

View File

@@ -56,6 +56,10 @@ class AccompanyingPeriodWorkWorkflowHandler implements EntityWorkflowHandlerInte
{
$work = $this->getRelatedEntity($entityWorkflow);
if (null === $work) {
return $this->translator->trans('workflow.SocialAction deleted');
}
return
$this->translator->trans('workflow.Work (n°%w%)', ['%w%' => $entityWorkflow->getRelatedEntityId()])
. ' - ' . $this->translatableStringHelper->localize($work->getSocialAction()->getTitle());

View File

@@ -1937,4 +1937,14 @@ paths:
summary: Return a list of possible altNames that are defined in the config
responses:
200:
description: "OK"
description: "OK"
/1.0/person/creation/authorized-centers:
get:
tags:
- person
- permissions
summary: Return a list of possible centers for person creation
responses:
200:
description: "OK"

View File

@@ -47,9 +47,8 @@ services:
tags: ['controller.service_arguments']
Chill\PersonBundle\Controller\PersonApiController:
arguments:
$authorizationHelper: '@Chill\MainBundle\Security\Authorization\AuthorizationHelper'
$configPersonAltNameHelper: '@Chill\PersonBundle\Config\ConfigPersonAltNamesHelper'
autoconfigure: true
autowire: true
tags: ['controller.service_arguments']
Chill\PersonBundle\Controller\AccompanyingCourseWorkApiController:

View File

@@ -1,4 +1,10 @@
services:
Chill\PersonBundle\Security\:
autoconfigure: true
autowire: true
resource: '../../Security'
chill.person.security.authorization.person:
autowire: true
autoconfigure: true

View File

@@ -970,6 +970,7 @@ Number of periods: Nombre de parcours
workflow:
Doc for evaluation (n°%eval%): Document de l'évaluation n°%eval%
doc for evaluation deleted: Document supprimé dans une évaluation
SocialAction deleted: Action sociale supprimée
period_by_user_list:
Period by user: Parcours d'accompagnement par utilisateur
@@ -1048,6 +1049,8 @@ export:
Max date: Date d'échéance
filter:
by_geog_unit:
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:
by_composition:
Filter by household composition: Filtrer les personnes par composition du ménage

View File

@@ -22,6 +22,8 @@ The lastname cannot be empty: Le nom de famille ne peut pas être vide
The gender must be set: Le genre doit être renseigné
You are not allowed to perform this action: Vous n'avez pas le droit de changer cette valeur.
A center is required: Un centre est requis
#export list
You must select at least one element: Vous devez sélectionner au moins un élément