diff --git a/CHANGELOG.md b/CHANGELOG.md index 8238d4f..df2e7d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,75 @@ 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.17.5] - 2026-09-15 + +### Added +- Greek translations for `Lunar\Models\Country`/`State` reference data (`lang/el/countries.php`, + `lang/el/states.php`), keyed by the exact English spellings Lunar's own installer seeds for + Greece (fetched from `data.lunarphp.io/countries+states.json`). Loaded via + `loadTranslationsFrom()` under the `core::` namespace — a plain lang file, not + `Modules\Core\Localization`'s DB-backed `TranslationService`, since this is fixed reference + data, not admin-editable UI copy. A consuming app's storefront looks these up itself (e.g. + `__('core::countries.'.$country->name)`) — core has no storefront UI of its own to wire this + into. +- `Modules\Core\Order\Filament\Extensions\OrderActionsExtension::fixCaptureAction()` — reroutes + the backoffice "Capture" header action through `Modules\Core\Payment\Support\ + TransactionDriverAdapter::capture()`, the same app-level payment pipeline checkout-time captures + use, instead of vendor Lunar's `Lunar\Models\Transaction::capture()` (which resolved + `Lunar\Facades\Payments`, an entirely separate, unused driver registry, and never dispatched + `Modules\Core\Payment\Events\PaymentCaptured`). +- `Modules\Core\Payment\Drivers\StripePaymentDriver::cardMetaFromIntent()` — extracts card + brand/last-four digits from the Stripe PaymentIntent's `latest_charge`, populated into + `PaymentResult::$meta` and mapped onto `Transaction.card_type`/`last_four` by + `Modules\Core\Order\Services\TransactionRecorder`. Fixes the admin activity log's "Payment of + :amount on card ending :last_four" line rendering with no digits, on both checkout-time and + manual captures. Only applies to transactions recorded after this change. +- `PaymentMethod.name` and `Lunar\Shipping\Models\ShippingMethod.name` are now locale-keyed JSON + columns, rendered in Filament via Lunar's own `Lunar\Admin\Support\Forms\Components\ + TranslatedText` — one input per configured `Language` row, same shape/resolution as + Product/Collection names. Existing plain-string rows are preserved under the store's default + language on migration. `ShippingMethod` has no model cast/`ModelManifest` extension point + available (vendor table, `Contracts\ShippingMethod` exists but is never bound by the package), + so its translation is decoded/encoded at the Filament field boundary and via the new + `Modules\Core\Shipping\Support\ShippingMethodName::resolve()` helper, rather than a model cast. +- `Modules\Core\Shipping\Contracts\DeclaresFulfillmentType` — lets a shipping rate driver declare + whether it fulfils via carrier delivery or in-store pickup as a hardcoded fact about the driver + (`AcsRateDriver`, `BoxNowRateDriver` both declare `'carrier'`), instead of asking a merchant to + also pick "Carrier delivery" on every row regardless of driver. The merchant-facing "Fulfillment + type" Select (`ShippingMethod.data['fulfillment_type']`) now only appears for + table-rate-shipping's generic drivers (flat-rate, ship-by, free-shipping), which are genuinely + ambiguous, and moved next to `charge_by` instead of trailing at the end of the form, + disconnected from the decisions it relates to. `Modules\Core\Shipping\Support\ + FulfillmentType::resolve()`/`isStorePickup()` is the new single source of truth, replacing a + direct `data['fulfillment_type']` read in `Order::isStorePickupOrder()`. + +### Fixed +- `Modules\Core\Order\Listeners\ApplyResolvedPaymentStatus` never advanced `Order::status` past + `awaiting_payment` on a capture — only `paid`/`paid_at` were written, so a fully captured order + could sit indefinitely at "awaiting payment" until a staff member manually clicked "Update + Status". Now, on `PaymentCaptured` (not `PaymentAuthorized`), `status` advances to the next step + in the order's flow, but only when it's still exactly `awaiting_payment`, so a duplicate/delayed + capture event never regresses an order staff already moved further. +- `Lunar\DataTypes\ShippingOption::$collect` (the flag `docs/checkout.md` documents as the + mechanism for detecting a pickup option at checkout) was never actually set by any shipping rate + driver — `Modules\Core\Shipping\Concerns\ResolvesFixedPricing` now populates it from the same + `FulfillmentType` resolution `Order::isStorePickupOrder()` uses, closing a real gap between + documented and actual behavior. + +### Changed +- `Modules\Core\Order\Filament\Extensions\OrderRefundActionsExtension` renamed to + `OrderActionsExtension` — the class now fixes both the refund and capture header actions on the + order page, not just refund. +- Removed the `lunarphp/stripe` dependency in favour of depending on `stripe/stripe-php` directly. + `Modules\Core\Payment\Drivers\StripePaymentDriver` had already replaced every bit of Lunar's own + Stripe payment flow (checkout, webhook processing) with its own — all that remained load-bearing + from the package was raw API-client access, amount conversion, and a correlation table, none of + which are Lunar-specific. Added first-party replacements: `Modules\Core\Payment\Support\ + StripeManager`, `Modules\Core\Payment\Models\StripePaymentIntent`, `Modules\Core\Payment\Http\ + Middleware\StripeWebhookMiddleware`, and a first-party copy of the vendor's + `create_stripe_payment_intents_table` migration (guarded with `Schema::hasTable()`). No behavior + change for consuming apps. + ## [0.17.4] - 2026-09-15 ### Added diff --git a/composer.json b/composer.json index ab37599..f4c2cf6 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.17.4", + "version": "0.17.5", "autoload": { "psr-4": { "Modules\\Core\\": "src/"