From 3e5c711beb04eafd9351a29585f832395154a112 Mon Sep 17 00:00:00 2001 From: Tino Mewes Date: Tue, 3 Sep 2024 22:41:31 +0200 Subject: [PATCH 1/5] fix: Handle removed payment methods in getInfoBlock --- app/code/core/Mage/Payment/Helper/Data.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/code/core/Mage/Payment/Helper/Data.php b/app/code/core/Mage/Payment/Helper/Data.php index a7f9071c5..4c1d26dbf 100644 --- a/app/code/core/Mage/Payment/Helper/Data.php +++ b/app/code/core/Mage/Payment/Helper/Data.php @@ -128,7 +128,15 @@ public function getMethodFormBlock(Mage_Payment_Model_Method_Abstract $method) */ public function getInfoBlock(Mage_Payment_Model_Info $info) { - $blockType = $info->getMethodInstance()->getInfoBlockType(); + $method = $info->getMethod(); + if ($this->getMethodModelClassName($method) !== null) { + $blockType = $info->getMethodInstance()->getInfoBlockType(); + } else { + Mage::log(sprintf('Payment method %s was not found.', $method), Zend_Log::NOTICE); + return ($this->getLayout() ?? Mage::app()->getLayout()) + ->createBlock('core/text') + ->setText($method); + } if ($this->getLayout()) { $block = $this->getLayout()->createBlock($blockType); } else { From da97d3d726e828515ecc0c5654a8ddddadbd52f5 Mon Sep 17 00:00:00 2001 From: Tino Mewes Date: Fri, 6 Sep 2024 17:21:36 +0200 Subject: [PATCH 2/5] fix(adminhtml): Handle removed payment methods in orders --- .../core/Mage/Adminhtml/Block/Sales/Items/Abstract.php | 7 +++++-- app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php | 2 +- app/code/core/Mage/Payment/Model/Observer.php | 9 ++++++++- app/code/core/Mage/Sales/Model/Order.php | 8 +++++++- app/code/core/Mage/Sales/Model/Order/Payment.php | 4 ++++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php index e60828bc8..ff5770365 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php @@ -458,8 +458,11 @@ public function canEditQty() ) { return false; } - if ($this->getOrder()->getPayment()->canCapture()) { - return $this->getOrder()->getPayment()->canCapturePartial(); + if (($payment = $this->getOrder()->getPayment()) + && Mage::helper('payment')->getMethodModelClassName($payment->getMethod()) !== null + && $payment->canCapture() + ) { + return $payment->canCapturePartial(); } return true; } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php index f639b19a7..fd2270205 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php @@ -166,7 +166,7 @@ public function __construct() if ($this->_isAllowedAction('creditmemo') && $order->canCreditmemo()) { $onClick = Mage::helper('core/js')->getSetLocationJs($this->getCreditmemoUrl()); - if ($order->getPayment()->getMethodInstance()->isGateway()) { + if ($order->getPayment() && $order->getPayment()->getMethodInstance()->isGateway()) { $onClick = Mage::helper('core/js')->getConfirmSetLocationJs( $this->getCreditmemoUrl(), Mage::helper('sales')->__('This will create an offline refund. To create an online refund, open an invoice and create credit memo for it. Do you wish to proceed?') diff --git a/app/code/core/Mage/Payment/Model/Observer.php b/app/code/core/Mage/Payment/Model/Observer.php index 85dc64be1..cdaba5f7f 100644 --- a/app/code/core/Mage/Payment/Model/Observer.php +++ b/app/code/core/Mage/Payment/Model/Observer.php @@ -32,7 +32,14 @@ public function salesOrderBeforeSave($observer) /** @var Mage_Sales_Model_Order $order */ $order = $observer->getEvent()->getOrder(); - if ($order->getPayment() && $order->getPayment()->getMethodInstance()->getCode() != 'free') { + if (($payment = $order->getPayment()) + && (( + Mage::helper('payment')->getMethodModelClassName($payment->getMethod()) !== null + && $payment->getMethodInstance()->getCode() !== 'free' + ) + || ($payment->getMethod() !== 'free') + ) + ) { return $this; } diff --git a/app/code/core/Mage/Sales/Model/Order.php b/app/code/core/Mage/Sales/Model/Order.php index ec00ea9bd..7f6620b36 100644 --- a/app/code/core/Mage/Sales/Model/Order.php +++ b/app/code/core/Mage/Sales/Model/Order.php @@ -671,6 +671,9 @@ public function canCancel() */ public function canVoidPayment() { + if ($this->getPayment() === false) { + return false; + } return $this->_canVoidOrder() ? $this->getPayment()->canVoid($this->getPayment()) : false; } @@ -841,7 +844,10 @@ public function canEdit() return false; } - if (!$this->getPayment()->getMethodInstance()->canEdit()) { + if (!($payment = $this->getPayment()) + || Mage::helper('payment')->getMethodModelClassName($payment->getMethod()) === null + || !$payment->getMethodInstance()->canEdit() + ) { return false; } diff --git a/app/code/core/Mage/Sales/Model/Order/Payment.php b/app/code/core/Mage/Sales/Model/Order/Payment.php index 2a7c572fb..4719dd428 100644 --- a/app/code/core/Mage/Sales/Model/Order/Payment.php +++ b/app/code/core/Mage/Sales/Model/Order/Payment.php @@ -655,6 +655,10 @@ protected function _invoice() public function canVoid(Varien_Object $document) { if ($this->_canVoidLookup === null) { + if (Mage::helper('payment')->getMethodModelClassName($this->getMethod()) === null) { + $this->_canVoidLookup = false; + return $this->_canVoidLookup; + } $this->_canVoidLookup = (bool)$this->getMethodInstance()->canVoid($document); if ($this->_canVoidLookup) { $authTransaction = $this->getAuthorizationTransaction(); From 4c538276ba463936fc685cfd3cd2a465b86a128c Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Fri, 6 Sep 2024 19:16:54 +0100 Subject: [PATCH 3/5] PHPStan --- .phpstan.baseline.neon | 5 ----- app/code/core/Mage/Sales/Model/Order/Payment.php | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.phpstan.baseline.neon b/.phpstan.baseline.neon index cadb754e8..766c05b41 100644 --- a/.phpstan.baseline.neon +++ b/.phpstan.baseline.neon @@ -3900,11 +3900,6 @@ parameters: count: 1 path: app/code/core/Mage/Sales/Model/Order/Payment.php - - - message: "#^Property Mage_Sales_Model_Order_Payment\\:\\:\\$_canVoidLookup \\(string\\) does not accept bool\\.$#" - count: 2 - path: app/code/core/Mage/Sales/Model/Order/Payment.php - - message: "#^Method Mage_Sales_Model_Order_Payment_Transaction\\:\\:getOrderId\\(\\) should return int\\|null but return statement is missing\\.$#" count: 1 diff --git a/app/code/core/Mage/Sales/Model/Order/Payment.php b/app/code/core/Mage/Sales/Model/Order/Payment.php index 4719dd428..0d91c55ba 100644 --- a/app/code/core/Mage/Sales/Model/Order/Payment.php +++ b/app/code/core/Mage/Sales/Model/Order/Payment.php @@ -225,7 +225,7 @@ class Mage_Sales_Model_Order_Payment extends Mage_Payment_Model_Info /** * Whether can void - * @var string + * @var bool|null */ protected $_canVoidLookup = null; From 8a27aab89e0c2d21dbe721f2d9e919ca61d0e49d Mon Sep 17 00:00:00 2001 From: Tino Mewes Date: Sat, 7 Sep 2024 07:51:41 +0200 Subject: [PATCH 4/5] refactor: Harden handling of removed payments or payment methods in getInfoBlock --- app/code/core/Mage/Payment/Helper/Data.php | 11 +++++++---- app/code/core/Mage/Payment/Model/Observer.php | 9 +-------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/code/core/Mage/Payment/Helper/Data.php b/app/code/core/Mage/Payment/Helper/Data.php index 4c1d26dbf..1e6057a1d 100644 --- a/app/code/core/Mage/Payment/Helper/Data.php +++ b/app/code/core/Mage/Payment/Helper/Data.php @@ -123,16 +123,19 @@ public function getMethodFormBlock(Mage_Payment_Model_Method_Abstract $method) /** * Retrieve payment information block * - * @param Mage_Payment_Model_Info $info + * @param Mage_Payment_Model_Info|false $info * @return Mage_Core_Block_Template|Mage_Core_Block_Abstract */ - public function getInfoBlock(Mage_Payment_Model_Info $info) + public function getInfoBlock(Mage_Payment_Model_Info|false $info) { - $method = $info->getMethod(); + $method = $info !== false ? $info->getMethod() : $this->__('No Data Found'); if ($this->getMethodModelClassName($method) !== null) { $blockType = $info->getMethodInstance()->getInfoBlockType(); } else { - Mage::log(sprintf('Payment method %s was not found.', $method), Zend_Log::NOTICE); + Mage::log( + sprintf('Payment method was not found: %s', $method), + Zend_Log::NOTICE + ); return ($this->getLayout() ?? Mage::app()->getLayout()) ->createBlock('core/text') ->setText($method); diff --git a/app/code/core/Mage/Payment/Model/Observer.php b/app/code/core/Mage/Payment/Model/Observer.php index cdaba5f7f..85dc64be1 100644 --- a/app/code/core/Mage/Payment/Model/Observer.php +++ b/app/code/core/Mage/Payment/Model/Observer.php @@ -32,14 +32,7 @@ public function salesOrderBeforeSave($observer) /** @var Mage_Sales_Model_Order $order */ $order = $observer->getEvent()->getOrder(); - if (($payment = $order->getPayment()) - && (( - Mage::helper('payment')->getMethodModelClassName($payment->getMethod()) !== null - && $payment->getMethodInstance()->getCode() !== 'free' - ) - || ($payment->getMethod() !== 'free') - ) - ) { + if ($order->getPayment() && $order->getPayment()->getMethodInstance()->getCode() != 'free') { return $this; } From a1b4cd763a8e08cb9f526e233b4b5017570bbe1c Mon Sep 17 00:00:00 2001 From: Tino Mewes Date: Tue, 10 Sep 2024 22:51:24 +0200 Subject: [PATCH 5/5] refactor: Harden handling of removed payments or payment methods in getInfoBlock > Implement PR feedback --- .../Mage/Adminhtml/Block/Sales/Items/Abstract.php | 5 +++-- app/code/core/Mage/Payment/Helper/Data.php | 2 +- app/code/core/Mage/Sales/Model/Order.php | 14 ++++++++++---- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php index ea97f04ef..4a5794355 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php @@ -449,8 +449,9 @@ public function canEditQty() ) { return false; } - if (($payment = $this->getOrder()->getPayment()) - && Mage::helper('payment')->getMethodModelClassName($payment->getMethod()) !== null + $payment = $this->getOrder()->getPayment(); + if ($payment + && $this->helper('payment')->getMethodModelClassName($payment->getMethod()) !== null && $payment->canCapture() ) { return $payment->canCapturePartial(); diff --git a/app/code/core/Mage/Payment/Helper/Data.php b/app/code/core/Mage/Payment/Helper/Data.php index a47b6a525..2ace8372e 100644 --- a/app/code/core/Mage/Payment/Helper/Data.php +++ b/app/code/core/Mage/Payment/Helper/Data.php @@ -122,7 +122,7 @@ public function getMethodFormBlock(Mage_Payment_Model_Method_Abstract $method) */ public function getInfoBlock(Mage_Payment_Model_Info|false $info) { - $method = $info !== false ? $info->getMethod() : $this->__('No Data Found'); + $method = $info === false ? $this->__('No Data Found') : $info->getMethod(); if ($this->getMethodModelClassName($method) !== null) { $blockType = $info->getMethodInstance()->getInfoBlockType(); } else { diff --git a/app/code/core/Mage/Sales/Model/Order.php b/app/code/core/Mage/Sales/Model/Order.php index d1ecbe6b8..d88840bb5 100644 --- a/app/code/core/Mage/Sales/Model/Order.php +++ b/app/code/core/Mage/Sales/Model/Order.php @@ -844,10 +844,16 @@ public function canEdit() return false; } - if (!($payment = $this->getPayment()) - || Mage::helper('payment')->getMethodModelClassName($payment->getMethod()) === null - || !$payment->getMethodInstance()->canEdit() - ) { + $payment = $this->getPayment(); + if (!$payment) { + return false; + } + + if (Mage::helper('payment')->getMethodModelClassName($payment->getMethod()) === null) { + return false; + } + + if (!$payment->getMethodInstance()->canEdit()) { return false; }