Compare commits

..
2 Commits
13 changed files with 81 additions and 19 deletions
+12
View File
@@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [0.26.1] - 2026-09-28
### Added
- `Modules\Core\Order\Support\OrderReferenceDisplay` — a human-facing form of
`Order::reference` for emails and storefront views. `Lunar\Base\OrderReferenceGenerator`
zero-pads the order's own id out to a fixed length (8 characters by default), so a shop's
first real orders read as `#00000001` rather than `#1`. This strips leading zeros until the
first non-zero digit (falling back to `0` if none remain), purely for display — the raw,
padded `reference` is untouched everywhere else (DB lookups, the order-status API, staff
search, GDPR exports). Wired into the checkout confirmation page and all customer-facing
order notification emails.
## [0.26.0] - 2026-09-28
### Added
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "boboko/core",
"description": "Core module — authentication and shared panel behaviour",
"type": "library",
"version": "0.26.0",
"version": "0.26.1",
"autoload": {
"psr-4": {
"Modules\\Core\\": "src/"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@boboko/core",
"version": "0.26.0",
"version": "0.26.1",
"private": true,
"type": "module",
"description": "Portable Stimulus controllers and styles for boboko-core's cart + checkout module. Installed as a real npm dependency (file:../boboko-core in dev, a tagged git install in prod) so a consuming app's `npm install` resolves this package's own dependencies (leaflet, @hotwired/stimulus) transitively, the same way `composer update boboko/*` does for PHP. See CONTRIBUTE.md's \"JS/CSS: a real npm package\" section.",
@@ -14,7 +14,7 @@
<dl class="bbk-confirmation-meta">
<div class="bbk-confirmation-meta-row">
<dt>{{ __('checkout.page.confirmation_order_number') }}</dt>
<dd>{{ $order->reference }}</dd>
<dd>{{ \Modules\Core\Order\Support\OrderReferenceDisplay::resolve($order) }}</dd>
</div>
@if ($order->billingAddress?->contact_email)
@@ -7,6 +7,7 @@ use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Notification as NotificationFacade;
use Modules\Core\Notification\BaseNotification;
use Modules\Core\Order\Events\OrderCaptured;
use Modules\Core\Order\Support\OrderReferenceDisplay;
class OrderCapturedNotification extends BaseNotification
{
@@ -40,10 +41,12 @@ class OrderCapturedNotification extends BaseNotification
{
$order = $this->event->order;
$reference = OrderReferenceDisplay::resolve($order);
return (new MailMessage)
->subject(__('Payment captured for your order :reference', ['reference' => $order->reference]))
->subject(__('Payment captured for your order :reference', ['reference' => $reference]))
->view('core::order.notifications.captured', [
'reference' => $order->reference,
'reference' => $reference,
'amount' => $this->event->transaction->amount->formatted,
]);
}
@@ -7,6 +7,7 @@ use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Notification as NotificationFacade;
use Modules\Core\Notification\BaseNotification;
use Modules\Core\Order\Events\OrderCompleted;
use Modules\Core\Order\Support\OrderReferenceDisplay;
class OrderCompletedNotification extends BaseNotification
{
@@ -40,10 +41,12 @@ class OrderCompletedNotification extends BaseNotification
{
$order = $this->event->order;
$reference = OrderReferenceDisplay::resolve($order);
return (new MailMessage)
->subject(__('Your order :reference is complete', ['reference' => $order->reference]))
->subject(__('Your order :reference is complete', ['reference' => $reference]))
->view('core::order.notifications.completed', [
'reference' => $order->reference,
'reference' => $reference,
]);
}
}
@@ -7,6 +7,7 @@ use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Notification as NotificationFacade;
use Modules\Core\Notification\BaseNotification;
use Modules\Core\Order\Events\OrderDelivered;
use Modules\Core\Order\Support\OrderReferenceDisplay;
class OrderDeliveredNotification extends BaseNotification
{
@@ -40,10 +41,12 @@ class OrderDeliveredNotification extends BaseNotification
{
$order = $this->event->order;
$reference = OrderReferenceDisplay::resolve($order);
return (new MailMessage)
->subject(__('Your order :reference has been delivered', ['reference' => $order->reference]))
->subject(__('Your order :reference has been delivered', ['reference' => $reference]))
->view('core::order.notifications.delivered', [
'reference' => $order->reference,
'reference' => $reference,
]);
}
}
@@ -7,6 +7,7 @@ use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Notification as NotificationFacade;
use Modules\Core\Notification\BaseNotification;
use Modules\Core\Order\Events\OrderDispatched;
use Modules\Core\Order\Support\OrderReferenceDisplay;
/**
* Fills a real, previously-unfilled customer-communication gap — before
@@ -45,10 +46,12 @@ class OrderDispatchedNotification extends BaseNotification
{
$order = $this->event->order;
$reference = OrderReferenceDisplay::resolve($order);
return (new MailMessage)
->subject(__('Your order :reference is on its way', ['reference' => $order->reference]))
->subject(__('Your order :reference is on its way', ['reference' => $reference]))
->view('core::order.notifications.dispatched', [
'reference' => $order->reference,
'reference' => $reference,
]);
}
}
@@ -7,6 +7,7 @@ use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Notification as NotificationFacade;
use Modules\Core\Notification\BaseNotification;
use Modules\Core\Order\Events\OrderReadyForPickup;
use Modules\Core\Order\Support\OrderReferenceDisplay;
/**
* "Your order is ready to collect" — listens to the specific
@@ -50,10 +51,12 @@ class OrderPickupReadyNotification extends BaseNotification
{
$order = $this->event->order;
$reference = OrderReferenceDisplay::resolve($order);
return (new MailMessage)
->subject(__('Your order :reference is ready for pickup', ['reference' => $order->reference]))
->subject(__('Your order :reference is ready for pickup', ['reference' => $reference]))
->view('core::order.notifications.pickup-ready', [
'reference' => $order->reference,
'reference' => $reference,
]);
}
}
@@ -7,6 +7,7 @@ use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Notification as NotificationFacade;
use Modules\Core\Checkout\Events\OrderPlaced;
use Modules\Core\Notification\BaseNotification;
use Modules\Core\Order\Support\OrderReferenceDisplay;
/**
* The order confirmation email — fires once, for every capture_mode and
@@ -51,10 +52,12 @@ class OrderPlacedNotification extends BaseNotification
{
$order = $this->event->order;
$reference = OrderReferenceDisplay::resolve($order);
return (new MailMessage)
->subject(__('Your order :reference is confirmed', ['reference' => $order->reference]))
->subject(__('Your order :reference is confirmed', ['reference' => $reference]))
->view('core::order.notifications.placed', [
'reference' => $order->reference,
'reference' => $reference,
'total' => $order->total->formatted,
'lines' => $order->lines,
]);
@@ -7,6 +7,7 @@ use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Notification as NotificationFacade;
use Modules\Core\Notification\BaseNotification;
use Modules\Core\Order\Events\OrderRefunded;
use Modules\Core\Order\Support\OrderReferenceDisplay;
class OrderRefundedNotification extends BaseNotification
{
@@ -40,10 +41,12 @@ class OrderRefundedNotification extends BaseNotification
{
$order = $this->event->order;
$reference = OrderReferenceDisplay::resolve($order);
return (new MailMessage)
->subject(__('A refund has been issued for your order :reference', ['reference' => $order->reference]))
->subject(__('A refund has been issued for your order :reference', ['reference' => $reference]))
->view('core::order.notifications.refunded', [
'reference' => $order->reference,
'reference' => $reference,
'amount' => $this->event->transaction->amount->formatted,
]);
}
@@ -7,6 +7,7 @@ use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Notification as NotificationFacade;
use Modules\Core\Notification\BaseNotification;
use Modules\Core\Order\Events\OrderStatusUpdated;
use Modules\Core\Order\Support\OrderReferenceDisplay;
class OrderStatusUpdatedNotification extends BaseNotification
{
@@ -52,10 +53,12 @@ class OrderStatusUpdatedNotification extends BaseNotification
{
$order = $this->event->order;
$reference = OrderReferenceDisplay::resolve($order);
return (new MailMessage)
->subject(__('Your order :reference has been updated', ['reference' => $order->reference]))
->subject(__('Your order :reference has been updated', ['reference' => $reference]))
->view('core::order.notifications.status-updated', [
'reference' => $order->reference,
'reference' => $reference,
'statusLabel' => config("lunar.orders.statuses.{$order->status}.label", $order->status),
]);
}
@@ -0,0 +1,26 @@
<?php
namespace Modules\Core\Order\Support;
use Lunar\Models\Order;
/**
* A shorter, human-facing form of Order::reference for emails/views —
* Lunar\Base\OrderReferenceGenerator pads the order's own id out to a fixed
* length (config('lunar.orders.reference_format'), 8 characters/'0'-padded
* by default), so a shop's first real orders read as "#00000001" rather
* than "#1". Strips leading zeros until the first non-zero digit; if
* nothing but zeros remain (or the reference is empty), shows "0".
*
* $order->reference itself is untouched anywhere else (DB lookups, the
* order-status API, staff search) — this is purely a display helper.
*/
class OrderReferenceDisplay
{
public static function resolve(Order $order): string
{
$reference = ltrim((string) $order->reference, '0');
return $reference !== '' ? $reference : '0';
}
}