PaymentOrderUpdater.php in Commerce Core 8.2
File
modules/payment/src/PaymentOrderUpdater.php
View source
<?php
namespace Drupal\commerce_payment;
use Drupal\Core\DestructableInterface;
use Drupal\commerce_order\Entity\OrderInterface;
use Drupal\commerce_price\Price;
use Drupal\Core\Entity\EntityTypeManagerInterface;
class PaymentOrderUpdater implements PaymentOrderUpdaterInterface, DestructableInterface {
protected $entityTypeManager;
protected $updateList = [];
public function __construct(EntityTypeManagerInterface $entity_type_manager) {
$this->entityTypeManager = $entity_type_manager;
}
public function requestUpdate(OrderInterface $order) {
$this->updateList[$order
->id()] = $order
->id();
}
public function needsUpdate(OrderInterface $order) {
return !$order
->isNew() && isset($this->updateList[$order
->id()]);
}
public function updateOrders() {
if (!empty($this->updateList)) {
$order_storage = $this->entityTypeManager
->getStorage('commerce_order');
$orders = $order_storage
->loadMultiple($this->updateList);
foreach ($orders as $order) {
$this
->updateOrder($order, TRUE);
}
}
}
public function updateOrder(OrderInterface $order, $save_order = FALSE) {
$previous_total = $order
->getTotalPaid();
if (!$previous_total) {
return;
}
$payment_storage = $this->entityTypeManager
->getStorage('commerce_payment');
$payments = $payment_storage
->loadMultipleByOrder($order);
$new_total = new Price('0', $previous_total
->getCurrencyCode());
foreach ($payments as $payment) {
if ($payment
->isCompleted()) {
$new_total = $new_total
->add($payment
->getBalance());
if ($order
->get('payment_method')
->isEmpty() && !$payment
->get('payment_method')
->isEmpty()) {
$order
->set('payment_gateway', $payment
->getPaymentGateway());
$order
->set('payment_method', $payment
->getPaymentMethod());
}
}
}
if (!$previous_total
->equals($new_total)) {
$order
->setTotalPaid($new_total);
if ($save_order) {
$order
->save();
}
}
unset($this->updateList[$order
->id()]);
}
public function destruct() {
$this
->updateOrders();
}
}