diff --git a/CHANGELOG.md b/CHANGELOG.md index b4978e4..b22a737 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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/). +## [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 :
" 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 ### Fixed - Checkout crashed ("Driver [acs] not supported", a 500) when a shipping diff --git a/composer.json b/composer.json index 3f94515..5be8f1d 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "boboko/core", "description": "Core module — authentication and shared panel behaviour", "type": "library", - "version": "0.29.1", + "version": "0.29.2", "autoload": { "psr-4": { "Modules\\Core\\": "src/" diff --git a/package.json b/package.json index 2405a86..8df0d7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@boboko/core", - "version": "0.29.1", + "version": "0.29.2", "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.",