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

117 lines
3.9 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
namespace Domain\Models\Entities;
use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus;
use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestType;
use Domain\Models\ValueObjects\Brand\BrandCode;
use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestId;
use Domain\Models\ValueObjects\CampaignRequest\Applicant;
use Domain\Models\ValueObjects\CampaignRequest\RejectionReason;
use Domain\Models\ValueObjects\CountryAuthorized;
use Domain\Models\ValueObjects\PrintRules;
use Domain\Models\ValueObjects\RequestedCoupon\RequestedCoupon;
use Shared\DDD\Models\AggregateRoot;
use Shared\DDD\Models\HasTimestampIdentifier;
use Shared\Helpers\DatesHelper;
/**
* @implements \Shared\DDD\Models\AggregateRoot<\Domain\Models\ValueObjects\CampaignRequest\CampaignRequestId>
*/
final readonly class CampaignRequest implements AggregateRoot, HasTimestampIdentifier
{
private function __construct(
2026-09-23 09:24:18 +02:00
public CampaignRequestId $id,
public BrandCode $code,
public Applicant $applicant,
public CountryAuthorized $country,
public CampaignRequestType $campaignType,
2026-09-23 09:24:18 +02:00
public ?PrintRules $printRules,
public RequestedCoupon $requestedCoupon,
public CampaignRequestStatus $status,
2026-09-23 09:24:18 +02:00
public ?RejectionReason $rejectionReason = null,
public ?\DateTimeInterface $updatedAt = null,
) {
if ($this->status === CampaignRequestStatus::REJECTED && ! $this->rejectionReason instanceof RejectionReason) {
throw new \DomainException('A rejection reason is required when the campaign request is rejected.');
}
if ($this->status !== CampaignRequestStatus::REJECTED && $this->rejectionReason instanceof RejectionReason) {
throw new \DomainException('A rejection reason can only be set when the campaign request is rejected.');
}
}
public function id(): CampaignRequestId
{
return $this->id;
}
public function createdAt(): \DateTimeInterface
{
return $this->id->toDateTime();
}
public function updatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public static function hydrate(
2026-09-23 09:24:18 +02:00
CampaignRequestId $id,
BrandCode $code,
Applicant $applicant,
CountryAuthorized $country,
CampaignRequestType $campaignType,
2026-09-23 09:24:18 +02:00
?PrintRules $printRules,
RequestedCoupon $requestedCoupon,
CampaignRequestStatus $status,
2026-09-23 09:24:18 +02:00
?RejectionReason $rejectionReason = null,
?\DateTimeInterface $updatedAt = null,
): self {
return new self(
id: $id,
code: $code,
applicant: $applicant,
country: $country,
campaignType: $campaignType,
printRules: $printRules,
requestedCoupon: $requestedCoupon,
status: $status,
rejectionReason: $rejectionReason,
updatedAt: $updatedAt,
);
}
public function reject(RejectionReason $reason): self
{
if ($this->status !== CampaignRequestStatus::CREATED) {
throw new \DomainException('Only a created campaign request can be rejected.');
}
return new self(
id: $this->id,
code: $this->code,
applicant: $this->applicant,
country: $this->country,
campaignType: $this->campaignType,
printRules: $this->printRules,
requestedCoupon: $this->requestedCoupon,
status: CampaignRequestStatus::REJECTED,
rejectionReason: $reason,
updatedAt: DatesHelper::now(),
);
}
2026-09-28 14:32:19 +02:00
public function rejectionReason(): RejectionReason
{
if (! $this->rejectionReason instanceof RejectionReason) {
throw new \DomainException('Only a rejected campaign request has a rejection reason.');
}
return $this->rejectionReason;
}
}