_init('JR\NetSuite\Model\RmaQueue', 'JR\NetSuite\Model\ResourceModel\RmaQueue'); } /** * get collection of RmaQueue with netsuite_tran_id filter * */ public function getCollectionByNetsuiteTranId($netsuiteTranId){ $collection = $this ->addFieldToSelect('*') ->addFieldToFilter('netsuite_tran_id', ['eq' => $netsuiteTranId]) ->setOrder('id', 'desc'); return $collection; } /** * Get next items in the queue based on batch size * * @param int $batchSize */ public function getNext($batchSize = null) { $collection = $this ->addFieldToSelect('*') ->addFieldToFilter('status', ['eq' => 'pending']) ->addFieldToFilter('data', ['notnull' => true]) ->setOrder('id', 'asc'); if ($batchSize) { $collection->getSelect()->limit($batchSize); } return $collection; } /** * Insert or update based on UNIQUE combo 'key-processing' * @param $key * @param $value */ public function insertOrUpdate($item) { $connection = $this->getConnection(); try { // Start a transaction // $connection->beginTransaction(); // echo json_encode($item, JSON_PRETTY_PRINT) . "\n"; // update the existing item with same netsuite_order_id $select = $connection->select() ->from($this->getMainTable()) // ->where('status = ?', 'pending') // ->where('netsuite_tran_id = ?', $item['netsuite_tran_id']) ->where('netsuite_id = ?', $item['netsuite_id']); $existingItem = $connection->fetchRow($select); if (!$existingItem) { $existingItem = []; } // if the existing item is already success and the data is the same, skip if (isset($existingItem['status']) && $existingItem['status'] == 'success' && isset($existingItem['data']) && $existingItem['data'] == json_encode($item)) { return; } $recorded_at = \DateTime::createFromFormat('m/d/Y g:i a', $item['recorded_at'], new \DateTimeZone('America/Los_Angeles')); $recorded_at->setTimezone(new \DateTimeZone('UTC')); $data = [ 'netsuite_id' => $item['netsuite_id'], 'netsuite_tran_id' => $item['netsuite_tran_id'], 'data' => json_encode($item), 'messages' => '', 'recorded_at' => $recorded_at->format('Y-m-d H:i:s'), // 'created_at' => (new \DateTime())->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT), 'status' => 'pending', ]; // update the existing item with same netsuite_order_id if (isset($existingItem['id'])) { $data['id'] = $existingItem['id']; } // Insert new item or update existing one $connection->insertOnDuplicate($this->getMainTable(), $data); // Commit the transaction // $connection->commit(); } catch (\Exception $e) { // Rollback the transaction in case of an error $connection->rollBack(); throw new \Magento\Framework\Exception\LocalizedException( __('Error in insertOrUpdate: %1', $e->getMessage()), $e ); } } /** * Get last sync netsuite rma id * * @return string */ public function getLastSyncRecordDate() { $select = $this->getConnection()->select() ->from($this->getMainTable(), ['recorded_at']) ->order('recorded_at DESC') ->limit(1); return $this->getConnection()->fetchOne($select); } /** * Get last sync netsuite rma id * * @return string */ public function getLastSyncNetsuiteId() { $select = $this->getConnection()->select() ->from($this->getMainTable(), ['netsuite_id']) ->where('data IS NOT NULL') ->order('netsuite_id DESC') ->limit(1); return $this->getConnection()->fetchOne($select); } }