config = $config; $this->countryGuard = $countryGuard; $this->taxInvoice = $taxInvoice; $this->messageManager = $messageManager; $this->configValidator = $configValidator; $this->invoiceRequestBuilder = $invoiceRequestBuilder; $this->extensionLoader = $extensionLoader; $this->hasInvoiceDeterminer = $hasInvoiceDeterminer; $this->attributeManager = $attributeManager; } /** * Commit a creditmemo to the Vertex Tax Log on Creditmemo Creation * * @param Observer $observer * @return void */ public function execute(Observer $observer) { /** @var Creditmemo $creditMemo */ $creditMemo = $observer->getEvent()->getCreditmemo(); if (!$this->config->isVertexActive($creditMemo->getStoreId())) { return; } /** @var Order $order */ $order = $creditMemo->getOrder(); if ($this->canSend($creditMemo, $order) && $this->hasInvoiceDeterminer->hasInvoice($order->getId())) { $this->extensionLoader->loadOnCreditmemo($creditMemo); $request = $this->invoiceRequestBuilder->buildFromCreditmemo($creditMemo); $response = $this->taxInvoice->sendRefundRequest($request, $order); if ($response) { $this->attributeManager->saveAllVertexAttributes($response->getLineItems()); $this->messageManager->addSuccessMessage(__('The Vertex invoice has been refunded.')->render()); } } } /** * Verify if creditmemo can be sent * * @param Creditmemo $creditMemo * @param Order $order * @return bool */ private function canSend(Creditmemo $creditMemo, Order $order) { return $this->countryGuard->isOrderServiceableByVertex($order) && $this->configValidator ->execute(ScopeInterface::SCOPE_STORE, $creditMemo->getStoreId(), true) ->isValid(); } }