Skip to content
This repository was archived by the owner on Oct 24, 2023. It is now read-only.

Commit ad58116

Browse files
author
Jens Schulze
committed
feat(CartDiscount): support free gift line item
Closes #325
1 parent c1c65fd commit ad58116

File tree

10 files changed

+310
-2
lines changed

10 files changed

+310
-2
lines changed

src/Core/Model/Cart/Cart.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
namespace Commercetools\Core\Model\Cart;
77

8+
use Commercetools\Core\Model\CartDiscount\CartDiscountReferenceCollection;
89
use Commercetools\Core\Model\Common\Address;
910
use Commercetools\Core\Model\Common\LocaleTrait;
1011
use Commercetools\Core\Model\Common\Resource;
@@ -68,6 +69,8 @@
6869
* @method Cart setTaxRoundingMode(string $taxRoundingMode = null)
6970
* @method int getDeleteDaysAfterLastModification()
7071
* @method Cart setDeleteDaysAfterLastModification(int $deleteDaysAfterLastModification = null)
72+
* @method CartDiscountReferenceCollection getRefusedGifts()
73+
* @method Cart setRefusedGifts(CartDiscountReferenceCollection $refusedGifts = null)
7174
* @method CartReference getReference()
7275
*/
7376
class Cart extends Resource
@@ -114,7 +117,8 @@ public function fieldDefinitions()
114117
'anonymousId' => [static::TYPE => 'string'],
115118
'locale' => [static::TYPE => 'string'],
116119
'taxRoundingMode' => [static::TYPE => 'string'],
117-
'deleteDaysAfterLastModification' => [static::TYPE => 'int']
120+
'deleteDaysAfterLastModification' => [static::TYPE => 'int'],
121+
'refusedGifts' => [static::TYPE => CartDiscountReferenceCollection::class],
118122
];
119123
}
120124

src/Core/Model/Cart/LineItem.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,18 @@
5353
* @method LineItem setPriceMode(string $priceMode = null)
5454
* @method ProductTypeReference getProductType()
5555
* @method LineItem setProductType(ProductTypeReference $productType = null)
56+
* @method string getLineItemMode()
57+
* @method LineItem setLineItemMode(string $lineItemMode = null)
5658
*/
5759
class LineItem extends JsonObject
5860
{
5961
const PRICE_MODE_PLATFORM = 'Platform';
6062
const PRICE_MODE_EXTERNAL_TOTAL = 'ExternalTotal';
6163
const PRICE_MODE_EXTERNAL_PRICE = 'ExternalPrice';
6264

65+
const LINE_ITEM_MODE_STANDARD = 'Standard';
66+
const LINE_ITEM_MODE_GIFT_LINE_ITEM = 'GiftLineItem';
67+
6368
public function fieldDefinitions()
6469
{
6570
return [
@@ -81,6 +86,7 @@ public function fieldDefinitions()
8186
static::TYPE => DiscountedPricePerQuantityCollection::class
8287
],
8388
'priceMode' => [static::TYPE => 'string'],
89+
'lineItemMode' => [static::TYPE => 'string'],
8490
'productType' => [static::TYPE => ProductTypeReference::class],
8591
];
8692
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
/**
3+
* @author @jayS-de <[email protected]>
4+
*/
5+
6+
namespace Commercetools\Core\Model\CartDiscount;
7+
8+
use Commercetools\Core\Model\Common\MoneyCollection;
9+
10+
/**
11+
* @package Commercetools\Core\Model\CartDiscount
12+
*
13+
* @method string getType()
14+
* @method AbsoluteCartDiscountValue setType(string $type = null)
15+
* @method MoneyCollection getMoney()
16+
* @method AbsoluteCartDiscountValue setMoney(MoneyCollection $money = null)
17+
*/
18+
class AbsoluteCartDiscountValue extends CartDiscountValue
19+
{
20+
/**
21+
* @inheritDoc
22+
*/
23+
public function __construct(array $data = [], $context = null)
24+
{
25+
$data['type'] = static::TYPE_ABSOLUTE;
26+
27+
parent::__construct($data, $context);
28+
}
29+
30+
public function fieldDefinitions()
31+
{
32+
return [
33+
'type' => [static::TYPE => 'string'],
34+
'permyriad' => [static::TYPE => 'int'],
35+
'money' => [static::TYPE => MoneyCollection::class]
36+
];
37+
}
38+
39+
/**
40+
* @deprecated getPermyriad will be removed for absolute cart discounts with v3.0
41+
* @return int
42+
*/
43+
public function getPermyriad()
44+
{
45+
return parent::getPermyriad();
46+
}
47+
/**
48+
* @deprecated setPermyriad will be removed for absolute cart discounts with v3.0
49+
* @param int $permyriad
50+
* @return AbsoluteCartDiscountValue
51+
*/
52+
public function setPermyriad($permyriad = null)
53+
{
54+
return parent::setPermyriad($permyriad);
55+
}
56+
}

src/Core/Model/CartDiscount/CartDiscountDraft.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,32 @@ public static function ofNameValuePredicateTargetOrderActiveAndDiscountCode(
100100
->setIsActive($isActive)
101101
->setRequiresDiscountCode($requiresDiscountCode);
102102
}
103+
104+
/**
105+
* @param LocalizedString $name
106+
* @param CartDiscountValue $value
107+
* @param string $cartPredicate
108+
* @param string $sortOrder
109+
* @param bool $isActive
110+
* @param bool $requiresDiscountCode
111+
* @param Context|callable $context
112+
* @return CartDiscountDraft
113+
*/
114+
public static function ofNameValuePredicateOrderActiveAndDiscountCode(
115+
LocalizedString $name,
116+
CartDiscountValue $value,
117+
$cartPredicate,
118+
$sortOrder,
119+
$isActive,
120+
$requiresDiscountCode,
121+
$context = null
122+
) {
123+
$draft = static::of($context);
124+
return $draft->setName($name)
125+
->setValue($value)
126+
->setCartPredicate($cartPredicate)
127+
->setSortOrder($sortOrder)
128+
->setIsActive($isActive)
129+
->setRequiresDiscountCode($requiresDiscountCode);
130+
}
103131
}

src/Core/Model/CartDiscount/CartDiscountValue.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55

66
namespace Commercetools\Core\Model\CartDiscount;
77

8+
use Commercetools\Core\Model\Common\Context;
89
use Commercetools\Core\Model\Common\DiscountValue;
910
use Commercetools\Core\Model\Common\MoneyCollection;
1011

1112
/**
1213
* @package Commercetools\Core\Model\CartDiscount
1314
* @link https://dev.commercetools.com/http-api-projects-cartDiscounts.html#cartdiscountvalue
15+
* @deprecated use RelativeCartDiscountValue, AbsoluteCartDiscountValue or GiftLineItemCartDiscountValue instead.
1416
* @method string getType()
1517
* @method CartDiscountValue setType(string $type = null)
1618
* @method int getPermyriad()
@@ -20,4 +22,29 @@
2022
*/
2123
class CartDiscountValue extends DiscountValue
2224
{
25+
const TYPE_RELATIVE = 'relative';
26+
const TYPE_ABSOLUTE = 'absolute';
27+
const TYPE_GIFT_LINE_ITEM = 'giftLineItem';
28+
29+
/**
30+
* @param array $data
31+
* @param Context|callable $context
32+
* @return static
33+
*/
34+
public static function fromArray(array $data, $context = null)
35+
{
36+
if (isset($data['type'])) {
37+
$className = static::getClassByType($data['type']);
38+
if (class_exists($className)) {
39+
return new $className($data, $context);
40+
}
41+
}
42+
return new static($data, $context);
43+
}
44+
45+
protected static function getClassByType($type)
46+
{
47+
$className = '\Commercetools\Core\Model\CartDiscount\\' . ucfirst($type) . 'CartDiscountValue';
48+
return $className;
49+
}
2350
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
/**
3+
* @author @jayS-de <[email protected]>
4+
*/
5+
6+
namespace Commercetools\Core\Model\CartDiscount;
7+
8+
use Commercetools\Core\Model\Channel\ChannelReference;
9+
use Commercetools\Core\Model\Common\Context;
10+
use Commercetools\Core\Model\Product\ProductReference;
11+
12+
/**
13+
* @package Commercetools\Core\Model\CartDiscount
14+
*
15+
* @method string getType()
16+
* @method GiftLineItemCartDiscountValue setType(string $type = null)
17+
* @method ProductReference getProduct()
18+
* @method GiftLineItemCartDiscountValue setProduct(ProductReference $product = null)
19+
* @method int getVariantId()
20+
* @method GiftLineItemCartDiscountValue setVariantId(int $variantId = null)
21+
* @method ChannelReference getSupplyChannel()
22+
* @method GiftLineItemCartDiscountValue setSupplyChannel(ChannelReference $supplyChannel = null)
23+
* @method ChannelReference getDistributionChannel()
24+
* @method GiftLineItemCartDiscountValue setDistributionChannel(ChannelReference $distributionChannel = null)
25+
*/
26+
class GiftLineItemCartDiscountValue extends CartDiscountValue
27+
{
28+
/**
29+
* @inheritDoc
30+
*/
31+
public function __construct(array $data = [], $context = null)
32+
{
33+
$data['type'] = static::TYPE_GIFT_LINE_ITEM;
34+
35+
parent::__construct($data, $context);
36+
}
37+
38+
public function fieldDefinitions()
39+
{
40+
return [
41+
'type' => [static::TYPE => 'string'],
42+
'product' => [static::TYPE => ProductReference::class],
43+
'variantId' => [static::TYPE => 'int'],
44+
'supplyChannel' => [static::TYPE => ChannelReference::class],
45+
'distributionChannel' => [static::TYPE => ChannelReference::class],
46+
];
47+
}
48+
49+
/**
50+
* @param ProductReference $product
51+
* @param int $variantId
52+
* @param Context|callable $context
53+
* @return GiftLineItemCartDiscountValue
54+
*/
55+
public static function ofProductAndVariantId(ProductReference $product, $variantId, $context = null)
56+
{
57+
return static::of($context)->setProduct($product)->setVariantId($variantId);
58+
}
59+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
/**
3+
* @author @jayS-de <[email protected]>
4+
*/
5+
6+
namespace Commercetools\Core\Model\CartDiscount;
7+
8+
use Commercetools\Core\Model\Common\MoneyCollection;
9+
10+
/**
11+
* @package Commercetools\Core\Model\CartDiscount
12+
* @method string getType()
13+
* @method RelativeCartDiscountValue setType(string $type = null)
14+
* @method int getPermyriad()
15+
* @method RelativeCartDiscountValue setPermyriad(int $permyriad = null)
16+
*/
17+
class RelativeCartDiscountValue extends CartDiscountValue
18+
{
19+
/**
20+
* @inheritDoc
21+
*/
22+
public function __construct(array $data = [], $context = null)
23+
{
24+
$data['type'] = static::TYPE_RELATIVE;
25+
26+
parent::__construct($data, $context);
27+
}
28+
29+
public function fieldDefinitions()
30+
{
31+
return [
32+
'type' => [static::TYPE => 'string'],
33+
'permyriad' => [static::TYPE => 'int'],
34+
'money' => [static::TYPE => MoneyCollection::class]
35+
];
36+
}
37+
38+
/**
39+
* @deprecated getMoney will be removed for relative cart discounts with v3.0
40+
* @return MoneyCollection
41+
*/
42+
public function getMoney()
43+
{
44+
return parent::getMoney();
45+
}
46+
47+
/**
48+
* @deprecated setMoney will be removed for relative cart discounts with v3.0
49+
* @param MoneyCollection|null $money
50+
* @return CartDiscountValue
51+
*/
52+
public function setMoney(MoneyCollection $money = null)
53+
{
54+
return parent::setMoney($money);
55+
}
56+
}

tests/fixtures/models.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ cart:
2727
- locale
2828
- taxRoundingMode
2929
- deleteDaysAfterLastModification
30+
- refusedGifts
3031
lineItem:
3132
domain: cart
3233
model: LineItem
@@ -48,6 +49,7 @@ lineItem:
4849
- totalPrice
4950
- priceMode
5051
- productType
52+
- lineItemMode
5153

5254
customLineItem:
5355
domain: cart

tests/integration/ApiTestCase.php

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010
use Commercetools\Core\Fixtures\TeamCityFormatter;
1111
use Commercetools\Core\Model\Cart\Cart;
1212
use Commercetools\Core\Model\Cart\CartDraft;
13+
use Commercetools\Core\Model\CartDiscount\AbsoluteCartDiscountValue;
1314
use Commercetools\Core\Model\CartDiscount\CartDiscount;
1415
use Commercetools\Core\Model\CartDiscount\CartDiscountDraft;
1516
use Commercetools\Core\Model\CartDiscount\CartDiscountReferenceCollection;
1617
use Commercetools\Core\Model\CartDiscount\CartDiscountTarget;
1718
use Commercetools\Core\Model\CartDiscount\CartDiscountValue;
19+
use Commercetools\Core\Model\CartDiscount\GiftLineItemCartDiscountValue;
1820
use Commercetools\Core\Model\Category\Category;
1921
use Commercetools\Core\Model\Category\CategoryDraft;
2022
use Commercetools\Core\Model\Channel\Channel;
@@ -734,7 +736,7 @@ protected function getCartDiscount()
734736
if (is_null($this->cartDiscount)) {
735737
$draft = CartDiscountDraft::ofNameValuePredicateTargetOrderActiveAndDiscountCode(
736738
LocalizedString::ofLangAndText('en', 'test-' . $this->getTestRun() . '-discount'),
737-
CartDiscountValue::of()->setType('absolute')->setMoney(
739+
AbsoluteCartDiscountValue::of()->setMoney(
738740
MoneyCollection::of()->add(Money::ofCurrencyAndAmount('EUR', 100))
739741
),
740742
'1=1',
@@ -751,6 +753,32 @@ protected function getCartDiscount()
751753
return $this->cartDiscount;
752754
}
753755

756+
protected function getGiftLineItemCartDiscount()
757+
{
758+
if (is_null($this->cartDiscount)) {
759+
$product = $this->getProduct();
760+
$draft = CartDiscountDraft::ofNameValuePredicateOrderActiveAndDiscountCode(
761+
LocalizedString::ofLangAndText(
762+
'en',
763+
'test-' . $this->getTestRun() . '-gift-line-item-discount'
764+
),
765+
GiftLineItemCartDiscountValue::of()
766+
->setProduct($product->getReference())
767+
->setVariantId($product->getMasterData()->getCurrent()->getMasterVariant()->getId()),
768+
'1=1',
769+
'0.9' . trim((string)mt_rand(1, 1000), '0'),
770+
true,
771+
false
772+
);
773+
$request = CartDiscountCreateRequest::ofDraft($draft);
774+
$response = $request->executeWithClient($this->getClient());
775+
776+
$this->cartDiscount = $request->mapResponse($response);
777+
}
778+
779+
return $this->cartDiscount;
780+
}
781+
754782
private function deleteCartDiscount()
755783
{
756784
if (!is_null($this->cartDiscount)) {

0 commit comments

Comments
 (0)