174 lines
5.3 KiB
PHP
Executable File
174 lines
5.3 KiB
PHP
Executable File
<?php
|
|
namespace JR\NetSuite\Model\Queue;
|
|
|
|
use JR\NetSuite\Helper\Data as Helper;
|
|
use JR\NetSuite\Logger\Logger;
|
|
use JR\NetSuite\Lib\NetSuiteAPI;
|
|
use JR\NetSuite\Mapper\OrderMapper;
|
|
use JR\NetSuite\Mapper\CustomerMapper;
|
|
use JR\NetSuite\Service\OrdersSyncService;
|
|
use JR\NetSuite\Service\CustomersSyncService;
|
|
use JR\NetSuite\Queue\CustomerQueueManager;
|
|
use Magento\Sales\Api\OrderRepositoryInterface;
|
|
use Magento\Framework\Serialize\Serializer\Json;
|
|
|
|
class Consumer
|
|
{
|
|
const SUCCESS_RESULT = 200;
|
|
|
|
/**
|
|
* @var NetSuiteAPI
|
|
*/
|
|
protected $netSuiteAPI;
|
|
|
|
/**
|
|
* @var Logger
|
|
*/
|
|
protected $logger;
|
|
|
|
/**
|
|
* @var Json
|
|
*/
|
|
protected $json;
|
|
|
|
/**
|
|
* @var Helper
|
|
*/
|
|
protected $helper;
|
|
|
|
/**
|
|
* @var OrderMapper
|
|
*/
|
|
protected $orderMapper;
|
|
|
|
/**
|
|
* @var CustomerMapper
|
|
*/
|
|
protected $customerMapper;
|
|
|
|
/**
|
|
* @var OrdersSyncService
|
|
*/
|
|
protected $ordersSyncService;
|
|
|
|
/**
|
|
* @var CustomersSyncService
|
|
*/
|
|
protected $customersSyncService;
|
|
|
|
/**
|
|
* @var CustomerQueueManager
|
|
*/
|
|
protected $customerQueueManager;
|
|
|
|
/**
|
|
* @var OrderRepositoryInterface
|
|
*/
|
|
protected $orderRepository;
|
|
|
|
/**
|
|
* @param Helper $helper
|
|
* @param Logger $logger
|
|
* @param Json $json
|
|
* @param NetSuiteAPI $netSuiteAPI
|
|
* @param OrderMapper $orderMapper
|
|
* @param CustomerMapper $customerMapper
|
|
* @param OrdersSyncService $ordersSyncService
|
|
* @param CustomersSyncService $customersSyncService
|
|
* @param CustomerQueueManager $customerQueueManager
|
|
* @param OrderRepositoryInterface $orderRepository
|
|
* @return void
|
|
*/
|
|
public function __construct(
|
|
Helper $helper,
|
|
Logger $logger,
|
|
Json $json,
|
|
NetSuiteAPI $netSuiteAPI,
|
|
OrderMapper $orderMapper,
|
|
CustomerMapper $customerMapper,
|
|
OrdersSyncService $ordersSyncService,
|
|
CustomersSyncService $customersSyncService,
|
|
CustomerQueueManager $customerQueueManager,
|
|
OrderRepositoryInterface $orderRepository,
|
|
|
|
) {
|
|
$this->helper = $helper;
|
|
$this->logger = $logger;
|
|
$this->json = $json;
|
|
$this->netSuiteAPI = $netSuiteAPI;
|
|
$this->orderMapper = $orderMapper;
|
|
$this->customerMapper = $customerMapper;
|
|
$this->ordersSyncService = $ordersSyncService;
|
|
$this->customersSyncService = $customersSyncService;
|
|
$this->customerQueueManager = $customerQueueManager;
|
|
$this->orderRepository = $orderRepository;
|
|
}
|
|
|
|
/**
|
|
* Run process from queue
|
|
*
|
|
* @param $data
|
|
* @return void
|
|
* @throws \Exception
|
|
*/
|
|
public function process($data) : void
|
|
{
|
|
// checking if the module is enabled
|
|
if ($this->helper->getNetSuiteIsEnabled()) {
|
|
// run process from queue and send request
|
|
|
|
$data = $this->json->unserialize($data);
|
|
|
|
// check if the order is already synced
|
|
$order = $this->orderMapper->getOrderBy('increment_id', $data["order_id"]);
|
|
if (!$order) {
|
|
throw new \Exception('Order with #' . $data["order_id"] .' not found');
|
|
}
|
|
if ($order->getNetSuiteId()) {
|
|
return;
|
|
}
|
|
|
|
$filter = ['filter' => ['email', 'is', $data["customer_email"]]];
|
|
$result = $this->netSuiteAPI->fetchCustomersWithFilter(1, 1, $filter);
|
|
|
|
if (!empty($result['error'])) {
|
|
throw new \Exception('Error while fetching customer data: ' . $result['message']);
|
|
}
|
|
|
|
// customer is not found
|
|
if (empty($result['data'])) {
|
|
$this->logger->info("JR Netsuite Model Queue Consumer: Order " . $data["order_id"] . " Customer " . $data["customer_email"] . " not found");
|
|
return;
|
|
// map customer data
|
|
$mapCustomerData = $this->customerMapper->convertToNetSuiteFormatByEmail($data["customer_email"]);
|
|
|
|
// update customer data to NetSuite
|
|
$result = $this->netSuiteAPI->updateCustomer($mapCustomerData);
|
|
if ($result['code'] == self::SUCCESS_RESULT) {
|
|
$netsuiteCustomerId = $result['data']['internal_id'];
|
|
// save the customer Id
|
|
$this->customersSyncService->saveNetsuiteId($data["customer_email"], $netsuiteCustomerId);
|
|
} else {
|
|
throw new \Exception('Error while updating customer data: ' . $result['msg']);
|
|
}
|
|
} else {
|
|
$netsuiteCustomerId = $result['data'][0]['internalid'];
|
|
}
|
|
|
|
// map order data
|
|
$mapOrderData = $this->orderMapper->convertToNetSuiteFormat($order);
|
|
|
|
// $this->logger->info('Map Order Data: ' . $this->json->serialize($mapOrderData));
|
|
$mapOrderData['entity'] = $netsuiteCustomerId;
|
|
$result = $this->netSuiteAPI->updateOrder($mapOrderData);
|
|
|
|
// update order status in case of successful result
|
|
if ($result['code'] == self::SUCCESS_RESULT) {
|
|
// save the order Id
|
|
$this->ordersSyncService->saveNetsuiteId($order, $result['data']['internal_id']);
|
|
} else {
|
|
throw new \Exception('Error while updating order data: ' . $result['msg']);
|
|
}
|
|
}
|
|
}
|
|
} |