contacts_events-8.x-1.x-dev/src/OrderStateTrait.php

src/OrderStateTrait.php
<?php

namespace Drupal\contacts_events;

use Drupal\commerce_order\Entity\OrderInterface;
use Drupal\state_machine\Plugin\Field\FieldType\StateItemInterface;

/**
 * Trait for common order state checks and processes.
 */
trait OrderStateTrait {

  /**
   * Check if an order has unconfirmed items.
   *
   * @param \Drupal\commerce_order\Entity\OrderInterface $order
   *   The order to check.
   *
   * @return bool
   *   Whether there are unconfirmed items.
   */
  protected function orderHasUnconfirmedItems(OrderInterface $order) {
    foreach ($order->getItems() as $item) {
      if ($item->hasField('state') && !$item->get('state')->isEmpty()) {
        /** @var \Drupal\state_machine\Plugin\Field\FieldType\StateItem $item_state */
        $item_state = $item->get('state')->first();
        $item_transitions = $item_state->getWorkflow()
          ->getPossibleTransitions($item_state->value);
        if (isset($item_transitions['confirm'])) {
          return TRUE;
        }
      }
    }
    return FALSE;
  }

  /**
   * Applies transition if it's allowed.
   *
   * @param \Drupal\state_machine\Plugin\Field\FieldType\StateItemInterface $state
   *   State field.
   * @param string $transition_id
   *   The ID of the transition to invoke.
   * @param bool $save
   *   Whether to save the entity (default FALSE).
   *
   * @return bool
   *   Whether a transition was applied.
   */
  protected function applyTransitionIfAllowed(StateItemInterface $state, $transition_id, $save = FALSE): bool {
    $entity = $state->getEntity();
    $transitions = $state->getWorkflow()->getAllowedTransitions($state->value, $entity);

    if (!isset($transitions[$transition_id])) {
      return FALSE;
    }

    $state->applyTransition($transitions[$transition_id]);

    if ($save) {
      $entity->save();
    }

    return TRUE;
  }

  /**
   * Find transitions that have a certain stub at the end of the ID.
   *
   * @param \Drupal\state_machine\Plugin\Field\FieldType\StateItemInterface $state
   *   State field.
   * @param string $transition_stub
   *   The substring for transition IDs to look for.
   *
   * @return string|null
   *   The transition ID or NULL if none found.
   *
   * @todo This needs test coverage.
   */
  protected function findAllowedTransitionFromStub(StateItemInterface $state, $transition_stub) {
    $entity = $state->getEntity();
    $transitions = $state->getWorkflow()->getAllowedTransitions($state->value, $entity);

    foreach (array_keys($transitions) as $transition_id) {
      if (substr($transition_id, -(strlen($transition_stub))) == $transition_stub) {
        return $transition_id;
      }
    }
  }

  /**
   * Check whether the paid amount has changed.
   *
   * @param \Drupal\commerce_order\Entity\OrderInterface $order
   *   The order.
   * @param \Drupal\commerce_order\Entity\OrderInterface|null $original
   *   The original, if any.
   *
   * @return bool
   *   Whether the amount paid has changed.
   */
  protected function hasPaidChanged(OrderInterface $order, ?OrderInterface $original = NULL): bool {
    $paid = $order->getTotalPaid();
    $original_paid = $original ? $original->getTotalPaid() : NULL;

    // If we don't have either, there's no change.
    if (!$paid && !$original_paid) {
      return FALSE;
    }

    // If we only have one and the other is non-zero, it has changed.
    if ((!$paid && !$original_paid->isZero()) || (!$original_paid && !$paid->isZero())) {
      return TRUE;
    }

    // If we only have one, and the other is zero, it hasn't changed.
    if ((!$paid && $original_paid->isZero()) || (!$original_paid && $paid->isZero())) {
      return FALSE;
    }

    // Otherwise check for equality.
    return !$paid->equals($original_paid);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc