Skip to content

Commit 643d4ad

Browse files
Add generating-order-number hook (#97)
1 parent dc674d8 commit 643d4ad

File tree

3 files changed

+83
-7
lines changed

3 files changed

+83
-7
lines changed

docs/docs/orders.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,60 @@ You may provide a `limit` option to control the number of items displayed in lis
133133
['type' => 'recent_orders', 'width' => 50, 'limit' => 10],
134134
```
135135

136+
## Order Numbers
137+
138+
When an order is created, Cargo will generate a unique order number. By default, order numbers start at `1000` but the minimum value is configurable:
139+
140+
```php
141+
// config/statamic/cargo.php
142+
143+
'minimum_order_number' => 5000,
144+
```
145+
146+
You may hook into the Stache `OrderRepository` class to customize how order numbers are generated:
147+
148+
```php
149+
// app/Providers/AppServiceProvider.php
150+
151+
use DuncanMcClean\Cargo\Stache\Repositories\OrderRepository;
152+
153+
OrderRepository::hook('generating-order-number', function ($payload, $next) {
154+
// $payload->order;
155+
// $payload->orderNumber;
156+
157+
$payload->orderNumber = 5000;
158+
159+
return $next($payload);
160+
});
161+
```
162+
163+
:::tip note
164+
When storing orders in the database, the `order_number` column is auto-incrementing, meaning the database (eg. MySQL, PostgreSQL, etc) is in charge of generating the next order number.
165+
166+
To customize how order numbers are generated, remove `->autoIncrement()` from the migration and listen for the Order model's `creating` event:
167+
168+
```php
169+
$table->integer('order_number')->autoIncrement(); // [tl! remove]
170+
$table->integer('order_number'); // [tl! add]
171+
```
172+
173+
```php
174+
// app/Providers/AppServiceProvider.php
175+
176+
use DuncanMcClean\Cargo\Orders\Eloquent\OrderModel;
177+
use Illuminate\Database\Eloquent\Model;
178+
179+
Model::creating(function (Model $model) {
180+
if ($model instanceof OrderModel) {
181+
$model->orderNumber = 5000;
182+
}
183+
});
184+
```
185+
:::
186+
187+
188+
when you're using a db, the order number column is auto incrementing. if you want to customize order numbers, you'll need to edit the migration
189+
136190
## Storage
137191
Out of the box, orders are stored as YAML files in the `content/cargo/orders` directory. If you wish, you can change the directory in the `cargo.php` config file:
138192

src/Stache/Repositories/OrderRepository.php

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414
use Illuminate\Support\Facades\Cache;
1515
use Statamic\Fields\Blueprint as StatamicBlueprint;
1616
use Statamic\Stache\Stache;
17+
use Statamic\Support\Traits\Hookable;
1718

1819
class OrderRepository implements RepositoryContract
1920
{
21+
use Hookable;
22+
2023
protected $stache;
2124
protected $store;
2225

@@ -95,7 +98,7 @@ public function save(Order $order): void
9598
}
9699

97100
if (! $order->orderNumber()) {
98-
$order->orderNumber($this->generateOrderNumber());
101+
$order->orderNumber($this->generateOrderNumber($order));
99102
}
100103

101104
$this->store->save($order);
@@ -106,16 +109,19 @@ public function delete(Order $order): void
106109
$this->store->delete($order);
107110
}
108111

109-
private function generateOrderNumber(): int
112+
private function generateOrderNumber(Order $order): int
110113
{
111-
return Cache::lock('cargo-order-number', 5)->get(function () {
112-
$lastOrder = $this->query()->orderByDesc('order_number')->first();
114+
return Cache::lock('cargo-order-number', 5)->get(function () use ($order) {
115+
$orderNumber = config('statamic.cargo.minimum_order_number', 1000);
113116

114-
if (! $lastOrder) {
115-
return config('statamic.cargo.minimum_order_number', 1000);
117+
if ($lastOrder = $this->query()->orderByDesc('order_number')->first()) {
118+
$orderNumber = (int) $lastOrder->orderNumber() + 1;
116119
}
117120

118-
return (int) $lastOrder->orderNumber() + 1;
121+
return $this->runHooks('generating-order-number', (object) [
122+
'order' => $order,
123+
'orderNumber' => $orderNumber,
124+
])->orderNumber;
119125
});
120126
}
121127

tests/Stache/Repositories/OrderRepositoryTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,22 @@ public function can_generate_order_number()
160160
$this->assertEquals(1003, $order->orderNumber());
161161
}
162162

163+
#[Test]
164+
public function can_hook_into_generating_order_number()
165+
{
166+
$this->repo->hook('generating-order-number', function ($payload, $next) {
167+
$payload->orderNumber = 5000;
168+
169+
return $next($payload);
170+
});
171+
172+
$order = Order::make();
173+
174+
$this->repo->save($order);
175+
176+
$this->assertEquals(5000, $order->orderNumber());
177+
}
178+
163179
#[Test]
164180
public function can_delete_an_order()
165181
{

0 commit comments

Comments
 (0)