108 lines
2.9 KiB
PHP
108 lines
2.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Domain\Models\Entities;
|
|
|
|
use Domain\Enums\Country;
|
|
use Domain\Models\ValueObjects\Brand\BrandCode;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignCode;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignCoupon;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignId;
|
|
use Domain\Models\ValueObjects\Campaign\CampaignName;
|
|
use Shared\DDD\Models\AggregateRoot;
|
|
use Shared\DDD\Models\HasTimestampIdentifier;
|
|
|
|
/**
|
|
* @implements \Shared\DDD\Models\AggregateRoot<\Domain\Models\ValueObjects\Campaign\CampaignId>
|
|
*/
|
|
final readonly class Campaign implements AggregateRoot, HasTimestampIdentifier
|
|
{
|
|
private function __construct(
|
|
public CampaignId $id,
|
|
public CampaignCode $code,
|
|
public Tag $tag,
|
|
public CampaignName $name,
|
|
public bool $publication,
|
|
public bool $printAllAtOnce,
|
|
public Country $availableIn,
|
|
/** @var array<int, CampaignCoupon> $coupons */
|
|
public array $coupons,
|
|
public BrandCode $brand,
|
|
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;
|
|
}
|
|
|
|
/**
|
|
* @param array<int, CampaignCoupon> $coupons
|
|
*/
|
|
public static function create(
|
|
CampaignCode $code,
|
|
Tag $tag,
|
|
CampaignName $name,
|
|
bool $publication,
|
|
bool $printAllAtOnce,
|
|
Country $availableIn,
|
|
/** @var array<int, CampaignCoupon> $coupons */
|
|
array $coupons,
|
|
BrandCode $brand,
|
|
?\DateTimeInterface $updatedAt = null,
|
|
): Campaign {
|
|
return new self(
|
|
id: CampaignId::generate(),
|
|
code: $code,
|
|
tag: $tag,
|
|
name: $name,
|
|
publication: $publication,
|
|
printAllAtOnce: $printAllAtOnce,
|
|
availableIn: $availableIn,
|
|
coupons: $coupons,
|
|
brand: $brand,
|
|
updatedAt: $updatedAt,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param array<int, CampaignCoupon> $coupons
|
|
*/
|
|
public static function hydrate(
|
|
CampaignId $id,
|
|
CampaignCode $code,
|
|
Tag $tag,
|
|
CampaignName $name,
|
|
bool $publication,
|
|
bool $printAllAtOnce,
|
|
Country $availableIn,
|
|
array $coupons,
|
|
BrandCode $brand,
|
|
?\DateTimeInterface $updatedAt = null,
|
|
): self {
|
|
return new self(
|
|
id: $id,
|
|
code: $code,
|
|
tag: $tag,
|
|
name: $name,
|
|
publication: $publication,
|
|
printAllAtOnce: $printAllAtOnce,
|
|
availableIn: $availableIn,
|
|
coupons: $coupons,
|
|
brand: $brand,
|
|
updatedAt: $updatedAt,
|
|
);
|
|
}
|
|
}
|