ldc-mesbr-app/src/Domain/Models/Entities/Coupon.php
2026-10-02 12:48:00 +02:00

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