From 207cb133634feddb28efc9675726307ab99df205 Mon Sep 17 00:00:00 2001 From: Konstantinos Arvanitakis Date: Thu, 1 Oct 2026 01:51:41 +0300 Subject: [PATCH] Bump version to 0.31.0 --- CHANGELOG.md | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++ composer.json | 2 +- package.json | 2 +- 3 files changed, 128 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ba813b..3f4468d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,132 @@ 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.31.0] - 2026-10-01 +### Added +- A "Create voucher" button on Carrier Vouchers, for a parcel that isn't a + shop order. The form follows the carrier: + - **ELTA:** recipient address and phones, envelope or parcel, packages, + weight, dimensions (sent as volumetric weight), cash on delivery, + extra services, remarks and our reference. + - **Box Now:** the locker, one size per box, the recipient's mobile and + email, cash on delivery, parcel value and reference. + + The voucher has no order. An ELTA one waits on Pending Vouchers, which + now lists vouchers without an order, until it's printed. It can be + linked to an order later. Carriers opt in with the new + `CreatesStandaloneVouchers` contract. +- Carrier Vouchers: + - a **Carrier** column; + - a **Print** button, in the list and on a voucher's page, for vouchers + created here (from an order or with "Create voucher"); + - vouchers created here that are still waiting for their number (ELTA + issues it on print) are listed too, as "Not issued yet". + + Empty Status and Order cells now read "None yet" and "None". +- An order's "Create Shipment" for ELTA and Box Now opens the same voucher + form (`VoucherForm`), prefilled from the order: + - recipient, phones, email and delivery instructions from the shipping + address; + - weight from the order lines, and Box Now's locker from the checkout; + - insurance defaulting to the order total; + - cash on delivery shown read-only, from the payment method. + + Staff can correct the recipient before it's sent. The correction goes + to the carrier and is saved on the voucher (`ShipmentRequest::$recipient`), + while the order keeps what the customer entered. Envelope and dimensions + are now available for orders' ELTA vouchers too. Manual carriers and ACS + keep their forms. +- Vouchers save their recipient when they're created (`meta.recipient`, + the new `VoucherRecipient` DTO), orders' vouchers included. + `Shipment::recipient()` and `Shipment::reference()` return them. ELTA + labels are rendered from these alone, not from the order. Vouchers + created before this fall back to their order's shipping address. +- ELTA vouchers can be envelopes and can carry dimensions: the parcel + flag becomes `1`, and `pel_x`/`pel_y`/`pel_z` plus the volumetric + weight are sent and printed. So far only through "Create voucher". +- ELTA return vouchers ("RETOUR"). With special handling, the voucher is + sent with us as the return-to party, as ELTA's client does. ELTA then + issues a return voucher with it. Printing prints it after the voucher + and its parcels: parties swapped, service 461/462, charged to the + recipient. Its number shows on the order page and on the Carrier + Vouchers view. +- ELTA PostBox delivery, as a new "PostBox delivery" extra service. The + postcode goes through ELTA's PostBox lookup (`PELTKBOX`), and the + voucher carries surcharge `917`. The label prints ELTA's + "* ΠΡΟΣΟΧΗ PostBox *" warnings. ELTA's rules are checked when the + shipment is created: + - no special handling; + - no cash on delivery; + - a 69… mobile; + - a postcode that has a PostBox. +- ELTA tracking now stores who received the parcel and when, and the COD + amount ELTA paid back to us. These show on the order page and in a new + Delivery section on the Carrier Vouchers view. + +### Changed +- ELTA's default endpoint is now `https://clients.elta-courier.gr`. The old + `http://212.205.47.226:9003` only speaks plain HTTP. Apps that set + `ELTA_SERVICE_LOCATION` should update it. Calls are retried twice on a + connection error or a 5xx. +- ELTA vouchers are sent with the service and locality that ELTA's + `PELTKNEW` gives for the postcode (sender station included): 101/201 for + the city, 211 for islands, 231 for hard-to-reach localities. When + several localities share a postcode, the one matching the address's city + is used. When none matches, ELTA picks the service and the order page + says so. Before this the service was blank and the area was the city + text. +- ELTA extra services go in ELTA's fixed slots: special handling / PostBox + in `pel_sur_1`, timed delivery in `pel_sur_2`, Saturday delivery in + `pel_sur_3`. +- ELTA remarks carry the parcel flag, as ELTA's own client sends them: + the remarks are right-aligned in 99 characters, followed by `2`. +- ELTA labels print ELTA's current company details (Λεωφ. Ιωνίας 200, + Γ.Ε.ΜΗ) on the A4 copies, the payment stub, the A4 child label and the + A6. The payment stub's ΠΟΡΤΑ-ΠΟΡΤΑ block is gone. + +### Fixed +- Creating an ELTA shipment now fails with a clear message: + - with no recipient phone; + - with more than 20 pieces; + - with a postcode ELTA doesn't serve. + + Before, ELTA accepted the pending voucher and it failed later. +- Phone numbers sent to ELTA drop the `30` / `0030` prefix. Mobiles + (`69…`) go in the mobile field. +- "Απόδειξη Είσπραξης" is now spelled correctly on the ELTA sender's + copy. +- ELTA labels left the deposit station (Γρ.Κατάθεσης) blank when + `ELTA_ORIGIN_STATION_CODE` isn't set. They now use the station ELTA's + login reports, as issuing already did. +- The ELTA A4 voucher no longer has overlapping parts: + - **Payment stub:** laid out again on a clean grid, with the same + fields. It now carries ELTA's "Hellenic Post" logo and "Αποστολή μας + εσείς!" (`resources/logos/elta-logo.png`), as ELTA's own stub does. + The remarks fit on one line. + - **Header box:** the title no longer runs into the barcode, the + barcode fits inside the box, and the voucher number sits within its + border. + - **Copy 1:** the tear-strip line runs beside the boxes, not through + them. + - **Copy 2:** it starts clear of the cut line, and the print date stays + inside its box. + - **REFERENCE / ΠΑΡΑΤΗΡΗΣΕΙΣ:** the boxes have no more gaps in their + borders. +- On the A6, "ΧΡΕΩΣΗ … ΠΙΣΤΩΣΗ" no longer wraps out of its cell. +- A Box Now shipment with several boxes got only one voucher. Box Now + merges the items of one delivery request into a single parcel at the + largest size (verified on staging, with our payload and with the + official plugin's), although its manual says each item becomes a + parcel. Each box is now its own delivery request, so each gets its own + voucher, label and compartment: + - order numbers `…-b1`, `…-b2`; + - "Box 1 of 2" on the order page; + - the order's value and any cash on delivery on box 1; + - if a later box fails, the boxes already created are cancelled. +- Creating a Box Now shipment without the recipient's mobile or email now + fails with a clear message, instead of sending Box Now an empty + contact. The locker pickup code goes to both. + ## [0.30.0] - 2026-09-30 ### Added - Manual vouchers (an integrated carrier's voucher typed in by hand) can be diff --git a/composer.json b/composer.json index 425292f..ec6b91e 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.30.0", + "version": "0.31.0", "autoload": { "psr-4": { "Modules\\Core\\": "src/" diff --git a/package.json b/package.json index 78c8cc7..21736c2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@boboko/core", - "version": "0.30.0", + "version": "0.31.0", "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.",