sectionResolver = $sectionResolver; $this->security = $security; } public function isOpenSale( SectionInterface $section = null, UserInterface $user = null, \DateTime $date = null ): bool { // Initialisation $this->messages = []; if (is_null($section)) { $section = $this->sectionResolver->getCurrent(); } if (is_null($user)) { $user = $this->security->getUser(); } if (is_null($date)) { $date = new \DateTime(); } // État des prise de commande (voir configuration de section) $orderState = $section->getSettingValue(SectionSettingDefinition::SETTING_ORDER_STATE); if ($orderState == SectionSettingDefinition::VALUE_ORDER_STATE_OPEN) { $this->addMessage('Les commandes sont ouvertes (configuration de la section).'); return true; } if ($orderState == SectionSettingDefinition::VALUE_ORDER_STATE_CLOSED) { $this->addMessage('Les commandes sont fermées (configuration de la section).'); return false; } // Nombre maximum de commandes par cycle (voir configuration de section) $countOrderShopCycle = 0; $orderMaximumPerCycle = $section->getSettingValue(SectionSettingDefinition::SETTING_ORDER_MAXIMUM_PER_CYCLE); if ($orderMaximumPerCycle && $countOrderShopCycle >= $orderMaximumPerCycle) { $this->addMessage('Le nombre maximum de commande a été atteint.'); return false; } // Période de fermeture des commandes issue de la configuration de la section (congés) $orderClosedStart = $section->getSettingValue(SectionSettingDefinition::SETTING_ORDER_CLOSED_START); $orderClosedEnd = $section->getSettingValue(SectionSettingDefinition::SETTING_ORDER_CLOSED_END); if ($orderClosedStart && $orderClosedEnd && $date >= $orderClosedStart && $date <= $orderClosedEnd) { $this->addMessage( 'Les commandes sont fermées (période de fermeture des commandes dans la configuration de la section).' ); return false; } // Période d'ouverture des commandes $openings = $section->getOpenings(); foreach ($openings as $opening) { if(!$opening->getGroupUser() || ($opening->getGroupUser() && $user && $user->getGroupUsers()->contains($opening->getGroupUser()))) { if ($this->isDateMatchWithOpening($date, $opening)) { $this->addMessage('Les commandes sont ouvertes (périodes d\'ouverture classique des commandes).'); return true; } } } $this->addMessage('Les commandes sont fermées (périodes d\'ouverture classique des commandes).'); return false; } public function isDateMatchWithOpening(\DateTime $date, OpeningInterface $opening): bool { $day = $date->format('N'); $dayOpening = $opening->getDay(); if ($opening->getTimeStart()) { $dateOpeningStart = clone $date; $dateOpeningStart->setTime( $opening->getTimeStart()->format('H'), $opening->getTimeStart()->format('i') ); } if ($opening->getTimeEnd()) { $dateOpeningEnd = clone $date; $dateOpeningEnd->setTime( $opening->getTimeEnd()->format('H'), $opening->getTimeEnd()->format('i') ); } if ($day == $dayOpening) { // Commandes ouvertes toute la journée if (!$opening->getTimeStart() && !$opening->getTimeEnd()) { return true; } // Commandes ouvertes à partir de timeStart elseif ($opening->getTimeStart() && !$opening->getTimeEnd() && $date >= $dateOpeningStart) { return true; } // Commandes ouvertes jusqu'à timeEnd elseif (!$opening->getTimeStart() && $opening->getTimeEnd() && $date < $dateOpeningEnd) { return true; } // Commandes ouvertes de timeStart à timeEnd elseif ($opening->getTimeStart() && $opening->getTimeEnd() && $date >= $dateOpeningStart && $date < $dateOpeningEnd) { return true; } } return false; } public function getMessages(): array { return $this->messages; } public function addMessage(string $message): void { $this->messages[] = $message; } }