190 lines
5.0 KiB
PHP
Executable File
190 lines
5.0 KiB
PHP
Executable File
<?php
|
|
|
|
namespace JR\NetSuite\Queue;
|
|
|
|
use JR\NetSuite\Lib\NetSuiteAPI;
|
|
use Magento\Framework\Serialize\SerializerInterface;
|
|
|
|
use \JR\NetSuite\Model\ResourceModel\RmaQueue\CollectionFactory as RmaQueueCollectionFactory;
|
|
use \JR\NetSuite\Service\RmaSyncService;
|
|
use \JR\NetSuite\Mapper\RmaMapper;
|
|
use \Mirasvit\Rma\Api\Repository\RmaRepositoryInterface;
|
|
|
|
class RmaPushQueueManager extends AbstractQueueManager
|
|
{
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $name = 'Rma';
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
protected $pageSize = 200;
|
|
|
|
/**
|
|
* @var RmaQueueCollectionFactory
|
|
*/
|
|
protected $rmaQueueCollectionFactory;
|
|
|
|
/**
|
|
* @var RmaSyncService
|
|
*/
|
|
protected $rmaSync;
|
|
|
|
/**
|
|
* @var RmaMapper
|
|
*/
|
|
protected $rmaMapper;
|
|
|
|
/**
|
|
* @var RmaRepositoryInterface
|
|
*/
|
|
protected $rmaRepository;
|
|
|
|
/**
|
|
* RmaPushQueueManager constructor.
|
|
*
|
|
* @param \JR\NetSuite\Helper\Data $helper
|
|
* @param \JR\NetSuite\Logger\Logger $logger
|
|
* @param SerializerInterface $serializer
|
|
* @param NetSuiteAPI $netSuiteAPI
|
|
* @param RmaQueueCollectionFactory $rmaQueueCollectionFactory
|
|
* @param RmasSyncService $rmaSync
|
|
* @param RmaMapper $rmaMapper
|
|
* @param RmaRepositoryInterface $rmaRepository
|
|
* @return void
|
|
*/
|
|
public function __construct(
|
|
\JR\NetSuite\Helper\Data $helper,
|
|
\JR\NetSuite\Logger\Logger $logger,
|
|
SerializerInterface $serializer,
|
|
NetSuiteAPI $netSuiteAPI,
|
|
RmaQueueCollectionFactory $rmaQueueCollectionFactory,
|
|
RmaSyncService $rmaSync,
|
|
RmaMapper $rmaMapper,
|
|
RmaRepositoryInterface $rmaRepository
|
|
) {
|
|
parent::__construct($helper, $logger, $serializer, $netSuiteAPI);
|
|
$this->rmaQueueCollectionFactory = $rmaQueueCollectionFactory;
|
|
$this->rmaSync = $rmaSync;
|
|
$this->rmaMapper = $rmaMapper;
|
|
$this->rmaRepository = $rmaRepository;
|
|
}
|
|
|
|
/**
|
|
* Fetch data from NetSuite
|
|
*
|
|
* @param int $pageSize
|
|
* @param int $page
|
|
* @return array
|
|
*/
|
|
public function fetch($pageSize = 50, $page = 1, $additionalParams = [])
|
|
{
|
|
$rmaCollection = $this->rmaRepository->getCollection();
|
|
$rmaCollection->addFieldToFilter('status.code', ['eq' => 'pending']);
|
|
$rmas = $rmaCollection->getColumnValues('rma_id');
|
|
|
|
$rmaQueueCollection = $this->rmaQueueCollectionFactory->create();
|
|
$rmaQueueCollection->addFieldToFilter('rma_id', ['in' => $rmas]);
|
|
$rmaQueueCollection->addFieldToFilter('netsuite_id', ['neq' => '']);
|
|
$returnAuthIds = $rmaQueueCollection->getColumnValues('netsuite_id');
|
|
if (empty($returnAuthIds)) {
|
|
return ['data' => []];
|
|
}
|
|
$filter = ['filter' => [
|
|
'internalid', 'anyof', $returnAuthIds
|
|
]];
|
|
return $this->netSuiteAPI->fetchReturnAuthorizations($pageSize, $page, $filter);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function getPageSize()
|
|
{
|
|
return $this->pageSize;
|
|
}
|
|
|
|
/**
|
|
* Convert NetSuite data to Magento format
|
|
*
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function convertToMagentoFormat($data)
|
|
{
|
|
return $this->rmaMapper->convertToMagentoFormat($data);
|
|
}
|
|
|
|
/**
|
|
* adds data to the queue.
|
|
*
|
|
* @param array $data
|
|
* @return void
|
|
*/
|
|
public function enqueue($data)
|
|
{
|
|
$rmaToBeUpdated = [];
|
|
$queue = $this->rmaQueueCollectionFactory->create();
|
|
$dataMap = [];
|
|
foreach ($data as $item) {
|
|
$dataMap[$item['netsuite_id']] = $item;
|
|
}
|
|
$queue->addFieldToFilter('netsuite_id', ['in' => array_keys($dataMap)]);
|
|
foreach ($queue as $item) {
|
|
$dataRow = $dataMap[$item->getNetsuiteId()];
|
|
$item->setNetsuiteTranId($dataRow['netsuite_tran_id']);
|
|
$item->setMessages($dataRow['status']);
|
|
$item->setRetry($item->getRetry() + 1);
|
|
$item->setRetryAt(new \DateTime());
|
|
#if item data is change , save if
|
|
if ($item->hasDataChanges()) {
|
|
$item->save();
|
|
}
|
|
// change the status of the RMA in Magento
|
|
if ($dataRow['status'] != 'pending') {
|
|
$rmaToBeUpdated[$item->getRmaId()] = $dataRow['status'];
|
|
}
|
|
}
|
|
$this->rmaSync->updateRmaStatus($rmaToBeUpdated);
|
|
}
|
|
|
|
/**
|
|
* Get next queue items to process
|
|
*
|
|
* @param int $batchSize
|
|
* @return array
|
|
*/
|
|
public function dequeue($batchSize = 50)
|
|
{
|
|
return $this->rmaQueueCollectionFactory->create()->addFieldToSelect('*')
|
|
->addFieldToFilter('status', ['eq' => 'pending'])
|
|
->addFieldToFilter('netsuite_tran_id', ['eq' => ''])
|
|
->setPageSize($batchSize)->setCurPage(1);
|
|
}
|
|
|
|
/**
|
|
* Process queue item
|
|
*
|
|
* @param $queueItem
|
|
* @return array
|
|
*/
|
|
public function processQueueItem($queueItem)
|
|
{
|
|
$rmaData = $this->rmaMapper->convertToNetSuiteFormat($queueItem->getRmaId());
|
|
if (!$rmaData['orderId']) {
|
|
return ['error' => true, 'message' => 'Order not sync in NetSuite'];
|
|
}
|
|
$result = $this->netSuiteAPI->createReturnAuthorization($rmaData);
|
|
if (!$result['error']) {
|
|
$queueItem->setNetsuiteId($result['returnAuthId']);
|
|
$queueItem->setNetsuiteTranId($result['tranid']);
|
|
$queueItem->setMessage($result['status']);
|
|
$queueItem->save();
|
|
}
|
|
return $result;
|
|
}
|
|
}
|