From c487576e1872ddfba182aa668075a68f6f835c46 Mon Sep 17 00:00:00 2001 From: David Remer Date: Fri, 25 Aug 2023 13:01:51 +0300 Subject: [PATCH] Track refunds [MAILPOET-5485] --- mailpoet/lib/Config/Hooks.php | 7 +++++++ mailpoet/lib/Config/HooksWooCommerce.php | 8 ++++++++ .../StatisticsWooCommercePurchasesRepository.php | 4 ++-- mailpoet/lib/Statistics/Track/WooCommercePurchases.php | 8 ++++++++ .../Statistics/Track/WooCommercePurchasesTest.php | 6 +++--- 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/mailpoet/lib/Config/Hooks.php b/mailpoet/lib/Config/Hooks.php index 81339849bb..f8cf115ca2 100644 --- a/mailpoet/lib/Config/Hooks.php +++ b/mailpoet/lib/Config/Hooks.php @@ -419,6 +419,13 @@ class Hooks { 10, 1 ); + + $this->wp->addAction( + 'woocommerce_order_refunded', + [$this->hooksWooCommerce, 'trackRefund'], + 10, + 1 + ); } public function setupWooCommerceSubscriberEngagement() { diff --git a/mailpoet/lib/Config/HooksWooCommerce.php b/mailpoet/lib/Config/HooksWooCommerce.php index b620d8f413..c6a917898e 100644 --- a/mailpoet/lib/Config/HooksWooCommerce.php +++ b/mailpoet/lib/Config/HooksWooCommerce.php @@ -115,6 +115,14 @@ class HooksWooCommerce { } } + public function trackRefund($id) { + try { + $this->woocommercePurchases->trackRefund($id); + } catch (\Throwable $e) { + $this->logError($e, 'WooCommerce Purchases Refund'); + } + } + public function extendForm() { try { $this->subscriberRegistration->extendForm(); diff --git a/mailpoet/lib/Statistics/StatisticsWooCommercePurchasesRepository.php b/mailpoet/lib/Statistics/StatisticsWooCommercePurchasesRepository.php index 2a6f41b825..a83dbea03b 100644 --- a/mailpoet/lib/Statistics/StatisticsWooCommercePurchasesRepository.php +++ b/mailpoet/lib/Statistics/StatisticsWooCommercePurchasesRepository.php @@ -52,13 +52,13 @@ class StatisticsWooCommercePurchasesRepository extends Repository { $click, $order->get_id(), $order->get_currency(), - $order->get_total(), + (float)$order->get_remaining_refund_amount(), $order->get_status() ); $this->persist($statistics); } else { $statistics->setOrderCurrency($order->get_currency()); - $statistics->setOrderPriceTotal($order->get_total()); + $statistics->setOrderPriceTotal((float)$order->get_remaining_refund_amount()); $statistics->setStatus($order->get_status()); } $statistics->setSubscriber($click->getSubscriber()); diff --git a/mailpoet/lib/Statistics/Track/WooCommercePurchases.php b/mailpoet/lib/Statistics/Track/WooCommercePurchases.php index a18ef99661..346ce2a8df 100644 --- a/mailpoet/lib/Statistics/Track/WooCommercePurchases.php +++ b/mailpoet/lib/Statistics/Track/WooCommercePurchases.php @@ -92,6 +92,14 @@ class WooCommercePurchases { } } + public function trackRefund($id) { + $order = $this->woocommerceHelper->wcGetOrder($id); + if (!$order instanceof WC_Order) { + return; + } + $this->trackExistingStatistic($order); + } + /** * Returns true when a valid purchase statistic for an order was found. * diff --git a/mailpoet/tests/integration/Statistics/Track/WooCommercePurchasesTest.php b/mailpoet/tests/integration/Statistics/Track/WooCommercePurchasesTest.php index 0486db5337..aa6af79b75 100644 --- a/mailpoet/tests/integration/Statistics/Track/WooCommercePurchasesTest.php +++ b/mailpoet/tests/integration/Statistics/Track/WooCommercePurchasesTest.php @@ -158,7 +158,7 @@ class WooCommercePurchasesTest extends \MailPoetTest { expect($click->getId())->equals($click->getId()); expect($purchaseStats[0]->getOrderId())->equals($orderMock->get_id()); expect($purchaseStats[0]->getOrderCurrency())->equals($orderMock->get_currency()); - expect($purchaseStats[0]->getOrderPriceTotal())->equals($orderMock->get_total()); + expect($purchaseStats[0]->getOrderPriceTotal())->equals($orderMock->get_remaining_refund_amount()); } public function testItTracksPaymentForMultipleNewsletters() { @@ -544,13 +544,13 @@ class WooCommercePurchasesTest extends \MailPoetTest { ->disableOriginalConstructor() ->disableOriginalClone() ->disableArgumentCloning() - ->setMethods(['get_id', 'get_date_created', 'get_billing_email', 'get_total', 'get_currency', 'get_status']) + ->setMethods(['get_id', 'get_date_created', 'get_billing_email', 'get_remaining_refund_amount', 'get_currency', 'get_status']) ->getMock(); $mock->method('get_id')->willReturn($id); $mock->method('get_date_created')->willReturn($dateCreated ?? new DateTime()); $mock->method('get_billing_email')->willReturn($email); - $mock->method('get_total')->willReturn((string)$totalPrice); + $mock->method('get_remaining_refund_amount')->willReturn((string)$totalPrice); $mock->method('get_currency')->willReturn('EUR'); $mock->method('get_status')->willReturn($status); return $mock;