ldc-mesbr-app/src/Domain/Models/Entities/Campaign.php

92 lines
2.4 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
namespace Domain\Models\Entities;
use Domain\Models\ValueObjects\Actor\ActorId;
use Domain\Models\ValueObjects\Brand\BrandCode;
use Domain\Models\ValueObjects\Campaign\CampaignCode;
use Domain\Models\ValueObjects\Campaign\CampaignCouponArray;
use Domain\Models\ValueObjects\Campaign\CampaignId;
use Domain\Models\ValueObjects\Campaign\CampaignName;
use Shared\DDD\Models\AggregateRoot;
use Shared\DDD\Models\HasTimestampIdentifier;
use Shared\Helpers\DatesHelper;
/**
* @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 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(),
);
}
}