diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b516137ca75ea8cd3f99b546edaa9e8be8ddbdb..c719912bcf854340aff92b15f83233231674771b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Journal des modifications ========================= +6.0.1 +----- +- [FIX] Module Formation : mauvais éléments de formulaire pour la date et les horaires, empêchant de créer/modifier une séance. +- [FIX] Module StepStar : erreur dans l'extraction du mail du doctorant. + 6.0.0 ----- - Passage à PHP 8.0 diff --git a/bin/run-envoi-step-star.sh b/bin/run-envoi-step-star.sh index 6bc85107a9e94ea1ee21974c8aaf9c44007452cd..c5312939ef54749e1f2e6f8a7075a6cf9daa1e0f 100755 --- a/bin/run-envoi-step-star.sh +++ b/bin/run-envoi-step-star.sh @@ -39,5 +39,12 @@ fi echo TAG="cron-${ETAB}-$(date +%Y%m%d_%H%M%S)" + +echo "> Envoi des theses ${ETAB} soutenues depuis moins d'un mois..." /usr/bin/php ${APP_DIR}/public/index.php step-star:envoyer-theses --etat S --etablissement ${ETAB} --tag ${TAG} --date-soutenance-min P1M +echo +echo +echo "> Envoi des theses ${ETAB} en cours..." /usr/bin/php ${APP_DIR}/public/index.php step-star:envoyer-theses --etat E --etablissement ${ETAB} --tag ${TAG} +echo + diff --git a/module/Formation/src/Formation/Form/Seance/SeanceForm.php b/module/Formation/src/Formation/Form/Seance/SeanceForm.php index c3f5da6b06bdeedc24729f57d638f2ef30346cbd..625554644c38eb04b3b6f379ae23d4a45ee05ac9 100644 --- a/module/Formation/src/Formation/Form/Seance/SeanceForm.php +++ b/module/Formation/src/Formation/Form/Seance/SeanceForm.php @@ -3,9 +3,10 @@ namespace Formation\Form\Seance; use Laminas\Form\Element\Button; -use Laminas\Form\Element\DateTime; +use Laminas\Form\Element\Date; use Laminas\Form\Element\Text; use Laminas\Form\Element\Textarea; +use Laminas\Form\Element\Time; use Laminas\Form\Form; use Laminas\InputFilter\Factory; @@ -16,14 +17,14 @@ class SeanceForm extends Form { //jour $this->add([ 'name' => 'date', - 'type' => DateTime::class, + 'type' => Date::class, 'options' => [ 'label' => "Date de la séance de formation <span class='icon icon-star' style='color: darkred;' title='Obligatoire'></span> :", 'label_options' => [ 'disable_html_escape' => true, ], 'label_attributes' => [ 'class' => 'control-label', ], - 'format' => 'd/m/Y', + 'format' => 'Y-m-d', ], 'attributes' => [ 'id' => 'date', @@ -33,7 +34,7 @@ class SeanceForm extends Form { //debut $this->add([ 'name' => 'debut', - 'type' => DateTime::class, + 'type' => Time::class, 'options' => [ 'label' => "Début de la séance <span class='icon icon-star' style='color: darkred;' title='Obligatoire'></span> :", 'label_options' => [ 'disable_html_escape' => true, ], @@ -50,7 +51,7 @@ class SeanceForm extends Form { //fin $this->add([ 'name' => 'fin', - 'type' => DateTime::class, + 'type' => Time::class, 'options' => [ 'label' => "Fin de la séance <span class='icon icon-star' style='color: darkred;' title='Obligatoire'></span> :", 'label_options' => [ 'disable_html_escape' => true, ], diff --git a/module/Formation/src/Formation/Form/Seance/SeanceHydrator.php b/module/Formation/src/Formation/Form/Seance/SeanceHydrator.php index c6839a6879c368e7de7f8c18abcc17d60a5a1271..c631a4eec61a64e1756b36cda8f2643a6678f87b 100644 --- a/module/Formation/src/Formation/Form/Seance/SeanceHydrator.php +++ b/module/Formation/src/Formation/Form/Seance/SeanceHydrator.php @@ -4,9 +4,15 @@ namespace Formation\Form\Seance; use DateTime; use Formation\Entity\Db\Seance; -use Laminas\Hydrator\HydratorInterface; +use Laminas\Hydrator\AbstractHydrator; +use Laminas\Hydrator\Strategy\DateTimeFormatterStrategy; -class SeanceHydrator implements HydratorInterface { +class SeanceHydrator extends AbstractHydrator +{ + public function __construct() + { + $this->addStrategy('date', new DateTimeFormatterStrategy('Y-m-d')); + } /** * @param Seance $object @@ -14,14 +20,13 @@ class SeanceHydrator implements HydratorInterface { */ public function extract($object): array { - $data = [ - 'date' => ($object->getDebut() !== null)?$object->getDebut()->format('d/m/Y'):null, + return [ + 'date' => ($object->getDebut() !== null)?$this->getStrategy('date')->extract($object->getDebut()):null, 'debut' => ($object->getDebut() !== null)?$object->getDebut()->format('H:i'):null, 'fin' => ($object->getFin() !== null)?$object->getFin()->format('H:i'):null, 'lieu' => ($object->getLieu() !== null)?$object->getLieu():null, 'description' => ($object->getDescription() !== null)?$object->getDescription():null, ]; - return $data; } /** @@ -37,13 +42,14 @@ class SeanceHydrator implements HydratorInterface { $lieu = (isset($data['lieu']) AND trim($data['lieu']) !== '')?trim($data['lieu']):null; $description = (isset($data['description']) AND trim($data['description']) !== '')?trim($data['description']):null; - $date_debut = ($date AND $debut)? DateTime::createFromFormat('d/m/Y H:i', $date .' '.$debut):null; - $date_fin = ($date AND $debut)? DateTime::createFromFormat('d/m/Y H:i', $date .' '.$fin):null; + $date_debut = ($date AND $debut)? DateTime::createFromFormat('Y-m-d H:i', $date .' '.$debut):null; + $date_fin = ($date AND $debut)? DateTime::createFromFormat('Y-m-d H:i', $date .' '.$fin):null; $object->setDebut($date_debut); $object->setFin($date_fin); $object->setLieu($lieu); $object->setDescription($description); + return $object; } diff --git a/module/Soutenance/src/Soutenance/Controller/PropositionController.php b/module/Soutenance/src/Soutenance/Controller/PropositionController.php index 2ef30656dc452faaa08db2a52623820f8d29806c..f279b438662ec3ccb4a8a0e44fa2c5291159f220 100644 --- a/module/Soutenance/src/Soutenance/Controller/PropositionController.php +++ b/module/Soutenance/src/Soutenance/Controller/PropositionController.php @@ -246,10 +246,14 @@ class PropositionController extends AbstractController $request = $this->getRequest(); if ($request->isPost()) { - $this->update($request, $form, $proposition); - $this->getHorodatageService()->addHorodatage($proposition, HorodatageService::TYPE_MODIFICATION, "Date et lieu"); - $this->getPropositionService()->initialisationDateRetour($proposition); - if (!$this->isAllowed($these, PropositionPrivileges::PROPOSITION_MODIFIER_GESTION)) $this->getPropositionService()->annulerValidationsForProposition($proposition); + $data = $request->getPost(); + $form->setData($data); + if ($form->isValid()) { + $this->update($request, $form, $proposition); + $this->getHorodatageService()->addHorodatage($proposition, HorodatageService::TYPE_MODIFICATION, "Date et lieu"); + $this->getPropositionService()->initialisationDateRetour($proposition); + if (!$this->isAllowed($these, PropositionPrivileges::PROPOSITION_MODIFIER_GESTION)) $this->getPropositionService()->annulerValidationsForProposition($proposition); + } } $vm = new ViewModel(); diff --git a/module/Soutenance/src/Soutenance/Form/DateLieu/DateLieuForm.php b/module/Soutenance/src/Soutenance/Form/DateLieu/DateLieuForm.php index cdff9e5313d9c8737188b9e2c5cc193eda49018f..0e694d0d6297b06e73493c7b628b0216d76de0f0 100644 --- a/module/Soutenance/src/Soutenance/Form/DateLieu/DateLieuForm.php +++ b/module/Soutenance/src/Soutenance/Form/DateLieu/DateLieuForm.php @@ -3,7 +3,7 @@ namespace Soutenance\Form\DateLieu; use Laminas\Form\Element\Button; -use Laminas\Form\Element\DateTime; +use Laminas\Form\Element\Date; use Laminas\Form\Element\Time; use Laminas\Form\Element\Radio; use Laminas\Form\Element\Text; @@ -16,13 +16,12 @@ class DateLieuForm extends Form { public function init() { - $this->add([ 'name' => 'date', - 'type' => DateTime::class, + 'type' => Date::class, 'options' => [ 'label' => 'Date de la soutenance : ', - 'format' => 'd/m/Y', + 'format' => 'Y-m-d', ], 'attributes' => [ //'min' => $twomonth->format('Y-m-d'), @@ -84,7 +83,7 @@ class DateLieuForm extends Form { Callback::INVALID_VALUE => "La date de soutenance est dans le passé ! ", ], 'callback' => function ($value) { - $sdate = DDateTime::createFromFormat('d/m/Y', $value); + $sdate = DDateTime::createFromFormat('Y-m-d', $value); $cdate = new DDateTime(); $res = $sdate >= $cdate; return $res; diff --git a/module/Soutenance/src/Soutenance/Form/DateLieu/DateLieuHydrator.php b/module/Soutenance/src/Soutenance/Form/DateLieu/DateLieuHydrator.php index 8516e687fd9c1db85415741f25dbbd7e3412c832..cf6753a1e84350080b014efc50ca0bc05ffdcfb9 100644 --- a/module/Soutenance/src/Soutenance/Form/DateLieu/DateLieuHydrator.php +++ b/module/Soutenance/src/Soutenance/Form/DateLieu/DateLieuHydrator.php @@ -15,7 +15,7 @@ class DateLieuHydrator implements HydratorInterface */ public function hydrate(array $data, $proposition) { - $date = DateTime::createFromFormat("d/m/Y H:i", $data['date'].' '.$data['heure']); + $date = DateTime::createFromFormat("Y-m-d H:i", $data['date'].' '.$data['heure']); $proposition->setDate($date); $proposition->setLieu($data['lieu']); $proposition->setExterieur($data['exterieur']); @@ -34,7 +34,7 @@ class DateLieuHydrator implements HydratorInterface $date = ''; $heure = ''; if ($datetime) { - $date = $datetime->format("d/m/Y"); + $date = $datetime->format("Y-m-d"); $heure = $datetime->format("H:i"); } diff --git a/module/Soutenance/view/soutenance/proposition/partial/validations-acteurs.phtml b/module/Soutenance/view/soutenance/proposition/partial/validations-acteurs.phtml index 4e1e51508a9df91d1a8b22969251a50b7e617910..c3daf0cc007e7250e83d54b8ff68d923359b89f7 100644 --- a/module/Soutenance/view/soutenance/proposition/partial/validations-acteurs.phtml +++ b/module/Soutenance/view/soutenance/proposition/partial/validations-acteurs.phtml @@ -34,8 +34,8 @@ $hasDeclaration= !empty($validations[TypeValidation::CODE_VALIDATION_DECLARATION $hasAttestation = !empty($attestationsIntegriteScientifique); $hasSursis = $proposition->hasSursis(); -$isDateOk = ((new DateTime())->add(new DateInterval('P2M')) < $proposition->getDate() OR $hasSursis); -$isAllOk = ($hasDeclaration AND $hasAttestation AND $isDateOk AND $isInformationsOk) +$isDateOk = (new DateTime())->add(new DateInterval('P2M')) < $proposition->getDate() || $hasSursis; +$isAllOk = $hasDeclaration && $hasAttestation && $isDateOk && $isInformationsOk; ?> <div class="box card"> diff --git a/module/StepStar/src/StepStar/Controller/Envoi/EnvoiConsoleController.php b/module/StepStar/src/StepStar/Controller/Envoi/EnvoiConsoleController.php index 3b73e6be89776fa0976760e3615ce3228ed5d729..6ccb7e2ce255800334e470e570c9a1e816640851 100644 --- a/module/StepStar/src/StepStar/Controller/Envoi/EnvoiConsoleController.php +++ b/module/StepStar/src/StepStar/Controller/Envoi/EnvoiConsoleController.php @@ -31,7 +31,8 @@ class EnvoiConsoleController extends AbstractConsoleController $theses = $this->fetchService->fetchThesesByCriteria($criteria); if (empty($theses)) { - throw new InvalidArgumentException("Aucune these trouvee avec les criteres specifies"); + $this->console->write("Aucune these trouvee avec les criteres specifies."); + exit(0); } $this->envoiFacade->setSaveLogs(true); @@ -39,6 +40,7 @@ class EnvoiConsoleController extends AbstractConsoleController /** @var \StepStar\Entity\Db\Log $log */ foreach ($logs as $log) { + $this->console->write("These " . $log->getTheseId()); $this->console->write($log->getLog()); } } diff --git a/module/StepStar/src/StepStar/Service/Fetch/FetchService.php b/module/StepStar/src/StepStar/Service/Fetch/FetchService.php index 6840b9d2cc2c0ad1e4b94713e997105fb6c0aafc..1680f44a1f51edbe4c66839446394436128c586f 100644 --- a/module/StepStar/src/StepStar/Service/Fetch/FetchService.php +++ b/module/StepStar/src/StepStar/Service/Fetch/FetchService.php @@ -100,7 +100,7 @@ class FetchService { $qb = $this->theseService->getRepository()->createQueryBuilder('t'); $qb - ->addSelect('e, d, di, dip, ed, ur, f, orf, m, rdv, mel, es, eds, urs, a, ai, r') + ->addSelect('e, d, di, dip, dimc, ed, ur, f, orf, m, rdv, mel, es, eds, urs, a, ai, r') ->join('t.etablissement', 'e') ->join('t.doctorant', 'd') ->join('d.individu', 'di') diff --git a/module/StepStar/src/StepStar/Service/Xml/XmlService.php b/module/StepStar/src/StepStar/Service/Xml/XmlService.php index 3aff6bda30a6b835fe6b3685bbc349639c70e6b9..5c6e1b669a56ce854c088a210f6e1173c0f4d630 100644 --- a/module/StepStar/src/StepStar/Service/Xml/XmlService.php +++ b/module/StepStar/src/StepStar/Service/Xml/XmlService.php @@ -387,7 +387,7 @@ class XmlService $contratDoctoral = $this->extractContratDoctoralFromThese($these) ? 'oui' : 'non'; $conventionCifre = $this->extractConventionCifreFromThese($these) ? 'oui' : 'non'; - $metadonnees = current($these['metadonnees']) ?: null; + $metadonnees = current($these['metadonnees']) ?: []; $dateFinConfidentialite = $these['dateFinConfidentialite'] ?? null; $dateDebutConfidentialite = null; @@ -451,9 +451,9 @@ class XmlService // self::NNT => '2013FOR31234', // métadonnées - self::TITRE => $metadonnees['titre'] ?: $these['titre'], + self::TITRE => $metadonnees['titre'] ?? $these['titre'], self::TITRE_LANGUE => $langue = $metadonnees['langue'] ?? 'fr', - self::TITRE_TRADUIT => $metadonnees['titreAutreLangue'], + self::TITRE_TRADUIT => $metadonnees['titreAutreLangue'] ?? null, self::TITRE_TRADUIT_LANGUE => $langue === 'fr' ? 'en' : 'fr', self::RESUME_FRANCAIS => $this->sanitizeXML($metadonnees['resume'] ?? ''), self::RESUME_ANGLAIS => $this->sanitizeXML($metadonnees['resumeAnglais'] ?? ''), @@ -645,7 +645,7 @@ class XmlService private function extractEmailPersoFromThese(array $these): ?string { - foreach ((array) $these['mailsConfirmations'] as $mailConfirmation) { + foreach ((array) $these['doctorant']['individu']['mailsConfirmations'] as $mailConfirmation) { if ($mailConfirmation['etat'] === MailConfirmation::CONFIRME) { return $mailConfirmation['email']; }