From a60f7371dc329b1cad185531624423c7ab2e7099 Mon Sep 17 00:00:00 2001 From: K Muller Date: Fri, 25 Sep 2026 12:14:48 +0200 Subject: [PATCH] fix: :bug: change entity requestedCoupon into VO --- .../Find/Output/CampaignRequestFound.php | 2 +- .../Models/Entities/CampaignRequest.php | 1 + .../Models/Entities/RequestedCoupon.php | 86 ------------ .../RequestedCoupon/RequestedCoupon.php | 32 +++++ .../RequestedCoupon/RequestedCouponId.php | 16 --- .../Find/FindCampaignRequestTest.php | 6 +- .../List/ListCampaignsRequestTest.php | 9 +- .../Reject/RejectCampaignRequestTest.php | 6 +- .../Models/Entities/CampaignRequestTest.php | 6 +- .../Models/Entities/RequestedCouponTest.php | 128 ------------------ .../RequestedCoupon/RequestedCouponIdTest.php | 28 ---- .../RequestedCoupon/RequestedCouponTest.php | 71 ++++++++++ 12 files changed, 114 insertions(+), 277 deletions(-) delete mode 100644 src/Domain/Models/Entities/RequestedCoupon.php create mode 100644 src/Domain/Models/ValueObjects/RequestedCoupon/RequestedCoupon.php delete mode 100644 src/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponId.php delete mode 100644 tests/Unit/Domain/Models/Entities/RequestedCouponTest.php delete mode 100644 tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponIdTest.php create mode 100644 tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponTest.php diff --git a/src/Application/UseCases/CampaignRequest/Find/Output/CampaignRequestFound.php b/src/Application/UseCases/CampaignRequest/Find/Output/CampaignRequestFound.php index eb0d481..08dafd7 100644 --- a/src/Application/UseCases/CampaignRequest/Find/Output/CampaignRequestFound.php +++ b/src/Application/UseCases/CampaignRequest/Find/Output/CampaignRequestFound.php @@ -7,11 +7,11 @@ namespace Application\UseCases\CampaignRequest\Find\Output; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestType; use Domain\Models\Entities\Brand; -use Domain\Models\Entities\RequestedCoupon; 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; final readonly class CampaignRequestFound implements Output { diff --git a/src/Domain/Models/Entities/CampaignRequest.php b/src/Domain/Models/Entities/CampaignRequest.php index 7858146..68e6cfd 100644 --- a/src/Domain/Models/Entities/CampaignRequest.php +++ b/src/Domain/Models/Entities/CampaignRequest.php @@ -12,6 +12,7 @@ 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; diff --git a/src/Domain/Models/Entities/RequestedCoupon.php b/src/Domain/Models/Entities/RequestedCoupon.php deleted file mode 100644 index 43c9c05..0000000 --- a/src/Domain/Models/Entities/RequestedCoupon.php +++ /dev/null @@ -1,86 +0,0 @@ - - */ -final readonly class RequestedCoupon implements AggregateRoot, HasTimestampIdentifier -{ - private function __construct( - public RequestedCouponId $id, - public CouponName $name, - public CouponProductName $productName, - public RequestedCouponQuantity $quantity, - public WarningThresholdQuantity $warningThresholdQuantity, - public Period $period, - public MoneyAmount $moneyAmount, - public ProcessingCode $processingCode, - public CouponPicture $couponPicture, - public GS1 $gs1, - public CouponValidity $couponValidity, - public ?\DateTimeInterface $updatedAt = null, - ) { - } - - public function id(): RequestedCouponId - { - return $this->id; - } - - public function createdAt(): \DateTimeInterface - { - return $this->id->toDateTime(); - } - - public function updatedAt(): ?\DateTimeInterface - { - return $this->updatedAt; - } - - public static function hydrate( - RequestedCouponId $id, - CouponName $name, - CouponProductName $productName, - RequestedCouponQuantity $quantity, - WarningThresholdQuantity $warningThresholdQuantity, - Period $period, - MoneyAmount $moneyAmount, - ProcessingCode $processingCode, - CouponPicture $couponPicture, - GS1 $gs1, - CouponValidity $couponValidity, - ?\DateTimeInterface $updatedAt = null, - ): self { - return new self( - id: $id, - name: $name, - productName: $productName, - quantity: $quantity, - warningThresholdQuantity: $warningThresholdQuantity, - period: $period, - moneyAmount: $moneyAmount, - processingCode: $processingCode, - couponPicture: $couponPicture, - gs1: $gs1, - couponValidity: $couponValidity, - updatedAt: $updatedAt, - ); - } -} diff --git a/src/Domain/Models/ValueObjects/RequestedCoupon/RequestedCoupon.php b/src/Domain/Models/ValueObjects/RequestedCoupon/RequestedCoupon.php new file mode 100644 index 0000000..616c082 --- /dev/null +++ b/src/Domain/Models/ValueObjects/RequestedCoupon/RequestedCoupon.php @@ -0,0 +1,32 @@ +requestedCoupon = RequestedCoupon::hydrate( - RequestedCouponId::generate(), + $this->requestedCoupon = new RequestedCoupon( new CouponName('Coupon A'), new CouponProductName('Product A'), new RequestedCouponQuantity(100), diff --git a/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php b/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php index dbc8c7d..de00837 100644 --- a/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php +++ b/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php @@ -9,7 +9,6 @@ use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestType; use Domain\Enums\Country; use Domain\Models\Entities\CampaignRequest; -use Domain\Models\Entities\RequestedCoupon; use Domain\Models\ValueObjects\Brand\BrandCode; use Domain\Models\ValueObjects\CampaignRequest\Applicant; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestFilters; @@ -28,13 +27,13 @@ use Domain\Models\ValueObjects\Period; use Domain\Models\ValueObjects\PicturePath; use Domain\Models\ValueObjects\PrintRules; use Domain\Models\ValueObjects\ProcessingCode; -use Domain\Models\ValueObjects\RequestedCoupon\RequestedCouponId; use Domain\Models\ValueObjects\RequestedCoupon\RequestedCouponQuantity; use Domain\Models\ValueObjects\WarningThresholdQuantity; use Domain\Ports\Repositories\CampaignRequestRepository; use Shared\DDD\UseCases\Input as BaseInput; use Shared\Enums\Currency; use DateTime; +use Domain\Models\ValueObjects\RequestedCoupon\RequestedCoupon; use Shared\ValueObjects\Email; use Shared\ValueObjects\Money; use Shared\ValueObjects\Pagination\Paginated; @@ -44,8 +43,7 @@ covers(ListCampaignsRequest::class, Input::class, Output::class, CampaignRequest describe('list campaigns request use case', function (): void { beforeEach(function (): void { - $this->couponA = RequestedCoupon::hydrate( - RequestedCouponId::generate(), + $this->couponA = new RequestedCoupon( new CouponName('Coupon A'), new CouponProductName('Product A'), new RequestedCouponQuantity(100), @@ -58,8 +56,7 @@ describe('list campaigns request use case', function (): void { new CouponValidity(30, new DateTime()), ); - $this->couponB = RequestedCoupon::hydrate( - RequestedCouponId::generate(), + $this->couponB = new RequestedCoupon( new CouponName('Coupon B'), new CouponProductName('Product B'), new RequestedCouponQuantity(100), diff --git a/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php b/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php index 5ffaa68..9ba5fd7 100644 --- a/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php +++ b/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php @@ -15,7 +15,6 @@ use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestType; use Domain\Enums\Country; use Domain\Models\Entities\CampaignRequest; -use Domain\Models\Entities\RequestedCoupon; use Domain\Models\ValueObjects\Brand\BrandCode; use Domain\Models\ValueObjects\CampaignRequest\Applicant; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestId; @@ -31,13 +30,13 @@ use Domain\Models\ValueObjects\Period; use Domain\Models\ValueObjects\PicturePath; use Domain\Models\ValueObjects\PrintRules; use Domain\Models\ValueObjects\ProcessingCode; -use Domain\Models\ValueObjects\RequestedCoupon\RequestedCouponId; use Domain\Models\ValueObjects\RequestedCoupon\RequestedCouponQuantity; use Domain\Models\ValueObjects\WarningThresholdQuantity; use Domain\Ports\Repositories\CampaignRequestRepository; use Shared\DDD\UseCases\Input as BaseInput; use Shared\Enums\Currency; use DateTime; +use Domain\Models\ValueObjects\RequestedCoupon\RequestedCoupon; use Shared\ValueObjects\Email; use Shared\ValueObjects\Money; @@ -49,8 +48,7 @@ describe('reject campaign request use case', function (): void { }); beforeEach(function (): void { - $this->requestedCoupon = RequestedCoupon::hydrate( - RequestedCouponId::generate(), + $this->requestedCoupon = new RequestedCoupon( new CouponName('Coupon A'), new CouponProductName('Product A'), new RequestedCouponQuantity(100), diff --git a/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php b/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php index caf16b5..837ae04 100644 --- a/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php +++ b/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php @@ -9,7 +9,6 @@ use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestType; use Domain\Enums\Country; use Domain\Models\Entities\CampaignRequest; -use Domain\Models\Entities\RequestedCoupon; use Domain\Models\ValueObjects\Brand\BrandCode; use Domain\Models\ValueObjects\CampaignRequest\Applicant; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestId; @@ -24,7 +23,6 @@ use Domain\Models\ValueObjects\Period; use Domain\Models\ValueObjects\PicturePath; use Domain\Models\ValueObjects\PrintRules; use Domain\Models\ValueObjects\ProcessingCode; -use Domain\Models\ValueObjects\RequestedCoupon\RequestedCouponId; use Ramsey\Uuid\Uuid; use Shared\Enums\Currency; use DateTime; @@ -32,6 +30,7 @@ use Shared\ValueObjects\Email; use Shared\ValueObjects\Money; use Carbon\CarbonImmutable; use Domain\Models\ValueObjects\CountryAuthorized; +use Domain\Models\ValueObjects\RequestedCoupon\RequestedCoupon; use Domain\Models\ValueObjects\RequestedCoupon\RequestedCouponQuantity; use Domain\Models\ValueObjects\WarningThresholdQuantity; @@ -43,8 +42,7 @@ describe('campaign request', function (): void { }); beforeEach(function (): void { - $this->requestedCoupon = RequestedCoupon::hydrate( - RequestedCouponId::generate(), + $this->requestedCoupon = new RequestedCoupon( new CouponName('Coupon A'), new CouponProductName('Product A'), new RequestedCouponQuantity(100), diff --git a/tests/Unit/Domain/Models/Entities/RequestedCouponTest.php b/tests/Unit/Domain/Models/Entities/RequestedCouponTest.php deleted file mode 100644 index a06c737..0000000 --- a/tests/Unit/Domain/Models/Entities/RequestedCouponTest.php +++ /dev/null @@ -1,128 +0,0 @@ -id())->toBe($id) - ->and($coupon->name)->toBe($name) - ->and($coupon->productName)->toBe($productName) - ->and($coupon->quantity)->toBe($quantity) - ->and($coupon->warningThresholdQuantity)->toBe($warningThresholdQuantity) - ->and($coupon->period)->toBe($period) - ->and($coupon->moneyAmount)->toBe($moneyAmount) - ->and($coupon->processingCode)->toBe($processingCode) - ->and($coupon->couponPicture)->toBe($couponPicture) - ->and($coupon->gs1)->toBe($gs1) - ->and($coupon->couponValidity)->toBe($couponValidity) - ->and($coupon->updatedAt)->toBeNull() - ->and($coupon->updatedAt())->toBeNull(); - }); - - it('hydrates a requested coupon with an explicit updatedAt date', function (): void { - // GIVEN - $updatedAt = new \DateTimeImmutable('2026-06-15 12:00:00', new \DateTimeZone('UTC')); - - // WHEN - $coupon = RequestedCoupon::hydrate( - RequestedCouponId::generate(), - new CouponName('Coupon A'), - new CouponProductName('Product A'), - new RequestedCouponQuantity(100), - new WarningThresholdQuantity(10), - new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01')), - new MoneyAmount(new Money(Currency::EUR, 300)), - new ProcessingCode('PC1'), - new CouponPicture(new PicturePath('coupons/product.jpg'), new PicturePath('coupons/thumbnail.jpg')), - new GS1('01234567890128', BarcodeFormat::EAN13), - new CouponValidity(30, new DateTime()), - $updatedAt, - ); - - // THEN - expect($coupon->updatedAt)->toBe($updatedAt) - ->and($coupon->updatedAt())->toBe($updatedAt); - }); - - it('returns the creation date extracted from the id', function (): void { - // GIVEN - $expected = new \DateTimeImmutable('2024-06-15 12:34:56.789000', new \DateTimeZone('UTC')); - $id = new RequestedCouponId(Uuid::uuid7($expected)); - $coupon = RequestedCoupon::hydrate( - $id, - new CouponName('Coupon A'), - new CouponProductName('Product A'), - new RequestedCouponQuantity(100), - new WarningThresholdQuantity(10), - new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01')), - new MoneyAmount(new Money(Currency::EUR, 300)), - new ProcessingCode('PC1'), - new CouponPicture(new PicturePath('coupons/product.jpg'), new PicturePath('coupons/thumbnail.jpg')), - new GS1('01234567890128', BarcodeFormat::EAN13), - new CouponValidity(30, new DateTime()), - ); - - // WHEN - $result = $coupon->createdAt(); - - // THEN - expect($result->format('Y-m-d H:i:s.v'))->toBe($expected->format('Y-m-d H:i:s.v')); - }); -}); diff --git a/tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponIdTest.php b/tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponIdTest.php deleted file mode 100644 index 017f4ac..0000000 --- a/tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponIdTest.php +++ /dev/null @@ -1,28 +0,0 @@ -toBeInstanceOf(RequestedCouponId::class); - }); - - it('generates different ids on each call', function (): void { - // WHEN - $first = RequestedCouponId::generate(); - $second = RequestedCouponId::generate(); - - // THEN - expect((string) $first)->not->toBe((string) $second); - }); -}); diff --git a/tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponTest.php b/tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponTest.php new file mode 100644 index 0000000..f5107a9 --- /dev/null +++ b/tests/Unit/Domain/Models/ValueObjects/RequestedCoupon/RequestedCouponTest.php @@ -0,0 +1,71 @@ +name)->toBe($name) + ->and($coupon->productName)->toBe($productName) + ->and($coupon->quantity)->toBe($quantity) + ->and($coupon->warningThresholdQuantity)->toBe($warningThresholdQuantity) + ->and($coupon->period)->toBe($period) + ->and($coupon->moneyAmount)->toBe($moneyAmount) + ->and($coupon->processingCode)->toBe($processingCode) + ->and($coupon->couponPicture)->toBe($couponPicture) + ->and($coupon->gs1)->toBe($gs1) + ->and($coupon->couponValidity)->toBe($couponValidity); + }); +});