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

Commit c75e53c

Browse files
author
Jens Schulze
committed
feat(ProductDiscount): support validFrom and validUntil for product discounts
Closes #368
1 parent b9461b6 commit c75e53c

File tree

6 files changed

+167
-30
lines changed

6 files changed

+167
-30
lines changed

src/Core/Model/ProductDiscount/ProductDiscount.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
* @method ProductDiscount setIsActive(bool $isActive = null)
3737
* @method ReferenceCollection getReferences()
3838
* @method ProductDiscount setReferences(ReferenceCollection $references = null)
39+
* @method DateTimeDecorator getValidFrom()
40+
* @method ProductDiscount setValidFrom(DateTime $validFrom = null)
41+
* @method DateTimeDecorator getValidUntil()
42+
* @method ProductDiscount setValidUntil(DateTime $validUntil = null)
3943
* @method ProductDiscountReference getReference()
4044
*/
4145
class ProductDiscount extends Resource
@@ -60,6 +64,14 @@ public function fieldDefinitions()
6064
'sortOrder' => [static::TYPE => 'string'],
6165
'isActive' => [static::TYPE => 'bool'],
6266
'references' => [static::TYPE => ReferenceCollection::class],
67+
'validFrom' => [
68+
static::TYPE => DateTime::class,
69+
static::DECORATOR => DateTimeDecorator::class
70+
],
71+
'validUntil' => [
72+
static::TYPE => DateTime::class,
73+
static::DECORATOR => DateTimeDecorator::class
74+
],
6375
];
6476
}
6577
}

src/Core/Model/ProductDiscount/ProductDiscountDraft.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
namespace Commercetools\Core\Model\ProductDiscount;
77

88
use Commercetools\Core\Model\Common\Context;
9+
use Commercetools\Core\Model\Common\DateTimeDecorator;
910
use Commercetools\Core\Model\Common\JsonObject;
1011
use Commercetools\Core\Model\Common\LocalizedString;
12+
use DateTime;
1113

1214
/**
1315
* @package Commercetools\Core\Model\ProductDiscount
@@ -24,6 +26,10 @@
2426
* @method ProductDiscountDraft setSortOrder(string $sortOrder = null)
2527
* @method bool getIsActive()
2628
* @method ProductDiscountDraft setIsActive(bool $isActive = null)
29+
* @method DateTimeDecorator getValidFrom()
30+
* @method ProductDiscountDraft setValidFrom(DateTime $validFrom = null)
31+
* @method DateTimeDecorator getValidUntil()
32+
* @method ProductDiscountDraft setValidUntil(DateTime $validUntil = null)
2733
*/
2834
class ProductDiscountDraft extends JsonObject
2935
{
@@ -36,6 +42,14 @@ public function fieldDefinitions()
3642
'predicate' => [static::TYPE => 'string'],
3743
'sortOrder' => [static::TYPE => 'string'],
3844
'isActive' => [static::TYPE => 'bool'],
45+
'validFrom' => [
46+
static::TYPE => DateTime::class,
47+
static::DECORATOR => DateTimeDecorator::class
48+
],
49+
'validUntil' => [
50+
static::TYPE => DateTime::class,
51+
static::DECORATOR => DateTimeDecorator::class
52+
],
3953
];
4054
}
4155

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
/**
3+
* @author @jenschude <jens.schulze@commercetools.de>
4+
*/
5+
6+
namespace Commercetools\Core\Request\ProductDiscounts\Command;
7+
8+
use Commercetools\Core\Model\Common\Context;
9+
use Commercetools\Core\Request\AbstractAction;
10+
use Commercetools\Core\Model\Common\DateTimeDecorator;
11+
use DateTime;
12+
13+
/**
14+
* @package Commercetools\Core\Request\ProductDiscounts\Command
15+
* @link https://docs.commercetools.com/http-api-projects-productDiscounts.html#set-valid-from
16+
* @method string getAction()
17+
* @method ProductDiscountSetValidFromAction setAction(string $action = null)
18+
* @method DateTimeDecorator getValidFrom()
19+
* @method ProductDiscountSetValidFromAction setValidFrom(DateTime $validFrom = null)
20+
*/
21+
class ProductDiscountSetValidFromAction extends AbstractAction
22+
{
23+
public function fieldDefinitions()
24+
{
25+
return [
26+
'action' => [static::TYPE => 'string'],
27+
'validFrom' => [
28+
static::TYPE => DateTime::class,
29+
static::DECORATOR => DateTimeDecorator::class
30+
],
31+
];
32+
}
33+
34+
/**
35+
* @param array $data
36+
* @param Context|callable $context
37+
*/
38+
public function __construct(array $data = [], $context = null)
39+
{
40+
parent::__construct($data, $context);
41+
$this->setAction('setValidFrom');
42+
}
43+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
/**
3+
* @author @jenschude <jens.schulze@commercetools.de>
4+
*/
5+
6+
namespace Commercetools\Core\Request\ProductDiscounts\Command;
7+
8+
use Commercetools\Core\Model\Common\Context;
9+
use Commercetools\Core\Request\AbstractAction;
10+
use Commercetools\Core\Model\Common\DateTimeDecorator;
11+
use DateTime;
12+
13+
/**
14+
* @package Commercetools\Core\Request\ProductDiscounts\Command
15+
* @link https://docs.commercetools.com/http-api-projects-productDiscounts.html#set-valid-until
16+
* @method string getAction()
17+
* @method ProductDiscountSetValidUntilAction setAction(string $action = null)
18+
* @method DateTimeDecorator getValidUntil()
19+
* @method ProductDiscountSetValidUntilAction setValidUntil(DateTime $validUntil = null)
20+
*/
21+
class ProductDiscountSetValidUntilAction extends AbstractAction
22+
{
23+
public function fieldDefinitions()
24+
{
25+
return [
26+
'action' => [static::TYPE => 'string'],
27+
'validUntil' => [
28+
static::TYPE => DateTime::class,
29+
static::DECORATOR => DateTimeDecorator::class
30+
],
31+
];
32+
}
33+
34+
/**
35+
* @param array $data
36+
* @param Context|callable $context
37+
*/
38+
public function __construct(array $data = [], $context = null)
39+
{
40+
parent::__construct($data, $context);
41+
$this->setAction('setValidUntil');
42+
}
43+
}

tests/fixtures/models.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,8 @@ productDiscount:
753753
- sortOrder
754754
- isActive
755755
- references
756+
- validFrom
757+
- validUntil
756758

757759
productDiscountValue:
758760
domain: productDiscount

tests/integration/ProductDiscount/ProductDiscountUpdateRequestTest.php

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
use Commercetools\Core\Request\ProductDiscounts\Command\ProductDiscountChangeSortOrderAction;
1919
use Commercetools\Core\Request\ProductDiscounts\Command\ProductDiscountChangeValueAction;
2020
use Commercetools\Core\Request\ProductDiscounts\Command\ProductDiscountSetDescriptionAction;
21+
use Commercetools\Core\Request\ProductDiscounts\Command\ProductDiscountSetValidFromAction;
22+
use Commercetools\Core\Request\ProductDiscounts\Command\ProductDiscountSetValidUntilAction;
2123
use Commercetools\Core\Request\ProductDiscounts\ProductDiscountCreateRequest;
2224
use Commercetools\Core\Request\ProductDiscounts\ProductDiscountDeleteRequest;
2325
use Commercetools\Core\Request\ProductDiscounts\ProductDiscountUpdateRequest;
@@ -49,7 +51,7 @@ protected function createProductDiscount(ProductDiscountDraft $draft)
4951
$request = ProductDiscountCreateRequest::ofDraft($draft);
5052
$response = $request->executeWithClient($this->getClient());
5153
$productDiscount = $request->mapResponse($response);
52-
$this->cleanupRequests[] = ProductDiscountDeleteRequest::ofIdAndVersion(
54+
$this->cleanupRequests[] = $this->deleteRequest = ProductDiscountDeleteRequest::ofIdAndVersion(
5355
$productDiscount->getId(),
5456
$productDiscount->getVersion()
5557
);
@@ -78,12 +80,7 @@ public function testChangeIsActive()
7880
$this->assertInstanceOf(ProductDiscount::class, $result);
7981
$this->assertSame($isActive, $result->getIsActive());
8082
$this->assertNotSame($productDiscount->getVersion(), $result->getVersion());
81-
82-
$deleteRequest = array_pop($this->cleanupRequests);
83-
$deleteRequest->setVersion($result->getVersion());
84-
$result = $this->getClient()->execute($deleteRequest)->toObject();
85-
86-
$this->assertInstanceOf(ProductDiscount::class, $result);
83+
$this->deleteRequest->setVersion($result->getVersion());
8784
}
8885

8986
public function testChangePredicate()
@@ -108,11 +105,7 @@ public function testChangePredicate()
108105
$this->assertSame($predicate, $result->getPredicate());
109106
$this->assertNotSame($productDiscount->getVersion(), $result->getVersion());
110107

111-
$deleteRequest = array_pop($this->cleanupRequests);
112-
$deleteRequest->setVersion($result->getVersion());
113-
$result = $this->getClient()->execute($deleteRequest)->toObject();
114-
115-
$this->assertInstanceOf(ProductDiscount::class, $result);
108+
$this->deleteRequest->setVersion($result->getVersion());
116109
}
117110

118111

@@ -137,11 +130,7 @@ public function testChangeName()
137130
$this->assertSame($name->en, $result->getName()->en);
138131
$this->assertNotSame($productDiscount->getVersion(), $result->getVersion());
139132

140-
$deleteRequest = array_pop($this->cleanupRequests);
141-
$deleteRequest->setVersion($result->getVersion());
142-
$result = $this->getClient()->execute($deleteRequest)->toObject();
143-
144-
$this->assertInstanceOf(ProductDiscount::class, $result);
133+
$this->deleteRequest->setVersion($result->getVersion());
145134
}
146135

147136
public function testSetDescription()
@@ -164,11 +153,7 @@ public function testSetDescription()
164153
$this->assertSame($description->en, $result->getDescription()->en);
165154
$this->assertNotSame($productDiscount->getVersion(), $result->getVersion());
166155

167-
$deleteRequest = array_pop($this->cleanupRequests);
168-
$deleteRequest->setVersion($result->getVersion());
169-
$result = $this->getClient()->execute($deleteRequest)->toObject();
170-
171-
$this->assertInstanceOf(ProductDiscount::class, $result);
156+
$this->deleteRequest->setVersion($result->getVersion());
172157
}
173158

174159
public function testChangeSortOrder()
@@ -191,11 +176,7 @@ public function testChangeSortOrder()
191176
$this->assertSame($sortOrder, $result->getSortOrder());
192177
$this->assertNotSame($productDiscount->getVersion(), $result->getVersion());
193178

194-
$deleteRequest = array_pop($this->cleanupRequests);
195-
$deleteRequest->setVersion($result->getVersion());
196-
$result = $this->getClient()->execute($deleteRequest)->toObject();
197-
198-
$this->assertInstanceOf(ProductDiscount::class, $result);
179+
$this->deleteRequest->setVersion($result->getVersion());
199180
}
200181

201182
public function testChangeValue()
@@ -226,10 +207,52 @@ public function testChangeValue()
226207
);
227208
$this->assertNotSame($productDiscount->getVersion(), $result->getVersion());
228209

229-
$deleteRequest = array_pop($this->cleanupRequests);
230-
$deleteRequest->setVersion($result->getVersion());
231-
$result = $this->getClient()->execute($deleteRequest)->toObject();
210+
$this->deleteRequest->setVersion($result->getVersion());
211+
}
212+
213+
public function testSetValidFrom()
214+
{
215+
$draft = $this->getDraft('set-valid-from');
216+
$productDiscount = $this->createProductDiscount($draft);
217+
218+
219+
$validFrom = new \DateTime();
220+
$request = ProductDiscountUpdateRequest::ofIdAndVersion(
221+
$productDiscount->getId(),
222+
$productDiscount->getVersion()
223+
)
224+
->addAction(ProductDiscountSetValidFromAction::of()->setValidFrom($validFrom))
225+
;
226+
$response = $request->executeWithClient($this->getClient());
227+
$result = $request->mapResponse($response);
228+
$this->deleteRequest->setVersion($result->getVersion());
229+
230+
$this->assertInstanceOf(ProductDiscount::class, $result);
231+
$validFrom->setTimezone(new \DateTimeZone('UTC'));
232+
$this->assertSame($validFrom->format('c'), $result->getValidFrom()->format('c'));
233+
$this->assertNotSame($productDiscount->getVersion(), $result->getVersion());
234+
}
235+
236+
public function testSetValidUntil()
237+
{
238+
$draft = $this->getDraft('set-valid-from');
239+
$productDiscount = $this->createProductDiscount($draft);
240+
241+
242+
$validUntil = new \DateTime();
243+
$request = ProductDiscountUpdateRequest::ofIdAndVersion(
244+
$productDiscount->getId(),
245+
$productDiscount->getVersion()
246+
)
247+
->addAction(ProductDiscountSetValidUntilAction::of()->setValidUntil($validUntil))
248+
;
249+
$response = $request->executeWithClient($this->getClient());
250+
$result = $request->mapResponse($response);
251+
$this->deleteRequest->setVersion($result->getVersion());
232252

233253
$this->assertInstanceOf(ProductDiscount::class, $result);
254+
$validUntil->setTimezone(new \DateTimeZone('UTC'));
255+
$this->assertSame($validUntil->format('c'), $result->getValidUntil()->format('c'));
256+
$this->assertNotSame($productDiscount->getVersion(), $result->getVersion());
234257
}
235258
}

0 commit comments

Comments
 (0)