'pending', 'Pending-receipt' => 'pending', 'partially-received' => 'pending', 'pending-refund/partially-received' => 'pending', 'pending-refund' => 'pending', 'refunded' => 'refunded', 'cancelled' => 'closed', 'closed' => 'closed', 'pendingApproval' => 'pending', 'pendingReceipt' => 'pending', 'partiallyReceived' => 'pending', 'pendingRefund/partiallyReceived' => 'pending', 'pendingRefund' => 'pending', ]; /** * @var Helper */ protected $helper; /** * @var ProductRepositoryInterface */ protected $productRepository; /** * @var RmaRepositoryInterface */ protected $rmaRepository; /** * @var RmaManagementInterface */ protected $rmaManagement; /** * @var ItemListBuilderInterface */ protected $itemListBuilder; /** * @var ItemManagementInterface */ protected $itemManagement; /** * @var \JR\NetSuite\Mapper\CustomerMapper */ private $customerMapper; /** * RmaMapper constructor. * * @param RmaRepositoryInterface $rmaRepository * @return void */ public function __construct( Helper $helper, ProductRepositoryInterface $productRepository, RmaRepositoryInterface $rmaRepository, RmaManagementInterface $rmaManagement, ItemListBuilderInterface $itemListBuilder, ItemManagementInterface $itemManagement, \JR\NetSuite\Mapper\CustomerMapper $customerMapper ) { $this->helper = $helper; $this->productRepository = $productRepository; $this->rmaRepository = $rmaRepository; $this->rmaManagement = $rmaManagement; $this->itemListBuilder = $itemListBuilder; $this->itemManagement = $itemManagement; $this->customerMapper = $customerMapper; } /** * Convert data from NetSuite format to Magento format. * * @param array $netSuiteData * @return array */ public function convertToMagentoFormat($netSuiteData) { // convert netsuite data to magento data $magentoData = []; foreach ($netSuiteData as $data) { $magentoData[] = [ 'netsuite_id' => $data['internalid'], 'netsuite_tran_id' => $data['tranid'], 'recorded_at' => $data['datecreated'], 'netsuite_order_id' => $data['createdfrom'], 'netsuite_order_number' => $data['custbody_sales_order'], 'transaction_date' => $data['trandate'], 'status' => self::STATUS_MAP[$data['status']] ?? 'pending', 'customer' => $this->customerMapper->convertToMagentoFormat([$data['customer']])[0] ?? [], 'billaddress' => $data['billaddress'], 'billaddress1' => $data['billaddress1'], 'billaddress2' => $data['billaddress2'], 'billcity' => $data['billcity'], 'billcountry' => $data['billcountry'], 'billstate' => $data['billstate'], 'billzip' => $data['billzip'], 'billphone' => $data['billphone'], 'shipaddress' => $data['shipaddress'], 'shipaddress1' => $data['shipaddress1'], 'shipaddress2' => $data['shipaddress2'], 'shipcity' => $data['shipcity'], 'shipcountry' => $data['shipcountry'], 'shipstate' => $data['shipstate'], 'shipzip' => $data['shipzip'], 'shipphone' => $data['shipphone'], 'total' => $data['total'], 'taxtotal' => $data['taxtotal'], 'shippingcost' => $data['shippingcost'], 'discountamount' => $data['discountamount'], 'amount' => $data['amount'], 'location' => $data['location'], 'return_address' => $data['custbody_return_address_proxy'], 'notes' => $data['custbody_notes'], 'internal_notes' => $data['custbody_internal_notes'], 'items' => $this->convertItems($data), ]; } return $magentoData; } /** * Convert items from NetSuite format to Magento format. * * @param array $data * @return array */ protected function convertItems($data) { $items = $data['items']; $result = []; foreach ($items as $item) { $result[] = [ 'sku' => $item['itemText'], 'netsuite_id' => $item['itemId'], 'name' => $item['itemText'], 'type' => $item['type'], 'description' => $item['description'], 'qty' => $item['quantity'], 'qty_billed' => $item['quantitybilled'], 'reason' => $item['reasonCode'], 'condition' => $item['conditions'], 'resolution' => $data['custbody_request_type'], 'rate' => $item['rate'], 'amount' => $item['amount'], 'discountamount' => $item['discountamount'], ]; } return $result; } /** * Convert data from Magento format to NetSuite format. * * @param string $rmaId * @return array */ public function convertToNetSuiteFormat($rmaId) { $rma = $this->rmaRepository->get($rmaId); $order = $this->rmaManagement->getOrder($rma); $customer = $this->rmaManagement->getCustomer($rma); $result = [ 'orderId' => $order->getNetsuiteId(), 'createdAt' => $this->helper->convertLocalTimeToUtc($rma->getCreatedAt(), 'm/d/Y'), 'status' => $this->rmaManagement->getStatus($rma)->getCode(), 'customerId' => $customer->getNetsuiteId(), 'items' => $this->getRmaItems($rma), ]; return $result; } /** * Get RMA items. * * @param RmaInterface $rma * @return array */ protected function getRmaItems($rma) { $items = $this->itemListBuilder->getRmaItems($rma); $result = []; foreach ($items as $item) { if (!$item->getQtyRequested()) { continue; } $orderItem = $this->itemManagement->getOrderItem($item); $product = $this->productRepository->getById($orderItem->getProductId()); $result[] = [ 'id' => $product->getCustomAttribute('netsuite_id')?->getValue() ?? '', 'sku' => $product->getSku(), 'reason' => $this->itemManagement->getReasonName($item), 'condition' => $this->itemManagement->getConditionName($item), 'resolution' => $this->itemManagement->getResolutionName($item), 'rate' => $orderItem->getPrice(), 'qty' => $item->getQtyRequested(), 'amount' => $orderItem->getPrice() * $item->getQtyRequested(), 'tax_percent' => $orderItem->getTaxPercent(), 'tax_amount' => $orderItem->getTaxPercent() / 100 * $orderItem->getPrice() * $item->getQtyRequested(), ]; } return $result; } }