]> Raphaël G. Git Repositories - airbundle/blobdiff - Entity/Session.php
Add user cache to constructor arguments
[airbundle] / Entity / Session.php
index 70b2fc4bed5e92bb2855c4b65f4aa91cc08f65b0..f74963cdb338dd2914d7c9fc189e2733abb12761 100644 (file)
 <?php declare(strict_types=1);
 
 /*
- * this file is part of the rapsys packbundle package.
+ * This file is part of the Rapsys AirBundle package.
  *
- * (c) raphaël gertz <symfony@rapsys.eu>
+ * (c) Raphaël Gertz <symfony@rapsys.eu>
  *
- * for the full copyright and license information, please view the license
+ * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
 
 namespace Rapsys\AirBundle\Entity;
 
+use Doctrine\Common\Collections\Collection;
 use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\ORM\Event\PreUpdateEventArgs;
 
+use Rapsys\PackBundle\Util\IntlUtil;
+
 /**
  * Session
  */
 class Session {
        /**
-        * @var integer
-        */
-       private $id;
-
-       /**
-        * @var \DateTime
-        */
-       private $date;
-
-       /**
-        * @var \DateTime
+        * Primary key
         */
-       private $begin;
+       private ?int $id = null;
 
        /**
-        * @var \DateTime
+        * Begin time
         */
-       private $start;
+       private ?\DateTime $begin = null;
 
        /**
-        * @var \DateTime
+        * Computed start datetime
         */
-       private $length;
+       private ?\DateTime $start = null;
 
        /**
-        * @var \DateTime
+        * Length time
         */
-       private $stop;
+       private ?\DateTime $length = null;
 
        /**
-        * @var bool
+        * Computed stop datetime
         */
-       private $premium;
+       private ?\DateTime $stop = null;
 
        /**
-        * @var float
+        * Premium
         */
-       private $rainfall;
+       private ?bool $premium = null;
 
        /**
-        * @var float
+        * Rain mm
         */
-       private $rainrisk;
+       private ?float $rainfall = null;
 
        /**
-        * @var float
+        * Rain chance
         */
-       private $realfeel;
+       private ?float $rainrisk = null;
 
        /**
-        * @var float
+        * Real feel temperature
         */
-       private $realfeelmin;
+       private ?float $realfeel = null;
 
        /**
-        * @var float
+        * Real feel minimum temperature
         */
-       private $realfeelmax;
+       private ?float $realfeelmin = null;
 
        /**
-        * @var float
+        * Real feel maximum temperature
         */
-       private $temperature;
+       private ?float $realfeelmax = null;
 
        /**
-        * @var float
+        * Temperature
         */
-       private $temperaturemin;
+       private ?float $temperature = null;
 
        /**
-        * @var float
+        * Minimum temperature
         */
-       private $temperaturemax;
+       private ?float $temperaturemin = null;
 
        /**
-        * @var \DateTime
+        * Maximum temperature
         */
-       private $locked;
+       private ?float $temperaturemax = null;
 
        /**
-        * @var \DateTime
+        * Lock datetime
         */
-       private $created;
+       private ?\DateTime $locked = null;
 
        /**
-        * @var \DateTime
+        * Create datetime
         */
-       private $updated;
+       private \DateTime $created;
 
        /**
-        * @var Application
+        * Update datetime
         */
-       private $application;
+       private \DateTime $updated;
 
        /**
-        * @var Location
+        * Application instance
         */
-       private $location;
+       private ?Application $application = null;
 
        /**
-        * @var Slot
+        * Applications collection
         */
-       private $slot;
-
-       /**
-        * @var ArrayCollection
-        */
-       private $applications;
+       private Collection $applications;
 
        /**
         * Constructor
         */
-       public function __construct() {
+       public function __construct(private \DateTime $date, private Location $location, private Slot $slot) {
                //Set defaults
-               $this->begin = null;
-               $this->start = null;
-               $this->length = null;
-               $this->stop = null;
-               $this->premium = null;
-               $this->rainfall = null;
-               $this->rainrisk = null;
-               $this->realfeel = null;
-               $this->realfeelmin = null;
-               $this->realfeelmax = null;
-               $this->temperature = null;
-               $this->temperaturemin = null;
-               $this->temperaturemax = null;
-               $this->locked = null;
                $this->created = new \DateTime('now');
                $this->updated = new \DateTime('now');
-               $this->application = null;
+
+               //Set collections
                $this->applications = new ArrayCollection();
        }
 
@@ -158,7 +133,7 @@ class Session {
         *
         * @return integer
         */
-       public function getId(): int {
+       public function getId(): ?int {
                return $this->id;
        }
 
@@ -290,7 +265,7 @@ class Session {
         *
         * @return Session
         */
-       public function setPremium(bool $premium): Session {
+       public function setPremium(?bool $premium): Session {
                $this->premium = $premium;
 
                return $this;
@@ -301,7 +276,7 @@ class Session {
         *
         * @return bool
         */
-       public function getPremium(): bool {
+       public function getPremium(): ?bool {
                return $this->premium;
        }
 
@@ -649,7 +624,7 @@ class Session {
         */
        public function preUpdate(PreUpdateEventArgs $eventArgs) {
                //Check that we have a session instance
-               if (($session = $eventArgs->getEntity()) instanceof Session) {
+               if (($session = $eventArgs->getObject()) instanceof Session) {
                        //Set updated value
                        $session->setUpdated(new \DateTime('now'));
                }
@@ -661,6 +636,8 @@ class Session {
         * Consider as premium a day off for afternoon, the eve for evening and after
         * Store computed result in premium member for afternoon and evening
         *
+        * @TODO improve by moving day off computation in IntlUtil or HolidayUtil class ?
+        *
         * @return bool Whether the date is day off or not
         */
        public function isPremium(): bool {
@@ -731,7 +708,7 @@ class Session {
                }
 
                //Get eastern
-               $eastern = $this->getEastern($date->format('Y'));
+               $eastern = (new IntlUtil())->getEastern($date->format('Y'));
 
                //Check dynamic holidays
                if (
@@ -758,48 +735,4 @@ class Session {
                //Date is not a holiday and week day
                return false;
        }
-
-       /**
-        * Compute eastern for selected year
-        *
-        * @param string $year The eastern year
-        *
-        * @return DateTime The eastern date
-        */
-       private function getEastern(string $year): \DateTime {
-               //Set static
-               static $data = null;
-
-               //Check if already computed
-               if (isset($data[$year])) {
-                       //Return computed eastern
-                       return $data[$year];
-               //Check if data is null
-               } elseif (is_null($data)) {
-                       //Init data array
-                       $data = [];
-               }
-
-               $d = (19 * ($year % 19) + 24) % 30;
-
-               $e = (2 * ($year % 4) + 4 * ($year % 7) + 6 * $d + 5) % 7;
-
-               $day = 22 + $d + $e;
-
-               $month = 3;
-
-               if ($day > 31) {
-                       $day = $d + $e - 9;
-                       $month = 4;
-               } elseif ($d == 29 && $e == 6) {
-                       $day = 10;
-                       $month = 4;
-               } elseif ($d == 28 && $e == 6) {
-                       $day = 18;
-                       $month = 4;
-               }
-
-               //Store eastern in data
-               return ($data[$year] = new \DateTime(sprintf('%04d-%02d-%02d', $year, $month, $day)));
-       }
 }