Skip to content

Commit f01ff02

Browse files
mstrzyzewskiMaksymilian Strzyżewski
andauthored
Add order status support and fix issue with Api response (#102)
* Add order status support and fix issue with Api response * Update README Co-authored-by: Maksymilian Strzyżewski <[email protected]>
1 parent 41bc536 commit f01ff02

File tree

14 files changed

+437
-21
lines changed

14 files changed

+437
-21
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<?php
2+
3+
namespace Macopedia\Allegro\Block\Adminhtml\Config\Form\Field;
4+
5+
use Macopedia\Allegro\Block\Adminhtml\Config\Form\Field\Renderer\AllegroOrderStatuses;
6+
use Macopedia\Allegro\Block\Adminhtml\Config\Form\Field\Renderer\MagentoOrderStatuses;
7+
use Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray;
8+
use Magento\Framework\DataObject;
9+
use Magento\Framework\Exception\LocalizedException;
10+
11+
class OrderStatuses extends AbstractFieldArray
12+
{
13+
/** @var MagentoOrderStatuses */
14+
protected $magentoBlockOptions;
15+
16+
/** @var AllegroOrderStatuses */
17+
protected $allegroBlockOptions;
18+
19+
/**
20+
* @inheritdoc
21+
*/
22+
protected function _prepareToRender()
23+
{
24+
$this->addColumn('allegro_code', [
25+
'label' => __('Allegro order status'),
26+
'class' => 'required-entry',
27+
'renderer' => $this->getAllegroStatusesRenderer()
28+
]);
29+
$this->addColumn('magento_code', [
30+
'label' => __('Magento order status'),
31+
'class' => 'required-entry',
32+
'renderer' => $this->getMagnetoStatusesRenderer()
33+
]);
34+
35+
$this->_addAfter = false;
36+
$this->_addButtonLabel = __('Add status');
37+
}
38+
39+
/**
40+
* @return MagentoOrderStatuses
41+
* @throws LocalizedException
42+
*/
43+
protected function getMagnetoStatusesRenderer()
44+
{
45+
if (!$this->magentoBlockOptions) {
46+
$this->magentoBlockOptions = $this->getLayout()->createBlock(
47+
MagentoOrderStatuses::class,
48+
'',
49+
['data' => ['is_render_to_js_template' => true]]
50+
);
51+
}
52+
53+
return $this->magentoBlockOptions;
54+
}
55+
56+
/**
57+
* @return AllegroOrderStatuses
58+
* @throws LocalizedException
59+
*/
60+
protected function getAllegroStatusesRenderer()
61+
{
62+
if (!$this->allegroBlockOptions) {
63+
$this->allegroBlockOptions = $this->getLayout()->createBlock(
64+
AllegroOrderStatuses::class,
65+
'',
66+
['data' => ['is_render_to_js_template' => true]]
67+
);
68+
}
69+
70+
return $this->allegroBlockOptions;
71+
}
72+
73+
/**
74+
* Prepare existing row data object.
75+
*
76+
* @param DataObject $row
77+
* @throws LocalizedException
78+
*/
79+
protected function _prepareArrayRow(DataObject $row)
80+
{
81+
$options = [];
82+
$customAttribute = $row->getData('magento_code');
83+
$key = 'option_' . $this->getMagnetoStatusesRenderer()->calcOptionHash($customAttribute);
84+
$options[$key] = 'selected="selected"';
85+
$row->setData('option_extra_attrs', $options);
86+
87+
$customAttribute = $row->getData('allegro_code');
88+
$key = 'option_' . $this->getAllegroStatusesRenderer()->calcOptionHash($customAttribute);
89+
$options[$key] = 'selected="selected"';
90+
$row->setData('option_extra_attrs', $options);
91+
}
92+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace Macopedia\Allegro\Block\Adminhtml\Config\Form\Field\Renderer;
4+
5+
use Magento\Framework\View\Element\Html\Select;
6+
7+
class AllegroOrderStatuses extends Select
8+
{
9+
/**
10+
* @param string $value
11+
* @return $this
12+
*/
13+
public function setInputName($value)
14+
{
15+
return $this->setName($value);
16+
}
17+
18+
/**
19+
* @return array
20+
*/
21+
public function getAllegroOrderStatuses()
22+
{
23+
return [
24+
'NEW' => __('NEW'),
25+
'PROCESSING' => __('PROCESSING'),
26+
'READY_FOR_SHIPMENT' => __('READY FOR SHIPMENT'),
27+
'READY_FOR_PICKUP' => __('READY FOR PICKUP'),
28+
'SENT' => __('SENT'),
29+
'PICKED_UP' => __('PICKED UP'),
30+
'CANCELLED' => __('CANCELLED')
31+
];
32+
}
33+
/**
34+
* @return Select
35+
*/
36+
protected function _prepareLayout()
37+
{
38+
$this->setOptions(
39+
$this->getAllegroOrderStatuses()
40+
);
41+
return parent::_prepareLayout();
42+
}
43+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace Macopedia\Allegro\Block\Adminhtml\Config\Form\Field\Renderer;
4+
5+
use Magento\Framework\View\Element\Context;
6+
use Magento\Framework\View\Element\Html\Select;
7+
use Magento\Sales\Model\ResourceModel\Order\Status\CollectionFactory;
8+
9+
class MagentoOrderStatuses extends Select
10+
{
11+
/**
12+
* @var CollectionFactory
13+
*/
14+
protected $orderStatusCollectionFactory;
15+
16+
/**
17+
* @param CollectionFactory $orderStatusCollectionFactory
18+
* @param Context $context
19+
* @param array $data
20+
*/
21+
public function __construct(
22+
CollectionFactory $orderStatusCollectionFactory,
23+
Context $context,
24+
array $data = []
25+
) {
26+
parent::__construct($context, $data);
27+
$this->orderStatusCollectionFactory = $orderStatusCollectionFactory;
28+
}
29+
30+
/**
31+
* @param $value
32+
* @return $this
33+
*/
34+
public function setInputName($value)
35+
{
36+
return $this->setName($value);
37+
}
38+
39+
/**
40+
* @return $this
41+
*/
42+
protected function _prepareLayout()
43+
{
44+
$collection = $this->orderStatusCollectionFactory->create()->joinStates();
45+
foreach ($collection as $item) {
46+
$this->addOption($item->getStatus(), __($item->getLabel()));
47+
}
48+
49+
return parent::_prepareLayout();
50+
}
51+
}

Model/AllegroOrderStatus.php

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
namespace Macopedia\Allegro\Model;
4+
5+
use Macopedia\Allegro\Logger\Logger;
6+
use Macopedia\Allegro\Model\ResourceModel\Order\CheckoutForm;
7+
use Magento\Framework\App\Config\ScopeConfigInterface;
8+
use Magento\Sales\Model\Order;
9+
10+
class AllegroOrderStatus
11+
{
12+
const STATUSES_MAPPING_CONFIG_KEY = 'allegro/order/mapping';
13+
14+
/**
15+
* @var ScopeConfigInterface
16+
*/
17+
protected $scopeConfig;
18+
19+
/**
20+
* @var CheckoutForm
21+
*/
22+
protected $checkoutForm;
23+
24+
/**
25+
* @var Logger
26+
*/
27+
protected $logger;
28+
29+
/**
30+
* @param ScopeConfigInterface $scopeConfig
31+
* @param CheckoutForm $checkoutForm
32+
* @param Logger $logger
33+
*/
34+
public function __construct(
35+
ScopeConfigInterface $scopeConfig,
36+
CheckoutForm $checkoutForm,
37+
Logger $logger
38+
) {
39+
$this->scopeConfig = $scopeConfig;
40+
$this->checkoutForm = $checkoutForm;
41+
$this->logger = $logger;
42+
}
43+
44+
/**
45+
* @param Order $order
46+
* @return void
47+
*/
48+
public function updateOrderStatus(Order $order)
49+
{
50+
$statusesMapping = $this->scopeConfig->getValue(self::STATUSES_MAPPING_CONFIG_KEY);
51+
$statusesMapping = json_decode($statusesMapping, true);
52+
$statusesMapping = array_column($statusesMapping, 'allegro_code', 'magento_code');
53+
54+
$magentoStatus = $order->getStatus();
55+
$checkoutFormId = $order->getExternalId() ?: $order->getExtensionAttributes()->getExternalId();
56+
if (!isset($statusesMapping[$magentoStatus]) || !$checkoutFormId) {
57+
return;
58+
}
59+
60+
try {
61+
$this->checkoutForm->changeOrderStatus($checkoutFormId, $statusesMapping[$magentoStatus]);
62+
$this->logger->info('Status on Allegro for order ' . $order->getRemoteIp() . ' has been updated');
63+
} catch (\Exception $e) {
64+
$this->logger->exception(
65+
$e,
66+
'Error while trying to update order ' . $order->getIncrementId() . ' status on Allegro: ' . $e->getMessage()//phpcs:ignore
67+
);
68+
}
69+
}
70+
}

Model/Api/Client.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,14 @@ private function sendHttpRequest(TokenInterface $token, Request $request)
178178
public function getResponse(GuzzleClient $client, string $method, string $uri, array $params)
179179
{
180180
$response = $client->request($method, $uri, $params);
181-
return $response->getBody()->getContents();
181+
$contents = $response->getBody()->getContents();
182+
183+
if (empty($contents)) {
184+
return $this->json->serialize(
185+
['statusCode' => $response->getStatusCode(), 'reasonPhrase' => $response->getReasonPhrase()]
186+
);
187+
}
188+
189+
return $contents;
182190
}
183191
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
3+
namespace Macopedia\Allegro\Model\Config\Backend;
4+
5+
use Magento\Framework\App\Cache\TypeListInterface;
6+
use Magento\Framework\App\Config\ScopeConfigInterface;
7+
use Magento\Framework\App\Config\Value as ConfigValue;
8+
use Magento\Framework\Data\Collection\AbstractDb;
9+
use Magento\Framework\Model\Context;
10+
use Magento\Framework\Model\ResourceModel\AbstractResource;
11+
use Magento\Framework\Registry;
12+
use Magento\Framework\Serialize\SerializerInterface;
13+
14+
class OrderStatuses extends ConfigValue
15+
{
16+
/** @var SerializerInterface */
17+
private $serializer;
18+
19+
/**
20+
* @param SerializerInterface $serializer
21+
* @param Context $context
22+
* @param Registry $registry
23+
* @param ScopeConfigInterface $config
24+
* @param TypeListInterface $cacheTypeList
25+
* @param AbstractResource|null $resource
26+
* @param AbstractDb|null $resourceCollection
27+
* @param array $data
28+
*/
29+
public function __construct(
30+
SerializerInterface $serializer,
31+
Context $context,
32+
Registry $registry,
33+
ScopeConfigInterface $config,
34+
TypeListInterface $cacheTypeList,
35+
AbstractResource $resource = null,
36+
AbstractDb $resourceCollection = null,
37+
array $data = []
38+
) {
39+
$this->serializer = $serializer;
40+
parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data);
41+
}
42+
43+
/**
44+
* @return void
45+
*/
46+
public function beforeSave()
47+
{
48+
/** @var array $value */
49+
$value = $this->getValue();
50+
unset($value['__empty']);
51+
array_walk_recursive($value, function (&$v) {
52+
$v = trim($v);
53+
});
54+
$encodedValue = $this->serializer->serialize($value);
55+
56+
$this->setValue($encodedValue);
57+
}
58+
59+
/**
60+
* @return void
61+
*/
62+
protected function _afterLoad()
63+
{
64+
/** @var string $value */
65+
$value = $this->getValue();
66+
if ($value) {
67+
$decodedValue = $this->serializer->unserialize($value);
68+
} else {
69+
$decodedValue = '';
70+
}
71+
72+
$this->setValue($decodedValue);
73+
}
74+
}

Model/ResourceModel/Order/CheckoutForm.php

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace Macopedia\Allegro\Model\ResourceModel\Order;
44

55
use Macopedia\Allegro\Model\Api\ClientException;
6+
use Macopedia\Allegro\Model\Api\ClientResponseErrorException;
7+
use Macopedia\Allegro\Model\Api\ClientResponseException;
68
use Macopedia\Allegro\Model\ResourceModel\AbstractResource;
79

810
/**
@@ -14,8 +16,8 @@ class CheckoutForm extends AbstractResource
1416
* @param $checkoutFormId
1517
* @return array
1618
* @throws ClientException
17-
* @throws \Macopedia\Allegro\Model\Api\ClientResponseErrorException
18-
* @throws \Macopedia\Allegro\Model\Api\ClientResponseException
19+
* @throws ClientResponseErrorException
20+
* @throws ClientResponseException
1921
*/
2022
public function getCheckoutForm($checkoutFormId)
2123
{
@@ -27,11 +29,24 @@ public function getCheckoutForm($checkoutFormId)
2729
* @param array $shippingData
2830
* @return array
2931
* @throws ClientException
30-
* @throws \Macopedia\Allegro\Model\Api\ClientResponseErrorException
31-
* @throws \Macopedia\Allegro\Model\Api\ClientResponseException
32+
* @throws ClientResponseErrorException
33+
* @throws ClientResponseException
3234
*/
3335
public function shipment($checkoutFormId, array $shippingData)
3436
{
3537
return $this->requestPost('order/checkout-forms/' . $checkoutFormId . '/shipments', $shippingData);
3638
}
39+
40+
/**
41+
* @param $checkoutFormId
42+
* @param string $status
43+
* @return array
44+
* @throws ClientException
45+
* @throws ClientResponseErrorException
46+
* @throws ClientResponseException
47+
*/
48+
public function changeOrderStatus($checkoutFormId, string $status)
49+
{
50+
return $this->requestPut('order/checkout-forms/' . $checkoutFormId . '/fulfillment', ['status' => $status]);
51+
}
3752
}

0 commit comments

Comments
 (0)