Skip to content

Commit 9b7bff4

Browse files
agoradesignbojanz
authored andcommitted
Issue #2842356 by agoradesign: Rethink the default order number generation (#609)
1 parent 39dfa5b commit 9b7bff4

File tree

6 files changed

+130
-9
lines changed

6 files changed

+130
-9
lines changed

modules/order/commerce_order.services.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ services:
3838
tags:
3939
- { name: event_subscriber }
4040

41+
commerce_order.order_number_subscriber:
42+
class: Drupal\commerce_order\EventSubscriber\OrderNumberSubscriber
43+
tags:
44+
- { name: event_subscriber }
45+
4146
commerce_order.order_receipt_subscriber:
4247
class: Drupal\commerce_order\EventSubscriber\OrderReceiptSubscriber
4348
arguments: ['@entity_type.manager', '@language_manager', '@plugin.manager.mail', '@commerce_order.order_total_summary', '@renderer']

modules/order/src/Entity/Order.php

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -522,14 +522,6 @@ protected function getOrderCurrencyCode() {
522522
public function postSave(EntityStorageInterface $storage, $update = TRUE) {
523523
parent::postSave($storage, $update);
524524

525-
// If no order number has been set explicitly, set it to the order ID.
526-
if (!$this->getOrderNumber()) {
527-
$this->setOrderNumber($this->id());
528-
// Order was refreshed in the save that just occurred, don't repeat it.
529-
$this->setRefreshState(self::REFRESH_SKIP);
530-
$this->save();
531-
}
532-
533525
// Ensure there's a back-reference on each order item.
534526
foreach ($this->getItems() as $order_item) {
535527
if ($order_item->order_id->isEmpty()) {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace Drupal\commerce_order\EventSubscriber;
4+
5+
use Drupal\state_machine\Event\WorkflowTransitionEvent;
6+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
7+
8+
/**
9+
* Generates the order number for placed orders.
10+
*
11+
* Modules wishing to override this logic can register their
12+
* own event subscriber with a higher weight (e.g. -10).
13+
*/
14+
class OrderNumberSubscriber implements EventSubscriberInterface {
15+
16+
/**
17+
* {@inheritdoc}
18+
*/
19+
public static function getSubscribedEvents() {
20+
$events = [
21+
'commerce_order.place.pre_transition' => ['setOrderNumber', -100],
22+
];
23+
return $events;
24+
}
25+
26+
/**
27+
* Sets the order number, if not already set explicitly, to the order ID.
28+
*
29+
* @param \Drupal\state_machine\Event\WorkflowTransitionEvent $event
30+
* The transition event.
31+
*/
32+
public function setOrderNumber(WorkflowTransitionEvent $event) {
33+
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
34+
$order = $event->getEntity();
35+
if (!$order->getOrderNumber()) {
36+
$order->setOrderNumber($order->id());
37+
}
38+
}
39+
40+
}

modules/order/tests/src/Functional/OrderTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ public function testCreateOrder() {
3434

3535
$order_exists = (bool) Order::load($order->id());
3636
$this->assertNotEmpty($order_exists, 'The new order has been created in the database.');
37-
$this->assertEquals($order->id(), $order->getOrderNumber(), 'The order number matches the order ID');
3837
}
3938

4039
/**

modules/order/tests/src/Functional/OrderUserTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public function testViewOrder() {
5454
'uid' => $uid,
5555
'order_items' => [$order_item],
5656
'mail' => '[email protected]',
57+
'order_number' => '1',
5758
]);
5859
$order->save();
5960

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<?php
2+
3+
namespace Drupal\Tests\commerce_order\Kernel;
4+
5+
use Drupal\commerce_order\Entity\Order;
6+
use Drupal\Tests\commerce\Kernel\CommerceKernelTestBase;
7+
8+
/**
9+
* Tests the setting of the order number during order placement.
10+
*
11+
* @group commerce
12+
*/
13+
class OrderNumberTest extends CommerceKernelTestBase {
14+
15+
/**
16+
* Modules to enable.
17+
*
18+
* @var array
19+
*/
20+
public static $modules = [
21+
'entity_reference_revisions',
22+
'path',
23+
'profile',
24+
'state_machine',
25+
'commerce_product',
26+
'commerce_order',
27+
'commerce_test',
28+
];
29+
30+
/**
31+
* {@inheritdoc}
32+
*/
33+
protected function setUp() {
34+
parent::setUp();
35+
36+
$this->installEntitySchema('profile');
37+
$this->installEntitySchema('commerce_order');
38+
$this->installEntitySchema('commerce_order_item');
39+
$this->installEntitySchema('commerce_product');
40+
$this->installEntitySchema('commerce_product_variation');
41+
$this->installConfig(['commerce_product', 'commerce_order']);
42+
}
43+
44+
/**
45+
* Tests setting the order number.
46+
*/
47+
public function testSetOrderNumber() {
48+
$user = $this->createUser(['mail' => $this->randomString() . '@example.com']);
49+
50+
/** @var \Drupal\commerce_order\Entity\Order $order1 */
51+
$order1 = Order::create([
52+
'type' => 'default',
53+
'state' => 'draft',
54+
'mail' => '[email protected]',
55+
'uid' => $user->id(),
56+
'ip_address' => '127.0.0.1',
57+
'store_id' => $this->store->id(),
58+
]);
59+
$order1->save();
60+
61+
$transition = $order1->getState()->getTransitions();
62+
$order1->getState()->applyTransition($transition['place']);
63+
$order1->save();
64+
$this->assertEquals($order1->id(), $order1->getOrderNumber(), 'During placement transition, the order number is set to the order ID.');
65+
66+
/** @var \Drupal\commerce_order\Entity\Order $order2 */
67+
$order2 = Order::create([
68+
'type' => 'default',
69+
'state' => 'draft',
70+
'mail' => '[email protected]',
71+
'uid' => $user->id(),
72+
'ip_address' => '127.0.0.1',
73+
'order_number' => '9999',
74+
'store_id' => $this->store->id(),
75+
]);
76+
$order2->save();
77+
78+
$transition = $order2->getState()->getTransitions();
79+
$order2->getState()->applyTransition($transition['place']);
80+
$order2->save();
81+
$this->assertEquals('9999', $order2->getOrderNumber(), 'Explicitly set order number should not get overridden.');
82+
}
83+
84+
}

0 commit comments

Comments
 (0)