*/ final readonly class Coupon implements AggregateRoot, HasTimestampIdentifier { private function __construct( public CouponId $id, public CouponCode $code, public CouponName $name, public MoneyAmount $amount, public CouponPicture $picture, public CouponDiffusion $diffusion, public CouponValidityInformationArray $validityInformations, public CouponLegalInformationArray $legalInformations, public CouponProcessingCodeArray $processingCode, public BrandCode $brandCode, public ActorId $createdBy, public CouponProductArray $products, public CouponMovementArray $movements, public CouponQuantity $quantity, public ?CouponAvailabilityCalendar $availabilityCalendar = null, public ?\DateTimeInterface $updatedAt = null, ) { } public function id(): CouponId { return $this->id; } public function createdAt(): \DateTimeInterface { return $this->id->toDateTime(); } public function updatedAt(): ?\DateTimeInterface { return $this->updatedAt; } public static function create( CouponCode $code, CouponName $name, MoneyAmount $amount, CouponPicture $picture, CouponDiffusion $diffusion, CouponValidityInformationArray $validityInformations, CouponLegalInformationArray $legalInformations, CouponProcessingCodeArray $processingCode, BrandCode $brandCode, ActorId $createdBy, CouponProductArray $products, CouponMovementArray $movements, CouponQuantity $quantity, ?CouponAvailabilityCalendar $availabilityCalendar = null, ?\DateTimeInterface $updatedAt = null, ): Coupon { return new self( id: CouponId::generate(), code: $code, name: $name, amount: $amount, picture: $picture, diffusion: $diffusion, validityInformations: $validityInformations, legalInformations: $legalInformations, processingCode: $processingCode, brandCode: $brandCode, createdBy: $createdBy, products: $products, movements: $movements, quantity: $quantity, availabilityCalendar: $availabilityCalendar, updatedAt: $updatedAt, ); } public static function hydrate( CouponId $id, CouponCode $code, CouponName $name, MoneyAmount $amount, CouponPicture $picture, CouponDiffusion $diffusion, CouponValidityInformationArray $validityInformations, CouponLegalInformationArray $legalInformations, CouponProcessingCodeArray $processingCode, BrandCode $brandCode, ActorId $createdBy, CouponProductArray $products, CouponMovementArray $movements, CouponQuantity $quantity, ?CouponAvailabilityCalendar $availabilityCalendar = null, ?\DateTimeInterface $updatedAt = null, ): self { return new self( id: $id, code: $code, name: $name, amount: $amount, picture: $picture, diffusion: $diffusion, validityInformations: $validityInformations, legalInformations: $legalInformations, processingCode: $processingCode, brandCode: $brandCode, createdBy: $createdBy, products: $products, movements: $movements, quantity: $quantity, availabilityCalendar: $availabilityCalendar, updatedAt: $updatedAt, ); } }