attributeManager = $attributeManager; $this->invoiceItemExtensionFactory = $invoiceItemExtensionFactory; $this->config = $config; } /** * Add Vertex extension attributes to an invoice's items after it is retrieved * * @param InvoiceRepositoryInterface $subject * @param InvoiceInterface $invoice * @return InvoiceInterface */ public function afterGet(InvoiceRepositoryInterface $subject, InvoiceInterface $invoice) { if (!$this->config->isVertexActive($invoice->getStoreId())) { return $invoice; } $invoiceItems = $invoice->getItems(); $orderItemIds = $this->getOrderItemIdsFromInvoiceItemList($invoiceItems); $taxCodes = $this->attributeManager->getTaxCodes($orderItemIds); $vertexTaxCodes = $this->attributeManager->getVertexTaxCodes($orderItemIds); $invoiceTextCodes = $this->attributeManager->getInvoiceTextCodes($orderItemIds); $this->setInvoiceItemVertexExtensionAttributes( $invoiceItems, $vertexTaxCodes, $invoiceTextCodes, $taxCodes ); return $invoice; } /** * Retrieve the Order Item IDs from a list of Invoice Items * * @param InvoiceItemInterface[] $invoiceItems * @return int[] */ private function getOrderItemIdsFromInvoiceItemList(array $invoiceItems) { return array_map( function (InvoiceItemInterface $invoiceItem) { return $invoiceItem->getOrderItemId(); }, $invoiceItems ); } /** * Assign Invoice Item Vertex extension attributes to the Invoice Item object * * @param InvoiceItemInterface[] $invoiceItems * @param string[] $vertexTaxCodes * @param string[] $invoiceTextCodes * @param string[] $taxCodes * @return void */ private function setInvoiceItemVertexExtensionAttributes( array $invoiceItems, array $vertexTaxCodes, array $invoiceTextCodes, array $taxCodes ) { if ($invoiceItems === null) { return; } foreach ($invoiceItems as $invoiceItem) { $this->setVertexTaxCodes($invoiceItem, $vertexTaxCodes); $this->setInvoiceTextCodes($invoiceItem, $invoiceTextCodes); $this->setTaxCodes($invoiceItem, $taxCodes); } } /** * Set InvoiceTextCode extension attribute for Invoice Item * * @param InvoiceItemInterface $invoiceItem * @param string[] $invoiceTextCodes * @return void */ private function setInvoiceTextCodes(InvoiceItemInterface $invoiceItem, array $invoiceTextCodes) { $extensionAttributes = $invoiceItem->getExtensionAttributes(); if ($extensionAttributes && $extensionAttributes->getInvoiceTextCodes()) { return; } if ($invoiceTextCodes !== null && array_key_exists($invoiceItem->getOrderItemId(), $invoiceTextCodes)) { $extensionAttributes = $extensionAttributes ?: $this->invoiceItemExtensionFactory->create(); $extensionAttributes->setInvoiceTextCodes($invoiceTextCodes[$invoiceItem->getOrderItemId()]); $invoiceItem->setExtensionAttributes($extensionAttributes); } } /** * Set the TaxCode extension attribute for an Invoice Item * * @param InvoiceItemInterface $invoiceItem * @param string[] $taxCodes * @return void */ private function setTaxCodes(InvoiceItemInterface $invoiceItem, array $taxCodes) { $extensionAttributes = $invoiceItem->getExtensionAttributes(); if ($extensionAttributes && $extensionAttributes->getTaxCodes()) { return; } if ($taxCodes !== null && array_key_exists($invoiceItem->getOrderItemId(), $taxCodes)) { $extensionAttributes = $extensionAttributes ?: $this->invoiceItemExtensionFactory->create(); $extensionAttributes->setTaxCodes($taxCodes[$invoiceItem->getOrderItemId()]); $invoiceItem->setExtensionAttributes($extensionAttributes); } } /** * Set the VertexTaxCode extension attribute for an Invoice Item * * @param InvoiceItemInterface $invoiceItem * @param string[] $vertexTaxCodes * @return void */ private function setVertexTaxCodes(InvoiceItemInterface $invoiceItem, array $vertexTaxCodes) { $extensionAttributes = $invoiceItem->getExtensionAttributes(); if ($extensionAttributes && $extensionAttributes->getVertexTaxCodes()) { return; } if ($vertexTaxCodes !== null && array_key_exists($invoiceItem->getOrderItemId(), $vertexTaxCodes)) { $extensionAttributes = $extensionAttributes ?: $this->invoiceItemExtensionFactory->create(); $extensionAttributes->setVertexTaxCodes($vertexTaxCodes[$invoiceItem->getOrderItemId()]); $invoiceItem->setExtensionAttributes($extensionAttributes); } } }