fix: 🐛 put enum in vo folder / use global country enum
This commit is contained in:
parent
59e4dbf2ee
commit
6d7aecbd1d
33 changed files with 907 additions and 170 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
) {
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
) {
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Domain\Enums\Campaign;
|
||||
|
||||
enum CampaignStatus: string
|
||||
{
|
||||
case CREATED = "created";
|
||||
case TRANSFORMED = "transformed";
|
||||
case REJECTED = "rejected";
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Domain\Enums\Campaign;
|
||||
|
||||
enum CampaignType: string
|
||||
{
|
||||
case CLUB = "club";
|
||||
case GAME = "game";
|
||||
}
|
||||
|
|
@ -4,9 +4,583 @@ declare(strict_types=1);
|
|||
|
||||
namespace Domain\Enums;
|
||||
|
||||
use Domain\Exceptions\UnknownCountryIsoCodeException;
|
||||
|
||||
enum Country: string
|
||||
{
|
||||
case FR = "fr";
|
||||
case BE = "be";
|
||||
case LU = "lu";
|
||||
case AFGHANISTAN = 'afghanistan';
|
||||
case ALAND_ISLANDS = 'alandIslands';
|
||||
case ALBANIA = 'albania';
|
||||
case ALGERIA = 'algeria';
|
||||
case AMERICAN_SAMOA = 'americanSamoa';
|
||||
case ANDORRA = 'andorra';
|
||||
case ANGOLA = 'angola';
|
||||
case ANGUILLA = 'anguilla';
|
||||
case ANTARCTICA = 'antarctica';
|
||||
case ANTIGUA_AND_BARBUDA = 'antiguaAndBarbuda';
|
||||
case ARGENTINA = 'argentina';
|
||||
case ARMENIA = 'armenia';
|
||||
case ARUBA = 'aruba';
|
||||
case AUSTRALIA = 'australia';
|
||||
case AUSTRIA = 'austria';
|
||||
case AZERBAIJAN = 'azerbaijan';
|
||||
case BAHRAIN = 'bahrain';
|
||||
case BAHAMAS = 'bahamas';
|
||||
case BANGLADESH = 'bangladesh';
|
||||
case BARBADOS = 'barbados';
|
||||
case BELARUS = 'belarus';
|
||||
case BELGIUM = 'belgium';
|
||||
case BELIZE = 'belize';
|
||||
case BENIN = 'benin';
|
||||
case BERMUDA = 'bermuda';
|
||||
case BHUTAN = 'bhutan';
|
||||
case BOLIVIA_PLURINATIONAL_STATE_OF = 'boliviaPlurinationalStateOf';
|
||||
case BONAIRE_SINT_EUSTATIUS_AND_SABA = 'bonaireSintEustatiusAndSaba';
|
||||
case BOSNIA_AND_HERZEGOVINA = 'bosniaAndHerzegovina';
|
||||
case BOTSWANA = 'botswana';
|
||||
case BOUVET_ISLAND = 'bouvetIsland';
|
||||
case BRAZIL = 'brazil';
|
||||
case BRITISH_INDIAN_OCEAN_TERRITORY = 'britishIndianOceanTerritory';
|
||||
case BRUNEI_DARUSSALAM = 'bruneiDarussalam';
|
||||
case BULGARIA = 'bulgaria';
|
||||
case BURKINA_FASO = 'burkinaFaso';
|
||||
case BURUNDI = 'burundi';
|
||||
case CAMBODIA = 'cambodia';
|
||||
case CAMEROON = 'cameroon';
|
||||
case CANADA = 'canada';
|
||||
case CAPE_VERDE = 'capeVerde';
|
||||
case CAYMAN_ISLANDS = 'caymanIslands';
|
||||
case CENTRAL_AFRICAN_REPUBLIC = 'centralAfricanRepublic';
|
||||
case CHAD = 'chad';
|
||||
case CHILE = 'chile';
|
||||
case CHINA = 'china';
|
||||
case CHRISTMAS_ISLAND = 'christmasIsland';
|
||||
case COCOS_KEELING_ISLANDS = 'cocosKeelingIslands';
|
||||
case COLOMBIA = 'colombia';
|
||||
case COMOROS = 'comoros';
|
||||
case CONGO = 'congo';
|
||||
case CONGO_THE_DEMOCRATIC_REPUBLIC_OF_THE = 'congoTheDemocraticRepublicOfThe';
|
||||
case COOK_ISLANDS = 'cookIslands';
|
||||
case COSTA_RICA = 'costaRica';
|
||||
case COTE_DIVOIRE = 'coteDivoire';
|
||||
case CROATIA = 'croatia';
|
||||
case CUBA = 'cuba';
|
||||
case CURACAO = 'curacao';
|
||||
case CYPRUS = 'cyprus';
|
||||
case CZECH_REPUBLIC = 'czechRepublic';
|
||||
case DENMARK = 'denmark';
|
||||
case DJIBOUTI = 'djibouti';
|
||||
case DOMINICA = 'dominica';
|
||||
case DOMINICAN_REPUBLIC = 'dominicanRepublic';
|
||||
case ECUADOR = 'ecuador';
|
||||
case EGYPT = 'egypt';
|
||||
case EL_SALVADOR = 'elSalvador';
|
||||
case EQUATORIAL_GUINEA = 'equatorialGuinea';
|
||||
case ERITREA = 'eritrea';
|
||||
case ESTONIA = 'estonia';
|
||||
case ETHIOPIA = 'ethiopia';
|
||||
case FALKLAND_ISLANDS_MALVINAS = 'falklandIslandsMalvinas';
|
||||
case FAROE_ISLANDS = 'faroeIslands';
|
||||
case FIJI = 'fiji';
|
||||
case FINLAND = 'finland';
|
||||
case FRANCE = 'france';
|
||||
case FRENCH_GUIANA = 'frenchGuiana';
|
||||
case FRENCH_POLYNESIA = 'frenchPolynesia';
|
||||
case FRENCH_SOUTHERN_TERRITORIES = 'frenchSouthernTerritories';
|
||||
case GABON = 'gabon';
|
||||
case GAMBIA = 'gambia';
|
||||
case GEORGIA = 'georgia';
|
||||
case GERMANY = 'germany';
|
||||
case GHANA = 'ghana';
|
||||
case GIBRALTAR = 'gibraltar';
|
||||
case GREECE = 'greece';
|
||||
case GREENLAND = 'greenland';
|
||||
case GRENADA = 'grenada';
|
||||
case GUADELOUPE = 'guadeloupe';
|
||||
case GUAM = 'guam';
|
||||
case GUATEMALA = 'guatemala';
|
||||
case GUERNSEY = 'guernsey';
|
||||
case GUINEA = 'guinea';
|
||||
case GUINEA_BISSAU = 'guineaBissau';
|
||||
case GUYANA = 'guyana';
|
||||
case HAITI = 'haiti';
|
||||
case HEARD_ISLAND_AND_MCDONALD_ISLANDS = 'heardIslandAndMcdonaldIslands';
|
||||
case HOLY_SEE_VATICAN_CITY_STATE = 'holySeeVaticanCityState';
|
||||
case HONDURAS = 'honduras';
|
||||
case HONG_KONG = 'hongKong';
|
||||
case HUNGARY = 'hungary';
|
||||
case ICELAND = 'iceland';
|
||||
case INDIA = 'india';
|
||||
case INDONESIA = 'indonesia';
|
||||
case IRAN_ISLAMIC_REPUBLIC_OF = 'iranIslamicRepublicOf';
|
||||
case IRAQ = 'iraq';
|
||||
case IRELAND = 'ireland';
|
||||
case ISLE_OF_MAN = 'isleOfMan';
|
||||
case ISRAEL = 'israel';
|
||||
case ITALY = 'italy';
|
||||
case JAMAICA = 'jamaica';
|
||||
case JAPAN = 'japan';
|
||||
case JERSEY = 'jersey';
|
||||
case JORDAN = 'jordan';
|
||||
case KAZAKHSTAN = 'kazakhstan';
|
||||
case KENYA = 'kenya';
|
||||
case KIRIBATI = 'kiribati';
|
||||
case KOREA_DEMOCRATIC_PEOPLES_REPUBLIC_OF = 'koreaDemocraticPeoplesRepublicOf';
|
||||
case KOREA_REPUBLIC_OF = 'koreaRepublicOf';
|
||||
case KUWAIT = 'kuwait';
|
||||
case KYRGYZSTAN = 'kyrgyzstan';
|
||||
case LAO_PEOPLES_DEMOCRATIC_REPUBLIC = 'laoPeoplesDemocraticRepublic';
|
||||
case LATVIA = 'latvia';
|
||||
case LEBANON = 'lebanon';
|
||||
case LESOTHO = 'lesotho';
|
||||
case LIBERIA = 'liberia';
|
||||
case LIBYA = 'libya';
|
||||
case LIECHTENSTEIN = 'liechtenstein';
|
||||
case LITHUANIA = 'lithuania';
|
||||
case LUXEMBOURG = 'luxembourg';
|
||||
case MACAO = 'macao';
|
||||
case MACEDONIA_THE_FORMER_YUGOSLAV_REPUBLIC_OF = 'macedoniaTheFormerYugoslavRepublicOf';
|
||||
case MADAGASCAR = 'madagascar';
|
||||
case MALAWI = 'malawi';
|
||||
case MALAYSIA = 'malaysia';
|
||||
case MALDIVES = 'maldives';
|
||||
case MALI = 'mali';
|
||||
case MALTA = 'malta';
|
||||
case MARSHALL_ISLANDS = 'marshallIslands';
|
||||
case MARTINIQUE = 'martinique';
|
||||
case MAURITANIA = 'mauritania';
|
||||
case MAURITIUS = 'mauritius';
|
||||
case MAYOTTE = 'mayotte';
|
||||
case MEXICO = 'mexico';
|
||||
case MICRONESIA_FEDERATED_STATES_OF = 'micronesiaFederatedStatesOf';
|
||||
case MOLDOVA_REPUBLIC_OF = 'moldovaRepublicOf';
|
||||
case MONACO = 'monaco';
|
||||
case MONGOLIA = 'mongolia';
|
||||
case MONTENEGRO = 'montenegro';
|
||||
case MONTSERRAT = 'montserrat';
|
||||
case MOROCCO = 'morocco';
|
||||
case MOZAMBIQUE = 'mozambique';
|
||||
case MYANMAR = 'myanmar';
|
||||
case NAMIBIA = 'namibia';
|
||||
case NAURU = 'nauru';
|
||||
case NEPAL = 'nepal';
|
||||
case NETHERLANDS = 'netherlands';
|
||||
case NEW_CALEDONIA = 'newCaledonia';
|
||||
case NEW_ZEALAND = 'newZealand';
|
||||
case NICARAGUA = 'nicaragua';
|
||||
case NIGER = 'niger';
|
||||
case NIGERIA = 'nigeria';
|
||||
case NIUE = 'niue';
|
||||
case NORFOLK_ISLAND = 'norfolkIsland';
|
||||
case NORTHERN_MARIANA_ISLANDS = 'northernMarianaIslands';
|
||||
case NORWAY = 'norway';
|
||||
case OMAN = 'oman';
|
||||
case PAKISTAN = 'pakistan';
|
||||
case PALAU = 'palau';
|
||||
case PALESTINE_STATE_OF = 'palestineStateOf';
|
||||
case PANAMA = 'panama';
|
||||
case PAPUA_NEW_GUINEA = 'papuaNewGuinea';
|
||||
case PARAGUAY = 'paraguay';
|
||||
case PERU = 'peru';
|
||||
case PHILIPPINES = 'philippines';
|
||||
case PITCAIRN = 'pitcairn';
|
||||
case POLAND = 'poland';
|
||||
case PORTUGAL = 'portugal';
|
||||
case PUERTO_RICO = 'puertoRico';
|
||||
case QATAR = 'qatar';
|
||||
case REUNION = 'reunion';
|
||||
case ROMANIA = 'romania';
|
||||
case RUSSIAN_FEDERATION = 'russianFederation';
|
||||
case RWANDA = 'rwanda';
|
||||
case SAINT_BARTHELEMY = 'saintBarthelemy';
|
||||
case SAINT_HELENA_ASCENSION_AND_TRISTAN_DA_CUNHA = 'saintHelenaAscensionAndTristanDaCunha';
|
||||
case SAINT_KITTS_AND_NEVIS = 'saintKittsAndNevis';
|
||||
case SAINT_LUCIA = 'saintLucia';
|
||||
case SAINT_MARTIN_FRENCH_PART = 'saintMartinFrenchPart';
|
||||
case SAINT_PIERRE_AND_MIQUELON = 'saintPierreAndMiquelon';
|
||||
case SAINT_VINCENT_AND_THE_GRENADINES = 'saintVincentAndTheGrenadines';
|
||||
case SAMOA = 'samoa';
|
||||
case SAN_MARINO = 'sanMarino';
|
||||
case SAO_TOME_AND_PRINCIPE = 'saoTomeAndPrincipe';
|
||||
case SAUDI_ARABIA = 'saudiArabia';
|
||||
case SENEGAL = 'senegal';
|
||||
case SERBIA = 'serbia';
|
||||
case SEYCHELLES = 'seychelles';
|
||||
case SIERRA_LEONE = 'sierraLeone';
|
||||
case SINGAPORE = 'singapore';
|
||||
case SINT_MAARTEN_DUTCH_PART = 'sintMaartenDutchPart';
|
||||
case SLOVAKIA = 'slovakia';
|
||||
case SLOVENIA = 'slovenia';
|
||||
case SOLOMON_ISLANDS = 'solomonIslands';
|
||||
case SOMALIA = 'somalia';
|
||||
case SOUTH_AFRICA = 'southAfrica';
|
||||
case SOUTH_GEORGIA_AND_THE_SOUTH_SANDWICH_ISLANDS = 'southGeorgiaAndTheSouthSandwichIslands';
|
||||
case SOUTH_SUDAN = 'southSudan';
|
||||
case SPAIN = 'spain';
|
||||
case SRI_LANKA = 'sriLanka';
|
||||
case SUDAN = 'sudan';
|
||||
case SURINAME = 'suriname';
|
||||
case SVALBARD_AND_JAN_MAYEN = 'svalbardAndJanMayen';
|
||||
case SWAZILAND = 'swaziland';
|
||||
case SWEDEN = 'sweden';
|
||||
case SWITZERLAND = 'switzerland';
|
||||
case SYRIAN_ARAB_REPUBLIC = 'syrianArabRepublic';
|
||||
case TAIWAN_PROVINCE_OF_CHINA = 'taiwanProvinceOfChina';
|
||||
case TAJIKISTAN = 'tajikistan';
|
||||
case TANZANIA_UNITED_REPUBLIC_OF = 'tanzaniaUnitedRepublicOf';
|
||||
case THAILAND = 'thailand';
|
||||
case TIMOR_LESTE = 'timorLeste';
|
||||
case TOGO = 'togo';
|
||||
case TOKELAU = 'tokelau';
|
||||
case TONGA = 'tonga';
|
||||
case TRINIDAD_AND_TOBAGO = 'trinidadAndTobago';
|
||||
case TUNISIA = 'tunisia';
|
||||
case TURKEY = 'turkey';
|
||||
case TURKMENISTAN = 'turkmenistan';
|
||||
case TURKS_AND_CAICOS_ISLANDS = 'turksAndCaicosIslands';
|
||||
case TUVALU = 'tuvalu';
|
||||
case UGANDA = 'uganda';
|
||||
case UKRAINE = 'ukraine';
|
||||
case UNITED_ARAB_EMIRATES = 'unitedArabEmirates';
|
||||
case UNITED_KINGDOM = 'unitedKingdom';
|
||||
case UNITED_STATES = 'unitedStates';
|
||||
case UNITED_STATES_MINOR_OUTLYING_ISLANDS = 'unitedStatesMinorOutlyingIslands';
|
||||
case URUGUAY = 'uruguay';
|
||||
case UZBEKISTAN = 'uzbekistan';
|
||||
case VANUATU = 'vanuatu';
|
||||
case VENEZUELA_BOLIVARIAN_REPUBLIC_OF = 'venezuelaBolivarianRepublicOf';
|
||||
case VIET_NAM = 'vietNam';
|
||||
case VIRGIN_ISLANDS_BRITISH = 'virginIslandsBritish';
|
||||
case VIRGIN_ISLANDS_US = 'virginIslandsUs';
|
||||
case WALLIS_AND_FUTUNA = 'wallisAndFutuna';
|
||||
case WESTERN_SAHARA = 'westernSahara';
|
||||
case YEMEN = 'yemen';
|
||||
case ZAMBIA = 'zambia';
|
||||
case ZIMBABWE = 'zimbabwe';
|
||||
|
||||
/**
|
||||
* Optionnal labels definition
|
||||
*
|
||||
* @phpstan-ignore-next-line
|
||||
*/
|
||||
private const LABELS = [
|
||||
self::AFGHANISTAN->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<string,string>
|
||||
*/
|
||||
public static function toIsoCodes(): array
|
||||
{
|
||||
return self::ISOCODES;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
20
src/Domain/Exceptions/UnknownCountryIsoCodeException.php
Normal file
20
src/Domain/Exceptions/UnknownCountryIsoCodeException.php
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Domain\Exceptions;
|
||||
|
||||
use Domain\Enums\Country;
|
||||
|
||||
final class UnknownCountryIsoCodeException extends \DomainException
|
||||
{
|
||||
public static function fromIsoCode(string $isoCode): self
|
||||
{
|
||||
return new self("No country found for ISO code '{$isoCode}'");
|
||||
}
|
||||
|
||||
public static function fromCountry(Country $country): self
|
||||
{
|
||||
return new self("No ISO code found for country '{$country->name}'");
|
||||
}
|
||||
}
|
||||
|
|
@ -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<int, CampaignCoupon> $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<int, CampaignCoupon> $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,
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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.');
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Domain\Models\ValueObjects\CampaignRequest;
|
||||
|
||||
enum CampaignRequestStatus: string
|
||||
{
|
||||
case CREATED = 'created';
|
||||
case TRANSFORMED = 'transformed';
|
||||
case REJECTED = 'rejected';
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Domain\Models\ValueObjects\CampaignRequest;
|
||||
|
||||
enum CampaignRequestType: string
|
||||
{
|
||||
case CLUB = 'club';
|
||||
case GAME = 'game';
|
||||
}
|
||||
46
src/Domain/Models/ValueObjects/CountryAuthorized.php
Normal file
46
src/Domain/Models/ValueObjects/CountryAuthorized.php
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Domain\Models\ValueObjects;
|
||||
|
||||
use Domain\Enums\Country;
|
||||
use Override;
|
||||
use Shared\DDD\Models\Equatable;
|
||||
|
||||
final readonly class CountryAuthorized implements \Stringable, Equatable
|
||||
{
|
||||
/** @var list<Country> */
|
||||
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<Country>
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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.');
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -6,5 +6,5 @@ namespace Shared\Enums;
|
|||
|
||||
enum Currency: string
|
||||
{
|
||||
case EUR = "euro";
|
||||
case EUR = 'euro';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
65
tests/Unit/Domain/Models/ValueObjects/CountryAuthorized.php
Normal file
65
tests/Unit/Domain/Models/ValueObjects/CountryAuthorized.php
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Domain\Models\ValueObjects;
|
||||
|
||||
use Domain\Enums\Country;
|
||||
use Domain\Models\ValueObjects\CountryAuthorized;
|
||||
|
||||
covers(CountryAuthorized::class);
|
||||
|
||||
describe('country authorized', function (): void {
|
||||
it('creates a valid authorized country', function (string $case): void {
|
||||
// GIVEN
|
||||
$country = Country::from($case);
|
||||
|
||||
// WHEN
|
||||
$authorized = new CountryAuthorized($country);
|
||||
|
||||
// THEN
|
||||
expect($authorized)->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');
|
||||
});
|
||||
});
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue