165 lines
5.6 KiB
PHP
165 lines
5.6 KiB
PHP
<?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\Coupon\CouponAvailabilityCalendar;
|
|
use Domain\Models\ValueObjects\Coupon\CouponCode;
|
|
use Domain\Models\ValueObjects\Coupon\CouponDiffusion;
|
|
use Domain\Models\ValueObjects\Coupon\CouponId;
|
|
use Domain\Models\ValueObjects\Coupon\CouponLegalInformation;
|
|
use Domain\Models\ValueObjects\Coupon\CouponValidity;
|
|
use Domain\Models\ValueObjects\Coupon\CouponValidityInformation;
|
|
use Domain\Models\ValueObjects\CouponName;
|
|
use Domain\Models\ValueObjects\CouponPicture;
|
|
use Domain\Models\ValueObjects\GS1;
|
|
use Domain\Models\ValueObjects\IncoCode;
|
|
use Domain\Models\ValueObjects\MoneyAmount;
|
|
use Domain\Models\ValueObjects\ProcessingCode;
|
|
use Shared\DDD\Models\AggregateRoot;
|
|
use Shared\DDD\Models\HasTimestampIdentifier;
|
|
|
|
/**
|
|
* @implements \Shared\DDD\Models\AggregateRoot<\Domain\Models\ValueObjects\Coupon\CouponId>
|
|
*/
|
|
final readonly class Coupon implements AggregateRoot, HasTimestampIdentifier
|
|
{
|
|
/**
|
|
* @param array<CouponValidityInformation> $couponValidityInformation
|
|
* @param array<CouponLegalInformation> $couponLegalInformation
|
|
* @param array<IncoCode> $products
|
|
*/
|
|
private function __construct(
|
|
public CouponId $id,
|
|
public CouponCode $code,
|
|
public CouponName $name,
|
|
public MoneyAmount $amount,
|
|
public CouponPicture $picture,
|
|
public CouponDiffusion $diffusion,
|
|
public CouponValidity $validity,
|
|
public array $couponValidityInformation,
|
|
public array $couponLegalInformation,
|
|
public ProcessingCode $processingCode,
|
|
public BrandCode $brandCode,
|
|
public ActorId $createdBy,
|
|
public array $products = [],
|
|
public ?CouponAvailabilityCalendar $availabilityCalendar = null,
|
|
public ?GS1 $gs1 = null,
|
|
public ?\DateTimeInterface $updatedAt = null,
|
|
) {
|
|
foreach ($this->couponValidityInformation as $validityInformation) {
|
|
if (!$validityInformation instanceof CouponValidityInformation) {
|
|
throw new \DomainException('Coupon validity information must be CouponValidityInformation instances.');
|
|
}
|
|
}
|
|
|
|
foreach ($this->couponLegalInformation as $legalInformation) {
|
|
if (!$legalInformation instanceof CouponLegalInformation) {
|
|
throw new \DomainException('Coupon legal information must be CouponLegalInformation instances.');
|
|
}
|
|
}
|
|
}
|
|
|
|
public function id(): CouponId
|
|
{
|
|
return $this->id;
|
|
}
|
|
|
|
public function createdAt(): \DateTimeInterface
|
|
{
|
|
return $this->id->toDateTime();
|
|
}
|
|
|
|
public function updatedAt(): ?\DateTimeInterface
|
|
{
|
|
return $this->updatedAt;
|
|
}
|
|
|
|
/**
|
|
* @param array<CouponValidityInformation> $couponValidityInformation
|
|
* @param array<CouponLegalInformation> $couponLegalInformation
|
|
* @param array<IncoCode> $products
|
|
*/
|
|
public static function create(
|
|
CouponCode $code,
|
|
CouponName $name,
|
|
MoneyAmount $amount,
|
|
CouponPicture $picture,
|
|
CouponDiffusion $diffusion,
|
|
CouponValidity $validity,
|
|
array $couponValidityInformation,
|
|
array $couponLegalInformation,
|
|
ProcessingCode $processingCode,
|
|
BrandCode $brandCode,
|
|
ActorId $createdBy,
|
|
array $products = [],
|
|
?CouponAvailabilityCalendar $availabilityCalendar = null,
|
|
?GS1 $gs1 = null,
|
|
?\DateTimeInterface $updatedAt = null,
|
|
): Coupon {
|
|
return new self(
|
|
id: CouponId::generate(),
|
|
code: $code,
|
|
name: $name,
|
|
amount: $amount,
|
|
picture: $picture,
|
|
diffusion: $diffusion,
|
|
validity: $validity,
|
|
couponValidityInformation: $couponValidityInformation,
|
|
couponLegalInformation: $couponLegalInformation,
|
|
processingCode: $processingCode,
|
|
brandCode: $brandCode,
|
|
createdBy: $createdBy,
|
|
products: $products,
|
|
availabilityCalendar: $availabilityCalendar,
|
|
gs1: $gs1,
|
|
updatedAt: $updatedAt,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param array<CouponValidityInformation> $couponValidityInformation
|
|
* @param array<CouponLegalInformation> $couponLegalInformation
|
|
* @param array<IncoCode> $products
|
|
*/
|
|
public static function hydrate(
|
|
CouponId $id,
|
|
CouponCode $code,
|
|
CouponName $name,
|
|
MoneyAmount $amount,
|
|
CouponPicture $picture,
|
|
CouponDiffusion $diffusion,
|
|
CouponValidity $validity,
|
|
array $couponValidityInformation,
|
|
array $couponLegalInformation,
|
|
ProcessingCode $processingCode,
|
|
BrandCode $brandCode,
|
|
ActorId $createdBy,
|
|
array $products = [],
|
|
?CouponAvailabilityCalendar $availabilityCalendar = null,
|
|
?GS1 $gs1 = null,
|
|
?\DateTimeInterface $updatedAt = null,
|
|
): self {
|
|
return new self(
|
|
id: $id,
|
|
code: $code,
|
|
name: $name,
|
|
amount: $amount,
|
|
picture: $picture,
|
|
diffusion: $diffusion,
|
|
validity: $validity,
|
|
couponValidityInformation: $couponValidityInformation,
|
|
couponLegalInformation: $couponLegalInformation,
|
|
processingCode: $processingCode,
|
|
brandCode: $brandCode,
|
|
createdBy: $createdBy,
|
|
products: $products,
|
|
availabilityCalendar: $availabilityCalendar,
|
|
gs1: $gs1,
|
|
updatedAt: $updatedAt,
|
|
);
|
|
}
|
|
}
|