netSuiteAPI = $netSuiteAPI; $this->netSuiteLogger = $netSuiteLogger; } /** * @param Customer $dataCustomer * @param AddressInterface $address * @return bool */ protected function isResaleCertificate(Customer $dataCustomer, AddressInterface $address){ $netsuiteId = $dataCustomer->getCustomAttribute('netsuite_id')?->getValue(); $state = $address->getRegion(); if (!$netsuiteId) { return false; } $query = sprintf( 'custrecord_customer ANY_OF [%d] AND '. 'custrecord_valid IS true AND custrecord_rcert_address_specific IS false AND custrecord_rc_state_full IS "%s"', $netsuiteId, $state ); $service = 'record/v1/customrecord_resale_certificates'; try { $response = $this->netSuiteAPI->get($service, ['q' => $query]); return isset($response['response']['count']) && $response['response']['count'] != 0; } catch (\Exception $e) { $this->netSuiteLogger->error( 'resale certificate request exception: '.$e->getMessage()); } return false; } public function execute(Observer $observer) { /* @var $quote Quote */ $quote = $observer->getData('quote'); $address = $quote->getShippingAddress(); $isResaleCertificate = $this->isResaleCertificate($quote->getCustomer(), $address); if ($isResaleCertificate) { foreach ($quote->getAllItems() as $item) { /* @var $item Quote\Item */ $item->setTaxAmount(0) ->setTaxPercent(0) ->setBaseTaxAmount(0); } $address->setTaxAmount(0)->setBaseTaxAmount(0)->setShippingTaxAmount(0)->setBaseShippingTaxAmount(0); } } }