make familial situations and professionnal situations configurable

This commit is contained in:
Julien Fastré 2019-05-09 14:01:53 +02:00
parent 04506781cd
commit d0dc6b3378
11 changed files with 219 additions and 66 deletions

View File

@ -16,24 +16,63 @@ class ConfigRepository
*/ */
protected $links; protected $links;
public function __construct($links) /**
*
* @var array
*/
protected $professionalSituations;
/**
*
* @var array
*/
protected $familialSituations;
public function __construct($links, $professionnalSituations, $familialSituations)
{ {
$this->links = $links; $this->links = $links;
$this->professionalSituations = $professionnalSituations ?? [];
$this->familialSituations = $familialSituations ?? [];
} }
/** /**
* *
* @return array where keys are the resource'key and label the ressource label * @return array where keys are the link's keys and label the links label
*/ */
public function getLinksLabels() public function getLinksLabels()
{ {
$links = array(); return $this->normalizeConfig($this->links);
}
public function getProfessionalSituationsLabels()
{
return $this->normalizeConfig($this->professionalSituations);
}
public function hasProfessionalSituation(): bool
{
return count($this->professionalSituations) > 0;
}
public function getFamilialSituationsLabels()
{
return $this->normalizeConfig($this->familialSituations);
}
public function hasFamilialSituation(): bool
{
return count($this->familialSituations) > 0;
}
private function normalizeConfig($config)
{
$els = array();
foreach ($this->links as $definition) { foreach ($config as $definition) {
$links[$definition['key']] = $this->normalizeLabel($definition['labels']); $els[$definition['key']] = $this->normalizeLabel($definition['labels']);
} }
return $links; return $els;
} }
private function normalizeLabel($labels) private function normalizeLabel($labels)

View File

@ -24,7 +24,7 @@ class ChillAMLIFamilyMembersExtension extends Extension implements PrependExtens
$configuration = new Configuration(); $configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs); $config = $this->processConfiguration($configuration, $configs);
$this->storeLinksConfig($container, $config); $this->storeConfig($container, $config);
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services/config.yml'); $loader->load('services/config.yml');
@ -35,14 +35,19 @@ class ChillAMLIFamilyMembersExtension extends Extension implements PrependExtens
$loader->load('services/templating.yml'); $loader->load('services/templating.yml');
} }
private function storeLinksConfig(ContainerBuilder $container, array $config) private function storeConfig(ContainerBuilder $container, array $config)
{ {
$container->setParameter('chill_family_members.links', $config['links']); $container->setParameter('chill_family_members.links', $config['links']);
$container->setParameter('chill_family_members.professionnal_situations',
$config['professionnal_situations']);
$container->setParameter('chill_family_members.familial_situations',
$config['familial_situations']);
} }
public function prepend(ContainerBuilder $container) public function prepend(ContainerBuilder $container)
{ {
$this->prependAuthorization($container); $this->prependAuthorization($container);
$this->prependRoutes($container);
} }
protected function prependAuthorization(ContainerBuilder $container) protected function prependAuthorization(ContainerBuilder $container)
@ -54,5 +59,20 @@ class ChillAMLIFamilyMembersExtension extends Extension implements PrependExtens
) )
)); ));
} }
/* (non-PHPdoc)
* @see \Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface::prepend()
*/
public function prependRoutes(ContainerBuilder $container)
{
//add routes for custom bundle
$container->prependExtensionConfig('chill_main', array(
'routing' => array(
'resources' => array(
'@ChillAMLIFamilyMembersBundle/Resources/config/routing.yml'
)
)
));
}
} }

View File

@ -22,23 +22,67 @@ class Configuration implements ConfigurationInterface
$rootNode $rootNode
->children() ->children()
// ressources
->arrayNode('links')->isRequired()->requiresAtLeastOneElement() ->arrayNode('links')->isRequired()->requiresAtLeastOneElement()
->arrayPrototype() ->arrayPrototype()
->children() ->children()
->scalarNode('key')->isRequired()->cannotBeEmpty() ->scalarNode('key')->isRequired()->cannotBeEmpty()
->info('the key stored in database') ->info('the key stored in database')
->example('grandson') ->example('grandson')
->end() ->end()
->arrayNode('labels')->isRequired()->requiresAtLeastOneElement() ->arrayNode('labels')->isRequired()->requiresAtLeastOneElement()
->arrayPrototype() ->arrayPrototype()
->children() ->children()
->scalarNode('lang')->isRequired()->cannotBeEmpty() ->scalarNode('lang')->isRequired()->cannotBeEmpty()
->example('fr') ->example('fr')
->end() ->end()
->scalarNode('label')->isRequired()->cannotBeEmpty() ->scalarNode('label')->isRequired()->cannotBeEmpty()
->example('Petit-fils') ->example('Petit-fils')
->end() ->end()
->end()
->end()
->end()
->end()
->end()
->end()
->arrayNode('professionnal_situations')->isRequired()
->info("the list of professional situations. If empty, the field will not be shown")
->arrayPrototype()
->children()
->scalarNode('key')->isRequired()->cannotBeEmpty()
->info('the key stored in database')
->example('student')
->end()
->arrayNode('labels')->isRequired()->requiresAtLeastOneElement()
->arrayPrototype()
->children()
->scalarNode('lang')->isRequired()->cannotBeEmpty()
->example('fr')
->end()
->scalarNode('label')->isRequired()->cannotBeEmpty()
->example('Étudiant')
->end()
->end()
->end()
->end()
->end()
->end()
->end()
->arrayNode('familial_situations')->isRequired()
->info("the list of familial situations. If empty, the field will not be shown")
->arrayPrototype()
->children()
->scalarNode('key')->isRequired()->cannotBeEmpty()
->info('the key stored in database')
->example('half_time_keeping')
->end()
->arrayNode('labels')->isRequired()->requiresAtLeastOneElement()
->arrayPrototype()
->children()
->scalarNode('lang')->isRequired()->cannotBeEmpty()
->example('fr')
->end()
->scalarNode('label')->isRequired()->cannotBeEmpty()
->example('En garde alternée')
->end() ->end()
->end() ->end()
->end() ->end()

View File

@ -44,9 +44,7 @@ class FamilyMemberType extends AbstractType
*/ */
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$professionnalSituations = \array_flip(AbstractDiagnosticNIAssignment::PROFESSIONNAL_SITUATIONS);
$professionnalSituations["Scolarité"] = 'scolarite';
$builder $builder
->add('lastname', TextType::class, [ ->add('lastname', TextType::class, [
'label' => 'Last name' 'label' => 'Last name'
@ -58,23 +56,35 @@ class FamilyMemberType extends AbstractType
->add('birthdate', ChillDateType::class, [ ->add('birthdate', ChillDateType::class, [
'required' => false 'required' => false
]) ])
->add('professionnalSituation', ChoiceType::class, [
'required' => false,
'choices' => $professionnalSituations
])
->add('link', ChoiceType::class, [ ->add('link', ChoiceType::class, [
'choices' => $this->getLinks(), 'choices' => $this->buildChoices($this->configRepository->getLinksLabels()),
'placeholder' => 'Choose a link', 'placeholder' => 'Choose a link',
'label' => 'Relationship' 'label' => 'Relationship'
]) ])
->add('maritalStatus', Select2MaritalStatusType::class, [ ->add('maritalStatus', Select2MaritalStatusType::class, [
'required' => false 'required' => false
]) ])
->add('familialSituation', ChoiceType::class, [ ;
'label' => 'Familial situation',
'required' => false, if ($this->configRepository->hasProfessionalSituation()) {
'choices' => \array_flip(AbstractFamilyMember::FAMILIAL_SITUATION) $builder
]); ->add('professionnalSituation', ChoiceType::class, [
'required' => false,
'choices' => $this->buildChoices(
$this->configRepository->getProfessionalSituationsLabels()
)
]);
}
if ($this->configRepository->hasProfessionalSituation()) {
$builder
->add('familialSituation', ChoiceType::class, [
'required' => false,
'choices' => $this->buildChoices(
$this->configRepository->getFamilialSituationsLabels()
)
]);
}
if ($options['show_start_date']) { if ($options['show_start_date']) {
$builder $builder
@ -108,17 +118,18 @@ class FamilyMemberType extends AbstractType
; ;
} }
private function getLinks() private function buildChoices($els)
{ {
$links = $this->configRepository $links = $this->configRepository
->getLinksLabels(); ->getLinksLabels();
$choices = [];
// rewrite labels to filter in language // rewrite labels to filter in language
foreach ($links as $key => $labels) { foreach ($els as $key => $labels) {
$links[$key] = $this->translatableStringHelper->localize($labels); $choices[$this->translatableStringHelper->localize($labels)] = $key;
} }
return \array_flip($links); return $choices;
} }
/** /**

View File

@ -2,3 +2,5 @@ services:
Chill\AMLI\FamilyMembersBundle\Config\ConfigRepository: Chill\AMLI\FamilyMembersBundle\Config\ConfigRepository:
arguments: arguments:
$links: '%chill_family_members.links%' $links: '%chill_family_members.links%'
$professionnalSituations: '%chill_family_members.professionnal_situations%'
$familialSituations: '%chill_family_members.familial_situations%'

View File

@ -1,28 +0,0 @@
<?php declare(strict_types=1);
namespace Application\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
/**
* Add `familial_situation` to family members
*/
final class Version20180723133605 extends AbstractMigration
{
public function up(Schema $schema) : void
{
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
$this->addSql('ALTER TABLE chill_amli.associated_family_member ADD familial_situation VARCHAR(200) DEFAULT NULL');
$this->addSql('ALTER TABLE chill_family.family_member ADD familial_situation VARCHAR(200) DEFAULT NULL');
}
public function down(Schema $schema) : void
{
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
$this->addSql('ALTER TABLE chill_family.family_member DROP familial_situation');
$this->addSql('ALTER TABLE chill_amli.associated_family_member DROP familial_situation');
}
}

View File

@ -14,8 +14,12 @@
{{ form_row(form.birthdate) }} {{ form_row(form.birthdate) }}
{{ form_row(form.link) }} {{ form_row(form.link) }}
{{ form_row(form.gender) }} {{ form_row(form.gender) }}
{% if form.familialSituation is defined %}
{{ form_row(form.familialSituation) }} {{ form_row(form.familialSituation) }}
{% endif %}
{% if form.professionnalSituation is defined -%}
{{ form_row(form.professionnalSituation) }} {{ form_row(form.professionnalSituation) }}
{% endif -%}
{{ form_row(form.maritalStatus) }} {{ form_row(form.maritalStatus) }}
{{ form_row(form.startDate) }} {{ form_row(form.startDate) }}
{{ form_row(form.endDate) }} {{ form_row(form.endDate) }}

View File

@ -52,7 +52,7 @@
{% endif %} {% endif %}
</td> </td>
<td> <td>
{{ f.link|family_member_link_display }} {{ f.link|chill_family_member_link_display }}
</td> </td>
<td> <td>
{% if f.endDate is not null %} {% if f.endDate is not null %}

View File

@ -14,8 +14,12 @@
{{ form_row(form.birthdate) }} {{ form_row(form.birthdate) }}
{{ form_row(form.link) }} {{ form_row(form.link) }}
{{ form_row(form.gender) }} {{ form_row(form.gender) }}
{% if form.familialSituation is defined %}
{{ form_row(form.familialSituation) }} {{ form_row(form.familialSituation) }}
{% endif %}
{% if form.professionnalSituation is defined -%}
{{ form_row(form.professionnalSituation) }} {{ form_row(form.professionnalSituation) }}
{% endif -%}
{{ form_row(form.maritalStatus) }} {{ form_row(form.maritalStatus) }}
{{ form_row(form.startDate) }} {{ form_row(form.startDate) }}
{{ form_row(form.endDate) }} {{ form_row(form.endDate) }}

View File

@ -14,7 +14,7 @@
<dd>{{ familyMember.firstName ~ ' ' ~ familyMember.lastName }}</dd> <dd>{{ familyMember.firstName ~ ' ' ~ familyMember.lastName }}</dd>
<dt>{{ 'family membership link'|trans }}</dt> <dt>{{ 'family membership link'|trans }}</dt>
<dd>{{ familyMember.link|family_member_link_display }}</dd> <dd>{{ familyMember.link|chill_family_member_link_display }}</dd>
<dt>{{ 'family membership period'|trans }}</dt> <dt>{{ 'family membership period'|trans }}</dt>
<dd> <dd>
@ -52,14 +52,23 @@
{%- endif -%} {%- endif -%}
</dd> </dd>
{% if chill_family_members_has_professionnal_situation() %}
<dt>{{ 'Professionnal situation'|trans }}</dt> <dt>{{ 'Professionnal situation'|trans }}</dt>
<dd> <dd>
{%- if familyMember.professionnalSituation is not empty -%} {%- if familyMember.professionnalSituation is not empty -%}
{{ familyMember.professionnalSituation }} {{ familyMember.professionnalSituation|chill_family_member_professional_situation_display }}
{%- else -%} {%- else -%}
<span class="chill-no-data-statement">{{ 'Not given'|trans }}</span> <span class="chill-no-data-statement">{{ 'Not given'|trans }}</span>
{%- endif -%} {%- endif -%}
</dd> </dd>
{% endif %}
{% if chill_family_members_has_familial_situation() %}
<dt>{{ 'Familial situation'|trans }}</dt>
<dd>
{{ familyMember.familialSituation|chill_family_member_familial_situation_display|chill_print_or_message('Not given') }}
</dd>
{% endif %}
</dl> </dl>
<ul class="record_actions sticky-form-buttons"> <ul class="record_actions sticky-form-buttons">

View File

@ -7,6 +7,7 @@ namespace Chill\AMLI\FamilyMembersBundle\Templating;
use Twig\Extension\AbstractExtension; use Twig\Extension\AbstractExtension;
use Chill\AMLI\FamilyMembersBundle\Config\ConfigRepository; use Chill\AMLI\FamilyMembersBundle\Config\ConfigRepository;
use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\MainBundle\Templating\TranslatableStringHelper;
use Twig\TwigFunction;
/** /**
* *
@ -39,15 +40,62 @@ class Twig extends AbstractExtension
public function getFilters() public function getFilters()
{ {
return [ return [
new \Twig_Filter('family_member_link_display', [ $this, 'displayLink' ], [ 'is_safe' => [ 'html' ]]) new \Twig_Filter('chill_family_member_link_display', [ $this, 'displayLink' ], [ 'is_safe' => [ 'html' ]]),
new \Twig_Filter('chill_family_member_professional_situation_display', [ $this, 'displayProfessionalSituation' ], [ 'is_safe' => [ 'html' ]]),
new \Twig_Filter('chill_family_member_familial_situation_display', [ $this, 'displayFamilialSituation' ], [ 'is_safe' => [ 'html' ]]),
];
}
public function getFunctions()
{
return [
new TwigFunction('chill_family_members_has_professionnal_situation', [ $this, 'hasProfessionnalSituation' ]),
new TwigFunction('chill_family_members_has_familial_situation', [ $this, 'hasFamilialSituation' ]),
]; ];
} }
public function displayLink($link) public function displayLink($link)
{ {
if (NULL === $link) {
return null;
}
return $this->translatableStringHelper->localize( return $this->translatableStringHelper->localize(
$this->configRepository->getLinksLabels()[$link] $this->configRepository->getLinksLabels()[$link]
); );
} }
public function displayProfessionalSituation($situation)
{
if (NULL === $situation) {
return null;
}
return $this->translatableStringHelper->localize(
$this->configRepository->getProfessionalSituationsLabels()[$situation]
);
}
public function hasProfessionnalSituation()
{
return $this->configRepository->hasProfessionalSituation();
}
public function displayFamilialSituation($situation)
{
if (NULL === $situation) {
return null;
}
return $this->translatableStringHelper->localize(
$this->configRepository->getFamilialSituationsLabels()[$situation]
);
}
public function hasFamilialSituation()
{
return $this->configRepository->hasFamilialSituation();
}
} }