diff --git a/changes.md b/changes.md index ea1a95536ea..1e94e69b056 100644 --- a/changes.md +++ b/changes.md @@ -209,8 +209,11 @@ - added type `ProductTailoringSetProductAttributeAction` - added type `AttributeLevelEnum` - added type `ProductSetProductAttributeAction` +- added type `DiscountCombinationMode` +- added type `DiscountsConfiguration` - added type `ProjectChangePriceRoundingModeAction` - added type `ProjectChangeTaxRoundingModeAction` +- added type `ProjectSetDiscountsConfigurationAction` - added type `DayOfMonthSchedule` - added type `DayOfMonthScheduleDraft` - added type `IntervalUnit` @@ -481,6 +484,7 @@ - added property `/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/` to type `ProductVariantChannelAvailabilityMap` - added property `priceRoundingMode` to type `CartsConfiguration` - added property `taxRoundingMode` to type `CartsConfiguration` +- added property `discounts` to type `Project` - added property `priceRoundingMode` to type `QuoteRequest` - added property `priceRoundingMode` to type `Quote` - added property `businessUnit` to type `ShoppingList` diff --git a/lib/commercetools-api/src/Models/Project/DiscountsConfiguration.php b/lib/commercetools-api/src/Models/Project/DiscountsConfiguration.php new file mode 100644 index 00000000000..4256f821667 --- /dev/null +++ b/lib/commercetools-api/src/Models/Project/DiscountsConfiguration.php @@ -0,0 +1,30 @@ +Indicates how Product Discounts and Cart Discounts should be combined. Default value is Stacking.

+ * + + * @return null|string + */ + public function getDiscountCombinationMode(); + + /** + * @param ?string $discountCombinationMode + */ + public function setDiscountCombinationMode(?string $discountCombinationMode): void; +} diff --git a/lib/commercetools-api/src/Models/Project/DiscountsConfigurationBuilder.php b/lib/commercetools-api/src/Models/Project/DiscountsConfigurationBuilder.php new file mode 100644 index 00000000000..a3a2484f4a3 --- /dev/null +++ b/lib/commercetools-api/src/Models/Project/DiscountsConfigurationBuilder.php @@ -0,0 +1,63 @@ + + */ +final class DiscountsConfigurationBuilder implements Builder +{ + /** + + * @var ?string + */ + private $discountCombinationMode; + + /** + *

Indicates how Product Discounts and Cart Discounts should be combined. Default value is Stacking.

+ * + + * @return null|string + */ + public function getDiscountCombinationMode() + { + return $this->discountCombinationMode; + } + + /** + * @param ?string $discountCombinationMode + * @return $this + */ + public function withDiscountCombinationMode(?string $discountCombinationMode) + { + $this->discountCombinationMode = $discountCombinationMode; + + return $this; + } + + + public function build(): DiscountsConfiguration + { + return new DiscountsConfigurationModel( + $this->discountCombinationMode + ); + } + + public static function of(): DiscountsConfigurationBuilder + { + return new self(); + } +} diff --git a/lib/commercetools-api/src/Models/Project/DiscountsConfigurationCollection.php b/lib/commercetools-api/src/Models/Project/DiscountsConfigurationCollection.php new file mode 100644 index 00000000000..f67d3a4616a --- /dev/null +++ b/lib/commercetools-api/src/Models/Project/DiscountsConfigurationCollection.php @@ -0,0 +1,56 @@ + + * @method DiscountsConfiguration current() + * @method DiscountsConfiguration end() + * @method DiscountsConfiguration at($offset) + */ +class DiscountsConfigurationCollection extends MapperSequence +{ + /** + * @psalm-assert DiscountsConfiguration $value + * @psalm-param DiscountsConfiguration|stdClass $value + * @throws InvalidArgumentException + * + * @return DiscountsConfigurationCollection + */ + public function add($value) + { + if (!$value instanceof DiscountsConfiguration) { + throw new InvalidArgumentException(); + } + $this->store($value); + + return $this; + } + + /** + * @psalm-return callable(int):?DiscountsConfiguration + */ + protected function mapper() + { + return function (?int $index): ?DiscountsConfiguration { + $data = $this->get($index); + if ($data instanceof stdClass) { + /** @var DiscountsConfiguration $data */ + $data = DiscountsConfigurationModel::of($data); + $this->set($data, $index); + } + + return $data; + }; + } +} diff --git a/lib/commercetools-api/src/Models/Project/DiscountsConfigurationModel.php b/lib/commercetools-api/src/Models/Project/DiscountsConfigurationModel.php new file mode 100644 index 00000000000..45c7e602c74 --- /dev/null +++ b/lib/commercetools-api/src/Models/Project/DiscountsConfigurationModel.php @@ -0,0 +1,66 @@ +discountCombinationMode = $discountCombinationMode; + } + + /** + *

Indicates how Product Discounts and Cart Discounts should be combined. Default value is Stacking.

+ * + * + * @return null|string + */ + public function getDiscountCombinationMode() + { + if (is_null($this->discountCombinationMode)) { + /** @psalm-var ?string $data */ + $data = $this->raw(self::FIELD_DISCOUNT_COMBINATION_MODE); + if (is_null($data)) { + return null; + } + $this->discountCombinationMode = (string) $data; + } + + return $this->discountCombinationMode; + } + + + /** + * @param ?string $discountCombinationMode + */ + public function setDiscountCombinationMode(?string $discountCombinationMode): void + { + $this->discountCombinationMode = $discountCombinationMode; + } +} diff --git a/lib/commercetools-api/src/Models/Project/Project.php b/lib/commercetools-api/src/Models/Project/Project.php index 6f5cf14bbb5..2890bb08bf4 100644 --- a/lib/commercetools-api/src/Models/Project/Project.php +++ b/lib/commercetools-api/src/Models/Project/Project.php @@ -30,6 +30,7 @@ interface Project extends JsonObject public const FIELD_EXTERNAL_O_AUTH = 'externalOAuth'; public const FIELD_SEARCH_INDEXING = 'searchIndexing'; public const FIELD_BUSINESS_UNITS = 'businessUnits'; + public const FIELD_DISCOUNTS = 'discounts'; /** *

Current version of the Project.

@@ -151,6 +152,14 @@ public function getSearchIndexing(); */ public function getBusinessUnits(); + /** + *

Holds configuration specific to discounts, including how Product and Cart Discounts are combined in every Cart of the Project.

+ * + + * @return null|DiscountsConfiguration + */ + public function getDiscounts(); + /** * @param ?int $version */ @@ -225,4 +234,9 @@ public function setSearchIndexing(?SearchIndexingConfiguration $searchIndexing): * @param ?BusinessUnitConfiguration $businessUnits */ public function setBusinessUnits(?BusinessUnitConfiguration $businessUnits): void; + + /** + * @param ?DiscountsConfiguration $discounts + */ + public function setDiscounts(?DiscountsConfiguration $discounts): void; } diff --git a/lib/commercetools-api/src/Models/Project/ProjectBuilder.php b/lib/commercetools-api/src/Models/Project/ProjectBuilder.php index 76d0fdca6d7..1c93ce3a0a5 100644 --- a/lib/commercetools-api/src/Models/Project/ProjectBuilder.php +++ b/lib/commercetools-api/src/Models/Project/ProjectBuilder.php @@ -113,6 +113,12 @@ final class ProjectBuilder implements Builder */ private $businessUnits; + /** + + * @var null|DiscountsConfiguration|DiscountsConfigurationBuilder + */ + private $discounts; + /** *

Current version of the Project.

* @@ -278,6 +284,17 @@ public function getBusinessUnits() return $this->businessUnits instanceof BusinessUnitConfigurationBuilder ? $this->businessUnits->build() : $this->businessUnits; } + /** + *

Holds configuration specific to discounts, including how Product and Cart Discounts are combined in every Cart of the Project.

+ * + + * @return null|DiscountsConfiguration + */ + public function getDiscounts() + { + return $this->discounts instanceof DiscountsConfigurationBuilder ? $this->discounts->build() : $this->discounts; + } + /** * @param ?int $version * @return $this @@ -443,6 +460,17 @@ public function withBusinessUnits(?BusinessUnitConfiguration $businessUnits) return $this; } + /** + * @param ?DiscountsConfiguration $discounts + * @return $this + */ + public function withDiscounts(?DiscountsConfiguration $discounts) + { + $this->discounts = $discounts; + + return $this; + } + /** * @deprecated use withMessages() instead * @return $this @@ -520,6 +548,17 @@ public function withBusinessUnitsBuilder(?BusinessUnitConfigurationBuilder $busi return $this; } + /** + * @deprecated use withDiscounts() instead + * @return $this + */ + public function withDiscountsBuilder(?DiscountsConfigurationBuilder $discounts) + { + $this->discounts = $discounts; + + return $this; + } + public function build(): Project { return new ProjectModel( @@ -537,7 +576,8 @@ public function build(): Project $this->shippingRateInputType instanceof ShippingRateInputTypeBuilder ? $this->shippingRateInputType->build() : $this->shippingRateInputType, $this->externalOAuth instanceof ExternalOAuthBuilder ? $this->externalOAuth->build() : $this->externalOAuth, $this->searchIndexing instanceof SearchIndexingConfigurationBuilder ? $this->searchIndexing->build() : $this->searchIndexing, - $this->businessUnits instanceof BusinessUnitConfigurationBuilder ? $this->businessUnits->build() : $this->businessUnits + $this->businessUnits instanceof BusinessUnitConfigurationBuilder ? $this->businessUnits->build() : $this->businessUnits, + $this->discounts instanceof DiscountsConfigurationBuilder ? $this->discounts->build() : $this->discounts ); } diff --git a/lib/commercetools-api/src/Models/Project/ProjectModel.php b/lib/commercetools-api/src/Models/Project/ProjectModel.php index bebe31df27c..4174d31c9af 100644 --- a/lib/commercetools-api/src/Models/Project/ProjectModel.php +++ b/lib/commercetools-api/src/Models/Project/ProjectModel.php @@ -112,6 +112,12 @@ final class ProjectModel extends JsonObjectModel implements Project */ protected $businessUnits; + /** + * + * @var ?DiscountsConfiguration + */ + protected $discounts; + /** * @psalm-suppress MissingParamType @@ -131,7 +137,8 @@ public function __construct( ?ShippingRateInputType $shippingRateInputType = null, ?ExternalOAuth $externalOAuth = null, ?SearchIndexingConfiguration $searchIndexing = null, - ?BusinessUnitConfiguration $businessUnits = null + ?BusinessUnitConfiguration $businessUnits = null, + ?DiscountsConfiguration $discounts = null ) { $this->version = $version; $this->key = $key; @@ -148,6 +155,7 @@ public function __construct( $this->externalOAuth = $externalOAuth; $this->searchIndexing = $searchIndexing; $this->businessUnits = $businessUnits; + $this->discounts = $discounts; } /** @@ -461,6 +469,27 @@ public function getBusinessUnits() return $this->businessUnits; } + /** + *

Holds configuration specific to discounts, including how Product and Cart Discounts are combined in every Cart of the Project.

+ * + * + * @return null|DiscountsConfiguration + */ + public function getDiscounts() + { + if (is_null($this->discounts)) { + /** @psalm-var stdClass|array|null $data */ + $data = $this->raw(self::FIELD_DISCOUNTS); + if (is_null($data)) { + return null; + } + + $this->discounts = DiscountsConfigurationModel::of($data); + } + + return $this->discounts; + } + /** * @param ?int $version @@ -582,6 +611,14 @@ public function setBusinessUnits(?BusinessUnitConfiguration $businessUnits): voi $this->businessUnits = $businessUnits; } + /** + * @param ?DiscountsConfiguration $discounts + */ + public function setDiscounts(?DiscountsConfiguration $discounts): void + { + $this->discounts = $discounts; + } + #[\ReturnTypeWillChange] public function jsonSerialize() diff --git a/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationAction.php b/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationAction.php new file mode 100644 index 00000000000..0c3141bc349 --- /dev/null +++ b/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationAction.php @@ -0,0 +1,30 @@ +Configuration for the behavior of Cart and Product Discounts in the Project.

+ * + + * @return null|DiscountsConfiguration + */ + public function getDiscountsConfiguration(); + + /** + * @param ?DiscountsConfiguration $discountsConfiguration + */ + public function setDiscountsConfiguration(?DiscountsConfiguration $discountsConfiguration): void; +} diff --git a/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationActionBuilder.php b/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationActionBuilder.php new file mode 100644 index 00000000000..104e64117f4 --- /dev/null +++ b/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationActionBuilder.php @@ -0,0 +1,73 @@ + + */ +final class ProjectSetDiscountsConfigurationActionBuilder implements Builder +{ + /** + + * @var null|DiscountsConfiguration|DiscountsConfigurationBuilder + */ + private $discountsConfiguration; + + /** + *

Configuration for the behavior of Cart and Product Discounts in the Project.

+ * + + * @return null|DiscountsConfiguration + */ + public function getDiscountsConfiguration() + { + return $this->discountsConfiguration instanceof DiscountsConfigurationBuilder ? $this->discountsConfiguration->build() : $this->discountsConfiguration; + } + + /** + * @param ?DiscountsConfiguration $discountsConfiguration + * @return $this + */ + public function withDiscountsConfiguration(?DiscountsConfiguration $discountsConfiguration) + { + $this->discountsConfiguration = $discountsConfiguration; + + return $this; + } + + /** + * @deprecated use withDiscountsConfiguration() instead + * @return $this + */ + public function withDiscountsConfigurationBuilder(?DiscountsConfigurationBuilder $discountsConfiguration) + { + $this->discountsConfiguration = $discountsConfiguration; + + return $this; + } + + public function build(): ProjectSetDiscountsConfigurationAction + { + return new ProjectSetDiscountsConfigurationActionModel( + $this->discountsConfiguration instanceof DiscountsConfigurationBuilder ? $this->discountsConfiguration->build() : $this->discountsConfiguration + ); + } + + public static function of(): ProjectSetDiscountsConfigurationActionBuilder + { + return new self(); + } +} diff --git a/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationActionCollection.php b/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationActionCollection.php new file mode 100644 index 00000000000..5bd7cfe0002 --- /dev/null +++ b/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationActionCollection.php @@ -0,0 +1,56 @@ + + * @method ProjectSetDiscountsConfigurationAction current() + * @method ProjectSetDiscountsConfigurationAction end() + * @method ProjectSetDiscountsConfigurationAction at($offset) + */ +class ProjectSetDiscountsConfigurationActionCollection extends ProjectUpdateActionCollection +{ + /** + * @psalm-assert ProjectSetDiscountsConfigurationAction $value + * @psalm-param ProjectSetDiscountsConfigurationAction|stdClass $value + * @throws InvalidArgumentException + * + * @return ProjectSetDiscountsConfigurationActionCollection + */ + public function add($value) + { + if (!$value instanceof ProjectSetDiscountsConfigurationAction) { + throw new InvalidArgumentException(); + } + $this->store($value); + + return $this; + } + + /** + * @psalm-return callable(int):?ProjectSetDiscountsConfigurationAction + */ + protected function mapper() + { + return function (?int $index): ?ProjectSetDiscountsConfigurationAction { + $data = $this->get($index); + if ($data instanceof stdClass) { + /** @var ProjectSetDiscountsConfigurationAction $data */ + $data = ProjectSetDiscountsConfigurationActionModel::of($data); + $this->set($data, $index); + } + + return $data; + }; + } +} diff --git a/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationActionModel.php b/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationActionModel.php new file mode 100644 index 00000000000..72c1aeaa13c --- /dev/null +++ b/lib/commercetools-api/src/Models/Project/ProjectSetDiscountsConfigurationActionModel.php @@ -0,0 +1,94 @@ +discountsConfiguration = $discountsConfiguration; + $this->action = $action ?? self::DISCRIMINATOR_VALUE; + } + + /** + * + * @return null|string + */ + public function getAction() + { + if (is_null($this->action)) { + /** @psalm-var ?string $data */ + $data = $this->raw(self::FIELD_ACTION); + if (is_null($data)) { + return null; + } + $this->action = (string) $data; + } + + return $this->action; + } + + /** + *

Configuration for the behavior of Cart and Product Discounts in the Project.

+ * + * + * @return null|DiscountsConfiguration + */ + public function getDiscountsConfiguration() + { + if (is_null($this->discountsConfiguration)) { + /** @psalm-var stdClass|array|null $data */ + $data = $this->raw(self::FIELD_DISCOUNTS_CONFIGURATION); + if (is_null($data)) { + return null; + } + + $this->discountsConfiguration = DiscountsConfigurationModel::of($data); + } + + return $this->discountsConfiguration; + } + + + /** + * @param ?DiscountsConfiguration $discountsConfiguration + */ + public function setDiscountsConfiguration(?DiscountsConfiguration $discountsConfiguration): void + { + $this->discountsConfiguration = $discountsConfiguration; + } +} diff --git a/lib/commercetools-api/src/Models/Project/ProjectUpdateActionModel.php b/lib/commercetools-api/src/Models/Project/ProjectUpdateActionModel.php index dbc1bd877e7..aeec23ce701 100644 --- a/lib/commercetools-api/src/Models/Project/ProjectUpdateActionModel.php +++ b/lib/commercetools-api/src/Models/Project/ProjectUpdateActionModel.php @@ -46,6 +46,7 @@ final class ProjectUpdateActionModel extends JsonObjectModel implements ProjectU 'changeProductSearchIndexingEnabled' => ProjectChangeProductSearchIndexingEnabledActionModel::class, 'changeShoppingListsConfiguration' => ProjectChangeShoppingListsConfigurationActionModel::class, 'changeTaxRoundingMode' => ProjectChangeTaxRoundingModeActionModel::class, + 'setDiscountsConfiguration' => ProjectSetDiscountsConfigurationActionModel::class, 'setExternalOAuth' => ProjectSetExternalOAuthActionModel::class, 'setMyBusinessUnitAssociateRoleOnCreation' => ProjectSetBusinessUnitAssociateRoleOnCreationActionModel::class, 'setShippingRateInputType' => ProjectSetShippingRateInputTypeActionModel::class, diff --git a/references.txt b/references.txt index 707029acf44..5ef63abd4a7 100644 --- a/references.txt +++ b/references.txt @@ -514,3 +514,4 @@ ea7ba668e4084d845f2f3871c239999f43613b28 7c8466665829aaf9142b056c57fe5b32c4072076 263e58a9f68bacfe67cd292b203c956d5ae9f264 780cff25cc0c08ba669762069bb264848aa5f6d5 +503a69044e9969bc058a116a7f7ecd4556c85258