commerce_license-8.x-2.x-dev/src/EventSubscriber/LicenseRenewalCartEventSubscriber.php

src/EventSubscriber/LicenseRenewalCartEventSubscriber.php
<?php

namespace Drupal\commerce_license\EventSubscriber;

use Drupal\commerce_cart\Event\CartEntityAddEvent;
use Drupal\commerce_cart\Event\CartEvents;
use Drupal\Core\Datetime\DateFormatterInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Handles license renewal.
 *
 * Set the already existing license in the order item.
 */
class LicenseRenewalCartEventSubscriber implements EventSubscriberInterface {

  use StringTranslationTrait;

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The messenger service.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  protected $messenger;

  /**
   * The date formatter service.
   *
   * @var \Drupal\Core\Datetime\DateFormatterInterface
   */
  protected $dateFormatter;

  /**
   * The license storage.
   *
   * @var \Drupal\commerce_license\LicenseStorage
   */
  protected $licenseStorage;

  /**
   * Constructs a new LicenseRenewalCartEventSubscriber.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger service.
   * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
   *   The date formatter service.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public function __construct(
    EntityTypeManagerInterface $entity_type_manager,
    MessengerInterface $messenger,
    DateFormatterInterface $date_formatter,
  ) {
    $this->licenseStorage = $entity_type_manager->getStorage('commerce_license');
    $this->entityTypeManager = $entity_type_manager;
    $this->messenger = $messenger;
    $this->dateFormatter = $date_formatter;
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events[CartEvents::CART_ENTITY_ADD] = ['onCartEntityAdd', 100];
    return $events;
  }

  /**
   * Sets the already existing license in the order item.
   *
   * @param \Drupal\commerce_cart\Event\CartEntityAddEvent $event
   *   The cart event.
   *
   * @throws \Drupal\Core\Entity\EntityStorageException
   */
  public function onCartEntityAdd(CartEntityAddEvent $event): void {
    $order_item = $event->getOrderItem();
    // Only act if the order item has a license reference field.
    if (!$order_item->hasField('license')) {
      return;
    }
    // We can't renew license types that don't allow us to find a license
    // given only a product variation and a user.
    $variation = $order_item->getPurchasedEntity();
    if ($variation === NULL || !$variation->hasField('license_type')) {
      return;
    }

    $cart = $event->getCart();
    /** @var \Drupal\commerce_license\Entity\LicenseInterface|null|false $existing_license */
    $existing_license = $this->licenseStorage->getExistingLicense($variation, $cart->getCustomerId());
    if ($existing_license && $existing_license->canRenew()) {
      $order_item->set('license', $existing_license->id());
      $order_item->save();

      if ($existing_license->getState()->getId() !== 'renewal_in_progress') {
        $transition = $existing_license->getState()->getWorkflow()->getTransition('renewal_in_progress');
        $existing_license->getState()->applyTransition($transition);
        $existing_license->save();
      }

      // Shows a message with existing and extended dates when order completed.
      $expiresTime = $existing_license->getExpiresTime();
      $datetime = (new \DateTimeImmutable())->setTimestamp($expiresTime);
      $expiration_plugin = $existing_license->getExpirationPlugin();
      $extendedDatetime = $expiration_plugin->calculateEnd($datetime);

      // @todo link here once there is user admin UI for licenses!
      $this->messenger->addStatus($this->t("You have an existing license, until @expires-time.\nThis will be extended until @extended-date when you complete this order.", [
        '@expires-time' => $this->dateFormatter->format($expiresTime),
        '@extended-date' => $this->dateFormatter->format($extendedDatetime->getTimestamp()),
      ]));
    }
    elseif ($existing_license) {
      // This will never be fired when expected,
      // since the CART_ENTITY_ADD is not fired at this point ?
      $renewal_window_start_time = $existing_license->getRenewalWindowStartTime();

      if (!is_null($renewal_window_start_time)) {
        $this->messenger->addStatus($this->t('You have an existing license. You will be able to renew your license after %date.', [
          '%date' => $this->dateFormatter->format($renewal_window_start_time),
        ]));
      }
    }
  }

}

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

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