diff --git a/vendor/magento/module-gift-card/Model/GenerateGiftCardAccounts.php b/vendor/magento/module-gift-card/Model/GenerateGiftCardAccounts.php new file mode 100644 index 00000000000..d035315e2b1 --- /dev/null +++ b/vendor/magento/module-gift-card/Model/GenerateGiftCardAccounts.php @@ -0,0 +1,155 @@ +scopeConfig = $scopeConfig; + $this->eventManager = $eventManager; + $this->accountGenerator = $accountGenerator; + } + + /** + * Generate gift card accounts after invoice save. + * + * @param Invoice $invoice + * @return void + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function process(Invoice $invoice) + { + /** @var Order $order */ + $order = $invoice->getOrder(); + + $orderPaid = false; + + $requiredStatus = (int)$this->scopeConfig->getValue( + Giftcard::XML_PATH_ORDER_ITEM_STATUS, + ScopeInterface::SCOPE_STORE, + $order->getStore() + ); + + if ($requiredStatus !== Item::STATUS_INVOICED || $invoice->getIsUsedForRefund()) { + return; + } + + if ((abs((float)$order->getBaseGrandTotal() - (float)$invoice->getBaseGrandTotal()) < 0.0001)) { + $orderPaid = true; + } + + /** @var Item $giftCardItem */ + foreach ($this->getGiftCardOrderItems($order) as $giftCardItem) { + if ($orderPaid) { + $qty = (int)$giftCardItem->getQtyInvoiced(); + } else { + $qty = $this->getInvoicedOrderItemQty($invoice, $giftCardItem); + } + + $options = $giftCardItem->getProductOptions(); + $qtyGiftCardCodes = isset($options['giftcard_created_codes']) + ? count($options['giftcard_created_codes']) + : 0; + if ($qtyGiftCardCodes < (int)$giftCardItem->getQtyInvoiced()) { + $options['giftcard_paid_invoice_items'][] = $giftCardItem->getItemId(); + $this->accountGenerator->generate($giftCardItem, $qty, $options); + } + } + } + + /** + * Return only gift card items from order + * + * @param Order $order + * @return array + */ + private function getGiftCardOrderItems(Order $order): array + { + $items = []; + foreach ($order->getAllItems() as $orderItem) { + if ($orderItem->getProductType() === ProductGiftCard::TYPE_GIFTCARD) { + $items[] = $orderItem; + } + } + return $items; + } + + /** + * Returns order item invoiced quantity. + * + * @param InvoiceInterface $invoice + * @param OrderItemInterface $orderItem + * @return int + */ + private function getInvoicedOrderItemQty( + InvoiceInterface $invoice, + OrderItemInterface $orderItem + ): int { + $qty = 0; + foreach ($invoice->getItems() as $invoiceItem) { + // check, if this order item has been paid + if ($invoiceItem->getOrderItemId() === $orderItem->getItemId() + && $invoice->getState() == Invoice::STATE_PAID + ) { + $qty = (int)$invoiceItem->getQty(); + } + } + + return $qty; + } +} diff --git a/vendor/magento/module-gift-card/Observer/AdminGenerateGiftCardAccounts.php b/vendor/magento/module-gift-card/Observer/AdminGenerateGiftCardAccounts.php new file mode 100644 index 00000000000..54f0fbb8baa --- /dev/null +++ b/vendor/magento/module-gift-card/Observer/AdminGenerateGiftCardAccounts.php @@ -0,0 +1,57 @@ +giftCardAccounts = $giftCardAccounts; + } + + /** + * Generate gift card accounts after invoice save. + * + * @param Observer $observer + * @return void + */ + public function execute(Observer $observer) + { + $event = $observer->getEvent(); + /** @var Invoice $invoice */ + $invoice = $event->getInvoice(); + $this->giftCardAccounts->process($invoice); + } +} diff --git a/vendor/magento/module-gift-card/Observer/GenerateGiftCardAccountsInvoice.php b/vendor/magento/module-gift-card/Observer/GenerateGiftCardAccountsInvoice.php deleted file mode 100644 index 3322e3e6065..00000000000 --- a/vendor/magento/module-gift-card/Observer/GenerateGiftCardAccountsInvoice.php +++ /dev/null @@ -1,147 +0,0 @@ -scopeConfig = $scopeConfig; - $this->eventManager = $eventManager; - $this->accountGenerator = $accountGenerator; - } - - /** - * Generate gift card accounts after invoice save. - * - * @param Observer $observer - * @return void - */ - public function execute(Observer $observer) - { - $event = $observer->getEvent(); - /** @var Invoice $invoice */ - $invoice = $event->getInvoice(); - /** @var Order $order */ - $order = $invoice->getOrder(); - $orderPaid = false; - - $requiredStatus = (int)$this->scopeConfig->getValue( - Giftcard::XML_PATH_ORDER_ITEM_STATUS, - ScopeInterface::SCOPE_STORE, - $order->getStore() - ); - - if ($requiredStatus !== Item::STATUS_INVOICED || $invoice->getIsUsedForRefund()) { - return; - } - - if ((abs((float)$order->getBaseGrandTotal() - (float)$invoice->getBaseGrandTotal()) < 0.0001)) { - $orderPaid = true; - } - - /** @var Item $giftCardItem */ - foreach ($this->getGiftCardOrderItems($order) as $giftCardItem) { - if ($orderPaid) { - $qty = (int)$giftCardItem->getQtyInvoiced(); - } else { - $qty = $this->getInvoicedOrderItemQty($invoice, $giftCardItem); - } - - $options = $giftCardItem->getProductOptions(); - $qtyGiftcardCodes = isset($options['giftcard_created_codes']) - ? count($options['giftcard_created_codes']) - : 0; - if ($qtyGiftcardCodes < (int)$giftCardItem->getQtyInvoiced()) { - $options['giftcard_paid_invoice_items'][] = $giftCardItem->getItemId(); - $this->accountGenerator->generate($giftCardItem, $qty, $options); - } - } - } - - /** - * Return only gift card items from order - * - * @param Order $order - * @return array - */ - private function getGiftCardOrderItems(Order $order): array - { - $items = []; - foreach ($order->getAllItems() as $orderItem) { - if ($orderItem->getProductType() === ProductGiftCard::TYPE_GIFTCARD) { - $items[] = $orderItem; - } - } - return $items; - } - - /** - * Returns order item invoiced quantity. - * - * @param InvoiceInterface $invoice - * @param OrderItemInterface $orderItem - * @return int - */ - private function getInvoicedOrderItemQty( - InvoiceInterface $invoice, - OrderItemInterface $orderItem - ): int { - $qty = 0; - foreach ($invoice->getItems() as $invoiceItem) { - // check, if this order item has been paid - if ($invoiceItem->getOrderItemId() === $orderItem->getItemId() - && $invoice->getState() == Invoice::STATE_PAID - ) { - $qty = (int)$invoiceItem->getQty(); - } - } - - return $qty; - } -} diff --git a/vendor/magento/module-gift-card/Plugin/Sales/Model/GenerateGiftCardAccountsInvoice.php b/vendor/magento/module-gift-card/Plugin/Sales/Model/GenerateGiftCardAccountsInvoice.php new file mode 100644 index 00000000000..b2cbfcb17be --- /dev/null +++ b/vendor/magento/module-gift-card/Plugin/Sales/Model/GenerateGiftCardAccountsInvoice.php @@ -0,0 +1,73 @@ +invoiceRepository = $invoiceRepository; + $this->giftCardAccounts = $giftCardAccounts; + } + + /** + * Generate gift card accounts after invoice save. + * + * @param InvoiceOrder $subject + * @param mixed $invoiceId + * + * @return mixed + * @throws InputException + * @throws NoSuchEntityException + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function afterExecute(InvoiceOrder $subject, $invoiceId) + { + /** @var Invoice $invoice */ + $invoice = $this->invoiceRepository->get($invoiceId); + $this->giftCardAccounts->process($invoice); + return $invoiceId; + } +} diff --git a/vendor/magento/module-gift-card/etc/adminhtml/events.xml b/vendor/magento/module-gift-card/etc/adminhtml/events.xml index 0e1e84f6b3a..f083c441eb7 100644 --- a/vendor/magento/module-gift-card/etc/adminhtml/events.xml +++ b/vendor/magento/module-gift-card/etc/adminhtml/events.xml @@ -12,4 +12,7 @@ + + + diff --git a/vendor/magento/module-gift-card/etc/di.xml b/vendor/magento/module-gift-card/etc/di.xml index 46d65c5a95a..b1c501cea06 100644 --- a/vendor/magento/module-gift-card/etc/di.xml +++ b/vendor/magento/module-gift-card/etc/di.xml @@ -201,4 +201,7 @@ + + + diff --git a/vendor/magento/module-gift-card/etc/events.xml b/vendor/magento/module-gift-card/etc/events.xml index 064733eb742..f738504c51e 100644 --- a/vendor/magento/module-gift-card/etc/events.xml +++ b/vendor/magento/module-gift-card/etc/events.xml @@ -9,9 +9,6 @@ - - -