-
Notifications
You must be signed in to change notification settings - Fork 9.3k
/
CaptureOperation.php
112 lines (101 loc) · 3.97 KB
/
CaptureOperation.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Model\Order\Payment\Operations;
use Magento\Sales\Api\Data\InvoiceInterface;
use Magento\Sales\Api\Data\OrderPaymentInterface;
use Magento\Sales\Model\Order;
use Magento\Sales\Model\Order\Payment;
use Magento\Sales\Model\Order\Payment\Transaction;
class CaptureOperation extends AbstractOperation
{
/**
* Captures payment.
*
* @param OrderPaymentInterface $payment
* @param InvoiceInterface|null $invoice
* @return OrderPaymentInterface
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function capture(OrderPaymentInterface $payment, $invoice)
{
/**
* @var $payment Payment
*/
if (null === $invoice) {
$invoice = $this->invoice($payment);
$payment->setCreatedInvoice($invoice);
if ($payment->getIsFraudDetected()) {
$payment->getOrder()->setStatus(Order::STATUS_FRAUD);
}
return $payment;
}
$amountToCapture = $payment->formatAmount($invoice->getBaseGrandTotal());
$order = $payment->getOrder();
$payment->setTransactionId(
$this->transactionManager->generateTransactionId(
$payment,
Transaction::TYPE_CAPTURE,
$payment->getAuthorizationTransaction()
)
);
$this->eventManager->dispatch(
'sales_order_payment_capture',
['payment' => $payment, 'invoice' => $invoice]
);
/**
* Fetch an update about existing transaction. It can determine whether the transaction can be paid
* Capture attempt will happen only when invoice is not yet paid and the transaction can be paid
*/
if ($invoice->getTransactionId()) {
$method = $payment->getMethodInstance();
$method->setStore(
$order->getStoreId()
);
$method->fetchTransactionInfo(
$payment,
$invoice->getTransactionId()
);
}
if ($invoice->getIsPaid()) {
throw new \Magento\Framework\Exception\LocalizedException(
__('The transaction "%1" cannot be captured yet.', $invoice->getTransactionId())
);
}
// attempt to capture: this can trigger "is_transaction_pending"
$method = $payment->getMethodInstance();
$method->setStore(
$order->getStoreId()
);
//TODO replace for sale usage
$method->capture($payment, $amountToCapture);
// prepare parent transaction and its amount
$paidWorkaround = 0;
if (!$invoice->wasPayCalled()) {
$paidWorkaround = (double)$amountToCapture;
}
if ($payment->isCaptureFinal($paidWorkaround)) {
$payment->setShouldCloseParentTransaction(true);
}
$transactionBuilder = $this->transactionBuilder->setPayment($payment);
$transactionBuilder->setOrder($order);
$transactionBuilder->setFailSafe(true);
$transactionBuilder->setTransactionId($payment->getTransactionId());
$transactionBuilder->setAdditionalInformation($payment->getTransactionAdditionalInfo());
$transactionBuilder->setSalesDocument($invoice);
$transaction = $transactionBuilder->build(Transaction::TYPE_CAPTURE);
$message = $this->stateCommand->execute($payment, $amountToCapture, $order);
if ($payment->getIsTransactionPending()) {
$invoice->setIsPaid(false);
} else {
$invoice->setIsPaid(true);
$this->updateTotals($payment, ['base_amount_paid_online' => $amountToCapture]);
}
$message = $payment->prependMessage($message);
$payment->addTransactionCommentsToOrder($transaction, $message);
$invoice->setTransactionId($payment->getLastTransId());
return $payment;
}
}