ValidityTimeType::class, 'fixed_starts_at' => 'datetime', 'fixed_expires_at' => 'datetime', ]; } /** @return HasMany */ public function catalogItems(): HasMany { return $this->hasMany(CatalogItem::class); } /** @return HasMany */ public function attributeOptions(): HasMany { return $this->hasMany(AttributeOption::class); } /** @return HasMany */ public function tickets(): HasMany { return $this->hasMany(Ticket::class); } public function startsAt( ?CarbonInterface $at = null, ): ?CarbonInterface { if ($this->type === ValidityTimeType::FixedWindow) { return $this->fixed_starts_at; } return $this->atCurrentDate($this->start_time, $at); } public function expiresAt( ?CarbonInterface $at = null, ): ?CarbonInterface { if ($this->type === ValidityTimeType::FixedWindow) { return $this->fixed_expires_at; } return $this->atCurrentDate($this->end_time, $at); } public function isValid( ?CarbonInterface $at = null, ): bool { $at ??= now(); $startsAt = $this->startsAt($at); $expiresAt = $this->expiresAt($at); return ($startsAt === null || $startsAt->lessThanOrEqualTo($at)) && ($expiresAt === null || $expiresAt->greaterThan($at)); } private function atCurrentDate( ?string $time, ?CarbonInterface $at, ): ?CarbonInterface { if ($time === null) { return null; } $at ??= now(); $localDate = CarbonImmutable::instance($at) ->format('Y-m-d'); return CarbonImmutable::parse($localDate.' '.$time); } }