|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- <?php
-
- namespace Lc\CaracoleBundle\Resolver;
-
- use Lc\CaracoleBundle\Definition\SectionSettingDefinition;
- use Lc\CaracoleBundle\Model\Section\OpeningInterface;
- use Lc\CaracoleBundle\Model\Section\SectionInterface;
- use Lc\SovBundle\Model\User\UserInterface;
- use Symfony\Component\Security\Core\Security;
-
- class OpeningResolver
- {
- protected array $messages = [];
- protected SectionResolver $sectionResolver;
- protected Security $security;
-
- public function __construct(SectionResolver $sectionResolver, Security $security)
- {
- $this->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;
- }
- }
|