*/ final readonly class Campaign implements AggregateRoot, HasTimestampIdentifier { private function __construct( public CampaignId $id, public CampaignCode $code, public CampaignName $name, public bool $publication, public bool $printAllAtOnce, public CampaignCouponArray $coupons, public BrandCode $brandCode, public ActorId $actorId, public ?\DateTimeInterface $updatedAt = null, ) { } public function id(): CampaignId { return $this->id; } public function createdAt(): \DateTimeInterface { return $this->id->toDateTime(); } public function updatedAt(): ?\DateTimeInterface { return $this->updatedAt; } public static function create( CampaignName $name, bool $printAllAtOnce, CampaignCouponArray $coupons, BrandCode $brandCode, ActorId $actorId, ): Campaign { return new self( id: CampaignId::generate(), code: CampaignCode::generate(), name: $name, publication: false, printAllAtOnce: $printAllAtOnce, coupons: $coupons, brandCode: $brandCode, actorId: $actorId, ); } public static function hydrate( CampaignId $id, CampaignCode $code, CampaignName $name, bool $publication, bool $printAllAtOnce, CampaignCouponArray $coupons, BrandCode $brandCode, ActorId $actorId, ): self { return new self( id: $id, code: $code, name: $name, publication: $publication, printAllAtOnce: $printAllAtOnce, coupons: $coupons, brandCode: $brandCode, actorId: $actorId, updatedAt: DatesHelper::now(), ); } }