From 6d7aecbd1d313c2e3f0123da181293e2dfc3a7fd Mon Sep 17 00:00:00 2001 From: K Muller Date: Fri, 25 Sep 2026 10:24:35 +0200 Subject: [PATCH] fix: :bug: put enum in vo folder / use global country enum --- .../Find/Output/CampaignRequestFound.php | 12 +- .../List/CampaignRequestListItem.php | 8 +- .../Reject/Output/CampaignRequestRejected.php | 4 +- src/Domain/Enums/BarcodeFormat.php | 6 +- src/Domain/Enums/Campaign/CampaignStatus.php | 12 - src/Domain/Enums/Campaign/CampaignType.php | 11 - src/Domain/Enums/Country.php | 580 +++++++++++++++++- .../UnknownCountryIsoCodeException.php | 20 + src/Domain/Models/Entities/Campaign.php | 8 +- .../Models/Entities/CampaignRequest.php | 26 +- .../CampaignRequestFilters.php | 3 +- .../CampaignRequest/CampaignRequestStatus.php | 12 + .../CampaignRequest/CampaignRequestType.php | 11 + .../Models/ValueObjects/CountryAuthorized.php | 46 ++ .../Coupon/CouponLegalInformation.php | 4 +- .../ValueObjects/Coupon/CouponProductInfo.php | 4 +- src/Shared/Enums/Currency.php | 2 +- src/Shared/ValueObjects/Money.php | 2 +- .../Find/FindCampaignRequestTest.php | 25 +- .../List/ListCampaignsRequestTest.php | 19 +- .../Reject/RejectCampaignRequestTest.php | 21 +- tests/Unit/Domain/Enums/BarcodeFormatTest.php | 6 +- .../Enums/Campaign/CampaignStatusTest.php | 12 +- .../Enums/Campaign/CampaignTypeTest.php | 10 +- tests/Unit/Domain/Enums/CountryTest.php | 8 +- .../Models/Entities/CampaignRequestTest.php | 69 ++- .../Domain/Models/Entities/CampaignTest.php | 15 +- .../Domain/Models/Entities/CouponTest.php | 38 +- .../CampaignRequestFiltersTest.php | 6 +- .../Models/ValueObjects/CountryAuthorized.php | 65 ++ .../Coupon/CouponLegalInformationTest.php | 5 +- .../Coupon/CouponProductInfoTest.php | 5 +- tests/Unit/Shared/Enums/CurrencyTest.php | 2 +- 33 files changed, 907 insertions(+), 170 deletions(-) delete mode 100644 src/Domain/Enums/Campaign/CampaignStatus.php delete mode 100644 src/Domain/Enums/Campaign/CampaignType.php create mode 100644 src/Domain/Exceptions/UnknownCountryIsoCodeException.php create mode 100644 src/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestStatus.php create mode 100644 src/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestType.php create mode 100644 src/Domain/Models/ValueObjects/CountryAuthorized.php create mode 100644 tests/Unit/Domain/Models/ValueObjects/CountryAuthorized.php diff --git a/src/Application/UseCases/CampaignRequest/Find/Output/CampaignRequestFound.php b/src/Application/UseCases/CampaignRequest/Find/Output/CampaignRequestFound.php index ecb675e..eb0d481 100644 --- a/src/Application/UseCases/CampaignRequest/Find/Output/CampaignRequestFound.php +++ b/src/Application/UseCases/CampaignRequest/Find/Output/CampaignRequestFound.php @@ -4,13 +4,13 @@ declare(strict_types=1); namespace Application\UseCases\CampaignRequest\Find\Output; -use Domain\Enums\Campaign\CampaignStatus; -use Domain\Enums\Campaign\CampaignType; -use Domain\Enums\Country; +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; final readonly class CampaignRequestFound implements Output @@ -18,11 +18,11 @@ final readonly class CampaignRequestFound implements Output public function __construct( public Brand $brand, public Applicant $applicant, - public Country $country, - public CampaignType $campaignType, + public CountryAuthorized $country, + public CampaignRequestType $campaignType, public ?PrintRules $printRules, public RequestedCoupon $requestedCoupon, - public CampaignStatus $status, + public CampaignRequestStatus $status, public ?RejectionReason $rejectionReason, public \DateTimeInterface $createdAt, public ?\DateTimeInterface $updatedAt, diff --git a/src/Application/UseCases/CampaignRequest/List/CampaignRequestListItem.php b/src/Application/UseCases/CampaignRequest/List/CampaignRequestListItem.php index 6d622f4..ebfa33e 100644 --- a/src/Application/UseCases/CampaignRequest/List/CampaignRequestListItem.php +++ b/src/Application/UseCases/CampaignRequest/List/CampaignRequestListItem.php @@ -4,8 +4,8 @@ declare(strict_types=1); namespace Application\UseCases\CampaignRequest\List; -use Domain\Enums\Campaign\CampaignStatus; -use Domain\Enums\Campaign\CampaignType; +use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus; +use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestType; use Domain\Models\ValueObjects\Brand\BrandCode; use Domain\Models\ValueObjects\CampaignRequest\Applicant; @@ -14,8 +14,8 @@ final readonly class CampaignRequestListItem public function __construct( public BrandCode $code, public Applicant $applicant, - public CampaignType $campaignType, - public CampaignStatus $status + public CampaignRequestType $campaignType, + public CampaignRequestStatus $status ) { } } diff --git a/src/Application/UseCases/CampaignRequest/Reject/Output/CampaignRequestRejected.php b/src/Application/UseCases/CampaignRequest/Reject/Output/CampaignRequestRejected.php index e27372f..ceca5c6 100644 --- a/src/Application/UseCases/CampaignRequest/Reject/Output/CampaignRequestRejected.php +++ b/src/Application/UseCases/CampaignRequest/Reject/Output/CampaignRequestRejected.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace Application\UseCases\CampaignRequest\Reject\Output; -use Domain\Enums\Campaign\CampaignStatus; +use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestId; use Domain\Models\ValueObjects\CampaignRequest\RejectionReason; @@ -12,7 +12,7 @@ final readonly class CampaignRequestRejected implements Output { public function __construct( public CampaignRequestId $id, - public CampaignStatus $status, + public CampaignRequestStatus $status, public RejectionReason $rejectionReason, public \DateTimeInterface $updatedAt, ) { diff --git a/src/Domain/Enums/BarcodeFormat.php b/src/Domain/Enums/BarcodeFormat.php index 5c625c6..f648d9d 100644 --- a/src/Domain/Enums/BarcodeFormat.php +++ b/src/Domain/Enums/BarcodeFormat.php @@ -6,7 +6,7 @@ namespace Domain\Enums; enum BarcodeFormat: string { - case EAN13 = "ean"; - case CODE128 = "code128"; - case GS1_128 = "gs1"; + case EAN13 = 'ean'; + case CODE128 = 'code128'; + case GS1_128 = 'gs1'; } diff --git a/src/Domain/Enums/Campaign/CampaignStatus.php b/src/Domain/Enums/Campaign/CampaignStatus.php deleted file mode 100644 index c617a78..0000000 --- a/src/Domain/Enums/Campaign/CampaignStatus.php +++ /dev/null @@ -1,12 +0,0 @@ -value => 'Afghanistan', + self::ALAND_ISLANDS->value => 'Åland Islands', + self::ALBANIA->value => 'Albania', + self::ALGERIA->value => 'Algeria', + self::AMERICAN_SAMOA->value => 'American Samoa', + self::ANDORRA->value => 'Andorra', + self::ANGOLA->value => 'Angola', + self::ANGUILLA->value => 'Anguilla', + self::ANTARCTICA->value => 'Antarctica', + self::ANTIGUA_AND_BARBUDA->value => 'Antigua and Barbuda', + self::ARGENTINA->value => 'Argentina', + self::ARMENIA->value => 'Armenia', + self::ARUBA->value => 'Aruba', + self::AUSTRALIA->value => 'Australia', + self::AUSTRIA->value => 'Austria', + self::AZERBAIJAN->value => 'Azerbaijan', + self::BAHRAIN->value => 'Bahrain', + self::BAHAMAS->value => 'Bahamas', + self::BANGLADESH->value => 'Bangladesh', + self::BARBADOS->value => 'Barbados', + self::BELARUS->value => 'Belarus', + self::BELGIUM->value => 'Belgium', + self::BELIZE->value => 'Belize', + self::BENIN->value => 'Benin', + self::BERMUDA->value => 'Bermuda', + self::BHUTAN->value => 'Bhutan', + self::BOLIVIA_PLURINATIONAL_STATE_OF->value => 'Bolivia, Plurinational State of', + self::BONAIRE_SINT_EUSTATIUS_AND_SABA->value => 'Bonaire, Sint Eustatius and Saba', + self::BOSNIA_AND_HERZEGOVINA->value => 'Bosnia and Herzegovina', + self::BOTSWANA->value => 'Botswana', + self::BOUVET_ISLAND->value => 'Bouvet Island', + self::BRAZIL->value => 'Brazil', + self::BRITISH_INDIAN_OCEAN_TERRITORY->value => 'British Indian Ocean Territory', + self::BRUNEI_DARUSSALAM->value => 'Brunei Darussalam', + self::BULGARIA->value => 'Bulgaria', + self::BURKINA_FASO->value => 'Burkina Faso', + self::BURUNDI->value => 'Burundi', + self::CAMBODIA->value => 'Cambodia', + self::CAMEROON->value => 'Cameroon', + self::CANADA->value => 'Canada', + self::CAPE_VERDE->value => 'Cape Verde', + self::CAYMAN_ISLANDS->value => 'Cayman Islands', + self::CENTRAL_AFRICAN_REPUBLIC->value => 'Central African Republic', + self::CHAD->value => 'Chad', + self::CHILE->value => 'Chile', + self::CHINA->value => 'China', + self::CHRISTMAS_ISLAND->value => 'Christmas Island', + self::COCOS_KEELING_ISLANDS->value => 'Cocos (Keeling) Islands', + self::COLOMBIA->value => 'Colombia', + self::COMOROS->value => 'Comoros', + self::CONGO->value => 'Congo', + self::CONGO_THE_DEMOCRATIC_REPUBLIC_OF_THE->value => 'Congo, the Democratic Republic of the', + self::COOK_ISLANDS->value => 'Cook Islands', + self::COSTA_RICA->value => 'Costa Rica', + self::COTE_DIVOIRE->value => 'Côte d\'Ivoire', + self::CROATIA->value => 'Croatia', + self::CUBA->value => 'Cuba', + self::CURACAO->value => 'Curaçao', + self::CYPRUS->value => 'Cyprus', + self::CZECH_REPUBLIC->value => 'Czech Republic', + self::DENMARK->value => 'Denmark', + self::DJIBOUTI->value => 'Djibouti', + self::DOMINICA->value => 'Dominica', + self::DOMINICAN_REPUBLIC->value => 'Dominican Republic', + self::ECUADOR->value => 'Ecuador', + self::EGYPT->value => 'Egypt', + self::EL_SALVADOR->value => 'El Salvador', + self::EQUATORIAL_GUINEA->value => 'Equatorial Guinea', + self::ERITREA->value => 'Eritrea', + self::ESTONIA->value => 'Estonia', + self::ETHIOPIA->value => 'Ethiopia', + self::FALKLAND_ISLANDS_MALVINAS->value => 'Falkland Islands (Malvinas)', + self::FAROE_ISLANDS->value => 'Faroe Islands', + self::FIJI->value => 'Fiji', + self::FINLAND->value => 'Finland', + self::FRANCE->value => 'France', + self::FRENCH_GUIANA->value => 'French Guiana', + self::FRENCH_POLYNESIA->value => 'French Polynesia', + self::FRENCH_SOUTHERN_TERRITORIES->value => 'French Southern Territories', + self::GABON->value => 'Gabon', + self::GAMBIA->value => 'Gambia', + self::GEORGIA->value => 'Georgia', + self::GERMANY->value => 'Germany', + self::GHANA->value => 'Ghana', + self::GIBRALTAR->value => 'Gibraltar', + self::GREECE->value => 'Greece', + self::GREENLAND->value => 'Greenland', + self::GRENADA->value => 'Grenada', + self::GUADELOUPE->value => 'Guadeloupe', + self::GUAM->value => 'Guam', + self::GUATEMALA->value => 'Guatemala', + self::GUERNSEY->value => 'Guernsey', + self::GUINEA->value => 'Guinea', + self::GUINEA_BISSAU->value => 'GuineaBissau', + self::GUYANA->value => 'Guyana', + self::HAITI->value => 'Haiti', + self::HEARD_ISLAND_AND_MCDONALD_ISLANDS->value => 'Heard Island and McDonald Islands', + self::HOLY_SEE_VATICAN_CITY_STATE->value => 'Holy See (Vatican City State)', + self::HONDURAS->value => 'Honduras', + self::HONG_KONG->value => 'Hong Kong', + self::HUNGARY->value => 'Hungary', + self::ICELAND->value => 'Iceland', + self::INDIA->value => 'India', + self::INDONESIA->value => 'Indonesia', + self::IRAN_ISLAMIC_REPUBLIC_OF->value => 'Iran, Islamic Republic of', + self::IRAQ->value => 'Iraq', + self::IRELAND->value => 'Ireland', + self::ISLE_OF_MAN->value => 'Isle of Man', + self::ISRAEL->value => 'Israel', + self::ITALY->value => 'Italy', + self::JAMAICA->value => 'Jamaica', + self::JAPAN->value => 'Japan', + self::JERSEY->value => 'Jersey', + self::JORDAN->value => 'Jordan', + self::KAZAKHSTAN->value => 'Kazakhstan', + self::KENYA->value => 'Kenya', + self::KIRIBATI->value => 'Kiribati', + self::KOREA_DEMOCRATIC_PEOPLES_REPUBLIC_OF->value => 'Korea, Democratic People\'s Republic of', + self::KOREA_REPUBLIC_OF->value => 'Korea, Republic of', + self::KUWAIT->value => 'Kuwait', + self::KYRGYZSTAN->value => 'Kyrgyzstan', + self::LAO_PEOPLES_DEMOCRATIC_REPUBLIC->value => 'Lao People\'s Democratic Republic', + self::LATVIA->value => 'Latvia', + self::LEBANON->value => 'Lebanon', + self::LESOTHO->value => 'Lesotho', + self::LIBERIA->value => 'Liberia', + self::LIBYA->value => 'Libya', + self::LIECHTENSTEIN->value => 'Liechtenstein', + self::LITHUANIA->value => 'Lithuania', + self::LUXEMBOURG->value => 'Luxembourg', + self::MACAO->value => 'Macao', + self::MACEDONIA_THE_FORMER_YUGOSLAV_REPUBLIC_OF->value => 'Macedonia, the Former Yugoslav Republic of', + self::MADAGASCAR->value => 'Madagascar', + self::MALAWI->value => 'Malawi', + self::MALAYSIA->value => 'Malaysia', + self::MALDIVES->value => 'Maldives', + self::MALI->value => 'Mali', + self::MALTA->value => 'Malta', + self::MARSHALL_ISLANDS->value => 'Marshall Islands', + self::MARTINIQUE->value => 'Martinique', + self::MAURITANIA->value => 'Mauritania', + self::MAURITIUS->value => 'Mauritius', + self::MAYOTTE->value => 'Mayotte', + self::MEXICO->value => 'Mexico', + self::MICRONESIA_FEDERATED_STATES_OF->value => 'Micronesia, Federated States of', + self::MOLDOVA_REPUBLIC_OF->value => 'Moldova, Republic of', + self::MONACO->value => 'Monaco', + self::MONGOLIA->value => 'Mongolia', + self::MONTENEGRO->value => 'Montenegro', + self::MONTSERRAT->value => 'Montserrat', + self::MOROCCO->value => 'Morocco', + self::MOZAMBIQUE->value => 'Mozambique', + self::MYANMAR->value => 'Myanmar', + self::NAMIBIA->value => 'Namibia', + self::NAURU->value => 'Nauru', + self::NEPAL->value => 'Nepal', + self::NETHERLANDS->value => 'Netherlands', + self::NEW_CALEDONIA->value => 'New Caledonia', + self::NEW_ZEALAND->value => 'New Zealand', + self::NICARAGUA->value => 'Nicaragua', + self::NIGER->value => 'Niger', + self::NIGERIA->value => 'Nigeria', + self::NIUE->value => 'Niue', + self::NORFOLK_ISLAND->value => 'Norfolk Island', + self::NORTHERN_MARIANA_ISLANDS->value => 'Northern Mariana Islands', + self::NORWAY->value => 'Norway', + self::OMAN->value => 'Oman', + self::PAKISTAN->value => 'Pakistan', + self::PALAU->value => 'Palau', + self::PALESTINE_STATE_OF->value => 'Palestine, State of', + self::PANAMA->value => 'Panama', + self::PAPUA_NEW_GUINEA->value => 'Papua New Guinea', + self::PARAGUAY->value => 'Paraguay', + self::PERU->value => 'Peru', + self::PHILIPPINES->value => 'Philippines', + self::PITCAIRN->value => 'Pitcairn', + self::POLAND->value => 'Poland', + self::PORTUGAL->value => 'Portugal', + self::PUERTO_RICO->value => 'Puerto Rico', + self::QATAR->value => 'Qatar', + self::REUNION->value => 'Réunion', + self::ROMANIA->value => 'Romania', + self::RUSSIAN_FEDERATION->value => 'Russian Federation', + self::RWANDA->value => 'Rwanda', + self::SAINT_BARTHELEMY->value => 'Saint Barthélemy', + self::SAINT_HELENA_ASCENSION_AND_TRISTAN_DA_CUNHA->value => 'Saint Helena, Ascension and Tristan da Cunha', + self::SAINT_KITTS_AND_NEVIS->value => 'Saint Kitts and Nevis', + self::SAINT_LUCIA->value => 'Saint Lucia', + self::SAINT_MARTIN_FRENCH_PART->value => 'Saint Martin (French part)', + self::SAINT_PIERRE_AND_MIQUELON->value => 'Saint Pierre and Miquelon', + self::SAINT_VINCENT_AND_THE_GRENADINES->value => 'Saint Vincent and the Grenadines', + self::SAMOA->value => 'Samoa', + self::SAN_MARINO->value => 'San Marino', + self::SAO_TOME_AND_PRINCIPE->value => 'Sao Tome and Principe', + self::SAUDI_ARABIA->value => 'Saudi Arabia', + self::SENEGAL->value => 'Senegal', + self::SERBIA->value => 'Serbia', + self::SEYCHELLES->value => 'Seychelles', + self::SIERRA_LEONE->value => 'Sierra Leone', + self::SINGAPORE->value => 'Singapore', + self::SINT_MAARTEN_DUTCH_PART->value => 'Sint Maarten (Dutch part)', + self::SLOVAKIA->value => 'Slovakia', + self::SLOVENIA->value => 'Slovenia', + self::SOLOMON_ISLANDS->value => 'Solomon Islands', + self::SOMALIA->value => 'Somalia', + self::SOUTH_AFRICA->value => 'South Africa', + self::SOUTH_GEORGIA_AND_THE_SOUTH_SANDWICH_ISLANDS->value => 'South Georgia and the South Sandwich Islands', + self::SOUTH_SUDAN->value => 'South Sudan', + self::SPAIN->value => 'Spain', + self::SRI_LANKA->value => 'Sri Lanka', + self::SUDAN->value => 'Sudan', + self::SURINAME->value => 'Suriname', + self::SVALBARD_AND_JAN_MAYEN->value => 'Svalbard and Jan Mayen', + self::SWAZILAND->value => 'Swaziland', + self::SWEDEN->value => 'Sweden', + self::SWITZERLAND->value => 'Switzerland', + self::SYRIAN_ARAB_REPUBLIC->value => 'Syrian Arab Republic', + self::TAIWAN_PROVINCE_OF_CHINA->value => 'Taiwan, Province of China', + self::TAJIKISTAN->value => 'Tajikistan', + self::TANZANIA_UNITED_REPUBLIC_OF->value => 'Tanzania, United Republic of', + self::THAILAND->value => 'Thailand', + self::TIMOR_LESTE->value => 'TimorLeste', + self::TOGO->value => 'Togo', + self::TOKELAU->value => 'Tokelau', + self::TONGA->value => 'Tonga', + self::TRINIDAD_AND_TOBAGO->value => 'Trinidad and Tobago', + self::TUNISIA->value => 'Tunisia', + self::TURKEY->value => 'Turkey', + self::TURKMENISTAN->value => 'Turkmenistan', + self::TURKS_AND_CAICOS_ISLANDS->value => 'Turks and Caicos Islands', + self::TUVALU->value => 'Tuvalu', + self::UGANDA->value => 'Uganda', + self::UKRAINE->value => 'Ukraine', + self::UNITED_ARAB_EMIRATES->value => 'United Arab Emirates', + self::UNITED_KINGDOM->value => 'United Kingdom', + self::UNITED_STATES->value => 'United States', + self::UNITED_STATES_MINOR_OUTLYING_ISLANDS->value => 'United States Minor Outlying Islands', + self::URUGUAY->value => 'Uruguay', + self::UZBEKISTAN->value => 'Uzbekistan', + self::VANUATU->value => 'Vanuatu', + self::VENEZUELA_BOLIVARIAN_REPUBLIC_OF->value => 'Venezuela, Bolivarian Republic of', + self::VIET_NAM->value => 'Viet Nam', + self::VIRGIN_ISLANDS_BRITISH->value => 'Virgin Islands, British', + self::VIRGIN_ISLANDS_US->value => 'Virgin Islands, U.S.', + self::WALLIS_AND_FUTUNA->value => 'Wallis and Futuna', + self::WESTERN_SAHARA->value => 'Western Sahara', + self::YEMEN->value => 'Yemen', + self::ZAMBIA->value => 'Zambia', + self::ZIMBABWE->value => 'Zimbabwe', + ]; + /** + * Custom added ISOCODES definition + */ + private const ISOCODES = [ + self::FRANCE->name => 'FR', + self::GUADELOUPE->name => 'GSP', + self::MARTINIQUE->name => 'MQ', + self::FRENCH_GUIANA->name => 'GF', + self::REUNION->name => 'RE', + self::SAINT_PIERRE_AND_MIQUELON->name => 'PM', + self::MAYOTTE->name => 'YT', + self::SAINT_BARTHELEMY->name => 'BL', + self::SAINT_MARTIN_FRENCH_PART->name => 'MF', + self::WALLIS_AND_FUTUNA->name => 'WF', + self::FRENCH_POLYNESIA->name => 'PF', + self::NEW_CALEDONIA->name => 'NC', + ]; + + /** + * Custom added Numerical ISOCODES definition + */ + private const ISOCODES_NUM = [ + self::FRANCE->name => 250, + self::GUADELOUPE->name => 312, + self::MARTINIQUE->name => 474, + self::FRENCH_GUIANA->name => 254, + self::REUNION->name => 638, + self::SAINT_PIERRE_AND_MIQUELON->name => 666, + self::MAYOTTE->name => 175, + self::SAINT_BARTHELEMY->name => 652, + self::SAINT_MARTIN_FRENCH_PART->name => 663, + self::WALLIS_AND_FUTUNA->name => 876, + self::FRENCH_POLYNESIA->name => 258, + self::NEW_CALEDONIA->name => 540, + ]; + + /** + * Get ISOCODE + */ + public function iso(): string + { + return self::ISOCODES[$this->name] ?? throw UnknownCountryIsoCodeException::fromCountry($this); + } + + /** + * Get ISOCODE NUM + */ + public function isoNum(): int + { + return self::ISOCODES_NUM[$this->name] ?? throw UnknownCountryIsoCodeException::fromCountry($this); + } + + /** + * Get ISOCODE + */ + public function isoCode(): ?string + { + return self::ISOCODES[$this->name] ?? null; + } + + /** + * Get enum ISOCODES + * + * @return array + */ + public static function toIsoCodes(): array + { + return self::ISOCODES; + } } diff --git a/src/Domain/Exceptions/UnknownCountryIsoCodeException.php b/src/Domain/Exceptions/UnknownCountryIsoCodeException.php new file mode 100644 index 0000000..6b566a3 --- /dev/null +++ b/src/Domain/Exceptions/UnknownCountryIsoCodeException.php @@ -0,0 +1,20 @@ +name}'"); + } +} diff --git a/src/Domain/Models/Entities/Campaign.php b/src/Domain/Models/Entities/Campaign.php index 4030a0e..f517879 100644 --- a/src/Domain/Models/Entities/Campaign.php +++ b/src/Domain/Models/Entities/Campaign.php @@ -4,12 +4,12 @@ declare(strict_types=1); namespace Domain\Models\Entities; -use Domain\Enums\Country; use Domain\Models\ValueObjects\Brand\BrandCode; use Domain\Models\ValueObjects\Campaign\CampaignCode; use Domain\Models\ValueObjects\Campaign\CampaignCoupon; use Domain\Models\ValueObjects\Campaign\CampaignId; use Domain\Models\ValueObjects\Campaign\CampaignName; +use Domain\Models\ValueObjects\CountryAuthorized; use Shared\DDD\Models\AggregateRoot; use Shared\DDD\Models\HasTimestampIdentifier; @@ -25,7 +25,7 @@ final readonly class Campaign implements AggregateRoot, HasTimestampIdentifier public CampaignName $name, public bool $publication, public bool $printAllAtOnce, - public Country $availableIn, + public CountryAuthorized $availableIn, /** @var array $coupons */ public array $coupons, public BrandCode $brand, @@ -62,7 +62,7 @@ final readonly class Campaign implements AggregateRoot, HasTimestampIdentifier CampaignName $name, bool $publication, bool $printAllAtOnce, - Country $availableIn, + CountryAuthorized $availableIn, /** @var array $coupons */ array $coupons, BrandCode $brand, @@ -92,7 +92,7 @@ final readonly class Campaign implements AggregateRoot, HasTimestampIdentifier CampaignName $name, bool $publication, bool $printAllAtOnce, - Country $availableIn, + CountryAuthorized $availableIn, array $coupons, BrandCode $brand, ?\DateTimeInterface $updatedAt = null, diff --git a/src/Domain/Models/Entities/CampaignRequest.php b/src/Domain/Models/Entities/CampaignRequest.php index bdf1de0..7858146 100644 --- a/src/Domain/Models/Entities/CampaignRequest.php +++ b/src/Domain/Models/Entities/CampaignRequest.php @@ -4,13 +4,13 @@ declare(strict_types=1); namespace Domain\Models\Entities; -use Domain\Enums\Campaign\CampaignStatus; -use Domain\Enums\Campaign\CampaignType; -use Domain\Enums\Country; +use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus; +use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestType; use Domain\Models\ValueObjects\Brand\BrandCode; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestId; use Domain\Models\ValueObjects\CampaignRequest\Applicant; use Domain\Models\ValueObjects\CampaignRequest\RejectionReason; +use Domain\Models\ValueObjects\CountryAuthorized; use Domain\Models\ValueObjects\PrintRules; use Shared\DDD\Models\AggregateRoot; use Shared\DDD\Models\HasTimestampIdentifier; @@ -25,19 +25,19 @@ final readonly class CampaignRequest implements AggregateRoot, HasTimestampIdent public CampaignRequestId $id, public BrandCode $code, public Applicant $applicant, - public Country $country, - public CampaignType $campaignType, + public CountryAuthorized $country, + public CampaignRequestType $campaignType, public ?PrintRules $printRules, public RequestedCoupon $requestedCoupon, - public CampaignStatus $status, + public CampaignRequestStatus $status, public ?RejectionReason $rejectionReason = null, public ?\DateTimeInterface $updatedAt = null, ) { - if ($this->status === CampaignStatus::REJECTED && ! $this->rejectionReason instanceof RejectionReason) { + if ($this->status === CampaignRequestStatus::REJECTED && ! $this->rejectionReason instanceof RejectionReason) { throw new \DomainException('A rejection reason is required when the campaign request is rejected.'); } - if ($this->status !== CampaignStatus::REJECTED && $this->rejectionReason instanceof RejectionReason) { + if ($this->status !== CampaignRequestStatus::REJECTED && $this->rejectionReason instanceof RejectionReason) { throw new \DomainException('A rejection reason can only be set when the campaign request is rejected.'); } } @@ -62,11 +62,11 @@ final readonly class CampaignRequest implements AggregateRoot, HasTimestampIdent CampaignRequestId $id, BrandCode $code, Applicant $applicant, - Country $country, - CampaignType $campaignType, + CountryAuthorized $country, + CampaignRequestType $campaignType, ?PrintRules $printRules, RequestedCoupon $requestedCoupon, - CampaignStatus $status, + CampaignRequestStatus $status, ?RejectionReason $rejectionReason = null, ?\DateTimeInterface $updatedAt = null, ): self { @@ -86,7 +86,7 @@ final readonly class CampaignRequest implements AggregateRoot, HasTimestampIdent public function reject(RejectionReason $reason): self { - if ($this->status !== CampaignStatus::CREATED) { + if ($this->status !== CampaignRequestStatus::CREATED) { throw new \DomainException('Only a created campaign request can be rejected.'); } @@ -98,7 +98,7 @@ final readonly class CampaignRequest implements AggregateRoot, HasTimestampIdent campaignType: $this->campaignType, printRules: $this->printRules, requestedCoupon: $this->requestedCoupon, - status: CampaignStatus::REJECTED, + status: CampaignRequestStatus::REJECTED, rejectionReason: $reason, updatedAt: DatesHelper::now(), ); diff --git a/src/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestFilters.php b/src/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestFilters.php index e60445d..5978375 100644 --- a/src/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestFilters.php +++ b/src/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestFilters.php @@ -4,14 +4,13 @@ declare(strict_types=1); namespace Domain\Models\ValueObjects\CampaignRequest; -use Domain\Enums\Campaign\CampaignStatus; use Domain\Models\ValueObjects\Brand\BrandCode; final readonly class CampaignRequestFilters { public function __construct( public ?BrandCode $brandCode = null, - public ?CampaignStatus $status = null, + public ?CampaignRequestStatus $status = null, ) { if (null === $this->brandCode && null === $this->status) { throw new \InvalidArgumentException('CampaignRequestFilters require at least a brand code or a status.'); diff --git a/src/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestStatus.php b/src/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestStatus.php new file mode 100644 index 0000000..0907efb --- /dev/null +++ b/src/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestStatus.php @@ -0,0 +1,12 @@ + */ + private const array AUTHORIZED = [ + Country::FRANCE, + Country::BELGIUM, + Country::LUXEMBOURG, + ]; + + public function __construct( + public Country $country, + ) { + if (! in_array($this->country, self::AUTHORIZED, true)) { + throw new \DomainException(sprintf('Country "%s" is not authorized.', $this->country->name)); + } + } + + /** + * @return list + */ + public static function authorizedCountries(): array + { + return self::AUTHORIZED; + } + + #[Override] + public function equals(mixed $other): bool + { + return $other instanceof self && $this->country === $other->country; + } + + public function __toString(): string + { + return $this->country->value; + } +} diff --git a/src/Domain/Models/ValueObjects/Coupon/CouponLegalInformation.php b/src/Domain/Models/ValueObjects/Coupon/CouponLegalInformation.php index 24db4b1..0a2a344 100644 --- a/src/Domain/Models/ValueObjects/Coupon/CouponLegalInformation.php +++ b/src/Domain/Models/ValueObjects/Coupon/CouponLegalInformation.php @@ -4,14 +4,14 @@ declare(strict_types=1); namespace Domain\Models\ValueObjects\Coupon; -use Domain\Enums\Country; +use Domain\Models\ValueObjects\CountryAuthorized; use Shared\DDD\Models\Equatable; final readonly class CouponLegalInformation implements Equatable { public function __construct( public string $legalText, - public Country $forLocale + public CountryAuthorized $forLocale ) { if (mb_trim($this->legalText) === '') { throw new \DomainException('Legal text cannot be empty.'); diff --git a/src/Domain/Models/ValueObjects/Coupon/CouponProductInfo.php b/src/Domain/Models/ValueObjects/Coupon/CouponProductInfo.php index 36a4971..853343f 100644 --- a/src/Domain/Models/ValueObjects/Coupon/CouponProductInfo.php +++ b/src/Domain/Models/ValueObjects/Coupon/CouponProductInfo.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace Domain\Models\ValueObjects\Coupon; -use Domain\Enums\Country; +use Domain\Models\ValueObjects\CountryAuthorized; use Shared\DDD\Models\Equatable; final readonly class CouponProductInfo implements Equatable @@ -13,7 +13,7 @@ final readonly class CouponProductInfo implements Equatable public string $name, public string $range, public string $validityText, - public Country $forLocale + public CountryAuthorized $forLocale ) { $trimmedName = mb_trim($this->name); diff --git a/src/Shared/Enums/Currency.php b/src/Shared/Enums/Currency.php index 93b8181..08fda79 100644 --- a/src/Shared/Enums/Currency.php +++ b/src/Shared/Enums/Currency.php @@ -6,5 +6,5 @@ namespace Shared\Enums; enum Currency: string { - case EUR = "euro"; + case EUR = 'euro'; } diff --git a/src/Shared/ValueObjects/Money.php b/src/Shared/ValueObjects/Money.php index f70521b..a23553d 100644 --- a/src/Shared/ValueObjects/Money.php +++ b/src/Shared/ValueObjects/Money.php @@ -32,7 +32,7 @@ final readonly class Money implements \Stringable, Equatable { return $other instanceof self && $this->currency->value === $other->currency->value - && $this->value === $other->value; + && $this->value === $other->value; } public function __toString(): string diff --git a/tests/Unit/Application/UseCases/CampaignRequest/Find/FindCampaignRequestTest.php b/tests/Unit/Application/UseCases/CampaignRequest/Find/FindCampaignRequestTest.php index 62dc9b8..9f3667d 100644 --- a/tests/Unit/Application/UseCases/CampaignRequest/Find/FindCampaignRequestTest.php +++ b/tests/Unit/Application/UseCases/CampaignRequest/Find/FindCampaignRequestTest.php @@ -10,9 +10,9 @@ use Application\UseCases\CampaignRequest\Find\Output\CampaignRequestFound; use Application\UseCases\CampaignRequest\Find\Output\CampaignRequestNotFound; use Application\UseCases\CampaignRequest\Find\Output\Output; use Domain\Enums\BarcodeFormat; -use Domain\Enums\Campaign\CampaignStatus; -use Domain\Enums\Campaign\CampaignType; use Domain\Enums\Country; +use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus; +use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestType; use Domain\Exceptions\BrandNotFoundException; use Domain\Models\Entities\Brand; use Domain\Models\Entities\CampaignRequest; @@ -23,6 +23,7 @@ use Domain\Models\ValueObjects\Brand\BrandName; use Domain\Models\ValueObjects\CampaignRequest\Applicant; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestId; use Domain\Models\ValueObjects\CampaignRequest\RejectionReason; +use Domain\Models\ValueObjects\CountryAuthorized; use Domain\Models\ValueObjects\Coupon\CouponValidity; use Domain\Models\ValueObjects\CouponName; use Domain\Models\ValueObjects\CouponPicture; @@ -70,11 +71,11 @@ describe('find campaign request use case', function (): void { $id, $code, new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::CREATED, + CampaignRequestStatus::CREATED, ); $brand = Brand::hydrate( BrandId::generate(), @@ -117,11 +118,11 @@ describe('find campaign request use case', function (): void { $id, $code, new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::REJECTED, + CampaignRequestStatus::REJECTED, $rejectionReason, ); @@ -147,7 +148,7 @@ describe('find campaign request use case', function (): void { // THEN expect($result)->toBeInstanceOf(CampaignRequestFound::class) - ->and($result->status)->toBe(CampaignStatus::REJECTED) + ->and($result->status)->toBe(CampaignRequestStatus::REJECTED) ->and($result->rejectionReason)->toBe($rejectionReason); }); @@ -178,11 +179,11 @@ describe('find campaign request use case', function (): void { $id, $code, new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::CREATED, + CampaignRequestStatus::CREATED, ); $repository = \Mockery::mock(CampaignRequestRepository::class); diff --git a/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php b/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php index 5a06de4..8775d10 100644 --- a/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php +++ b/tests/Unit/Application/UseCases/CampaignRequest/List/ListCampaignsRequestTest.php @@ -5,8 +5,8 @@ declare(strict_types=1); namespace Application\UseCases\CampaignRequest\List; use Domain\Enums\BarcodeFormat; -use Domain\Enums\Campaign\CampaignStatus; -use Domain\Enums\Campaign\CampaignType; +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; @@ -17,6 +17,7 @@ use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestId; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestSortClause; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestSortCriteria; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestSortField; +use Domain\Models\ValueObjects\CountryAuthorized; use Domain\Models\ValueObjects\Coupon\CouponValidity; use Domain\Models\ValueObjects\CouponName; use Domain\Models\ValueObjects\CouponPicture; @@ -77,21 +78,21 @@ describe('list campaigns request use case', function (): void { CampaignRequestId::generate(), new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->couponA, - CampaignStatus::CREATED, + CampaignRequestStatus::CREATED, ); $campaignRequest2 = CampaignRequest::hydrate( CampaignRequestId::generate(), new BrandCode('AAA02'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->couponB, - CampaignStatus::CREATED, + CampaignRequestStatus::CREATED, ); $paginated = new Paginated($pagination, [$campaignRequest1, $campaignRequest2], 2); @@ -101,7 +102,7 @@ describe('list campaigns request use case', function (): void { new CampaignRequestSortClause(field: CampaignRequestSortField::CreatedAt, direction: \SortDirection::Descending) ] ); - $filters = new CampaignRequestFilters($campaignRequest2->code, CampaignStatus::CREATED); + $filters = new CampaignRequestFilters($campaignRequest2->code, CampaignRequestStatus::CREATED); $input = new Input(pagination: $pagination, sort: $sort, filters: $filters); $repository = \Mockery::mock(CampaignRequestRepository::class); diff --git a/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php b/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php index 23c3b30..7581f27 100644 --- a/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php +++ b/tests/Unit/Application/UseCases/CampaignRequest/Reject/RejectCampaignRequestTest.php @@ -11,8 +11,8 @@ use Application\UseCases\CampaignRequest\Reject\Output\Output; use Application\UseCases\CampaignRequest\Reject\RejectCampaignRequest; use Carbon\CarbonImmutable; use Domain\Enums\BarcodeFormat; -use Domain\Enums\Campaign\CampaignStatus; -use Domain\Enums\Campaign\CampaignType; +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; @@ -20,6 +20,7 @@ use Domain\Models\ValueObjects\Brand\BrandCode; use Domain\Models\ValueObjects\CampaignRequest\Applicant; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestId; use Domain\Models\ValueObjects\CampaignRequest\RejectionReason; +use Domain\Models\ValueObjects\CountryAuthorized; use Domain\Models\ValueObjects\Coupon\CouponValidity; use Domain\Models\ValueObjects\CouponName; use Domain\Models\ValueObjects\CouponPicture; @@ -69,18 +70,18 @@ describe('reject campaign request use case', function (): void { $id, new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::CREATED, + CampaignRequestStatus::CREATED, ); $reason = new RejectionReason('Missing legal documents.'); $repository = \Mockery::mock(CampaignRequestRepository::class); $repository->shouldReceive('findById')->once()->with($id)->andReturn($campaignRequest); $repository->shouldReceive('save')->once()->with(\Mockery::on( - fn (CampaignRequest $saved): bool => $saved->status === CampaignStatus::REJECTED + fn (CampaignRequest $saved): bool => $saved->status === CampaignRequestStatus::REJECTED && $saved->rejectionReason === $reason && $saved->updatedAt !== null, )); @@ -93,7 +94,7 @@ describe('reject campaign request use case', function (): void { // THEN expect($result)->toBeInstanceOf(CampaignRequestRejected::class) ->and($result->id)->toBe($id) - ->and($result->status)->toBe(CampaignStatus::REJECTED) + ->and($result->status)->toBe(CampaignRequestStatus::REJECTED) ->and($result->rejectionReason)->toBe($reason) ->and($result->updatedAt->format('Y-m-d H:i:s'))->toBe('2026-06-15 12:00:00'); }); @@ -122,11 +123,11 @@ describe('reject campaign request use case', function (): void { $id, new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::TRANSFORMED, + CampaignRequestStatus::TRANSFORMED, ); $repository = \Mockery::mock(CampaignRequestRepository::class); diff --git a/tests/Unit/Domain/Enums/BarcodeFormatTest.php b/tests/Unit/Domain/Enums/BarcodeFormatTest.php index e91bf1d..d1af8e0 100644 --- a/tests/Unit/Domain/Enums/BarcodeFormatTest.php +++ b/tests/Unit/Domain/Enums/BarcodeFormatTest.php @@ -11,9 +11,9 @@ covers(BarcodeFormat::class); describe('barcode format', function (): void { it('has the expected cases with their backing values', function (): void { // THEN - expect(BarcodeFormat::EAN13->value)->toBe("ean") - ->and(BarcodeFormat::CODE128->value)->toBe("code128") - ->and(BarcodeFormat::GS1_128->value)->toBe("gs1"); + expect(BarcodeFormat::EAN13->value)->toBe('ean') + ->and(BarcodeFormat::CODE128->value)->toBe('code128') + ->and(BarcodeFormat::GS1_128->value)->toBe('gs1'); }); it('exposes its case name', function (): void { diff --git a/tests/Unit/Domain/Enums/Campaign/CampaignStatusTest.php b/tests/Unit/Domain/Enums/Campaign/CampaignStatusTest.php index 259264f..bcf43f5 100644 --- a/tests/Unit/Domain/Enums/Campaign/CampaignStatusTest.php +++ b/tests/Unit/Domain/Enums/Campaign/CampaignStatusTest.php @@ -4,20 +4,20 @@ declare(strict_types=1); namespace Tests\Unit\Domain\Enums\Campaign; -use Domain\Enums\Campaign\CampaignStatus; +use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus; -covers(CampaignStatus::class); +covers(CampaignRequestStatus::class); describe('campaign status', function (): void { it('has the expected cases with their backing values', function (): void { // THEN - expect(CampaignStatus::CREATED->value)->toBe("created") - ->and(CampaignStatus::TRANSFORMED->value)->toBe("transformed") - ->and(CampaignStatus::REJECTED->value)->toBe("rejected"); + expect(CampaignRequestStatus::CREATED->value)->toBe('created') + ->and(CampaignRequestStatus::TRANSFORMED->value)->toBe('transformed') + ->and(CampaignRequestStatus::REJECTED->value)->toBe('rejected'); }); it('exposes its case name', function (): void { // THEN - expect(CampaignStatus::CREATED->name)->toBe('CREATED'); + expect(CampaignRequestStatus::CREATED->name)->toBe('CREATED'); }); }); diff --git a/tests/Unit/Domain/Enums/Campaign/CampaignTypeTest.php b/tests/Unit/Domain/Enums/Campaign/CampaignTypeTest.php index f0d43b7..737fccd 100644 --- a/tests/Unit/Domain/Enums/Campaign/CampaignTypeTest.php +++ b/tests/Unit/Domain/Enums/Campaign/CampaignTypeTest.php @@ -4,19 +4,19 @@ declare(strict_types=1); namespace Tests\Unit\Domain\Enums\Campaign; -use Domain\Enums\Campaign\CampaignType; +use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestType; -covers(CampaignType::class); +covers(CampaignRequestType::class); describe('campaign type', function (): void { it('has the expected cases with their backing values', function (): void { // THEN - expect(CampaignType::CLUB->value)->toBe("club") - ->and(CampaignType::GAME->value)->toBe("game"); + expect(CampaignRequestType::CLUB->value)->toBe('club') + ->and(CampaignRequestType::GAME->value)->toBe('game'); }); it('exposes its case name', function (): void { // THEN - expect(CampaignType::CLUB->name)->toBe('CLUB'); + expect(CampaignRequestType::CLUB->name)->toBe('CLUB'); }); }); diff --git a/tests/Unit/Domain/Enums/CountryTest.php b/tests/Unit/Domain/Enums/CountryTest.php index 3252171..5445fdc 100644 --- a/tests/Unit/Domain/Enums/CountryTest.php +++ b/tests/Unit/Domain/Enums/CountryTest.php @@ -11,13 +11,13 @@ covers(Country::class); describe('country', function (): void { it('has the expected cases with their backing values', function (): void { // THEN - expect(Country::FR->value)->toBe("fr") - ->and(Country::BE->value)->toBe("be") - ->and(Country::LU->value)->toBe("lu"); + expect(Country::FRANCE->value)->toBe('france') + ->and(Country::BELGIUM->value)->toBe('belgium') + ->and(Country::LUXEMBOURG->value)->toBe('luxembourg'); }); it('exposes its case name', function (): void { // THEN - expect(Country::FR->name)->toBe('FR'); + expect(Country::FRANCE->name)->toBe('FRANCE'); }); }); diff --git a/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php b/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php index 94e6262..0cb2349 100644 --- a/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php +++ b/tests/Unit/Domain/Models/Entities/CampaignRequestTest.php @@ -5,8 +5,8 @@ declare(strict_types=1); namespace Tests\Unit\Domain\Models\Entities; use Domain\Enums\BarcodeFormat; -use Domain\Enums\Campaign\CampaignStatus; -use Domain\Enums\Campaign\CampaignType; +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; @@ -31,6 +31,7 @@ use Shared\ValueObjects\DateTime; use Shared\ValueObjects\Email; use Shared\ValueObjects\Money; use Carbon\CarbonImmutable; +use Domain\Models\ValueObjects\CountryAuthorized; covers(CampaignRequest::class); @@ -60,11 +61,11 @@ describe('campaign request', function (): void { $id = CampaignRequestId::generate(); $code = new BrandCode('AAA01'); $applicant = new Applicant('John', 'Doe', new Email('john.doe@example.com')); - $country = Country::FR; - $campaignType = CampaignType::CLUB; + $country = new CountryAuthorized(Country::FRANCE); + $campaignType = CampaignRequestType::CLUB; $printRules = new PrintRules(maxPerCustomer: 3); $requestedCoupon = $this->requestedCoupon; - $status = CampaignStatus::CREATED; + $status = CampaignRequestStatus::CREATED; // WHEN $campaignRequest = CampaignRequest::hydrate( @@ -97,11 +98,11 @@ describe('campaign request', function (): void { CampaignRequestId::generate(), new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, null, $this->requestedCoupon, - CampaignStatus::CREATED, + CampaignRequestStatus::CREATED, ); // THEN @@ -117,11 +118,11 @@ describe('campaign request', function (): void { CampaignRequestId::generate(), new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::CREATED, + CampaignRequestStatus::CREATED, null, $updatedAt, ); @@ -140,16 +141,16 @@ describe('campaign request', function (): void { CampaignRequestId::generate(), new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::REJECTED, + CampaignRequestStatus::REJECTED, $rejectionReason, ); // THEN - expect($campaignRequest->status)->toBe(CampaignStatus::REJECTED) + expect($campaignRequest->status)->toBe(CampaignRequestStatus::REJECTED) ->and($campaignRequest->rejectionReason)->toBe($rejectionReason); }); @@ -159,11 +160,11 @@ describe('campaign request', function (): void { CampaignRequestId::generate(), new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::REJECTED, + CampaignRequestStatus::REJECTED, ); // THEN @@ -179,11 +180,11 @@ describe('campaign request', function (): void { CampaignRequestId::generate(), new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::CREATED, + CampaignRequestStatus::CREATED, new RejectionReason('Missing legal documents.'), ); @@ -201,11 +202,11 @@ describe('campaign request', function (): void { CampaignRequestId::generate(), new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::CREATED, + CampaignRequestStatus::CREATED, ); $reason = new RejectionReason('Missing legal documents.'); @@ -213,7 +214,7 @@ describe('campaign request', function (): void { $rejected = $campaignRequest->reject($reason); // THEN - expect($rejected->status)->toBe(CampaignStatus::REJECTED) + expect($rejected->status)->toBe(CampaignRequestStatus::REJECTED) ->and($rejected->rejectionReason)->toBe($reason) ->and($rejected->id())->toBe($campaignRequest->id()) ->and($rejected->code)->toBe($campaignRequest->code) @@ -232,11 +233,11 @@ describe('campaign request', function (): void { CampaignRequestId::generate(), new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::TRANSFORMED, + CampaignRequestStatus::TRANSFORMED, ); // WHEN @@ -252,11 +253,11 @@ describe('campaign request', function (): void { CampaignRequestId::generate(), new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::REJECTED, + CampaignRequestStatus::REJECTED, new RejectionReason('First reason.'), ); @@ -275,11 +276,11 @@ describe('campaign request', function (): void { $id, new BrandCode('AAA01'), new Applicant('John', 'Doe', new Email('john.doe@example.com')), - Country::FR, - CampaignType::CLUB, + new CountryAuthorized(Country::FRANCE), + CampaignRequestType::CLUB, new PrintRules(maxPerCustomer: 3), $this->requestedCoupon, - CampaignStatus::CREATED, + CampaignRequestStatus::CREATED, ); // WHEN diff --git a/tests/Unit/Domain/Models/Entities/CampaignTest.php b/tests/Unit/Domain/Models/Entities/CampaignTest.php index 1eb807a..e50c295 100644 --- a/tests/Unit/Domain/Models/Entities/CampaignTest.php +++ b/tests/Unit/Domain/Models/Entities/CampaignTest.php @@ -13,6 +13,7 @@ use Domain\Models\ValueObjects\Campaign\CampaignCode; use Domain\Models\ValueObjects\Campaign\CampaignCoupon; use Domain\Models\ValueObjects\Campaign\CampaignId; use Domain\Models\ValueObjects\Campaign\CampaignName; +use Domain\Models\ValueObjects\CountryAuthorized; use Domain\Models\ValueObjects\PrintRules; use Domain\Models\ValueObjects\ProcessingCode; use Domain\Models\ValueObjects\Stock\StockId; @@ -41,7 +42,7 @@ describe('campaign', function (): void { $name = new CampaignName('Name'); $publication = \boolval(0); $printAllAtOnce = \boolval(1); - $availableIn = Country::FR; + $availableIn = new CountryAuthorized(Country::FRANCE); $coupons = [new CampaignCoupon(new ProcessingCode('PC1'), StockId::generate(), 100, new PrintRules(maxPerCustomer: 3))]; $brand = new BrandCode('AAA01'); @@ -79,7 +80,7 @@ describe('campaign', function (): void { $name = new CampaignName('Name'); $publication = \boolval(0); $printAllAtOnce = \boolval(1); - $availableIn = Country::FR; + $availableIn = new CountryAuthorized(Country::FRANCE); $coupons = []; $brand = new BrandCode('AAA01'); @@ -107,7 +108,7 @@ describe('campaign', function (): void { $name = new CampaignName('Name'); $publication = \boolval(0); $printAllAtOnce = \boolval(1); - $availableIn = Country::FR; + $availableIn = new CountryAuthorized(Country::FRANCE); $coupons = [new CampaignCoupon(new ProcessingCode('PC1'), StockId::generate(), 100, new PrintRules(maxPerCustomer: 3))]; $brand = new BrandCode('AAA01'); $updatedAt = new \DateTimeImmutable('2026-09-22 10:00:00', new \DateTimeZone('UTC')); @@ -137,7 +138,7 @@ describe('campaign', function (): void { $name = new CampaignName('Name'); $publication = \boolval(0); $printAllAtOnce = \boolval(1); - $availableIn = Country::FR; + $availableIn = new CountryAuthorized(Country::FRANCE); $coupons = [new CampaignCoupon(new ProcessingCode('PC1'), StockId::generate(), 100, new PrintRules(maxPerCustomer: 3))]; $brand = new BrandCode('AAA01'); @@ -173,7 +174,7 @@ describe('campaign', function (): void { $name = new CampaignName('Name'); $publication = \boolval(0); $printAllAtOnce = \boolval(1); - $availableIn = Country::FR; + $availableIn = new CountryAuthorized(Country::FRANCE); $coupons = [new CampaignCoupon(new ProcessingCode('PC1'), StockId::generate(), 100, new PrintRules(maxPerCustomer: 3))]; $brand = new BrandCode('AAA01'); @@ -214,7 +215,7 @@ describe('campaign', function (): void { new CampaignName('Name'), \boolval(0), \boolval(1), - Country::FR, + new CountryAuthorized(Country::FRANCE), [new CampaignCoupon(new ProcessingCode('PC1'), StockId::generate(), 100, new PrintRules(maxPerCustomer: 3))], new BrandCode('AAA01') ); @@ -233,7 +234,7 @@ describe('campaign', function (): void { $name = new CampaignName('Name'); $publication = \boolval(0); $printAllAtOnce = \boolval(1); - $availableIn = Country::FR; + $availableIn = new CountryAuthorized(Country::FRANCE); $coupons = ['PC1']; $brand = new BrandCode('AAA01'); diff --git a/tests/Unit/Domain/Models/Entities/CouponTest.php b/tests/Unit/Domain/Models/Entities/CouponTest.php index 9b485a5..d98d68a 100644 --- a/tests/Unit/Domain/Models/Entities/CouponTest.php +++ b/tests/Unit/Domain/Models/Entities/CouponTest.php @@ -10,6 +10,7 @@ use Domain\Enums\Country; use Domain\Models\Entities\Coupon; use Domain\Models\ValueObjects\Actor\ActorId; use Domain\Models\ValueObjects\Brand\BrandCode; +use Domain\Models\ValueObjects\CountryAuthorized; use Domain\Models\ValueObjects\Coupon\CouponAvailabilityCalendar; use Domain\Models\ValueObjects\Coupon\CouponDiffusion; use Domain\Models\ValueObjects\Coupon\CouponId; @@ -48,7 +49,12 @@ describe('coupon', function (): void { $diffusion = new CouponDiffusion([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]); $availability = new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]); $validity = new CouponValidity(30, new DateTime('2026-11-30')); - $legalInformation = [new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FR)]; + $legalInformation = [ + new CouponLegalInformation( + 'Lorem ipsum dolor sit amet consectetur adipiscing elit.', + new CountryAuthorized(Country::FRANCE) + ) + ]; $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); $createdBy = ActorId::generate(); @@ -105,7 +111,12 @@ describe('coupon', function (): void { $diffusion = new CouponDiffusion([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]); $availability = new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]); $validity = new CouponValidity(30, new DateTime('2026-11-30')); - $legalInformation = [new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FR)]; + $legalInformation = [ + new CouponLegalInformation( + 'Lorem ipsum dolor sit amet consectetur adipiscing elit.', + new CountryAuthorized(Country::FRANCE) + ) + ]; $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); $createdBy = ActorId::generate(); @@ -159,7 +170,12 @@ describe('coupon', function (): void { $diffusion = new CouponDiffusion([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]); $availability = new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]); $validity = new CouponValidity(30, new DateTime('2026-11-30')); - $legalInformation = [new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FR)]; + $legalInformation = [ + new CouponLegalInformation( + 'Lorem ipsum dolor sit amet consectetur adipiscing elit.', + new CountryAuthorized(Country::FRANCE) + ) + ]; $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); $gtin = new GS1('110101010', BarcodeFormat::EAN13); @@ -202,7 +218,12 @@ describe('coupon', function (): void { $diffusion = new CouponDiffusion([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]); $availability = new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]); $validity = new CouponValidity(30, new DateTime('2026-11-30')); - $legalInformation = [new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FR)]; + $legalInformation = [ + new CouponLegalInformation( + 'Lorem ipsum dolor sit amet consectetur adipiscing elit.', + new CountryAuthorized(Country::FRANCE) + ) + ]; $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); $createdBy = ActorId::generate(); @@ -257,7 +278,12 @@ describe('coupon', function (): void { $diffusion = new CouponDiffusion([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]); $availability = new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]); $validity = new CouponValidity(30, new DateTime('2026-11-30')); - $legalInformation = [new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FR)]; + $legalInformation = [ + new CouponLegalInformation( + 'Lorem ipsum dolor sit amet consectetur adipiscing elit.', + new CountryAuthorized(Country::FRANCE) + ) + ]; $code = new ProcessingCode('5425003944130'); $brandCode = new BrandCode('AAA01'); $createdBy = ActorId::generate(); @@ -316,7 +342,7 @@ describe('coupon', function (): void { new CouponDiffusion([new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01'))]), new CouponAvailabilityCalendar([new Period(new DateTime('2026-08-25'), new DateTime('2026-10-31'))]), new CouponValidity(30, new DateTime('2026-11-30')), - [new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', Country::FR)], + [new CouponLegalInformation('Lorem ipsum dolor sit amet consectetur adipiscing elit.', new CountryAuthorized(Country::FRANCE))], new ProcessingCode('5425003944130'), new BrandCode('AAA01'), ActorId::generate(), diff --git a/tests/Unit/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestFiltersTest.php b/tests/Unit/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestFiltersTest.php index 4052f9f..6083d0b 100644 --- a/tests/Unit/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestFiltersTest.php +++ b/tests/Unit/Domain/Models/ValueObjects/CampaignRequest/CampaignRequestFiltersTest.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace Tests\Unit\Domain\Models\ValueObjects; -use Domain\Enums\Campaign\CampaignStatus; use Domain\Models\ValueObjects\Brand\BrandCode; use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestFilters; +use Domain\Models\ValueObjects\CampaignRequest\CampaignRequestStatus; covers(CampaignRequestFilters::class); @@ -14,7 +14,7 @@ describe('campaign request filters', function (): void { it('creates filters with both fields set', function (): void { // GIVEN $brandCode = new BrandCode('AAA01'); - $status = CampaignStatus::CREATED; + $status = CampaignRequestStatus::CREATED; // WHEN $filters = new CampaignRequestFilters(brandCode: $brandCode, status: $status); @@ -38,7 +38,7 @@ describe('campaign request filters', function (): void { it('creates filters with only status set', function (): void { // GIVEN - $status = CampaignStatus::CREATED; + $status = CampaignRequestStatus::CREATED; // WHEN $filters = new CampaignRequestFilters(status: $status); diff --git a/tests/Unit/Domain/Models/ValueObjects/CountryAuthorized.php b/tests/Unit/Domain/Models/ValueObjects/CountryAuthorized.php new file mode 100644 index 0000000..517d2c7 --- /dev/null +++ b/tests/Unit/Domain/Models/ValueObjects/CountryAuthorized.php @@ -0,0 +1,65 @@ +toBeInstanceOf(CountryAuthorized::class) + ->and($authorized->country)->toBe($country); + })->with([ + 'france' => 'france', + 'belgium' => 'belgium', + 'luxembourg' => 'luxembourg', + ]); + + it('rejects a country that is not authorized', function (): void { + // WHEN + $action = fn (): CountryAuthorized => new CountryAuthorized(Country::GERMANY); + + // THEN + expect($action)->toThrow(\DomainException::class, 'Country "GERMANY" is not authorized.'); + }); + + it('lists the authorized countries', function (): void { + // THEN + expect(CountryAuthorized::authorizedCountries())->toBe([ + Country::FRANCE, + Country::BELGIUM, + Country::LUXEMBOURG, + ]); + }); + + it('implements equals correctly', function (): void { + // GIVEN + $france1 = new CountryAuthorized(Country::FRANCE); + $france2 = new CountryAuthorized(Country::FRANCE); + $belgium = new CountryAuthorized(Country::BELGIUM); + + // THEN + expect($france1->equals($france2))->toBeTrue() + ->and($france1->equals($belgium))->toBeFalse() + ->and($france1->equals(null))->toBeFalse(); + }); + + it('converts to string as the country backing value', function (): void { + // GIVEN + $authorized = new CountryAuthorized(Country::FRANCE); + + // THEN + expect((string) $authorized)->toBe('france'); + }); +}); diff --git a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponLegalInformationTest.php b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponLegalInformationTest.php index 7f46ee8..c3c8693 100644 --- a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponLegalInformationTest.php +++ b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponLegalInformationTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Tests\Unit\Domain\Models\ValueObjects; use Domain\Enums\Country; +use Domain\Models\ValueObjects\CountryAuthorized; use Domain\Models\ValueObjects\Coupon\CouponLegalInformation; covers(CouponLegalInformation::class); @@ -13,7 +14,7 @@ describe('coupon legal information', function (): void { it('creates a valid coupon legal information', function (): void { // GIVEN $legalText = 'Lorem ipsum dolor sit amet consectetur adipiscing elit.'; - $forLocale = Country::FR; + $forLocale = new CountryAuthorized(Country::FRANCE); // WHEN $couponLegalInformation = new CouponLegalInformation($legalText, $forLocale); @@ -26,7 +27,7 @@ describe('coupon legal information', function (): void { it('rejects invalid coupon legal information', function (): void { // GIVEN $legalText = ''; - $forLocale = Country::FR; + $forLocale = new CountryAuthorized(Country::FRANCE); // GIVEN / THEN expect(fn (): CouponLegalInformation => new CouponLegalInformation($legalText, $forLocale))->toThrow(\DomainException::class); diff --git a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProductInfoTest.php b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProductInfoTest.php index bef8718..13ae8cd 100644 --- a/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProductInfoTest.php +++ b/tests/Unit/Domain/Models/ValueObjects/Coupon/CouponProductInfoTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Tests\Unit\Domain\Models\ValueObjects; use Domain\Enums\Country; +use Domain\Models\ValueObjects\CountryAuthorized; use Domain\Models\ValueObjects\Coupon\CouponProductInfo; covers(CouponProductInfo::class); @@ -15,7 +16,7 @@ describe('coupon product info', function (): void { $name = 'Lorem ipsum'; $range = 'Lorem'; $validityText = 'Lorem ipsum dolor sit amet consectetur adipiscing elit.'; - $forLocale = Country::FR; + $forLocale = new CountryAuthorized(Country::FRANCE); // WHEN $couponProductInfo = new CouponProductInfo($name, $range, $validityText, $forLocale); @@ -32,7 +33,7 @@ describe('coupon product info', function (): void { $name = ''; $range = ''; $validityText = ''; - $forLocale = Country::FR; + $forLocale = new CountryAuthorized(Country::FRANCE); // GIVEN / THEN expect(fn (): CouponProductInfo => new CouponProductInfo($name, $range, $validityText, $forLocale))->toThrow(\DomainException::class); diff --git a/tests/Unit/Shared/Enums/CurrencyTest.php b/tests/Unit/Shared/Enums/CurrencyTest.php index 1d0a2a3..6de9498 100644 --- a/tests/Unit/Shared/Enums/CurrencyTest.php +++ b/tests/Unit/Shared/Enums/CurrencyTest.php @@ -11,6 +11,6 @@ covers(Currency::class); describe('currency', function (): void { it('has the expected cases with their backing values', function (): void { // THEN - expect(Currency::EUR->value)->toBe("euro"); + expect(Currency::EUR->value)->toBe('euro'); }); });