Commit 8aafe4db authored by Antony Le Courtes's avatar Antony Le Courtes
Browse files

Amélioration du contrôle de saisie de date de début et de fin de mission, afin...

Amélioration du contrôle de saisie de date de début et de fin de mission, afin de laisser une marge pour le choix des dates selon l'année universitaire :  la mission doit être saisie sur l'année universitaire où elle se déroule majoritairement
parent 6f531720
Loading
Loading
Loading
Loading
+34 −28
Original line number Diff line number Diff line
@@ -2,12 +2,12 @@

namespace Mission\Form;


use Application\Form\AbstractForm;
use Application\Service\Traits\ContextServiceAwareTrait;
use Laminas\Validator\Between;
use Lieu\Entity\Db\Structure;
use Mission\Entity\Db\Mission;
use Mission\Entity\Db\TypeMission;
use Mission\Validator\DateMissionValidator;
use Paiement\Entity\Db\TauxRemu;
use UnicaenApp\Util;

@@ -50,6 +50,28 @@ class MissionForm extends AbstractForm
            'structure'       => ['type' => \Lieu\Form\Element\Structure::class],
            'tauxRemuMajore'  => ['input' => ['required' => false]],
            'heuresFormation' => ['input' => ['required' => false]],
            'dateDebut'       => [
                'options'    => [
                    'label_attributes' => [
                        'class' => 'form-label',
                    ],
                ],
                'attributes' => [
                    'class' => 'form-control',

                ],
            ],
            'dateFin'         => [
                'options'    => [
                    'label_attributes' => [
                        'class' => 'form-label',
                    ],
                ],
                'attributes' => [
                    'class' => 'form-control',

                ],
            ],
        ]);
        $this->build();

@@ -83,40 +105,24 @@ class MissionForm extends AbstractForm

    public function getInputFilterSpecification()
    {

        $dateDebut = new \DateTime($this->get('dateDebut')->getValue());
        $dateFin   = new \DateTime($this->get('dateFin')->getValue());
        $annee     = $this->getServiceContext()->getAnnee();
        $dateDebut = $annee->getDateDebut()->format('Y-m-d');
        $dateFin   = $annee->getDateFin()->format('Y-m-d');

        return [
            'dateDebut'      => [
                'required'   => true,
                'validators' => [
                    [
                        'name'    => Between::class,
                        'options' => [
                            'min'       => $annee->getDateDebut()->format('Y-m-d'),
                            'max'       => $annee->getDateFin()->format('Y-m-d'),
                            'inclusive' => true,
                            'messages'  => [
                                Between::NOT_BETWEEN => 'La date de début de la mission doit être comprise entre ' . $annee->getDateDebut()->format('d/m/Y') . ' et le ' . $annee->getDateFin()->format('d/m/Y') . ' (Année universitaire)',
                            ],
                        ],
                    ],
                    new DateMissionValidator(['annee'        => $annee,
                                              'dateDebut'    => $dateDebut,
                                              'dateFin'      => $dateFin,
                                              'dateVerifiee' => $dateDebut,
                    ]),
                ],
            ],
            'dateFin'        => [
                'validators' => [
                    [
                        'name'    => Between::class,
                        'options' => [
                            'min'       => $annee->getDateDebut()->format('Y-m-d'),
                            'max'       => $annee->getDateFin()->format('Y-m-d'),
                            'inclusive' => true,
                            'messages'  => [
                                Between::NOT_BETWEEN => 'La date de fin de la mission doit être comprise entre ' . $annee->getDateDebut()->format('d/m/Y') . ' et le ' . $annee->getDateFin()->format('d/m/Y') . ' (Année universitaire)',
                            ],
                        ],
                    ],
                ],
                'required' => true,
            ],
            'tauxRemuMajore' => [
                'required' => false,
+59 −0
Original line number Diff line number Diff line
<?php

namespace Mission\Validator;

use Application\Entity\Db\Annee;
use DateTime;

use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Date;

class DateMissionValidator extends AbstractValidator
{
    const MSG_INVALID = 'msgInvalid';

    protected          $messageTemplates = [
        self::MSG_INVALID => "La mission doit être saisie sur l'année universitaire où elle se déroule majoritairement : les dates de début et de fin de mission renseignées ne sont pas compatibles avec l'année universitaire <strong>%value%</strong>.",
    ];

    protected DateTime $dateDebut;

    protected DateTime $dateFin;

    protected DateTime $dateVerifiee;

    protected Annee    $annee;



    public function __construct($options = null)
    {
        parent::__construct($options);

        $this->dateDebut    = $options['dateDebut'];
        $this->dateFin      = $options['dateFin'];
        $this->annee        = $options['annee'];
        $this->dateVerifiee = $options['dateVerifiee'];
    }



    public function isValid($value, $context = null)
    {


        //On cherche la date médiane de la mission
        $dateDiff    = $this->dateDebut->diff($this->dateFin);
        $interval    = \DateInterval::createFromDateString(floor($dateDiff->days / 2) . ' day');
        $dateMediane = clone $this->dateDebut;
        $dateMediane->add($interval);

        //On vérifie que la date médiane de la mission est bien dans l'année universitaire en cours
        if ($dateMediane >= $this->annee->getDateDebut() && $dateMediane <= $this->annee->getDateFin()) {
            return true;
        }
        $this->error(self::MSG_INVALID, $this->annee->getLibelle());

        return false;
    }
}
 No newline at end of file
+6 −2
Original line number Diff line number Diff line
@@ -7,6 +7,8 @@
 */

echo $this->messenger()->addCurrentMessagesFromFlashMessengerWithNamespace('error');


if ($form->isValide()) {
    echo $this->messenger()->renderMessage("Cette mission est déjà validée. Il n'est possible de ne modifier que son nombre d'heures et sa date de fin.", 'info');
}
@@ -21,10 +23,12 @@ echo $this->formControlGroup($form->get('typeMission'));
echo $this->formControlGroup($form->get('libelleMission'));
echo '<div class="row">';
echo '<div class="col-md-6">';
echo $this->formControlGroup($form->get('dateDebut'));
echo $this->formLabel($form->get('dateDebut'));
echo $this->formElement($form->get('dateDebut'));
echo '</div>';
echo '<div class="col-md-6">';
echo $this->formControlGroup($form->get('dateFin'));
echo $this->formLabel($form->get('dateFin'));
echo $this->formElement($form->get('dateFin'));
echo '</div>';
echo '</div>';