Bump version to 0.29.0

This commit is contained in:
2026-09-30 17:30:09 +03:00
parent 49ec4333af
commit cd3245df7b
3 changed files with 103 additions and 2 deletions
+101
View File
@@ -4,6 +4,107 @@ 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.0] - 2026-09-30
### Added
- **ELTA Courier** carrier (`elta` shipping driver): rates, shipment creation,
tracking, and labels rendered locally in ELTA's own A4 / A6 voucher layout.
Configured through `ELTA_*` env variables (`ELTA_APOST_CODE`,
`ELTA_USER_CODE`, `ELTA_SENDER_*`, `ELTA_LABEL_PAPER_SIZE`, …). Vouchers
are created pending and issued when first printed, so they can be
cancelled until then; once issued, ELTA has to cancel them.
- **Pending Vouchers** now has an ELTA tab next to ACS. Print opens the label
(issuing the voucher), Cancel cancels with the carrier, and **Print
selected** returns one combined PDF for carriers that support it (ELTA).
Issue Manifest only shows on tabs for carriers that batch (ACS).
- **Carrier Vouchers** screen (Sales): every voucher with a number, including
the ones carriers report that we don't have (daily sync of the last 14
days, plus **Sync now** and **Look up voucher**). Tabs All / Unlinked /
Returns. Each sync also brings every voucher it sees up to date: new
tracking checkpoints for all of them (ours included), and the carrier's
latest details for the ones that came from the carrier. **Status** is ours (normalized, the same on every carrier) and
**Carrier status** is the carrier's own wording. A view page per voucher
has its details (recipient, COD,
extra services, return info, suggested orders, tracking history). Vouchers
are never linked to an order automatically: each gets suggested orders
(the order its reference points to first, then same postcode and phone or
name), and staff link it with **Link to order**. Supported for ELTA, Box
Now and ACS
(finalized vouchers only).
- **Manual carriers**: a new "Manual carrier" shipping driver for couriers
without an integration. The shipping method holds the carrier name, an
optional tracking URL template (`{number}` = voucher number) and whether the
courier collects cash on delivery. Its shipments are created from the order
page, and staff add tracking updates by hand; they move the order through
dispatched / delivered / failed and send the same emails as integrated
carriers.
- **Extra services** (Saturday delivery, timed delivery, insurance, …), one
normalized list mapped to each carrier's own codes, picked by staff in
Create Shipment. Sent to ACS (`Acs_Delivery_Products`, `Insurance_Ammount`,
`Appointment_Until_Time`) and ELTA (`pel_sur_*`, `pel_asf_poso`), printed
on the ELTA label.
- **Add manual voucher** on the order page, for an integrated carrier's
voucher that wasn't created here (API down, or the courier wrote his own).
It previews what the carrier reports for the number, and its tracking
history is picked up like any other shipment.
- Customer tracking: the dispatched email lists each shipment's voucher
number and links to the order page, which shows the carrier, status and
the synced tracking history. Only manual carriers link to the courier's
site. New `storefront.orders.*` and `storefront.tracking_status.*` keys —
re-run `StorefrontTranslationsSeeder` in consuming apps.
- Carrier tracking on the order page's **Timeline**: every checkpoint of the
order's shipments (carrier polling or a manual tracking update) is logged
as it arrives, showing carrier, voucher, status, location and the
carrier's own time. Linking a voucher to an order from Carrier Vouchers
adds its history so far.
- Every shipment stores its cash-on-delivery amount and extra services; the
order page shows them. ACS vouchers now carry the order reference
(`Reference_Key1`) so they can be matched back.
### Changed
- Creating a shipment no longer marks the order **dispatched**. It moves to
dispatched when the carrier reports picking the parcel up, which is also
when the "on its way" email is sent (previously it was never sent after
Create Shipment).
- `shipments.tracking_reference` and `shipments.order_id` are nullable, and
shipments have a `source` (`created`, `manual_voucher`, `manual`,
`synced`). New migration.
- `SupportsCashCollection::collectsCash()` now receives the shipping method:
`collectsCash(ShippingMethod $method)`. Custom shipping drivers implementing
it need the new signature.
- Create Shipment is available again once all of an order's shipments are
cancelled.
- The order page shows ELTA and manual carriers by name, and hides Print for
shipments without a carrier label.
- `OrderStatusUpdated` carries the cause of the write (`$causeClass`, null
for writes outside `OrderStatusWriter`).
### Fixed
- Customers got two emails when an order became ready for pickup,
dispatched, delivered or completed: the dedicated one and the generic
"your order is now …" one, which only skipped a `ready-for-pickup` spelling
that is never written. The generic email now skips exactly the writes that
send their own email; a manual status change from the admin still sends
it.
- ELTA labels now print everything ELTA's own client prints (checked
field by field against its `SydetaLabelE` / `sydetaE` reports and
`print_vg()`): the cash-on-delivery amount and breakdown
("ΑΝΤΙΚΑΤΑΒΟΛΗ 17.00", "* ΑΝΑΛΥΣΗ *", "17.00 MΕΤΡΗΤΑ") in the COD column,
the A6 bottom banner, both A4 copies and the payment stub (with ΠΟΣΟ), the
A4 "* ΠΡΟΣΟΧΗ ΑΝΤΙΚΑΤΑΒΟΛΗ *" / "* Απόδειξη Είσπαξης *" notes, the
sender's "Κωδικός:" line, extra services in ELTA's own slots, and
"* ΠΟΛΛΑΠΛΗ ΑΠΟΣΤΟΛΗ *". Previously the A6 label showed no COD amount at
all. The OCR line is no longer wrapped in doubled `> <` markers, and the
volumetric weight is left empty (not 0.000) when none was given.
- ELTA tracking texts were almost never recognized: ELTA sends them in
unaccented capitals ("ΠΑΡΑΔΟΘΗΚΕ") while the mapping looked for accented
words, so most checkpoints came through as Pending. Box Now's `canceled`
spelling is now recognized too.
- ACS shipments were never detected as delivered: the tracking summary was
read from `ACSValueOutput` instead of `ACSTableOutput`.
- Re-creating a Box Now shipment after cancelling it failed, because the
same `orderNumber` was sent again. Retries now send `{reference}-{id}-2`,
`-3`, …
## [0.28.0] - 2026-09-30 ## [0.28.0] - 2026-09-30
### Added ### Added
- `php artisan boboko:translations:pull` — the reverse of the translation - `php artisan boboko:translations:pull` — the reverse of the translation
+1 -1
View File
@@ -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.28.0", "version": "0.29.0",
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Modules\\Core\\": "src/" "Modules\\Core\\": "src/"
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@boboko/core", "name": "@boboko/core",
"version": "0.28.0", "version": "0.29.0",
"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.",