diff --git a/VERSIONS_HOTLINE/207656 b/VERSIONS_HOTLINE/207656 new file mode 100644 index 0000000000000000000000000000000000000000..8be3d10352796fe7cde3ec327343e82a41139114 --- /dev/null +++ b/VERSIONS_HOTLINE/207656 @@ -0,0 +1 @@ + - correctif #207656 : Activités : correction de la getion des quotas en mode file d'attente \ No newline at end of file diff --git a/application/modules/admin/views/scripts/session-activity-inscription/subscribe.phtml b/application/modules/admin/views/scripts/session-activity-inscription/subscribe.phtml index 94470b899a6aabcc96b0bacccb19807cc1145910..ab892d434fa86b6f41a734ef9a2f67d769741c83 100644 --- a/application/modules/admin/views/scripts/session-activity-inscription/subscribe.phtml +++ b/application/modules/admin/views/scripts/session-activity-inscription/subscribe.phtml @@ -1,6 +1,9 @@ <?php +if ($error = $this->error) + echo $this->tagError($error); + if (!$this->isPopup()) echo $this->partial('activity/_activity_panel.phtml', - ['activity' => $this->inscription->getActivity()]); + ['activity' => $this->inscription?->getActivity()]); echo $this->renderForm($this->form); diff --git a/library/Class/SessionActivity.php b/library/Class/SessionActivity.php index bd697a3364a821c287caf36e355f2e470c57644c..45bb8af0082ab3eea05c09b190b1969c90e42cfb 100644 --- a/library/Class/SessionActivity.php +++ b/library/Class/SessionActivity.php @@ -763,6 +763,13 @@ class Class_SessionActivity extends Storm_Model_Abstract { } + public function acceptAttendeesOnlyInQueue(): bool + { + return $this->getQueueAttendees() + && ($this->getTotalRegistered() >= $this->getEffectifTotalMax()); + } + + public function isFullAdults() { return $this->_getAttendees()->isFullAdults(); } diff --git a/library/Class/SessionActivityAttendees.php b/library/Class/SessionActivityAttendees.php index ddf6049ad08151ecef188601e6958cf4cdb7da1a..d36436d63badee00ca6f76b2194a335d3ee3fc01 100644 --- a/library/Class/SessionActivityAttendees.php +++ b/library/Class/SessionActivityAttendees.php @@ -353,6 +353,9 @@ class Class_SessionActivityAttendeesWithQueueAndQuotas extends Class_SessionActi protected bool $_session_with_quotas = true; + /** + * @warning this method check if there is unlimited quota + */ public function isFull() : bool { return $this->isFullAdults() && $this->isFullChildren(); } diff --git a/library/Class/SessionActivityInscription.php b/library/Class/SessionActivityInscription.php index d58729de0c6841d8aee3acc8b9dcafeb12b152d3..06451f2a0dd7b0f22116901f7957ce41b702211f 100644 --- a/library/Class/SessionActivityInscription.php +++ b/library/Class/SessionActivityInscription.php @@ -298,7 +298,7 @@ class Class_SessionActivityInscription extends Storm_Model_Abstract if ( $max < $current) $this->checkAttribute('adults', false, - $this->_('Le nombre maximum d\'adultes pour cette activité est atteint. Il ne doit pas dépasser %d adultes. %s', + $this->_('Le nombre maximum d\'adultes pour cette activité est atteint. Il ne doit pas dépasser %d adulte(s). %s', $max, $plural)); @@ -322,7 +322,7 @@ class Class_SessionActivityInscription extends Storm_Model_Abstract if ( $max < $current) $this->checkAttribute('children', false, - $this->_('Le nombre maximum d\'enfants pour cette activité est atteint. Il ne doit pas dépasser %d enfants. %s', + $this->_('Le nombre maximum d\'enfants pour cette activité est atteint. Il ne doit pas dépasser %d enfant(s). %s', $max, $plural)); @@ -338,6 +338,7 @@ class Class_SessionActivityInscription extends Storm_Model_Abstract $this->setQueue(0); return $this + ->_checkRemainingQueue() ->_checkRemainingAdultsQueue() ->_checkRemainingChildrenQueue(); } @@ -389,6 +390,20 @@ class Class_SessionActivityInscription extends Storm_Model_Abstract } + protected function _checkRemainingQueue(): self + { + if ( !$max = $this->getEffectifTotalMax()) + return $this; + + $current_with_new = $this->numberOfAdults() + $this->numberOfChildren(); + + if ($current_with_new > $max) + $this->setQueue(1); + + return $this; + } + + protected function _checkAttributeTotal() : bool { $remaining = (int) ($this->isNew() ? $this->getSessionActivity()->getNextTotalFor($this) diff --git a/library/ZendAfi/Controller/Plugin/Manager/AbonneSessionActivity.php b/library/ZendAfi/Controller/Plugin/Manager/AbonneSessionActivity.php index 357f6fe541f1964848b9b5619e623278a9248853..b7b060f81edf0de6b2167dda715b0e11227c910d 100644 --- a/library/ZendAfi/Controller/Plugin/Manager/AbonneSessionActivity.php +++ b/library/ZendAfi/Controller/Plugin/Manager/AbonneSessionActivity.php @@ -130,10 +130,20 @@ class ZendAfi_Controller_Plugin_Manager_AbonneSessionActivity } + protected function _getStatusInQueueMessage($model): string + { + return $this->_('Votre inscription à l\'activité %s du %s est enregistrée. Vous avez été placé.e sur liste d\'attente et serez notifié.e si une place se libère.', + $model->getLibelleActivity(), + $model->getDateDebutTexte()); + } + + protected function _getSuccessfulSaveMessage($model) { - return $this->_('Modification de votre inscription à la session du %s de l\'activité %s réussie', - $model->getDateDebutTexte(), - $model->getLibelleActivity()); + return $model->isQueue() + ? $this->_getStatusInQueueMessage($model) + : $this->_('Modification de votre inscription à la session du %s de l\'activité %s réussie', + $model->getDateDebutTexte(), + $model->getLibelleActivity()); } @@ -180,10 +190,8 @@ class ZendAfi_Controller_Plugin_Manager_AbonneSessionActivity protected function _getSuccessfulAddMessage($model) { - return ($model->hasQueue()) - ? $this->_('Vous êtes sur la liste d\'attente pour la session du %s de l\'activité %s.', - $model->getDateDebutTexte(), - $model->getLibelleActivity()) + return ($model->isQueue()) + ? $this->_getStatusInQueueMessage($model) : $this->_('Vous êtes inscrit à la session du %s de l\'activité %s.', $model->getDateDebutTexte(), $model->getLibelleActivity()); diff --git a/library/ZendAfi/Controller/Plugin/Manager/SessionActivityInscriptionBasic.php b/library/ZendAfi/Controller/Plugin/Manager/SessionActivityInscriptionBasic.php index b748abf037fde34a5ce245b270d3776d92b6db2a..2648c142736526ac9576a9b6a3c33f84c89250e3 100644 --- a/library/ZendAfi/Controller/Plugin/Manager/SessionActivityInscriptionBasic.php +++ b/library/ZendAfi/Controller/Plugin/Manager/SessionActivityInscriptionBasic.php @@ -110,9 +110,6 @@ class ZendAfi_Controller_Plugin_Manager_SessionActivityInscriptionBasic protected function _doAfterAdd($model) { - if (!$model->isQueue()) - $this->_notifyRegistration($this->_user); - if (!$this->_view->isPopup()) $this->_redirectToUrlOrReferer($this->_redirect_default_url); } @@ -161,7 +158,8 @@ class ZendAfi_Controller_Plugin_Manager_SessionActivityInscriptionBasic protected function _doOnCannotAdd() { - return $this->_redirectToReferer(); + $this->_view->error = $this->_add_message; + return false; } diff --git a/library/ZendAfi/Form/SessionActivityInscription.php b/library/ZendAfi/Form/SessionActivityInscription.php index 67ea7011c0c80134a962a01128d9f36ad31c706c..9d3ccd39c4f1f6977443f7bdb5a5715c3ceba67f 100644 --- a/library/ZendAfi/Form/SessionActivityInscription.php +++ b/library/ZendAfi/Form/SessionActivityInscription.php @@ -29,6 +29,7 @@ class ZendAfi_Form_SessionActivityInscription extends ZendAfi_Form { $this ->addElement('info', 'totalmax_info') + ->addElement('info', 'queue_info') ->addElement('number', 'adults', ['label' => $this->_('Nombre d\'adultes'), 'value' => 0, @@ -63,6 +64,10 @@ class ZendAfi_Form_SessionActivityInscription extends ZendAfi_Form { ->setValue($this->_('Nombre total de participants: %s/%s', $session->getTotalRegistered(), $total)); + if ( !$session->hasStagiaire(Class_Users::getIdentity()) && $session->acceptAttendeesOnlyInQueue()) + $this->getElement('queue_info') + ->setValue($this->_('Vous serez placé.e en liste d\'attente')); + return $this; } diff --git a/library/ZendAfi/View/Helper/Template/TruncateList.php b/library/ZendAfi/View/Helper/Template/TruncateList.php index 60b0fca92d838c5fc73c6a2897468c9e0f138a35..6066dc18ddd7e0d1443240dc1087b7820467b577 100644 --- a/library/ZendAfi/View/Helper/Template/TruncateList.php +++ b/library/ZendAfi/View/Helper/Template/TruncateList.php @@ -29,6 +29,7 @@ class ZendAfi_View_Helper_Template_TruncateList $_min_size_for_tools = 5, $_page_size = 3, $_container_id, + $_module_id, $_widget_id, $_top_tools_id, $_bottom_tools_id; @@ -51,12 +52,15 @@ class ZendAfi_View_Helper_Template_TruncateList } - protected function _truncateListWithTools($collection, $callback, $size) { - $this->_container_id = uniqid(); - $this->_widget_id = 'truncate_list_widget_id_' . $this->_container_id; - $this->_top_tools_id = 'top_tools_' . $this->_container_id; - $this->_bottom_tools_id = 'bottom_tools_' . $this->_container_id; + public function setIdModule(string $id): self + { + $this->_module_id = $id; + return $this; + } + + protected function _truncateListWithTools($collection, $callback, $size) { + $this->_initIds(); $html = $collection ->injectInto('', fn($html, $element) => $html . $this->_tag('div', $callback($element->inJsSearch()), @@ -82,6 +86,19 @@ class ZendAfi_View_Helper_Template_TruncateList } + protected function _initIds(): self + { + if ( ! $this->_container_id ) + $this->_container_id = $this->_module_id ?: uniqid(); + + $this->_widget_id = 'truncate_list_widget_id_' . $this->_container_id; + $this->_top_tools_id = 'top_tools_' . $this->_container_id; + $this->_bottom_tools_id = 'bottom_tools_' . $this->_container_id; + + return $this; + } + + protected function _renderTools($size, $tools_id) { $multi_options = $this->_getTruncateOptions($size); @@ -120,8 +137,7 @@ class ZendAfi_View_Helper_Template_TruncateList public function renderHeadScriptsOn($script_loader) { - if ( ! $this->_container_id) - return $this; + $this->_initIds(); $script_loader ->addSearchInputToContainer('#' . $this->_container_id, diff --git a/library/templates/Intonation/Library/Widget/Carousel/View.php b/library/templates/Intonation/Library/Widget/Carousel/View.php index df0be027431786477f2a3551748b3ddb1e3e2cc4..001cd45d735fdd4335a01713dd6732b843571c0f 100644 --- a/library/templates/Intonation/Library/Widget/Carousel/View.php +++ b/library/templates/Intonation/Library/Widget/Carousel/View.php @@ -267,7 +267,8 @@ abstract class Intonation_Library_Widget_Carousel_View extends Zendafi_View_Help if (in_array($layout, [Intonation_Library_Widget_Carousel_Definition::MAP, Intonation_Library_Widget_Carousel_Definition::WALL, - Intonation_Library_Widget_Carousel_Definition::GRID])) + Intonation_Library_Widget_Carousel_Definition::GRID, + Intonation_Library_Widget_Carousel_Definition::LISTING_WITH_OPTIONS])) $this->_layout_helper->setIdModule($this->_settings->getIdForHtml()); return $this->_layout_helper; diff --git a/tests/application/modules/AbstractControllerTestCase.php b/tests/application/modules/AbstractControllerTestCase.php index 58af5e5a130d4affe01a07ddb3f08fde18b8d796..90c0b21cffd1572916caa20543887650e6a80917 100644 --- a/tests/application/modules/AbstractControllerTestCase.php +++ b/tests/application/modules/AbstractControllerTestCase.php @@ -462,6 +462,12 @@ abstract class AbstractControllerTestCase extends Zend_Test_PHPUnit_ControllerTe } + public function assertFlashMessengerCount(int $count): void + { + $this->assertCount($count, $this->_getFlashMessengerNotifications()); + } + + public function assertFlashMessengerContentContains(string $value, string $message = ''): void { $messages = $this->_getFlashMessengerNotifications(); diff --git a/tests/application/modules/admin/controllers/SessionActivityInscriptionControllerGetExceededQuotaWithoutQueueTest.php b/tests/application/modules/admin/controllers/SessionActivityInscriptionControllerGetExceededQuotaWithoutQueueTest.php new file mode 100644 index 0000000000000000000000000000000000000000..dd4fa52c4b8035768ca02dab0cf748240ad71cf0 --- /dev/null +++ b/tests/application/modules/admin/controllers/SessionActivityInscriptionControllerGetExceededQuotaWithoutQueueTest.php @@ -0,0 +1,105 @@ +<?php +/** + * Copyright (c) 2012-2024, Agence Française Informatique (AFI). All rights reserved. + * + * BOKEH is free software; you can redistribute it and/or modify + * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by + * the Free Software Foundation. + * + * There are special exceptions to the terms and conditions of the AGPL as it + * is applied to this software (see README file). + * + * BOKEH is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE + * along with BOKEH; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +class SessionActivityInscriptionControllerGetExceededQuotaWithoutQueueTest + extends Admin_AbstractControllerTestCase +{ + public function setUp(): void + { + parent::setUp(); + Class_AdminVar::set('ACTIVITY_SESSION_QUOTAS', 1); + + $group_trainee = $this->fixture(Class_UserGroup::class, + ['id' => 22, + 'libelle' => 'Stagiaires', + 'rights' => [Class_UserGroup::RIGHT_SUIVRE_ACTIVITY]]); + + $this->fixture(Class_Users::class, + ['id' => 1001, + 'nom' => 'Pistache', + 'prenom' => 'Amandine', + 'login' => 'Amd', + 'idabon' => '65251', + 'id_site' => 1, + 'password' => 'fx9k', + 'mail' => 'pist@che.io', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB, + 'user_groups' => [$group_trainee]]); + + $this->fixture(Class_Users::class, + ['id' => 1002, + 'nom' => 'Poincaré', + 'prenom' => 'Raymond', + 'login' => 'rpoincare', + 'idabon' => '65252', + 'id_site' => 1, + 'password' => 'fx9k', + 'mail' => 'rpoincare@che.io', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB, + 'user_groups' => [$group_trainee]]); + + $this->fixture(Class_Activity::class, + ['id' => 330, + 'libelle' => 'Petites histoire']); + + $session = $this->fixture(Class_SessionActivity::class, + ['id' => 320, + 'activity_id' => 330, + 'date_debut' => '2025-03-27', + 'date_fin' => '2025-03-29', + 'effectif_min' => 0, + 'effectif_max' => 1, + 'effectif_child_min' => 0, + 'effectif_child_max' => 1, + 'effectif_total_min' => 0, + 'effectif_total_max' => 2, + 'age_child_max' => 5, + 'effectif_inscription_max' => 1, + 'effectif_inscription_child_max' => 1, + 'duree'=> 8, + 'contenu' => 'Lecture', + 'horaires' => '9h - 12h, 13h - 18h', + 'date_limite_inscription'=>'2025-03-05', + 'queue_attendees' => false]); + + $inscription = $this->fixture(Class_SessionActivityInscription::class, + ['id' => 617, + 'stagiaire_id' => 1001, + 'session_activity_id' => 320, + 'adults' => 1, + 'children' => 1]); + + $session->setSessionActivityInscriptions([$inscription]); + + $this->dispatch('/admin/session-activity-inscription/subscribe/' + . 'id/320/stagiaire_id/1001'); + + } + + + /** @test */ + public function responseShouldContainErrorMessageInscriptionImpossible() + { + $this->assertXPathContentContains('//p[@class="error"]', + 'Inscription impossible, plus de place disponible.'); + } +} diff --git a/tests/application/modules/admin/controllers/SessionActivityInscriptionControllerPostExceedingQuotaWithQueueAndExistingSubscriptionTest.php b/tests/application/modules/admin/controllers/SessionActivityInscriptionControllerPostExceedingQuotaWithQueueAndExistingSubscriptionTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8b2b22664d5495081b545a345311953e02ee3552 --- /dev/null +++ b/tests/application/modules/admin/controllers/SessionActivityInscriptionControllerPostExceedingQuotaWithQueueAndExistingSubscriptionTest.php @@ -0,0 +1,107 @@ +<?php +/** + * Copyright (c) 2012-2024, Agence Française Informatique (AFI). All rights reserved. + * + * BOKEH is free software; you can redistribute it and/or modify + * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by + * the Free Software Foundation. + * + * There are special exceptions to the terms and conditions of the AGPL as it + * is applied to this software (see README file). + * + * BOKEH is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE + * along with BOKEH; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +class SessionActivityInscriptionControllerPostExceedingQuotaWithQueueAndExistingSubscriptionTest + extends Admin_AbstractControllerTestCase +{ + public function setUp(): void + { + parent::setUp(); + + Class_AdminVar::set('ACTIVITY_SESSION_QUOTAS', 1); + + $group_trainee = $this->fixture(Class_UserGroup::class, + ['id' => 22, + 'libelle' => 'Stagiaires', + 'rights' => [Class_UserGroup::RIGHT_SUIVRE_ACTIVITY]]); + + $this->fixture(Class_Users::class, + ['id' => 1002, + 'nom' => 'Poincaré', + 'prenom' => 'Raymond', + 'login' => 'rpoincare', + 'idabon' => '65252', + 'id_site' => 1, + 'password' => 'fx9k', + 'mail' => 'rpoincare@che.io', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB, + 'user_groups' => [$group_trainee]]); + + $this->fixture(Class_Users::class, + ['id' => 1001, + 'nom' => 'Pistache', + 'prenom' => 'Amandine', + 'login' => 'Amd', + 'idabon' => '65251', + 'id_site' => 1, + 'password' => 'fx9k', + 'mail' => 'pist@che.io', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB, + 'user_groups' => [$group_trainee]]); + + $this->fixture(Class_Activity::class, + ['id' => 330, + 'libelle' => 'Petites histoire']); + + $session = $this->fixture(Class_SessionActivity::class, + ['id' => 320, + 'activity_id' => 330, + 'date_debut' => '2025-03-27', + 'date_fin' => '2025-03-29', + 'effectif_min' => 0, + 'effectif_max' => 1, + 'effectif_child_min' => 0, + 'effectif_child_max' => 1, + 'effectif_total_min' => 0, + 'effectif_total_max' => 3, + 'age_child_max' => 5, + 'effectif_inscription_max' => 1, + 'effectif_inscription_child_max' => 1, + 'duree'=> 8, + 'contenu' => 'Lecture', + 'horaires' => '9h - 12h, 13h - 18h', + 'date_limite_inscription'=>'2025-03-05', + 'queue_attendees' => true]); + + $inscription = $this->fixture(Class_SessionActivityInscription::class, + ['id' => 617, + 'stagiaire_id' => 1002, + 'session_activity_id' => 320, + 'adults' => 1, + 'children' => 1]); + + $session->setSessionActivityInscriptions([$inscription]); + + $this->postDispatch('/admin/session-activity-inscription/subscribe/' + . 'id/320/stagiaire_id/1001', + ['adults' => 1, + 'children' => 1]); + } + + /** @test */ + public function additionamSubscribingRequestShouldBePutInQueue() + { + $this->assertTrue(Class_SessionActivityInscription + ::findFirstBy(['session_activity_id' => 320, + 'stagiaire_id' => 1001])->isQueue()); + } +} diff --git a/tests/application/modules/admin/controllers/SessionActivityInscriptionControllerPostExceedingQuotaWithQueueTest.php b/tests/application/modules/admin/controllers/SessionActivityInscriptionControllerPostExceedingQuotaWithQueueTest.php new file mode 100644 index 0000000000000000000000000000000000000000..af95681d25a59e7ad719edebd6a6fde4f093efa0 --- /dev/null +++ b/tests/application/modules/admin/controllers/SessionActivityInscriptionControllerPostExceedingQuotaWithQueueTest.php @@ -0,0 +1,85 @@ +<?php +/** + * Copyright (c) 2012-2024, Agence Française Informatique (AFI). All rights reserved. + * + * BOKEH is free software; you can redistribute it and/or modify + * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by + * the Free Software Foundation. + * + * There are special exceptions to the terms and conditions of the AGPL as it + * is applied to this software (see README file). + * + * BOKEH is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE + * along with BOKEH; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +class SessionActivityInscriptionControllerPostExceedingQuotaWithQueueTest + extends Admin_AbstractControllerTestCase +{ + public function setUp(): void + { + parent::setUp(); + + Class_AdminVar::set('ACTIVITY_SESSION_QUOTAS', 1); + + $group_trainee = $this->fixture(Class_UserGroup::class, + ['id' => 22, + 'libelle' => 'Stagiaires', + 'rights' => [Class_UserGroup::RIGHT_SUIVRE_ACTIVITY]]); + + $this->fixture(Class_Users::class, + ['id' => 1001, + 'nom' => 'Pistache', + 'prenom' => 'Amandine', + 'login' => 'Amd', + 'idabon' => '65251', + 'id_site' => 1, + 'password' => 'fx9k', + 'mail' => 'pist@che.io', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB, + 'user_groups' => [$group_trainee]]); + + $this->fixture(Class_Activity::class, + ['id' => 330, + 'libelle' => 'Petites histoire']); + + $this->fixture(Class_SessionActivity::class, + ['id' => 320, + 'activity_id' => 330, + 'date_debut' => '2025-03-27', + 'date_fin' => '2025-03-29', + 'effectif_min' => 0, + 'effectif_max' => 1, + 'effectif_child_min' => 0, + 'effectif_child_max' => 1, + 'effectif_total_min' => 0, + 'effectif_total_max' => 1, + 'age_child_max' => 5, + 'effectif_inscription_max' => 1, + 'effectif_inscription_child_max' => 1, + 'duree'=> 8, + 'contenu' => 'Lecture', + 'horaires' => '9h - 12h, 13h - 18h', + 'date_limite_inscription'=>'2025-03-05', + 'queue_attendees' => true]); + + $this->postDispatch('/admin/session-activity-inscription/subscribe/' + . 'id/320/stagiaire_id/1001', + ['adults' => 1, + 'children' => 1]); + } + + /** @test */ + public function subscribingRequestShouldBePutInQueue() + { + $this->assertTrue(Class_SessionActivityInscription + ::findFirstBy(['session_activity_id' => 320])->isQueue()); + } +} diff --git a/tests/scenarios/Activities/AbonneControllerWithQuotasTest.php b/tests/scenarios/Activities/AbonneControllerWithQuotasTest.php index 0c0c91ae8d633649306a60b8e69a4f90c5c7b473..e62ea6902cef57cb9fcef1fec9fe15b281606df2 100644 --- a/tests/scenarios/Activities/AbonneControllerWithQuotasTest.php +++ b/tests/scenarios/Activities/AbonneControllerWithQuotasTest.php @@ -731,7 +731,14 @@ class Activities_AbonneControllerWithQuotasRegisterSessionPostTest /** @test */ public function shouldNotifyRegistered() { - $this->assertFlashMessengerContentContains('Vous êtes inscrit'); + $this->assertFlashMessengerContentContains('Vous êtes inscrit à la session du 10 février 2015 de l\'activité Learn Java.'); + } + + + /** @test */ + public function flashMessengerShouldContainOneMessage() + { + $this->assertFlashMessengerCount(1); } } @@ -875,13 +882,13 @@ class Activities_AbonneControllerWithQuotasRegisterSessionMaxQuotasErrosWithTota /** @test */ public function shouldDisplayTooManyAdults() { - $this->assertXPathContentContains('//ul[@class="errors"]', 'Le nombre maximum d\'adultes pour cette activité est atteint. Il ne doit pas dépasser 3 adultes. Il reste 3 places pour les adultes'); + $this->assertXPathContentContains('//ul[@class="errors"]', 'Le nombre maximum d\'adultes pour cette activité est atteint. Il ne doit pas dépasser 3 adulte(s). Il reste 3 places pour les adultes'); } /** @test */ public function shouldDisplayTooManyChildren() { - $this->assertXPathContentContains('//ul[@class="errors"]', 'Le nombre maximum d\'enfants pour cette activité est atteint. Il ne doit pas dépasser 4 enfants. Il reste 4 places pour les enfants.'); + $this->assertXPathContentContains('//ul[@class="errors"]', 'Le nombre maximum d\'enfants pour cette activité est atteint. Il ne doit pas dépasser 4 enfant(s). Il reste 4 places pour les enfants.'); } } @@ -1069,7 +1076,7 @@ class Activities_AbonneControllerWithQuotasRegisterSessionWithNoMoreAdultsPostTe /** @test */ public function pageShouldContainsTooManyChildrenError() { - $this->assertXPathContentContains('//ul[@class="errors"]', 'Le nombre maximum d\'enfants pour cette activité est atteint. Il ne doit pas dépasser 2 enfants. Il reste 1 place pour un enfant.'); + $this->assertXPathContentContains('//ul[@class="errors"]', 'Le nombre maximum d\'enfants pour cette activité est atteint. Il ne doit pas dépasser 2 enfant(s). Il reste 1 place pour un enfant.'); } @@ -1107,7 +1114,7 @@ class Activities_AbonneControllerWithQuotasRegisterSessionWithNoMoreChildrenPost /** @test */ public function pageShouldContainsTooManyAdultsError() { - $this->assertXPathContentContains('//ul[@class="errors"]', 'Le nombre maximum d\'adultes pour cette activité est atteint. Il ne doit pas dépasser 2 adultes. Il reste 1 place pour un adulte.'); + $this->assertXPathContentContains('//ul[@class="errors"]', 'Le nombre maximum d\'adultes pour cette activité est atteint. Il ne doit pas dépasser 2 adulte(s). Il reste 1 place pour un adulte.'); } diff --git a/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasAndQueueExistsTest.php b/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasAndQueueExistsTest.php index 8f7fed64b9b9fbdb1e321ae17e0e76a6ca5e8df5..318f061be9eeabf9aa9ac8ab7f41223bbb2095c6 100644 --- a/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasAndQueueExistsTest.php +++ b/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasAndQueueExistsTest.php @@ -80,7 +80,7 @@ class AbonneInscrireSessionWithQuotasFullAndQueueExistsTest extends AbstractCont /** @test */ public function registrationShouldSuccessWithQueueMessage() { - $this->assertFlashMessengerContentContains('Vous êtes sur la liste d\'attente pour la session du 09 octobre 2024 de l\'activité scythe chap 1.'); + $this->assertFlashMessengerContentContains('Votre inscription à l\'activité scythe chap 1 du 09 octobre 2024 est enregistrée. Vous avez été placé.e sur liste d\'attente et serez notifié.e si une place se libère.'); } diff --git a/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasAndQueueTest.php b/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasAndQueueTest.php index e7ff30e05ae49dc8c1b97f80f8acb03fcbc48a6d..6b6b440ed705676bc14ecf8c870fb3dd68b9767e 100644 --- a/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasAndQueueTest.php +++ b/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasAndQueueTest.php @@ -75,7 +75,7 @@ class AbonneInscrireSessionWithQuotasFullAndQueueTest extends AbstractController /** @test */ public function registrationShouldSuccessWithQueueMessage() { - $this->assertFlashMessengerContentContains('Vous êtes sur la liste d\'attente pour la session du 09 octobre 2024 de l\'activité scythe chap 1.'); + $this->assertFlashMessengerContentContains('Votre inscription à l\'activité scythe chap 1 du 09 octobre 2024 est enregistrée. Vous avez été placé.e sur liste d\'attente et serez notifié.e si une place se libère.'); } diff --git a/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasTest.php b/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasTest.php index 4d0da9f65231db7abd5a49a141b6c0bf104ec594..e92d06918fc2f10de9b93821bcb3fcae7871efa3 100644 --- a/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasTest.php +++ b/tests/scenarios/Activities/AbonneInscrireSessionWithQuotasTest.php @@ -74,7 +74,7 @@ class AbonneInscrireSessionWithQuotasFullTest extends AbstractControllerTestCase /** @test */ public function registrationShouldFailWithFullMessage() { - $this->assertFlashMessengerContentContains('Le nombre maximum d\'adultes pour cette activité est atteint. Il ne doit pas dépasser 2 adultes. Il reste 1 place pour un adulte.'); + $this->assertFlashMessengerContentContains('Le nombre maximum d\'adultes pour cette activité est atteint. Il ne doit pas dépasser 2 adulte(s). Il reste 1 place pour un adulte.'); } diff --git a/tests/scenarios/Activities/ActivitiesWithQueueAbonneTest.php b/tests/scenarios/Activities/ActivitiesWithQueueAbonneTest.php index 8802bbb02452cada4d149f4eaa227abc610d1de2..d8d58bdd8526f35e57a300436c8cae0129b715bd 100644 --- a/tests/scenarios/Activities/ActivitiesWithQueueAbonneTest.php +++ b/tests/scenarios/Activities/ActivitiesWithQueueAbonneTest.php @@ -726,6 +726,18 @@ class ActivitiesWithQueueAbonneWithQuotasFullNotInQueueEditTest } + /** @test */ + public function modifShouldHaveMessageInQueue() + { + ZendAfi_Auth::getInstance()->logUser(Class_Users::find(435)); + $this->postDispatch('/abonne/edit-session/id/159', + ['adults' => 2, + 'children'=>3]); + Class_SessionActivityInscription::clearCache(); + $this->assertFlashMessengerContentContains("Votre inscription à l'activité Learn Java du 27 mai 2021 est enregistrée. Vous avez été placé.e sur liste d'attente et serez notifié.e si une place se libère."); + } + + /** @test */ public function onPostLessAdultsShouldReloadQueue() { $this->postDispatch('/abonne/edit-session/id/234', ['adults' => 2]); @@ -1062,6 +1074,13 @@ class ActivitiesWithQueueAbonneWithMaxQuotasTest } + /** @test */ + public function pageShouldNotContainsQueueInfo() + { + $this->assertNotXPathContentContains('//div', 'Vous serez placé.e en liste d\'attente'); + } + + /** @test */ public function pageShouldContainsNombresAdultes15PlacesRestantes() { $this->assertXPathContentContains('//label[@for="adults"]', @@ -1106,6 +1125,13 @@ class ActivitiesWithQueueAbonneWithMaxQuotasPartiallyRegistredTest } + /** @test */ + public function pageShouldNotContainsQueueInfo() + { + $this->assertNotXPathContentContains('//div', 'Vous serez placé.e en liste d\'attente'); + } + + /** @test */ public function pageShouldContainsNombresAdultes5PlacesRestantes() { $this->assertXPathContentContains('//label[@for="adults"]', @@ -1150,6 +1176,13 @@ class ActivitiesWithQueueAbonneWithMaxQuotasFullRegistredTest } + /** @test */ + public function pageShouldContainsQueueInfo() + { + $this->assertXPathContentContains('//div', 'Vous serez placé.e en liste d\'attente'); + } + + /** @test */ public function pageShouldContainsNombresAdultesComplet() { $this->assertXPathContentContains('//label[@for="adults"]', @@ -1192,7 +1225,10 @@ class ActivitiesWithQueueAbonneWithMaxQuotasFullAttemptRegistringTest /** @test */ public function registrationShouldBePutInQueue() { - $registration = Class_SessionActivityInscription::find(568); + $registration = Class_SessionActivityInscription::findFirstBy(['stagiaire_id' => 435, + 'session_activity_id' => 36, + 'adults' => 10, + 'children' => 10]); $this->assertTrue($registration->isQueue()); } } diff --git a/tests/scenarios/Templates/TemplatesActivitiesWidgetCachedTest.php b/tests/scenarios/Templates/TemplatesActivitiesWidgetCachedTest.php new file mode 100644 index 0000000000000000000000000000000000000000..630a67ecff9ed9c6a1e0a4141a27758eec463120 --- /dev/null +++ b/tests/scenarios/Templates/TemplatesActivitiesWidgetCachedTest.php @@ -0,0 +1,111 @@ +<?php +/** + * Copyright (c) 2012-2024, Agence Française Informatique (AFI). All rights reserved. + * + * BOKEH is free software; you can redistribute it and/or modify + * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by + * the Free Software Foundation. + * + * There are special exceptions to the terms and conditions of the AGPL as it + * is applied to this software (see README file). + * + * BOKEH is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE + * along with BOKEH; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +class TemplatesActivitiesWidgetHiddenSessionActivityAsAdminTest + extends AbstractControllerTestCase +{ + + public function setUp(): void + { + parent::setUp(); + + $this->_buildTemplateProfil(['id' => 3]); + + $group = $this->fixture(Class_UserGroup::class, + ['id' => 19, + 'libelle' => 'Le groupe des activités', + 'rights' => [Class_UserGroup::RIGHT_DIRIGER_ACTIVITY]]); + + $bib = $this->fixture(Class_Bib::class, ['id' => 12, + 'libelle' => 'Annecy']); + + $logged = $this->fixture(Class_Users::class, + ['id' => 12, + 'nom' => 'Rédacteur', + 'prenom' => 'Activités', + 'login' => 'ractivities', + 'password' => 'fx9k', + 'mail' => 'r@bib.com', + 'bib' => $bib, + 'user_groups' => [$group], + 'role_level' => ZendAfi_Acl_AdminControllerRoles::MODO_BIB]); + + (new Class_Template_ProfilePatcher(null)) + ->setProfile(Class_Profil::find(3)) + ->addWidget(Intonation_Library_Widget_Carousel_Activity_Definition::CODE, + Class_Profil::DIV_MAIN, + ['rendering' => 'card-horizontal', + 'selected_activities' => '56-57', + 'layout' => 'list_with_options', + 'order' => 'title desc', + 'size' => 5]); + + $this->fixture(Class_Activity::class, + ['id' => 56, + 'libelle' => 'scythe chap 1', + 'visible' => true]) + ->setSessions([$this->fixture(Class_SessionActivity::class, + ['id' => 1, + 'contenu' => 'dogfighting tricks', + 'date_debut' => '2024-09-05', + 'date_fin' => '2024-10-30', + 'date_limite_fin' => '2024-09-04', + 'stagiaires' => [], + 'effectif_max' => 0, + 'effectif_min' => 0, + 'visible' => false])]) + ->save(); + + $this->fixture(Class_Activity::class, + ['id' => 57, + 'libelle' => 'scythe chap 2']) + ->setSessions([$this->fixture(Class_SessionActivity::class, + ['id' => 5, + 'contenu' => 'dogfighting aim', + 'date_debut' => '2024-10-10', + 'date_fin' => '2024-10-30', + 'date_limite_fin' => '2024-10-08', + 'stagiaires' => [], + 'effectif_max' => 10, + 'effectif_min' => 1])]) + ->save(); + + $timesource = new TimeSourceForTest('2024-09-04'); + Class_SessionActivity::setTimeSource($timesource); + Intonation_Library_Widget_Carousel_Activity_Definition::setTimeSource($timesource); + + ZendAfi_Auth::getInstance()->logUser($logged); + $this->dispatch('/'); + } + + /** @test */ + public function truncateListToolsScriptShouldBeLoaded() + { + $this->assertXPathContentContains('//script', 'truncate_list_tools'); + } + + /** @test */ + public function scytheChap2ShouldBeDisplayed() + { + $this->assertXPathContentContains('//main', 'scythe chap 2'); + } +}