Bump version to 0.29.2
This commit is contained in:
@@ -4,6 +4,77 @@ 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/).
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||||
|
|
||||||
|
## [0.29.2] - 2026-09-30
|
||||||
|
### Added
|
||||||
|
- `core.display_timezone` (env `DISPLAY_TIMEZONE`, default `Europe/Athens`):
|
||||||
|
the timezone times are shown in, while they stay stored in the app
|
||||||
|
timezone (UTC). Set as Filament's display timezone, so every admin date
|
||||||
|
column, entry and picker shows local time (and pickers save UTC), and
|
||||||
|
available on dates as `->inDisplayTimezone()` for hand-formatted ones —
|
||||||
|
storefront pages and emails should use it (3dealer's My orders, tracking
|
||||||
|
timeline and order-placed email do).
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Every time in the admin was shown in UTC — 3 hours behind Greek time in
|
||||||
|
summer, 2 in winter — including Carrier Vouchers, Pending Vouchers, the
|
||||||
|
order page's shipments and the order Timeline (whose view core now
|
||||||
|
overrides, `resources/views/lunarpanel`, since Lunar formats its times by
|
||||||
|
hand). Manual tracking updates entered in local time were saved as if
|
||||||
|
they were UTC; they're now converted.
|
||||||
|
- ACS tracking times (Greek time, no offset) were stored as if they were
|
||||||
|
UTC; they're now read as Greek time, like ELTA's.
|
||||||
|
- ELTA multi-parcel sends: Create Shipment with several packages now
|
||||||
|
creates one shipment per parcel straight away (the extra parcels get
|
||||||
|
their voucher numbers when the main voucher is issued, on first print),
|
||||||
|
so the order shows every parcel from the start. Labels follow ELTA's own
|
||||||
|
client: printing the main voucher prints every parcel in one PDF, each
|
||||||
|
parcel is numbered `00k/00n` (previously every label said `001/00n`),
|
||||||
|
the extra parcels show "ΠΟΛΛΑΠΛΗ ΑΠΟΣΤΟΛΗ - MASTER : <main voucher>" and
|
||||||
|
only the COD warning (the amount is collected on the main voucher), and
|
||||||
|
on A4 they use ELTA's separate single-parcel layout (`label-a4-child`).
|
||||||
|
An extra parcel can't be cancelled on its own — ELTA cancels the whole
|
||||||
|
voucher, so cancelling the main parcel cancels them all.
|
||||||
|
- The order page's shipments list now updates right after Create Shipment
|
||||||
|
and Add manual voucher, instead of only on the next page load.
|
||||||
|
- Pending Vouchers kept ELTA vouchers forever (ELTA has no manifest step,
|
||||||
|
which is what took ACS vouchers off the list). A voucher now leaves once
|
||||||
|
its carrier's hand-over step is done: printed for carriers that issue on
|
||||||
|
print (ELTA), on a manifest for carriers that batch (ACS).
|
||||||
|
- "Issued Manifests" is hidden from the menu while no registered carrier
|
||||||
|
uses manifests (ACS is currently off); the page and past manifests stay
|
||||||
|
reachable.
|
||||||
|
- Carrier Vouchers: the list shows each voucher's **Source** again, colored
|
||||||
|
per source (created here green, manual voucher orange, manual carrier
|
||||||
|
grey, from carrier blue), same on the view page. "Reference sent to the
|
||||||
|
carrier" was only filled for vouchers the carrier reported; shipments now
|
||||||
|
save the reference they send (ELTA `pel_ref_no`, ACS `Reference_Key1`,
|
||||||
|
Box Now `orderNumber`), and older ones show what was sent (the order
|
||||||
|
reference, or `{reference}-{id}` for Box Now).
|
||||||
|
- Multi-parcel sends show which voucher is the main one and which parcels
|
||||||
|
belong to it — "Main voucher · parcel 1 of 3", "Parcel 2 of 3 · of
|
||||||
|
NZ…GR" — on the order page, Pending Vouchers and Carrier Vouchers (list
|
||||||
|
and view), via `Shipment::parcelDescription()`.
|
||||||
|
- Shipping options are now resolved by **place, from the inside out**:
|
||||||
|
postcode → state → country → unrestricted, and the first place with
|
||||||
|
usable rates is the whole answer — outer places are not considered. So a
|
||||||
|
postcode zone offering only Box Now at €4 means customers in that
|
||||||
|
postcode get only Box Now at €4, even if an unrestricted zone offers Box
|
||||||
|
Now and ACS at €8. Postcode zones go from the most specific match to the
|
||||||
|
least (an exact postcode beats a `45*` prefix). Previously Lunar mixed
|
||||||
|
every matching zone together and kept whichever rate per method it met
|
||||||
|
first, so the price depended on the order zones were created in.
|
||||||
|
A place whose rates are all unusable (disabled, outside the customer
|
||||||
|
group or schedule, stock, weight limits, or an unregistered driver) falls
|
||||||
|
through to the next one. It finds every zone containing the address in
|
||||||
|
one query and checks customer groups once for all methods, so it runs a
|
||||||
|
fixed ~10 queries — no more than Lunar's own resolver, which grew with
|
||||||
|
each rate. `Modules\Core\Shipping\Support\PlaceShippingRateResolver`
|
||||||
|
replaces 0.29.1's `RegisteredDriverRateResolver` (its unregistered-driver
|
||||||
|
check is part of it).
|
||||||
|
Exclusion lists don't make a place fall through: an excluded product
|
||||||
|
means "can't be shipped there", so a cart holding one gets that place's
|
||||||
|
remaining options — or none — never an outer place's rule.
|
||||||
|
|
||||||
## [0.29.1] - 2026-09-30
|
## [0.29.1] - 2026-09-30
|
||||||
### Fixed
|
### Fixed
|
||||||
- Checkout crashed ("Driver [acs] not supported", a 500) when a shipping
|
- Checkout crashed ("Driver [acs] not supported", a 500) when a shipping
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
"name": "boboko/core",
|
"name": "boboko/core",
|
||||||
"description": "Core module — authentication and shared panel behaviour",
|
"description": "Core module — authentication and shared panel behaviour",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"version": "0.29.1",
|
"version": "0.29.2",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"Modules\\Core\\": "src/"
|
"Modules\\Core\\": "src/"
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@boboko/core",
|
"name": "@boboko/core",
|
||||||
"version": "0.29.1",
|
"version": "0.29.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"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.",
|
"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.",
|
||||||
|
|||||||
Reference in New Issue
Block a user