Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions Model/Push/AfterpayProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,10 @@ public function __construct(
?\Magento\Sales\Api\OrderRepositoryInterface $orderRepository = null,
?\Magento\Sales\Api\OrderPaymentRepositoryInterface $paymentRepository = null,
?\Magento\Sales\Api\InvoiceRepositoryInterface $invoiceRepository = null,
?\Buckaroo\Magento2\Model\ResourceModel\GroupTransaction $groupTransactionResource = null
?\Buckaroo\Magento2\Model\ResourceModel\GroupTransaction $groupTransactionResource = null,
?\Magento\Sales\Api\TransactionRepositoryInterface $transactionRepository = null,
?\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder = null,
?\Magento\Sales\Api\OrderManagementInterface $orderManagement = null
) {
parent::__construct(
$orderRequestService,
Expand All @@ -101,7 +104,10 @@ public function __construct(
$orderRepository,
$paymentRepository,
$invoiceRepository,
$groupTransactionResource
$groupTransactionResource,
$transactionRepository,
$searchCriteriaBuilder,
$orderManagement
);
$this->afterpayConfig = $afterpayConfig;
}
Expand Down
108 changes: 83 additions & 25 deletions Model/Push/DefaultProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,17 @@
use Buckaroo\Magento2\Service\Push\OrderRequestService;
use Exception;
use Magento\Directory\Model\CurrencyFactory;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Phrase;
use Magento\Sales\Api\Data\TransactionInterface;
use Magento\Sales\Api\InvoiceRepositoryInterface;
use Magento\Sales\Api\OrderManagementInterface;
use Magento\Sales\Api\OrderPaymentRepositoryInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Sales\Api\TransactionRepositoryInterface;
use Magento\Sales\Model\Order;
use Magento\Sales\Model\Order\Invoice;
use Magento\Sales\Model\Order\Payment;
Expand Down Expand Up @@ -191,6 +194,21 @@ class DefaultProcessor implements PushProcessorInterface
*/
protected $groupTransactionResource;

/**
* @var TransactionRepositoryInterface
*/
protected $transactionRepository;

/**
* @var SearchCriteriaBuilder
*/
protected $searchCriteriaBuilder;

/**
* @var OrderManagementInterface
*/
protected $orderManagement;

/**
* Constructor
*
Expand All @@ -212,6 +230,9 @@ class DefaultProcessor implements PushProcessorInterface
* @param OrderPaymentRepositoryInterface|null $paymentRepository
* @param InvoiceRepositoryInterface|null $invoiceRepository
* @param \Buckaroo\Magento2\Model\ResourceModel\GroupTransaction|null $groupTransactionResource
* @param TransactionRepositoryInterface|null $transactionRepository
* @param SearchCriteriaBuilder|null $searchCriteriaBuilder
* @param OrderManagementInterface|null $orderManagement
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Expand All @@ -232,7 +253,10 @@ public function __construct(
?OrderRepositoryInterface $orderRepository = null,
?OrderPaymentRepositoryInterface $paymentRepository = null,
?InvoiceRepositoryInterface $invoiceRepository = null,
?\Buckaroo\Magento2\Model\ResourceModel\GroupTransaction $groupTransactionResource = null
?\Buckaroo\Magento2\Model\ResourceModel\GroupTransaction $groupTransactionResource = null,
?TransactionRepositoryInterface $transactionRepository = null,
?SearchCriteriaBuilder $searchCriteriaBuilder = null,
?OrderManagementInterface $orderManagement = null
) {
$this->pushTransactionType = $pushTransactionType;
$this->orderRequestService = $orderRequestService;
Expand All @@ -248,15 +272,34 @@ public function __construct(
$this->uncancelService = $uncancelService;
$this->resourceConnection = $resourceConnection;
$this->giftcardCollection = $giftcardCollection;
$this->currencyFactory = $currencyFactory ?: ObjectManager::getInstance()->get(CurrencyFactory::class);
$this->orderRepository = $orderRepository
?: ObjectManager::getInstance()->get(OrderRepositoryInterface::class);
$this->paymentRepository = $paymentRepository
?: ObjectManager::getInstance()->get(OrderPaymentRepositoryInterface::class);
$this->invoiceRepository = $invoiceRepository
?: ObjectManager::getInstance()->get(InvoiceRepositoryInterface::class);
$this->groupTransactionResource = $groupTransactionResource
?: ObjectManager::getInstance()->get(\Buckaroo\Magento2\Model\ResourceModel\GroupTransaction::class);
$this->currencyFactory = $this->resolveDependency($currencyFactory, CurrencyFactory::class);
$this->orderRepository = $this->resolveDependency($orderRepository, OrderRepositoryInterface::class);
$this->paymentRepository = $this->resolveDependency($paymentRepository, OrderPaymentRepositoryInterface::class);
$this->invoiceRepository = $this->resolveDependency($invoiceRepository, InvoiceRepositoryInterface::class);
$this->groupTransactionResource = $this->resolveDependency(
$groupTransactionResource,
\Buckaroo\Magento2\Model\ResourceModel\GroupTransaction::class
);
$this->transactionRepository = $this->resolveDependency(
$transactionRepository,
TransactionRepositoryInterface::class
);
$this->searchCriteriaBuilder = $this->resolveDependency($searchCriteriaBuilder, SearchCriteriaBuilder::class);
$this->orderManagement = $this->resolveDependency($orderManagement, OrderManagementInterface::class);
}

/**
* BC fallback for constructor deps added after the initial release; subclasses
* forward them positionally, so DI cannot fill parent-only params. Removed when
* the Phase 4.4 constructor cleanup makes them required.
*
* @param object|null $dependency
* @param class-string $class
* @return object
*/
private function resolveDependency(?object $dependency, string $class): object
{
return $dependency ?: ObjectManager::getInstance()->get($class);
}

/**
Expand Down Expand Up @@ -910,21 +953,22 @@ private function reactivateCanceledOrder(): bool
// 6. Delete ALL existing transactions to start fresh
// This prevents circular references and stale transaction states
try {
$connection = $this->resourceConnection->getConnection();
$tableName = $this->resourceConnection->getTableName('sales_payment_transaction');
$searchCriteria = $this->searchCriteriaBuilder
->addFilter('order_id', $this->order->getId())
->create();
$transactions = $this->transactionRepository->getList($searchCriteria)->getItems();

$deleted = $connection->delete(
$tableName,
['order_id = ?' => $this->order->getId()]
);
foreach ($transactions as $orderTransaction) {
$this->transactionRepository->delete($orderTransaction);
}

if ($deleted > 0) {
if (count($transactions) > 0) {
$this->logger->addDebug(sprintf(
'[%s:%s] - Order %s: Deleted %d transaction(s) to prevent circular references',
__METHOD__,
__LINE__,
$orderNumber,
$deleted
count($transactions)
));
}

Expand Down Expand Up @@ -1186,8 +1230,8 @@ protected function getTransactionKey(): string
protected function setOrderStatusMessage(): void
{
if (!empty($this->pushRequest->getStatusMessage())) {
// Refresh order state to get the most current state
$this->order = $this->order->load($this->order->getId());
// Refresh the shared order instance in place
$this->orderRequestService->loadOrder();

if ($this->order->getState() === Order::STATE_NEW
&& empty($this->pushRequest->getRelatedtransactionPartialpayment())
Expand Down Expand Up @@ -1612,8 +1656,8 @@ protected function processSucceededPushAuthorization(): void
var_export($this->payment->getMethod(), true)
));

// Persisted by the updateOrderStatus save that follows in processSucceededPush
$this->order->setState(Order::STATE_PROCESSING);
$this->order->save();
}
}

Expand Down Expand Up @@ -1944,9 +1988,6 @@ public function processFailedPush(string $newStatus, string $message): bool
$message
));

// Add a clear cancellation message to order history before canceling
$this->order->addCommentToStatusHistory('Payment failed. Canceling order due to payment failure: ' . $message);

// setting parameter which will cause to stop the cancel process on
$methods = [
'buckaroo_magento2_afterpay',
Expand All @@ -1973,14 +2014,31 @@ public function processFailedPush(string $newStatus, string $message): bool

try {
try {
$this->order->cancel()->save();
if (!$this->orderManagement->cancel((int)$this->order->getId())) {
$this->logger->addDebug(sprintf(
'[%s:%s] - Order %s could not be canceled through OrderManagement',
__METHOD__,
__LINE__,
$this->order->getIncrementId()
));
}
} finally {
// Restore the original flag value to avoid side effects
if ($originalRequestOnVoid !== null) {
$methodInstanceClass::$requestOnVoid = $originalRequestOnVoid;
}
}

// OrderManagement cancels and saves its own order instance; reload the
// shared one so the steps below don't persist pre-cancellation state
$this->orderRequestService->loadOrder();

// On the refreshed instance so it survives the reload; persisted by the
// updateOrderStatus save below
$this->order->addCommentToStatusHistory(
'Payment failed. Canceling order due to payment failure: ' . $message
);

if (!$this->isMagentoGiftCardRefundActive()) {
$this->giftCardRefundService->refund($this->order);
}
Expand Down
21 changes: 17 additions & 4 deletions Model/Push/KlarnaKpProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ class KlarnaKpProcessor extends DefaultProcessor
* @param OrderPaymentRepositoryInterface|null $paymentRepository
* @param InvoiceRepositoryInterface|null $invoiceRepository
* @param GroupTransaction|null $groupTransactionResource
* @param \Magento\Sales\Api\TransactionRepositoryInterface|null $transactionRepository
* @param \Magento\Framework\Api\SearchCriteriaBuilder|null $searchCriteriaBuilder
* @param \Magento\Sales\Api\OrderManagementInterface|null $orderManagement
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Expand All @@ -98,7 +101,10 @@ public function __construct(
?OrderRepositoryInterface $orderRepository = null,
?OrderPaymentRepositoryInterface $paymentRepository = null,
?InvoiceRepositoryInterface $invoiceRepository = null,
?GroupTransaction $groupTransactionResource = null
?GroupTransaction $groupTransactionResource = null,
?\Magento\Sales\Api\TransactionRepositoryInterface $transactionRepository = null,
?\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder = null,
?\Magento\Sales\Api\OrderManagementInterface $orderManagement = null
) {
parent::__construct(
$orderRequestService,
Expand All @@ -118,7 +124,10 @@ public function __construct(
$orderRepository,
$paymentRepository,
$invoiceRepository,
$groupTransactionResource
$groupTransactionResource,
$transactionRepository,
$searchCriteriaBuilder,
$orderManagement
);
$this->klarnakpConfig = $klarnakpConfig;
$this->escaper = $escaper;
Expand Down Expand Up @@ -202,10 +211,14 @@ private function processPlazaCancelReservation(): bool
$methodInstanceClass::$requestOnVoid = false;

try {
$this->order->cancel()->save();
$this->orderManagement->cancel((int)$this->order->getId());
} finally {
$methodInstanceClass::$requestOnVoid = $originalRequestOnVoid;
}

// OrderManagement cancels and saves its own order instance; reload the
// shared one so updateOrderStatus below doesn't persist pre-cancellation state
$this->orderRequestService->loadOrder();
}

$cancelTrxId = $this->escaper->escapeHtml((string)$this->pushRequest->getDatarequest());
Expand Down Expand Up @@ -440,8 +453,8 @@ protected function processSucceededPushAuthorization(): void

// Only set to processing if not already canceled (the canUpdateOrderStatus will handle canceled->new transition)
if ($this->order->getState() !== Order::STATE_CANCELED) {
// Persisted by the updateOrderStatus save that follows in processSucceededPush
$this->order->setState(Order::STATE_PROCESSING);
$this->orderRepository->save($this->order);
}
}
}
Expand Down
15 changes: 12 additions & 3 deletions Model/Push/KlarnaMorProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ class KlarnaMorProcessor extends DefaultProcessor
* @param OrderPaymentRepositoryInterface|null $paymentRepository
* @param InvoiceRepositoryInterface|null $invoiceRepository
* @param GroupTransaction|null $groupTransactionResource
* @param \Magento\Sales\Api\TransactionRepositoryInterface|null $transactionRepository
* @param \Magento\Framework\Api\SearchCriteriaBuilder|null $searchCriteriaBuilder
* @param \Magento\Sales\Api\OrderManagementInterface|null $orderManagement
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Expand All @@ -85,7 +88,10 @@ public function __construct(
?OrderRepositoryInterface $orderRepository = null,
?OrderPaymentRepositoryInterface $paymentRepository = null,
?InvoiceRepositoryInterface $invoiceRepository = null,
?GroupTransaction $groupTransactionResource = null
?GroupTransaction $groupTransactionResource = null,
?\Magento\Sales\Api\TransactionRepositoryInterface $transactionRepository = null,
?\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder = null,
?\Magento\Sales\Api\OrderManagementInterface $orderManagement = null
) {
parent::__construct(
$orderRequestService,
Expand All @@ -105,7 +111,10 @@ public function __construct(
$orderRepository,
$paymentRepository,
$invoiceRepository,
$groupTransactionResource
$groupTransactionResource,
$transactionRepository,
$searchCriteriaBuilder,
$orderManagement
);
}

Expand Down Expand Up @@ -387,8 +396,8 @@ protected function processSucceededPushAuthorization(): void
));

if ($this->order->getState() !== Order::STATE_CANCELED) {
// Persisted by the updateOrderStatus save that follows in processSucceededPush
$this->order->setState(Order::STATE_PROCESSING);
$this->orderRepository->save($this->order);
}
}
}
Expand Down
13 changes: 11 additions & 2 deletions Model/Push/PayPerEmailProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ class PayPerEmailProcessor extends DefaultProcessor
* @param OrderPaymentRepositoryInterface|null $paymentRepository
* @param InvoiceRepositoryInterface|null $invoiceRepository
* @param GroupTransaction|null $groupTransactionResource
* @param \Magento\Sales\Api\TransactionRepositoryInterface|null $transactionRepository
* @param \Magento\Framework\Api\SearchCriteriaBuilder|null $searchCriteriaBuilder
* @param \Magento\Sales\Api\OrderManagementInterface|null $orderManagement
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Expand All @@ -109,7 +112,10 @@ public function __construct(
?OrderRepositoryInterface $orderRepository = null,
?OrderPaymentRepositoryInterface $paymentRepository = null,
?InvoiceRepositoryInterface $invoiceRepository = null,
?GroupTransaction $groupTransactionResource = null
?GroupTransaction $groupTransactionResource = null,
?\Magento\Sales\Api\TransactionRepositoryInterface $transactionRepository = null,
?\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder = null,
?\Magento\Sales\Api\OrderManagementInterface $orderManagement = null
) {
parent::__construct(
$orderRequestService,
Expand All @@ -129,7 +135,10 @@ public function __construct(
$orderRepository,
$paymentRepository,
$invoiceRepository,
$groupTransactionResource
$groupTransactionResource,
$transactionRepository,
$searchCriteriaBuilder,
$orderManagement
);
$this->configPayPerEmail = $configPayPerEmail;
}
Expand Down
13 changes: 11 additions & 2 deletions Model/Push/PaypalProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ class PaypalProcessor extends DefaultProcessor
* @param OrderPaymentRepositoryInterface|null $paymentRepository
* @param InvoiceRepositoryInterface|null $invoiceRepository
* @param GroupTransaction|null $groupTransactionResource
* @param \Magento\Sales\Api\TransactionRepositoryInterface|null $transactionRepository
* @param \Magento\Framework\Api\SearchCriteriaBuilder|null $searchCriteriaBuilder
* @param \Magento\Sales\Api\OrderManagementInterface|null $orderManagement
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Expand All @@ -90,7 +93,10 @@ public function __construct(
?OrderRepositoryInterface $orderRepository = null,
?OrderPaymentRepositoryInterface $paymentRepository = null,
?InvoiceRepositoryInterface $invoiceRepository = null,
?GroupTransaction $groupTransactionResource = null
?GroupTransaction $groupTransactionResource = null,
?\Magento\Sales\Api\TransactionRepositoryInterface $transactionRepository = null,
?\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder = null,
?\Magento\Sales\Api\OrderManagementInterface $orderManagement = null
) {
parent::__construct(
$orderRequestService,
Expand All @@ -110,7 +116,10 @@ public function __construct(
$orderRepository,
$paymentRepository,
$invoiceRepository,
$groupTransactionResource
$groupTransactionResource,
$transactionRepository,
$searchCriteriaBuilder,
$orderManagement
);
$this->paypalConfig = $paypalConfig;
}
Expand Down
Loading
Loading