Skip to content

Commit 39dfa5b

Browse files
steveoliverbojanz
authored andcommitted
Issue #2840669: Expand order logging to cover all state changes. (#603)
1 parent c5cb064 commit 39dfa5b

3 files changed

Lines changed: 104 additions & 2 deletions

File tree

modules/log/commerce_log.commerce_log_templates.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,15 @@ order_placed:
1111
category: commerce_order
1212
label: 'Order placed'
1313
template: '<p>The order was placed.</p>'
14+
order_validated:
15+
category: commerce_order
16+
label: 'Order validated'
17+
template: '<p>The order was validated.</p>'
18+
order_fulfilled:
19+
category: commerce_order
20+
label: 'Order fulfilled'
21+
template: '<p>The order was fulfilled.</p>'
22+
order_canceled:
23+
category: commerce_order
24+
label: 'Order canceled'
25+
template: '<p>The order was canceled.</p>'

modules/log/src/EventSubscriber/OrderEventSubscriber.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager) {
3131
public static function getSubscribedEvents() {
3232
$events = [
3333
'commerce_order.place.pre_transition' => ['onPlaceTransition', -100],
34+
'commerce_order.validate.pre_transition' => ['onValidateTransition', -100],
35+
'commerce_order.fulfill.pre_transition' => ['onFulfillTransition', -100],
36+
'commerce_order.cancel.pre_transition' => ['onCancelTransition', -100],
3437
];
3538
return $events;
3639
}
@@ -47,4 +50,40 @@ public function onPlaceTransition(WorkflowTransitionEvent $event) {
4750
$this->logStorage->generate($order, 'order_placed')->save();
4851
}
4952

53+
/**
54+
* Creates a log when an order is validated.
55+
*
56+
* @param \Drupal\state_machine\Event\WorkflowTransitionEvent $event
57+
* The transition event.
58+
*/
59+
public function onValidateTransition(WorkflowTransitionEvent $event) {
60+
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
61+
$order = $event->getEntity();
62+
$this->logStorage->generate($order, 'order_validated')->save();
63+
}
64+
65+
/**
66+
* Creates a log when an order is fulfilled.
67+
*
68+
* @param \Drupal\state_machine\Event\WorkflowTransitionEvent $event
69+
* The transition event.
70+
*/
71+
public function onFulfillTransition(WorkflowTransitionEvent $event) {
72+
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
73+
$order = $event->getEntity();
74+
$this->logStorage->generate($order, 'order_fulfilled')->save();
75+
}
76+
77+
/**
78+
* Creates a log when an order is canceled.
79+
*
80+
* @param \Drupal\state_machine\Event\WorkflowTransitionEvent $event
81+
* The transition event.
82+
*/
83+
public function onCancelTransition(WorkflowTransitionEvent $event) {
84+
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
85+
$order = $event->getEntity();
86+
$this->logStorage->generate($order, 'order_canceled')->save();
87+
}
88+
5089
}

modules/log/tests/src/Kernel/OrderIntegrationTest.php

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Drupal\Tests\commerce_log\Kernel;
44

55
use Drupal\commerce_order\Entity\Order;
6+
use Drupal\commerce_order\Entity\OrderType;
67
use Drupal\commerce_price\Price;
78
use Drupal\commerce_product\Entity\Product;
89
use Drupal\commerce_product\Entity\ProductVariation;
@@ -71,6 +72,11 @@ protected function setUp() {
7172
$this->logStorage = $this->container->get('entity_type.manager')->getStorage('commerce_log');
7273
$this->logViewBuilder = $this->container->get('entity_type.manager')->getViewBuilder('commerce_log');
7374

75+
// Change the workflow of the default order type.
76+
$order_type = OrderType::load('default');
77+
$order_type->setWorkflowId('order_fulfillment_validation');
78+
$order_type->save();
79+
7480
// Turn off title generation to allow explicit values to be used.
7581
$variation_type = ProductVariationType::load('default');
7682
$variation_type->setGenerateTitle(FALSE);
@@ -123,9 +129,28 @@ protected function setUp() {
123129
}
124130

125131
/**
126-
* Tests that a log is generated when an order is placed.
132+
* Tests that a log is generated for the cancel transition.
127133
*/
128-
public function testPlacedLog() {
134+
public function testCancelLog() {
135+
// Draft -> Canceled.
136+
$transition = $this->order->getState()->getTransitions();
137+
$this->order->getState()->applyTransition($transition['cancel']);
138+
$this->order->save();
139+
140+
$logs = $this->logStorage->loadByEntity($this->order);
141+
$this->assertEquals(1, count($logs));
142+
$log = reset($logs);
143+
$build = $this->logViewBuilder->view($log);
144+
$this->render($build);
145+
146+
$this->assertText('The order was canceled.');
147+
}
148+
149+
/**
150+
* Tests that a log is generated for place, validate, and fulfill transitions.
151+
*/
152+
public function testPlaceValidateFulfillLogs() {
153+
// Draft -> Placed.
129154
$transition = $this->order->getState()->getTransitions();
130155
$this->order->getState()->applyTransition($transition['place']);
131156
$this->order->save();
@@ -137,6 +162,32 @@ public function testPlacedLog() {
137162
$this->render($build);
138163

139164
$this->assertText('The order was placed.');
165+
166+
// Placed -> Validated.
167+
$transition = $this->order->getState()->getTransitions();
168+
$this->order->getState()->applyTransition($transition['validate']);
169+
$this->order->save();
170+
171+
$logs = $this->logStorage->loadByEntity($this->order);
172+
$this->assertEquals(2, count($logs));
173+
$log = $logs[2];
174+
$build = $this->logViewBuilder->view($log);
175+
$this->render($build);
176+
177+
$this->assertText('The order was validated.');
178+
179+
// Validated -> Fulfilled.
180+
$transition = $this->order->getState()->getTransitions();
181+
$this->order->getState()->applyTransition($transition['fulfill']);
182+
$this->order->save();
183+
184+
$logs = $this->logStorage->loadByEntity($this->order);
185+
$this->assertEquals(3, count($logs));
186+
$log = $logs[3];
187+
$build = $this->logViewBuilder->view($log);
188+
$this->render($build);
189+
190+
$this->assertText('The order was fulfilled.');
140191
}
141192

142193
}

0 commit comments

Comments
 (0)