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

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