diff --git a/modules/log/commerce_log.commerce_log_templates.yml b/modules/log/commerce_log.commerce_log_templates.yml index 13dc722d95..37fd1443ab 100644 --- a/modules/log/commerce_log.commerce_log_templates.yml +++ b/modules/log/commerce_log.commerce_log_templates.yml @@ -6,6 +6,10 @@ cart_item_removed: category: commerce_cart label: 'Removed from cart' template: '

{{ purchased_entity_label }} removed from the cart.

' +cart_item_quantity_changed: + category: commerce_cart + label: 'Quantity changed from cart' + template: '

Quantity of {{ purchased_entity_label }} changed in the cart from {{ original_quantity }} to {{ quantity }}.

' order_placed: category: commerce_order diff --git a/modules/log/src/EventSubscriber/CartEventSubscriber.php b/modules/log/src/EventSubscriber/CartEventSubscriber.php index f95e7bd30e..3d8af3075b 100644 --- a/modules/log/src/EventSubscriber/CartEventSubscriber.php +++ b/modules/log/src/EventSubscriber/CartEventSubscriber.php @@ -5,6 +5,7 @@ use Drupal\commerce_cart\Event\CartEntityAddEvent; use Drupal\commerce_cart\Event\CartEvents; use Drupal\commerce_cart\Event\CartOrderItemRemoveEvent; +use Drupal\commerce_cart\Event\CartOrderItemUpdateEvent; use Drupal\Core\Entity\EntityTypeManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -34,6 +35,7 @@ public static function getSubscribedEvents() { $events = [ CartEvents::CART_ENTITY_ADD => ['onCartEntityAdd', -100], CartEvents::CART_ORDER_ITEM_REMOVE => ['onCartOrderItemRemove', -100], + CartEvents::CART_ORDER_ITEM_UPDATE => ['onCartOrderItemUpdate', -100], ]; return $events; } @@ -66,4 +68,21 @@ public function onCartOrderItemRemove(CartOrderItemRemoveEvent $event) { ])->save(); } + /** + * Creates a log when a quantity is updated. + * + * @param \Drupal\commerce_cart\Event\CartOrderItemUpdateEvent $event + * The transition event. + */ + public function onCartOrderItemUpdate(CartOrderItemUpdateEvent $event) { + $cart = $event->getCart(); + $order_item = $event->getOrderItem(); + $original_order_item = $event->getOriginalOrderItem(); + $this->logStorage->generate($cart, 'cart_item_quantity_changed', [ + 'purchased_entity_label' => $order_item->getPurchasedEntity()->label(), + 'original_quantity' => $original_order_item->getQuantity(), + 'quantity' => $order_item->getQuantity(), + ])->save(); + } + } diff --git a/modules/log/tests/src/Kernel/CartIntegrationTest.php b/modules/log/tests/src/Kernel/CartIntegrationTest.php index cc760e1859..ea4da3e93a 100644 --- a/modules/log/tests/src/Kernel/CartIntegrationTest.php +++ b/modules/log/tests/src/Kernel/CartIntegrationTest.php @@ -63,7 +63,6 @@ class CartIntegrationTest extends CommerceKernelTestBase { 'commerce_log', 'commerce_product', 'commerce_order', - 'commerce_test', ]; /** @@ -141,6 +140,24 @@ public function testRemovedFromCart() { $this->assertText("{$this->variation->label()} removed from the cart."); } + /** + * Tests that a log is generated when a quantity changed for an order item. + */ + public function testQuantityChangedFromCart() { + $this->enableCommerceCart(); + $cart = $this->cartProvider->createCart('default', $this->store, $this->createUser()); + $order_item = $this->cartManager->addEntity($cart, $this->variation); + $order_item->setQuantity(2); + $this->cartManager->updateOrderItem($cart, $order_item); + + $logs = $this->logStorage->loadByEntity($cart); + $log = end($logs); + $build = $this->logViewBuilder->view($log); + $this->render($build); + + $this->assertText("Quantity of {$this->variation->label()} changed in the cart from 1.0 to 2."); + } + /** * Enables commerce_cart for tests. *