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), ])); } } } }