You are here

public function PaymentOrderUpdater::updateOrder in Commerce Core 8.2

Updates the given order.

The order's total_paid field will be recalculated to reflect the current payment total.

Parameters

\Drupal\commerce_order\Entity\OrderInterface $order: The order.

bool $save_order: Whether the order should be saved after the update. Always skipped if the total_paid field hasn't changed.

Overrides PaymentOrderUpdaterInterface::updateOrder

1 call to PaymentOrderUpdater::updateOrder()
PaymentOrderUpdater::updateOrders in modules/payment/src/PaymentOrderUpdater.php
Updates and saves all relevant orders.

File

modules/payment/src/PaymentOrderUpdater.php, line 67

Class

PaymentOrderUpdater

Namespace

Drupal\commerce_payment

Code

public function updateOrder(OrderInterface $order, $save_order = FALSE) {
  $previous_total = $order
    ->getTotalPaid();
  if (!$previous_total) {

    // A NULL total indicates an order that doesn't have any items yet.
    return;
  }

  // The new total is always calculated from scratch, to properly handle
  // orders that were created before the total_paid field was introduced.

  /** @var \Drupal\commerce_payment\PaymentStorageInterface $payment_storage */
  $payment_storage = $this->entityTypeManager
    ->getStorage('commerce_payment');
  $payments = $payment_storage
    ->loadMultipleByOrder($order);

  /** @var \Drupal\commerce_price\Price $new_total */
  $new_total = new Price('0', $previous_total
    ->getCurrencyCode());
  foreach ($payments as $payment) {
    if ($payment
      ->isCompleted()) {
      $new_total = $new_total
        ->add($payment
        ->getBalance());

      // Sync payment_gateway and payment_method fields from the first
      // payment if the payment_method field is empty.
      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()]);
}