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; } }