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 @@
-
-
-