139 lines
4.7 KiB
PHP
139 lines
4.7 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\CouponLegalInformationArray;
|
|
use Domain\Models\ValueObjects\Coupon\CouponMovementArray;
|
|
use Domain\Models\ValueObjects\Coupon\CouponName;
|
|
use Domain\Models\ValueObjects\Coupon\CouponPicture;
|
|
use Domain\Models\ValueObjects\Coupon\CouponProcessingCodeArray;
|
|
use Domain\Models\ValueObjects\Coupon\CouponProductArray;
|
|
use Domain\Models\ValueObjects\Coupon\CouponQuantity;
|
|
use Domain\Models\ValueObjects\Coupon\CouponValidityInformationArray;
|
|
use Domain\Models\ValueObjects\MoneyAmount;
|
|
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
|
|
{
|
|
private function __construct(
|
|
public CouponId $id,
|
|
public CouponCode $code,
|
|
public CouponName $name,
|
|
public MoneyAmount $amount,
|
|
public CouponPicture $picture,
|
|
public CouponDiffusion $diffusion,
|
|
public CouponValidityInformationArray $validityInformations,
|
|
public CouponLegalInformationArray $legalInformations,
|
|
public CouponProcessingCodeArray $processingCode,
|
|
public BrandCode $brandCode,
|
|
public ActorId $createdBy,
|
|
public CouponProductArray $products,
|
|
public CouponMovementArray $movements,
|
|
public CouponQuantity $quantity,
|
|
public ?CouponAvailabilityCalendar $availabilityCalendar = null,
|
|
public ?\DateTimeInterface $updatedAt = null,
|
|
) {
|
|
}
|
|
|
|
public function id(): CouponId
|
|
{
|
|
return $this->id;
|
|
}
|
|
|
|
public function createdAt(): \DateTimeInterface
|
|
{
|
|
return $this->id->toDateTime();
|
|
}
|
|
|
|
public function updatedAt(): ?\DateTimeInterface
|
|
{
|
|
return $this->updatedAt;
|
|
}
|
|
|
|
public static function create(
|
|
CouponCode $code,
|
|
CouponName $name,
|
|
MoneyAmount $amount,
|
|
CouponPicture $picture,
|
|
CouponDiffusion $diffusion,
|
|
CouponValidityInformationArray $validityInformations,
|
|
CouponLegalInformationArray $legalInformations,
|
|
CouponProcessingCodeArray $processingCode,
|
|
BrandCode $brandCode,
|
|
ActorId $createdBy,
|
|
CouponProductArray $products,
|
|
CouponMovementArray $movements,
|
|
CouponQuantity $quantity,
|
|
?CouponAvailabilityCalendar $availabilityCalendar = null,
|
|
?\DateTimeInterface $updatedAt = null,
|
|
): Coupon {
|
|
return new self(
|
|
id: CouponId::generate(),
|
|
code: $code,
|
|
name: $name,
|
|
amount: $amount,
|
|
picture: $picture,
|
|
diffusion: $diffusion,
|
|
validityInformations: $validityInformations,
|
|
legalInformations: $legalInformations,
|
|
processingCode: $processingCode,
|
|
brandCode: $brandCode,
|
|
createdBy: $createdBy,
|
|
products: $products,
|
|
movements: $movements,
|
|
quantity: $quantity,
|
|
availabilityCalendar: $availabilityCalendar,
|
|
updatedAt: $updatedAt,
|
|
);
|
|
}
|
|
|
|
public static function hydrate(
|
|
CouponId $id,
|
|
CouponCode $code,
|
|
CouponName $name,
|
|
MoneyAmount $amount,
|
|
CouponPicture $picture,
|
|
CouponDiffusion $diffusion,
|
|
CouponValidityInformationArray $validityInformations,
|
|
CouponLegalInformationArray $legalInformations,
|
|
CouponProcessingCodeArray $processingCode,
|
|
BrandCode $brandCode,
|
|
ActorId $createdBy,
|
|
CouponProductArray $products,
|
|
CouponMovementArray $movements,
|
|
CouponQuantity $quantity,
|
|
?CouponAvailabilityCalendar $availabilityCalendar = null,
|
|
?\DateTimeInterface $updatedAt = null,
|
|
): self {
|
|
return new self(
|
|
id: $id,
|
|
code: $code,
|
|
name: $name,
|
|
amount: $amount,
|
|
picture: $picture,
|
|
diffusion: $diffusion,
|
|
validityInformations: $validityInformations,
|
|
legalInformations: $legalInformations,
|
|
processingCode: $processingCode,
|
|
brandCode: $brandCode,
|
|
createdBy: $createdBy,
|
|
products: $products,
|
|
movements: $movements,
|
|
quantity: $quantity,
|
|
availabilityCalendar: $availabilityCalendar,
|
|
updatedAt: $updatedAt,
|
|
);
|
|
}
|
|
}
|