ldc-mesbr-app/src/Domain/Models/Entities/Campaign.php
2026-10-02 12:47:27 +02:00

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,
);
}
}