Bump version to 0.31.0

This commit is contained in:
2026-10-01 01:51:41 +03:00
parent 5ff0d60f54
commit 207cb13363
3 changed files with 128 additions and 2 deletions
+126
View File
@@ -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