lunarphp/lunar
53.0
Adequate · 19 September 2026
92.9k
lines of production code
PHP
primary language
1
measurement over time
What this system is
Lunar is a modular, monorepo-based e-commerce platform built on Laravel that manages the full product lifecycle, including catalog management, cart operations, and order processing. It provides a Filament-based admin panel for staff and supports extensible payment integrations such as Stripe, PayPal, and Opayo. The system features a robust shipping engine with configurable zones and rates, alongside a pluggable search architecture supporting Meilisearch and Typesense.
How it got here
2021–2022 — LunarPHP monorepo rebrand and core rewrite
50 changes.
The project underwent a major structural transformation, migrating from the GetCandy monolith to the LunarPHP monorepo with a complete namespace rebrand. This period focused on rebuilding the core domain models to support extensibility, tax-inclusive pricing, and complex cart calculations, while introducing a new Filament-based admin panel and comprehensive discount engine.
2023 — payment and shipping expansion
68 changes.
This period focused on integrating Opayo and PayPal payment gateways and introducing a comprehensive table-rate shipping system with multiple fulfillment drivers. The work also included refactoring the order creation pipeline, adding search indexing for core entities, and establishing extensive test coverage for the new features and admin panel components.
2024–2025 — shipping, payments, and search expansion
48 changes.
This period focused on expanding the platform's core capabilities by introducing dedicated packages for table-rate shipping, Stripe and Opayo payment gateways, and a modular search system with Meilisearch support. Significant effort was also directed toward internationalization, adding comprehensive localization for the core and shipping modules across numerous languages, alongside extensive test coverage for these new features.
2026 — Localization expansion and test coverage
17 changes.
This period focused on expanding internationalization support by adding initial translation files for Bulgarian, Arabic, Persian, Croatian, and Mongolian across core and shipping packages. Concurrently, the team improved code reliability by adding unit and feature tests for shipping discounts, postcode resolution, and product variant inventory management. The workflow was further enhanced by implementing automated AI-driven code review and issue triage systems.
Features
Add Arabic translations for the table-rate shipping package
Users can now see the table-rate shipping interface in Arabic. This change adds the complete set of Arabic language files (auth, plugin, relationmanagers, shippingexclusionlist, shippingmethod, and shippingzone) for the packages/table-rate-shipping resource, covering labels, form fields, navigation groups, and permission descriptions.
packages/table-rate-shipping/resources/lang/ar · high confidence
Add Brazilian Portuguese translations for product associations and cart exceptions
This change introduces the initial Brazilian Portuguese (pt\_BR) language files for the core package. Users will now see localized error messages and UI text in Portuguese, specifically covering product association types (cross-sell, up-sell, alternate) and various cart-related exceptions such as invalid quantities, missing shipping/billing addresses, and purchasability checks.
_packages/core/resources/lang/pt\BR · high confidence
Add Brazilian Portuguese translations for the table-rate shipping package
Users can now see the table-rate shipping interface in Brazilian Portuguese (pt\_BR). This change adds translation files for shipping methods, zones, rates, exclusions, and related permissions, ensuring labels, form fields, and navigation items are localized for Portuguese-speaking administrators.
_packages/table-rate-shipping/resources/lang/pt\BR · high confidence
Add Bulgarian translations for table-rate-shipping
This change adds a new Bulgarian (bg) locale for the table-rate-shipping package, providing translated labels, descriptions, and UI strings for shipping methods, zones, rates, and exclusions. Users with Bulgarian language settings will now see the shipping configuration interface in their native language.
packages/table-rate-shipping/resources/lang/bg · high confidence
Add Croatian language support for table-rate shipping
This update introduces Croatian (hr) translations for the table-rate shipping package, covering UI labels for shipping methods, zones, rates, exclusions, and permissions. Users with Croatian locale enabled will now see the shipping configuration interface, customer group associations, and discount forms in Croatian.
packages/table-rate-shipping/resources/lang/hr · high confidence
Add Croatian language translations for cart and product association messages
Users can now see interface messages in Croatian (hr). This change adds the initial Croatian translation files for the core package, covering error messages related to cart operations (such as invalid quantities, missing shipping/billing addresses, and unavailable items) and product association types (cross-sell, up-sell, and alternate products).
packages/core/resources/lang/hr · high confidence
Add Dutch translations for cart exceptions and product association types
This change introduces the initial Dutch (nl) localization files for the core package. The new base.php file provides translations for product association types (cross-sell, up-sell, alternate) and media collection titles, while exceptions.php adds Dutch error messages for cart operations, such as invalid quantities, missing shipping/billing addresses, and purchasability checks. Users interacting with the system in Dutch will now see these interface elements and error states in their language.
packages/core/resources/lang/nl · high confidence
Add French language support
This change introduces French translations for the core application, enabling users to interact with the system in French. The new language files provide localized text for standard media definitions (such as 'Images'), product association types (including 'Cross-sell', 'Up-sell', and 'Alternate'), and various exception messages related to cart operations, pricing, and validation errors.
packages/core/resources/lang/fr · high confidence
Add French language translations for table-rate-shipping
This change adds the French (fr) locale files for the table-rate-shipping package, providing translations for shipping methods, zones, rates, exclusions, and related permissions. Users with French language settings will now see the shipping configuration interface in French, including labels for shipping method types (Standard, Collection), zone restrictions (countries, states, postcodes), and price break forms.
packages/table-rate-shipping/resources/lang/fr · high confidence
Add Hungarian translations for the table-rate shipping package
Users can now see the table-rate shipping interface in Hungarian. This change adds the complete set of language files (auth, plugin, relationmanagers, shippingexclusionlist, shippingmethod, and shippingzone) for the 'hu' locale, translating labels, form fields, navigation groups, and permission descriptions for shipping methods, zones, rates, and exclusions.
packages/table-rate-shipping/resources/lang/hu · high confidence
Add Mongolian (mn) language translations for admin panel
The admin panel now supports Mongolian (mn) for the table-rate-shipping package. Users can view and manage shipping methods, zones, rates, exclusions, and discounts in Mongolian, including labels, form fields, navigation groups, and permission descriptions.
packages/table-rate-shipping/resources/lang/mn · high confidence
Add Opayo card tokens table migration
A new database migration has been added to create the \opayo\_tokens\ table, which stores card payment tokens for the Opayo integration. The table includes columns for the user foreign key, card type, last four digits, the token itself, an optional authorization code, and an expiration timestamp, enabling the system to securely manage and reference saved payment methods.
packages/opayo/database · high confidence
Add Opayo payment integration with card tokenization and 3D Secure support
Introduces a new Opayo payment addon that provides a frontend payment form (powered by Alpine.js and Cleave.js) for capturing card details, tokenizing them via SagePay's \tokeniseCardDetails\ API, and handling 3D Secure authentication through a modal and iframe flow. The package includes the necessary Blade views, JavaScript assets, and a Laravel config file to enable this payment method.
(repo-wide) · high confidence
Add RefundFailedException class
A new RefundFailedException class has been added to the PayPal package's exception hierarchy. This allows the application to throw a specific exception type when a refund operation fails, enabling more precise error handling for users and developers compared to using a generic exception.
packages/paypal/src/Exceptions · high confidence
Add Romanian language translations for cart and product association strings
This change introduces the initial Romanian (ro) localization files for the core package. Users will now see Romanian text for product association types (cross-sell, up-sell, alternate) and various cart-related error messages and validation rules, such as those for invalid quantities, missing shipping/billing addresses, and unavailable items.
packages/core/resources/lang/ro · high confidence
Add Spanish localization files
Spanish language support is now available for the core resource strings. This includes translations for product association types (cross-sell, up-sell, alternate) and standard media definitions, as well as comprehensive error messages for cart operations, shipping/billing validation, and purchasable item constraints.
packages/core/resources/lang/es · high confidence
Add Spanish localization for table-rate-shipping
This change adds Spanish language files for the table-rate-shipping package, covering UI labels and permissions for shipping methods, zones, rates, and exclusions. Users with Spanish language settings will now see translated interface text for managing shipping configurations.
packages/table-rate-shipping/resources/lang/es · high confidence
Add Turkish translations for table-rate-shipping
This change adds the Turkish (tr) locale for the table-rate-shipping package, providing translations for UI labels, navigation groups, permission descriptions, and form fields related to shipping methods, zones, rates, and exclusions. Users with Turkish language settings will now see the shipping configuration interface in their language.
packages/table-rate-shipping/resources/lang/tr · high confidence
Add Vietnamese language support for core UI and cart exceptions
This change introduces the initial Vietnamese (vi) translation files for the core package. The new base.php file provides localized labels for standard media definitions (such as 'Images') and product association types (including 'Cross-sell', 'Up-sell', and 'Alternate'). Additionally, the exceptions.php file adds Vietnamese translations for various system error messages, covering scenarios like invalid cart actions, missing shipping/billing addresses, unavailable items, and pricing issues, ensuring these errors are displayed in Vietnamese for users.
packages/core/resources/lang/vi · high confidence
Add Vietnamese translations for table-rate-shipping
Added Vietnamese language files for the table-rate-shipping package, covering UI labels and permissions for shipping methods, zones, rates, and exclusions.
packages/table-rate-shipping/resources/lang/vi · high confidence
Add facades and traits for table-rate shipping configuration
This change introduces new PHP classes to the table-rate shipping package to support shipping method configuration and postcode resolution. It adds the \Postcode\ facade to expose the \PostcodeManager\ for managing postcode resolvers, and the \Shipping\ facade to expose the \ShippingMethodManagerInterface\ for creating and managing shipping drivers (such as free, flat rate, ship-by, and collection). Additionally, it includes the \ExcludesProducts\ trait, which provides functionality for managing product exclusions within shipping methods via a \ShippingExclusionList\.
packages/table-rate-shipping/src/Facades · high confidence
Added Arabic translations for cart and product association messages
Users can now see localized error and interface messages in Arabic for cart operations (such as quantity limits, shipping/billing requirements, and item availability) and product association types (cross-sell, up-sell, and alternate). This change introduces the initial Arabic language files for the core package, ensuring that specific validation errors and standard media definitions are displayed in Arabic rather than falling back to English.
packages/core/resources/lang/ar · high confidence
Added Bulgarian language translations
Introduced the initial Bulgarian (bg) localization files for the core package, including base translations for media definitions and product association types, as well as exception messages related to cart operations and validation errors. This enables users to view interface text and error notifications in Bulgarian.
packages/core/resources/lang/bg · high confidence
Added Meilisearch integration package for Lunar
A new Meilisearch package has been added to the monorepo, providing a service provider and a console command (\lunar:meilisearch:setup\) to initialize Meilisearch indexes. This command automatically creates indexes for configured search models and updates their filterable and sortable attributes based on the application's configuration, enabling users to integrate Meilisearch as a search engine for their Lunar storefront.
packages/meilisearch · high confidence
Added Mongolian (mn) language translations for the admin panel
The application now supports the Mongolian language in the admin interface. This change introduces new translation files for base UI strings (such as product association types like cross-sell and up-sell) and exception messages related to cart operations (including validation errors for quantities, shipping, billing, and item availability), enabling Mongolian-speaking administrators to interact with the system in their native language.
packages/core/resources/lang/mn · high confidence
Added Opayo 3D Secure routing endpoints
The Opayo payment package now includes a new web route file defining two endpoints for handling 3D Secure authentication: a GET route for the secure iframe and a POST route for processing the 3D Secure response. These routes enable the necessary frontend interaction and callback handling for secure card payments via Opayo.
packages/opayo/routes · high confidence
Added Persian (fa) language translations for the admin package
This change introduces the initial Persian (fa) localization files for the core admin package. Users can now see translated text for standard media definitions (such as 'images'), product association types (like 'cross-sell', 'up-sell', and 'alternate'), and various system exception messages related to cart operations, pricing, and field types.
packages/core/resources/lang/fa · high confidence
Added Persian (fa) language translations for the table-rate-shipping admin interface
Users can now see the table-rate-shipping package interface in Persian. This change adds new translation files for authentication permissions, navigation labels, shipping methods, shipping zones, shipping rates, and shipping exclusions, ensuring that labels, descriptions, and form fields are displayed in the correct language for Persian-speaking administrators.
packages/table-rate-shipping/resources/lang/fa · high confidence
Added Polish language translations for product associations and cart exceptions
This update introduces the initial Polish (pl) localization files for the core package. It adds translations for product association types (cross-sell, up-sell, alternate) and standard media definitions, as well as a comprehensive set of exception messages related to cart operations, such as invalid quantities, missing shipping/billing addresses, and item availability errors. Users interacting with the Polish interface will now see localized error messages and product association labels instead of raw keys.
packages/core/resources/lang/pl · high confidence
Added Polish translations for the table-rate shipping package
This change adds Polish language files for the table-rate shipping module, covering UI labels for shipping methods, zones, rates, exclusions, and permissions. Users with Polish locale enabled will now see the shipping configuration interface, navigation groups, and form fields in Polish.
packages/table-rate-shipping/resources/lang/pl · high confidence
Added Romanian language translations for the Table Rate Shipping package
The Table Rate Shipping package now includes a complete Romanian (ro) localization. Users with Romanian language settings will see translated labels, descriptions, and UI elements for shipping methods, zones, rates, and exclusions, including specific terminology for weight units, customer groups, and tax calculations.
packages/table-rate-shipping/resources/lang/ro · high confidence
Added Turkish language translations for core resources and exceptions
This change introduces the initial Turkish (tr) localization files for the core package. Users will now see Turkish translations for standard media definitions (such as 'Images'), product association types (including 'Cross-sell', 'Up-sell', and 'Alternate'), and various system exception messages related to cart operations, pricing, and validation errors.
packages/core/resources/lang/tr · high confidence
Added model contracts for shipping entities
Introduced a set of new PHP interfaces (contracts) within the \Lunar\\Shipping\\Models\\Contracts\ namespace to define the structure and relationships for shipping-related models. These contracts specify the expected Eloquent relationships for \ShippingExclusion\, \ShippingExclusionList\, \ShippingMethod\, \ShippingRate\, \ShippingZone\, and \ShippingZonePostcode\, ensuring a consistent API for accessing data such as shipping zones, methods, rates, and exclusions.
packages/table-rate-shipping/src/Models · high confidence
Admin panel initial release with staff authentication and role-based access control
The admin package is introduced, providing a Filament-based administration interface. This release establishes the core staff authentication system, including a dedicated \staff\ database table and a \StaffFactory\ for testing. It integrates Spatie Laravel-Permission to manage roles and permissions, with a state class to ensure base roles and permissions are created upon installation. The panel includes configuration options for product variants, PDF rendering, Scout search, and navigation order counts, along with the necessary assets (CSS/JS) and branding assets to render the UI.
packages/admin · high confidence
Automated AI code review and issue triage workflows
The repository now includes automated AI-driven workflows for pull request review and issue triage. The PR review workflow uses a dedicated skill and rubric to analyze changes against Lunar-specific standards, checking for translation completeness across 16 locales, correct model contract usage, migration safety, and public API stability, while reporting findings as blockers, should-fix items, or nits. The issue triage workflow classifies incoming issues by type (bug, support, feature, docs) and completeness, and assigns a risk tier (high, medium, low, trivial) to help maintainers prioritize review effort. These changes enhance contributor experience by providing immediate, structured feedback and reducing manual triage overhead.
.claude · high confidence
Automated new customer flagging for orders
A new background job, MarkAsNewCustomer, has been introduced to automatically determine whether an order belongs to a new customer. When executed, the job checks if the billing email address from the current order has been used in any previous orders placed before the current one; if no prior order is found, the order is marked as belonging to a new customer. This logic ensures the 'new customer' status is accurately reflected based on historical order data.
packages/core/src/Jobs/Orders · high confidence
Automatic price synchronization for new currencies
The system now automatically creates and syncs prices when a new currency is added or when existing prices are updated. A new action and job handle the initial creation of prices for a new currency by calculating values based on the base currency's exchange rate. Additionally, a new job ensures that when a price is updated, corresponding prices in other enabled currencies are automatically recalculated and synchronized using their respective exchange rates.
packages/core/src/Actions/Currencies, packages/core/src/Jobs/Currencies · high confidence
Automatic shipping zone assignment for orders
The table-rate-shipping package now automatically determines and assigns the correct shipping zone to an order when it is created or updated. This is handled by a new OrderObserver that checks the order's shipping address postcode, looks up the corresponding zone via the Shipping facade, and syncs the zone ID to the order while storing the zone name in the order's metadata. Additionally, the shipping zone is added as a searchable attribute when the order is indexed.
packages/table-rate-shipping/src/Observers · high confidence
Core refactored to Lunar namespace with new extension points and telemetry
The core package has been migrated from the GetCandy namespace to Lunar, introducing a suite of new base classes and interfaces that enable deeper customization. Key additions include a ModelManifest for automatic model registration and morph mapping, an AttributeManifest for managing attribute types, and a FieldTypeManifest for extensible field types. Cart and shipping logic now utilize a pipeline-based modifier system (CartLineModifier, ShippingModifier) with the ability to add or remove modifiers dynamically. Additionally, a new TelemetryService has been added to collect anonymous usage insights, which users can opt out of.
packages/core/src/Base · high confidence
Initial English localization for table-rate-shipping admin interface
This change adds the initial English language files for the table-rate-shipping package, providing user-facing labels and descriptions for the admin panel. The translations cover shipping zones (including country, state, and postcode restrictions), shipping methods (with options for standard shipping and collection, availability schedules, and weight-based charging), shipping rates (including price breaks and tax notices), shipping exclusions, and shipping discounts. It also includes navigation labels and specific permissions for managing shipping.
packages/table-rate-shipping/resources/lang/en · high confidence
Introduce AbstractPayment base class and OfflinePayment implementation
The payment type system now includes an AbstractPayment base class that standardizes cart and order association, configuration, and data handling for all payment providers. Additionally, a new OfflinePayment type has been added, allowing users to process offline payments by automatically creating or retrieving a draft order, updating its status and metadata, and dispatching a payment attempt event upon authorization.
packages/core/src/PaymentTypes · high confidence
Introduce Lunar Facade API for core domain services
This release adds a comprehensive set of static Facades in \packages/core/src/Facades\ to provide convenient access to core Lunar capabilities. New Facades include \AttributeManifest\, \CartSession\, \Converter\, \Discounts\, \ModelManifest\, \Payments\, \Pricing\, \StorefrontSession\, \Taxes\, and \Telemetry\, enabling developers to interact with attribute management, cart and pricing logic, discount application, payment and tax drivers, and telemetry without resolving managers from the container. The \DB\ facade is also introduced to wrap Laravel's database manager with custom connection handling via the \lunar.database.connection\ config. Additionally, the \FieldTypeManifest\ and \ShippingManifest\ facades are updated to the \Lunar\ namespace with expanded method signatures for managing field types and shipping options.
packages/core/src/Facades · high confidence
Introduce Opayo payment gateway integration
Adds a new Opayo payment driver to the platform, enabling users to accept card payments via the Opayo API. This includes a Livewire-based PaymentForm component for handling checkout, support for Three-D Secure authentication challenges, and the ability to save and reuse card tokens for future transactions. The integration registers a new payment type, provides the necessary service providers and facades, and includes database migrations for storing Opayo-specific token data.
packages/opayo/src · high confidence
Introduce PayPal payment integration
This change adds a new PayPal payment type to the platform, enabling users to process payments via PayPal. The implementation includes a service provider that registers the payment driver, a facade for accessing the PayPal API client, and controllers to handle order creation. It supports authorizing payments by capturing approved orders, processing refunds for completed transactions, and configuring API endpoints for both sandbox and production environments.
packages/paypal/src · high confidence
Introduce Stripe payment integration package
This change adds the Stripe payment gateway package to the repository, providing the core infrastructure for processing payments via Stripe. It includes a Livewire-based payment form component for checkout, a webhook controller and middleware to handle Stripe event signatures and routing, and a background job to process webhook payloads and update order statuses. The package introduces a new database migration to persist Stripe payment intents, a configuration file for settings like capture policy and address syncing, and a facade with a mock client to facilitate testing. It also defines the necessary actions to store charges and address information, ensuring payment data is correctly mapped to the platform's order and transaction models.
packages/stripe · high confidence
Introduce SystemTaxDriver for tax calculation and breakdown
A new SystemTaxDriver has been added to handle tax calculations, implementing the TaxDriver interface to provide tax breakdowns for cart items. This driver supports setting shipping and billing addresses, currency, and purchasable items, and includes logic to calculate tax inclusive prices when enabled, ensuring accurate tax breakdowns based on the applicable tax zone and tax class.
packages/core/src/Drivers · high confidence
Introduce extensible price formatting with minimum unit quantity enforcement
The pricing module now includes a new \PriceFormatterInterface\ and a \DefaultPriceFormatter\ implementation, allowing for standardized and extensible price formatting logic. This change introduces a \unitQty\ parameter to the formatter, which enforces a minimum value of 1 to prevent invalid unit calculations. Users can now format prices using locale-aware number formatting with support for currency codes, decimal places, and trailing zero trimming, while the default behavior ensures that unit quantities are never less than one.
packages/core/src/Pricing · high confidence
Introduce modular search package with pluggable engine support
The search package is now a standalone, monorepo-integrated component providing a unified search interface via the \SearchManager\ and \Search\ facade. It supports multiple backends through pluggable engines: \DatabaseEngine\ for local database searches, \MeilisearchEngine\ for Meilisearch integration, and \TypesenseEngine\ for Typesense. The package introduces a configuration-driven facet system (defined in \config/search.php\) and standardized data structures (\SearchResults\, \SearchHit\, \SearchFacet\) to ensure consistent response formats across all engines.
packages/search · high confidence
Introduce shipping data transfer objects for postcode and option lookups
Added three new data transfer objects to the table-rate-shipping package: PostcodeLookup, which delegates postcode parsing to a country-specific resolver; ShippingOptionLookup, which validates that its collection of shipping rates strictly contains ShippingRate instances; and ShippingOptionRequest, which bundles a specific shipping rate with a cart for request processing.
packages/table-rate-shipping/src/DataTransferObjects · high confidence
Introduce table-rate shipping with configurable discounts and admin management
This change adds a new table-rate shipping capability to the platform. Users can now configure shipping zones, methods, and exclusion lists via new Filament admin resources (ShippingMethodResource, ShippingZoneResource, ShippingExclusionListResource) registered by the ShippingPlugin. The system calculates shipping costs using a ShippingModifier that integrates with the shipping manifest, and supports a new ShippingDiscount type that allows applying fixed or percentage discounts to specific shipping methods or all methods via the admin panel. A configurable postcode resolver is included, with a new NoPostcodeResolverException for unsupported countries, and a migration handles updating cutoff rules to availability schedules.
packages/table-rate-shipping/src · high confidence
Introduces configurable postcode resolution and shipping manager
The table-rate-shipping package now includes a PostcodeManager that allows users to register multiple postcode resolvers, with the last-registered resolver supporting a specific country taking precedence. Additionally, a new ShippingManager has been added to handle shipping drivers (Free, Flat Rate, Ship By, Collection) and provide access to shipping zone, rate, and option resolvers, enabling more flexible configuration of shipping logic.
packages/table-rate-shipping/src/Managers · high confidence
Introduces model contract interfaces for the core domain
This change adds a comprehensive set of PHP interfaces in \packages/core/src/Models/Contracts\ (e.g., \Cart\, \Product\, \Order\, \Discount\) that define the expected relationships and behaviors for the core domain models. By establishing these contracts, the system now enforces a standardized structure for model interactions, allowing for more flexible implementations and easier testing of core e-commerce entities like carts, orders, and product associations.
packages/core/src/Models · high confidence
Introduction of AbstractAction base class for action chaining
A new AbstractAction class has been added to the core Actions package, providing a foundational structure for action implementations. This class introduces a static factory pattern via the \make()\ method and a convenient \run()\ method that instantiates and executes actions. It also supports a \then()\ method, allowing users to chain callbacks that receive a \passThrough\ value, facilitating a fluent interface for processing results within the action workflow.
packages/core/src/Actions · high confidence
Introduction of core discount engine and types
This change introduces the foundational discount system for the cart, adding the \AbstractDiscountType\ base class along with concrete implementations for \AmountOff\ and \BuyXGetY\ discounts. The \AmountOff\ type supports both fixed-value and percentage-based discounts, including logic to handle currency factors and share remaining amounts across cart lines. The \BuyXGetY\ type enables promotional rewards based on quantity thresholds, supporting conditions and rewards limited by products, variants, or collections, with options to automatically add rewards. The base class handles discount usage tracking, customer restrictions, coupon validation, and min-spend checks, ensuring discounts are correctly applied and tracked against the cart.
packages/core/src/DiscountTypes · high confidence
New Filament admin resources for shipping exclusions, methods, and zones
Administrators can now manage shipping configurations directly in the Filament panel. This change introduces dedicated resources for Shipping Exclusion Lists, Shipping Methods, and Shipping Zones. Shipping Methods now support defining availability schedules (days and time ranges), weight constraints (min/max with unit selection), and stock availability toggles. Shipping Zones allow administrators to define geographic scope by type (unrestricted, countries, states, or postcodes) with appropriate form fields for each. All resources are protected by the 'shipping:manage' permission and include bulk delete actions.
packages/table-rate-shipping/src/Filament/Resources · high confidence
New PaymentAttemptEvent introduced for payment authorization tracking
A new event class, PaymentAttemptEvent, has been added to the core package to capture payment authorization data. This event accepts a PaymentAuthorize data transfer object, enabling the system to dispatch and listen for specific payment attempt occurrences, which supports the broader order creation workflow.
packages/core/src/Events · high confidence
New URL generator ensures unique slugs for models
A new UrlGenerator class has been added to the core package to handle automatic URL creation for models. When a model lacks existing URLs, the generator creates a default URL using the model's name or a 'name' attribute. To prevent conflicts, it automatically generates unique slugs by appending numeric suffixes (e.g., -2, -3) if a duplicate slug already exists in the database for the default language.
packages/core/src/Generators · high confidence
New availability schedule widget for table rate shipping
A new Blade view for an availability schedule widget has been added to the table-rate-shipping package. This widget provides a Filament-based interface allowing users to configure and save availability schedules, which likely serve as the cutoff logic for shipping rates.
packages/table-rate-shipping/resources/views · high confidence
New console command to sync new customer status for historic orders
A new Artisan command, \lunar:orders:sync-new\, has been added to allow administrators to update the 'new customer' status on existing orders. This command processes orders in chunks and dispatches background jobs to mark each order appropriately, enabling the re-evaluation of historic order data.
packages/core/src/Console/Commands/Orders · high confidence
New data transfer objects for pricing and payment operations
The core package introduces several new Data Transfer Objects (DTOs) to standardize data handling for pricing and payment workflows. For pricing, the new \PricingResponse\ DTO encapsulates matched, base, and break-level price data along with customer group prices. For payments, a suite of DTOs has been added: \PaymentAuthorize\, \PaymentCapture\, \PaymentRefund\, and \PaymentCheck\ represent the results of individual payment actions, while \PaymentChecks\ provides an iterable collection to manage multiple check results. Additionally, \CartDiscount\ is introduced to structure discount application data relative to a cart or cart line.
packages/core/src/Base/DataTransferObjects · high confidence
New migration, cart pruning, and search indexing commands; renamed addon discovery command
This update introduces three new console commands and refines an existing one. Users can now migrate legacy GetCandy data to Lunar using the new \lunar:migrate:getcandy\ command, which handles table renaming, polymorphic relationship updates, and brand data migration. A new \lunar:prune:carts\ command allows for the deletion of old cart records via configurable pipelines, and \lunar:search:index\ provides a centralized way to manage Laravel Scout indexing with options to refresh or flush specific models. Additionally, the \getcandy:addons:discover\ command has been renamed to \lunar:addons:discover\ and updated to use the new component-based output style, aligning with the broader rebranding and codebase structure.
packages/core/src/Console/Commands · high confidence
New search indexers for core entities
Added new search indexers for Brand, Collection, Customer, Order, Product, and ProductOption models, enabling these entities to be indexed and searched via Laravel Scout. The Customer indexer includes user emails, while the Order indexer indexes channel, transactions, product lines, and address details. The Product indexer includes product type, brand, thumbnail URL, and variant SKUs. The ProductOption indexer includes localized option names, labels, and values. A base ScoutIndexer class handles attribute mapping and table prefix configuration.
packages/core/src/Search · high confidence
New shipping method drivers for Collection, Flat Rate, Free Shipping, and Ship By
This change introduces four new shipping method implementations within the table-rate-shipping package, allowing merchants to configure specific fulfillment options. The Collection driver enables in-store pickup with zero cost and exclusion checks. The Flat Rate driver applies a set price based on order subtotals using the pricing facade. The Free Shipping driver offers free delivery when a configurable minimum spend threshold is met, optionally accounting for discount amounts. The Ship By driver calculates shipping costs based on either cart total or total weight (converting to the method's configured unit), applying tiered pricing that respects customer group overrides.
packages/table-rate-shipping/src/Drivers · high confidence
New value objects for cart breakdowns
Added new value objects in the \packages/core/src/Base/ValueObjects/Cart\ directory to structure cart totals, including \DiscountBreakdown\, \ShippingBreakdown\, and \TaxBreakdown\ (along with their respective line/amount items and related \Promotion\ and \FreeItem\ classes). These classes provide a structured way to represent detailed discount, shipping, and tax information within the cart system.
packages/core/src/Base/ValueObjects · high confidence
PayPal API route registration
The PayPal package now registers its API endpoints via a dedicated web route file. This adds a POST route at 'api/paypal/order' which is handled by the GetPaypalOrderController, enabling the frontend to initiate PayPal checkout sessions.
packages/paypal/routes · high confidence
Shipping exclusion list management UI in Filament admin
The shipping exclusion list resource now provides a complete Filament-based interface for managing product exclusions. Administrators can view a list of exclusion records, create new exclusions by selecting a product via a searchable morph-to selector, and edit or delete existing entries. The list view includes a header action to create new items, while the edit view allows deletion and redirects to the list upon completion. The relation manager displays exclusion details including product thumbnails, names, and associated SKUs, enabling users to effectively control which products are excluded from specific shipping rates.
packages/table-rate-shipping/src/Filament/Resources/ShippingExclusionListResource · high confidence
Shipping method availability is now managed via a weekly time-based schedule
The Filament admin interface for shipping methods now includes a dedicated availability management page and widget. Users can configure a weekly schedule by enabling specific days and setting start and end times for each, with validation ensuring the end time is after the start time. This schedule is stored in the shipping method's JSON data field and is accessible through the new 'Manage Shipping Method Availability' section in the admin panel.
packages/table-rate-shipping/src/Filament/Resources/ShippingMethodResource · high confidence
Removals
Removal of initial GetCandy core implementation files
This change removes the initial set of core files for the GetCandy e-commerce platform, effectively reverting the 'Init' commit. The deleted files include the main service provider (\GetCandyServiceProvider\), console commands for installation and Meilisearch setup, and the foundational domain models such as \Cart\, \Order\, \Product\, and \Customer\. It also removes the associated managers (\CartManager\, \CartSessionManager\), base traits (\HasMedia\, \HasChannels\), and configuration files, stripping the repository of its initial product logic and infrastructure.
(repo-wide) · high confidence
Architecture
Refactored order creation pipeline with dedicated address and line handling
The order creation process has been restructured into a series of dedicated pipeline steps to improve clarity and maintainability. New classes have been introduced to handle specific aspects of the conversion: \FillOrderFromCart\ now manages the initial population of order header data (totals, currency, customer reference); \CreateOrderAddresses\ explicitly handles the mapping of cart addresses to the order; \CreateOrderLines\ and \CreateShippingLine\ separately manage the creation of product and shipping lines, ensuring shipping lines are correctly identified and populated; \MapDiscountBreakdown\ ensures discount details are accurately linked to the resulting order lines; and \CleanUpOrderLines\ removes any order lines that no longer exist in the cart, preventing orphaned data. This separation ensures that each part of the order creation logic is isolated and easier to test or modify independently.
packages/core/src/Pipelines/Order · high confidence
Behavioural changes
Add Hungarian translations for cart and product association strings
Users can now see Hungarian translations for cart-related error messages (such as invalid quantities, missing addresses, and unavailable items) and product association types (cross-sell, up-sell, alternate) in the application interface.
packages/core/resources/lang/hu · high confidence
Added German and Dutch translations for shipping permissions
The table-rate-shipping package now includes localized permission labels and descriptions for German (de) and Dutch (nl) users. Specifically, the 'shipping:manage' permission is translated to 'Versand verwalten' in German and 'Beheer Verzending' in Dutch, ensuring that staff members see the correct interface text in their respective languages.
packages/table-rate-shipping/resources/lang/de, packages/table-rate-shipping/resources/lang/nl · high confidence
Address data import command migrated to Lunar namespace with updated data source and progress UI
The AddressData console command has been moved to the Lunar package namespace, changing its invocation from 'getcandy:import:address-data' to 'lunar:import:address-data'. The command now fetches country and state data from 'http://data.lunarphp.io/countries+states.json' instead of the previous GetCandy CDN URL, a change implemented to avoid SSL certificate issues in environments with outdated CA authorities. Additionally, the import progress display has been upgraded from the legacy Laravel progress bar to the modern Laravel Prompts library, providing a more consistent user interface during the import process.
packages/core/src/Console/Commands/Import · high confidence
Cart actions refactored to Lunar namespace with improved tax and discount handling
The cart action classes (such as AddAddress, CreateOrder, and CalculateLine) have been moved to the Lunar namespace and refactored to improve tax calculation accuracy and discount management. The CalculateLine action now delegates subtotal calculation to a dedicated CalculateLineSubtotal action, ensuring unit prices are correctly derived from tax-inclusive pricing responses. Additionally, the CreateOrder action now tracks consumed discount IDs to prevent double-consumption when retrying orders, and the tax breakdown logic has been updated to use the new Taxes facade instead of the previous TaxManager.
packages/core/src/Actions/Carts · high confidence
Cart exception classes migrated to new namespace and location
The cart-related exception classes (such as BillingAddressIncompleteException, ShippingAddressMissingException, and the new CartException base class) have been moved from the root src directory into packages/core/src/Exceptions/Carts and updated to use the Lunar namespace instead of GetCandy. This change affects how these exceptions are referenced in code, requiring updates to any imports or catch blocks that previously pointed to the old GetCandy namespace or file paths.
packages/core/src/Exceptions/Carts · high confidence
Cart line unit price calculation now includes tax and customer context
The cart line pipeline now calculates both the standard unit price and a new unit price inclusive of tax (unitPriceInclTax) for each cart item. This calculation dynamically considers the customer's associated customer groups when resolving pricing, ensuring that logged-in users see prices specific to their group rather than generic guest pricing. This change provides users with accurate tax-inclusive pricing information directly on cart line items.
packages/core/src/Pipelines/CartLine · high confidence
Cart pruning logic refactored to use configurable interval
The cart pruning pipeline has been restructured into distinct steps, replacing the previous \PruneAfter\ implementation with a new \PruneAfter\ class that uses a configurable \prune\_interval\ (defaulting to 90 days) instead of a fixed \prune\_after\ value. This change introduces two additional pipeline stages, \WhereNotMerged\ and \WithoutOrders\, to ensure that only unmerged carts without associated orders are considered for pruning, providing more granular control over which carts are removed based on their status and activity.
packages/core/src/Pipelines/CartPrune · high confidence
Collection jobs migrated to Lunar namespace and type contracts
The RebuildCollectionTree and UpdateProductPositions jobs have been moved from the root src directory to packages/core and renamed to the Lunar namespace. This change updates internal dependencies to use Lunar-specific models and facades, and refactors the job constructors and properties to accept CollectionContract interfaces instead of concrete Collection classes, improving type flexibility for collection handling.
packages/core/src/Jobs/Collections · high confidence
Configurable shipping rate tax calculation method
The table-rate-shipping package now includes a configuration file that allows users to control how tax is calculated for shipping rates. By default, it uses the system-wide default tax rate, but users can switch to selecting the highest tax rate found in the cart or provide a custom callable for specific tax logic.
packages/table-rate-shipping/config · high confidence
Core configuration files reorganized and expanded
The configuration files for the core package have been reorganized into dedicated files for cart, database, media, orders, payments, pricing, products, search, and URLs, replacing the previous flat structure. This change introduces new configuration options including cart fingerprinting, authentication policies, and pipeline definitions for cart calculations; database settings for table prefixes and user ID types; media fallback URLs; order reference formatting and status definitions; and search engine mappings. Additionally, the shipping configuration has been updated to correct the lbs conversion factor, and the cart session configuration now includes options for multiple orders per cart and cart deletion on logout.
packages/core/config · high confidence
Core models refactored to support extensibility, tax-inclusive pricing, and structured cart calculations
The core domain models have been significantly restructured to improve extensibility and pricing accuracy. A new \BaseModel\ base class introduces model extending capabilities and configurable database prefixes/connections. Pricing logic now supports tax-inclusive storage, with the \Price\ model providing explicit methods to calculate tax-exclusive and tax-inclusive values based on the active tax zone. Cart calculations have been enhanced with dedicated breakdown objects for shipping and discounts, and the \Cart\ model now supports soft deletes and fingerprinting. Additionally, \meta\ attributes across models like \Address\, \Customer\, and \ProductOption\ are now cast to \AsArrayObject\ for consistent structured data handling, and product associations are managed via a dedicated enum and relationship structure.
lunarphp/lunarmono · high confidence
Core traits migrated to Lunar namespace with scheduling, media, and model-extending enhancements
All traits in \packages/core/src/Base/Traits\ have been moved from the \GetCandy\ to the \Lunar\ namespace. The \HasChannels\ trait now automatically associates models with all existing channels on creation and supports scheduling availability via \starts\_at\ and \ends\_at\ dates. The \HasCustomerGroups\ trait has been updated to sync customer groups on creation, support scheduling, and introduce a \visible\ pivot attribute alongside \enabled\. The \HasMedia\ trait now delegates media collection and conversion registration to configurable definition classes, allowing for custom media handling. The \HasModelExtending\ trait improves model resolution and event firing for extended models, ensuring proper morph maps and observer registration. The \HasPrices\ trait introduces a \priceBreaks\ relationship and a \pricing()\ helper method. The \HasTranslations\ trait enhances the \translateAttribute\ method to handle non-iterable values and field types more robustly, and adds a shorthand \attr()\ method. The \CanScheduleAvailability\ trait now accepts \DateTimeInterface\ for scheduling and simplifies validation. The \HasDefaultRecord\ trait uses \Blink\ for caching default record lookups. The \HasDimensions\ trait fixes the default weight unit from 'mm' to 'kg' and uses the \Lunar\ converter facade. The \LogsActivity\ trait updates the log name to 'lunar' and allows customizing excluded fields. The \Searchable\ trait delegates indexing logic to configurable indexers. The \HasUrls\ trait generates URLs on model creation and deletes them on soft delete. The \CachesProperties\ trait provides a new mechanism for caching model properties within a request using \Blink\. The \HasMacros\ trait enables dynamic macro calls on models.
packages/core/src/Base/Traits · high confidence
Database factories migrated to Lunar namespace with updated model defaults
All database factories in the core package have been moved from the root \database/factories\ directory to \packages/core/database/factories\ and updated to use the new \Lunar\ namespace instead of the legacy \GetCandy\ namespace. Factories now extend a new \BaseFactory\ class. Several factories have been updated to reflect model changes: \CartFactory\ now uses \customer\_id\ instead of \user\_id\, \OrderFactory\ and \OrderLineFactory\ use the \TaxBreakdown\ value object and a new \awaiting-payment\ status, \AddressFactory\ and \CartAddressFactory\ include a \tax\_identifier\, \ProductFactory\ links to a \Brand\ via \brand\_id\, and \TransactionFactory\ uses a \type\ field and \lunar\ driver. Additionally, \TaxZoneFactory\ defaults to \active: true\, \TagFactory\ no longer uppercases values, and \LanguageFactory\ uses \faker-\>slug()\ for the code.
packages/core/database/factories · high confidence
Database schema overhaul for discounts, attributes, and pricing
This update introduces a comprehensive set of database migrations that significantly expand the platform's data model. It adds a new discount system with tables for discounts, user limits, and associations with brands, collections, and customer groups, while also adding discount and shipping breakdowns to orders. Product variants now support minimum quantities and quantity increments, and product options have been refactored to support shared options and labels. Additionally, the schema now allows custom attributes on customers, brands, and customer groups, and enforces non-nullable currency IDs on prices.
packages/core/database/migrations · high confidence
Database seeders migrated to Lunar namespace and monorepo structure
The DemoSeeder and TestingSeeder have been moved from the root database directory into the packages/core/database/seeders folder as part of the monorepo restructure. Additionally, the codebase has been updated to use the Lunar namespace (replacing GetCandy) for all model references and configuration keys, ensuring the seeders correctly interact with the new package structure.
packages/core/database/seeders · high confidence
Database state migration scripts for version upgrades
This location introduces a suite of database state migration scripts designed to handle data transformations and schema updates when upgrading the system. These scripts manage specific legacy data conversions, including migrating product type attributes to products, updating tax breakdown structures for orders and order lines, converting backorder purchasability statuses, and renaming media collections. Additionally, they handle data integrity tasks such as ensuring brands are properly linked to products, assigning default tax classes, linking user orders to customers, fixing cart-order relationships, populating product option labels, and standardizing weight units to kilograms.
packages/core/database/state · high confidence
Enforce per-user coupon usage limits
The coupon validation logic now checks the \max\_uses\_per\_user\ constraint on discounts. When a coupon is validated for an authenticated user, the system counts how many times that specific user has already used the discount and rejects the coupon if the count meets or exceeds the configured limit, preventing a single user from redeeming a limited-use coupon multiple times.
packages/core/src/Base/Validation · high confidence
Enhanced default installation with tax zone-country association
The \lunar:install\ console command now automatically associates all imported countries with the default tax zone during setup. Previously, the default tax zone was created without any countries; the updated installer explicitly links every country record to this zone, ensuring that tax calculations are immediately applicable to all regions upon a fresh installation.
packages/core/src/Console · high confidence
Exception classes migrated to Lunar namespace and base class
All exception classes in the core package have been moved from the \GetCandy\ namespace to \Lunar\ and now extend the new \LunarException\ base class instead of the generic PHP \Exception\. This includes renaming specific exceptions (e.g., \CartLineIdMismatchException\ to \CustomerNotBelongsToUserException\) and updating translation keys to use the \lunar\ domain, ensuring consistent error handling and branding across the platform.
packages/core/src/Exceptions · high confidence
Field types migrated to Lunar namespace with JSON serialization and configuration support
The field type classes in packages/core/src/FieldTypes have been moved from the GetCandy namespace to the Lunar namespace. All field types (Dropdown, File, ListField, Text, Toggle, YouTube, Number, TranslatedText, Vimeo) now implement JsonSerializable, allowing them to be serialized directly to JSON. Additionally, most field types now provide a getConfig() method that defines validation rules for their configuration options (e.g., Number supports min/max, File supports disk/directory/file\_types, Text supports richtext options). The Number field type also now accepts nullable values and casts whole numbers to int and decimals to float. The TranslatedText field type now accepts numeric and boolean values in addition to strings, wrapping them in Text instances.
packages/core/src/FieldTypes · high confidence
Introduce new session, pricing, and discount managers with cart retrieval fixes
This change introduces several new manager classes in the core package to handle storefront sessions, cart persistence, pricing calculations, and discount application. The new CartSessionManager improves cart retrieval logic by preferring unmerged carts for authenticated users and ensures shipping estimates are calculated before estimation. The DiscountManager adds support for limiting discounts to specific product variants and collections, while the PricingManager introduces pipeline-based pricing calculations. Additionally, the StorefrontSessionManager centralizes session state for channels, currencies, and customer groups, and the TaxManager namespace is updated from GetCandy to Lunar.
packages/core/src/Managers · high confidence
Introduces configurable postcode resolution and new shipping resolver interfaces
The table-rate-shipping package now supports a pluggable postcode resolution strategy via the new PostcodeResolverInterface and a default PostcodeResolver that breaks postcodes into multiple matching parts (full, prefix, suffix, etc.) to improve zone matching accuracy. This change is accompanied by the introduction of new interfaces (ShippingMethodManagerInterface, ShippingRateInterface) and resolvers (ShippingOptionResolver, ShippingZoneResolver) that refactor how shipping zones and options are resolved, ensuring that unrestricted zones are correctly retrieved and that shipping options are filtered and dispatched via events.
packages/table-rate-shipping/src/Resolvers · high confidence
Introduces model observers to enforce data integrity and manage lifecycle events
The core package now registers a comprehensive set of Eloquent observers to manage business rules and cleanup tasks automatically. Default-address constraints are enforced for Customers, Channels, Currencies, Customer Groups, Languages, and URLs, ensuring only one default record exists per entity. Deletion logic has been added to safely detach or remove related records for Customers, Discounts, Products, Product Options, Product Variants, and Collections, preventing orphaned data. Cart and Order lines are now validated to ensure they reference valid purchasable items, and price synchronization jobs are dispatched only when appropriate. Additionally, activity logging is implemented for Order status changes and Transaction creation, while Media handling ensures a single primary image is maintained per collection.
packages/core/src/Observers · high confidence
Jobs namespace migration and SyncTags case-sensitivity fix
The job classes in this package have been moved from the root \src/Jobs\ directory to \packages/core/src/Jobs\ and their namespace updated from \GetCandy o Lunar\. Specifically, the \SyncTags\ job now imports \Lunar\ classes and includes an explicit \Str::upper\ call on tag values before database lookup to ensure case-sensitive collations match existing rows, complementing the model's existing mutator.
packages/core/src/Jobs · high confidence
Namespace migration to Lunar and extensible price formatting
The \Price\ and \ShippingOption\ data types have been moved to the \Lunar\ namespace. Price formatting is now delegated to a configurable formatter service (defaulting to \DefaultPriceFormatter\), exposing new \decimal\, \unitDecimal\, \formatted\, and \unitFormatted\ methods for consistent currency display. \ShippingOption\ now requires a \name\, adds \collect\ and \meta\ properties, and implements the \Purchasable\ interface with methods like \getPrices\, \getName\, and \getOptions\ to support broader cart and inventory logic.
packages/core/src/DataTypes · high confidence
New and updated Eloquent casts for cart breakdowns, pricing, and coupon handling
This change introduces new Eloquent casts in the core package to improve data integrity and structure for cart and order attributes. Coupon codes are now automatically normalized to uppercase via the new CouponString cast. Shipping and tax breakdowns are handled by new ShippingBreakdown and TaxBreakdown casts, which serialize complex nested objects (including currency and price details) into JSON for storage and reconstruct them into typed ValueObjects on retrieval. The existing Price cast has been updated to use regex for stripping non-numeric characters, ensuring robust integer conversion regardless of locale-specific formatting, and now supports a fallback to the model's unit\_quantity. Additionally, the AsAttributeData cast now safely skips undefined field types, and the DiscountBreakdown cast (renamed from TaxBreakdown) has been restructured to track individual order lines and quantities per discount, providing more granular discount application data.
packages/core/src/Base/Casts · high confidence
New cart line validation rules for availability, quantity, and stock
Added three new validation classes in the core package to enforce cart line integrity: CartLineAvailability checks if a product is purchasable in the current channel and customer groups; CartLineQuantity validates that quantities are within allowed ranges, respect minimums, and adhere to increment steps; and CartLineStock verifies that the requested quantity can be fulfilled. These validators ensure that cart updates fail gracefully with specific error messages when items are unavailable, quantities are invalid, or stock is insufficient.
packages/core/src/Validation/CartLine · high confidence
New exceptions for field type validation errors
The core package now includes specific exception classes, \FieldTypeMissingException\ and \InvalidFieldTypeException\, located in the \Lunar\\Exceptions\\FieldTypes\ namespace. These exceptions provide structured error handling for scenarios where a field type class is missing or invalid, displaying user-friendly messages via the \lunar::exceptions.fieldtype\_missing\ and \lunar::exceptions.invalid\_fieldtype\ translation keys.
packages/core/src/Exceptions/FieldTypes · high confidence
New localization keys for product associations and cart validation
The English language file now includes definitions for customizable product association types (cross-sell, up-sell, alternate) and adds several new exception messages for cart operations, including validation for minimum/maximum quantities, shipping/billing address requirements, and line item availability.
packages/core/resources/lang/en · high confidence
Product association jobs now support typed association types
The Associate and Dissociate jobs in the core package have been updated to allow product association types to be customized using either a string or a typed enum (ProvidesProductAssociationType). This change enables more structured and type-safe handling of association types when linking or unlinking products, improving consistency in how associations are stored and queried.
packages/core/src/Jobs/Products · high confidence
Rebrand from GetCandy to Lunar and remove licensing dependencies
The addon manifest system has been rebranded from GetCandy to Lunar, updating the PHP namespace, configuration keys, and composer package metadata checks (e.g., \extra.getcandy\ to \extra.lunar\). The \LicenseManager\ dependency has been removed, eliminating license fetching and related fields (\marketplaceId\, \licensed\, etc.) from the addon data structure. Additionally, the addon \id\ is now base64-encoded, and a \github\_url\ field is included in the output.
packages/core/src/Addons · high confidence
Rebrand to Lunar and restrict cart association to Lunar users
The cart session authentication listener has been moved to the core package and rebranded from GetCandy to Lunar, updating all namespace references and configuration keys accordingly. Functionally, the listener now validates that the authenticated user is a Lunar user before associating a cart or merging user carts, preventing unintended cart associations for non-Lunar accounts. Additionally, when retrieving a user's existing cart, the system now uses the user's primary key via \getKey()\ instead of assuming an \id\ attribute and filters for active carts only.
packages/core/src/Listeners · high confidence
Refactored cart calculation pipeline with explicit discount, shipping, and tax stages
The cart calculation logic has been restructured into a series of dedicated pipeline classes (ApplyDiscounts, ApplyShipping, Calculate, CalculateLines, CalculateShippingSubTotal, CalculateTax) to improve modularity and accuracy. This change introduces explicit handling for discount application and breakdown, shipping cost calculation via a ShippingManifest, and granular tax computation that supports both tax-inclusive and tax-exclusive pricing models. Users will see more accurate cart totals, detailed tax and shipping breakdowns, and consistent behavior when overriding shipping options or applying discounts.
packages/core/src/Pipelines/Cart · high confidence
Refined cart validation allows collection-based shipping without a shipping address
The cart validation logic for order creation has been updated to distinguish between shipping methods that require physical delivery and those that do not. Previously, any shippable cart required a shipping address; the new logic checks if the selected shipping option is a 'collection' type (indicated by the \collect\ flag). If the option is for collection, the system no longer mandates a shipping address, allowing orders to proceed without one. For standard shipping options, the requirement for a valid shipping address remains. Additionally, the validation now explicitly checks for unavailable purchasable lines and uses a unified validator class structure.
packages/core/src/Validation/Cart · high confidence
Repository restructured as a monorepo with updated testing and CI configuration
The repository has been reorganized into a monorepo structure, introducing a \packages/\ directory for core components and adding configuration files for the Symplify Monorepo Builder, PHPStan, and Laravel Pint. The project branding has been updated from GetCandy to LunarPHP, including copyright notices and documentation links. Testing infrastructure has been upgraded to PHPUnit 10.5, with the test suite split into distinct suites (admin, core, search, stripe, shipping) and coverage reporting adjusted to scan the new \packages/\ source paths.
(repo-wide) · high confidence
Shipping zone management UI migrated to Filament v4 with per-currency pricing support
The Shipping Zone resource pages (Edit, List, Manage Rates, Manage Exclusions) have been rewritten to align with Filament v4, introducing a new interface for managing shipping rates that supports per-currency base prices and customer-group-specific price breaks. Users can now configure shipping costs for multiple currencies directly in the edit form, with weight-based tiers correctly evaluated using the method's configured unit, and exclusions managed via a dedicated relation manager.
packages/table-rate-shipping/src/Filament/Resources/ShippingZoneResource · high confidence
Support for storing prices inclusive of tax
Users can now configure the system to store product prices including tax. This is enabled via the new \lunar.pricing.stored\_inclusive\_of\_tax\ configuration option and exposed through the \prices\_inc\_tax()\ helper function, allowing the pricing engine to handle tax-inclusive price storage and calculations.
packages/core/src · high confidence
Table-rate shipping database schema and data migrations
This change introduces the database schema and migration logic for the table-rate shipping package. It creates core tables for shipping zones, methods, rates, and exclusions, and adds a pivot table linking customer groups to shipping methods with scheduling and visibility controls. The schema now supports weight-based shipping by adding min/max weight and unit columns to shipping methods, while removing the legacy cutoff time column in favor of a schedule stored in JSON. A state migration migrates existing cutoff times into this new schedule format. Additionally, the system enforces a new 'shipping:manage' permission, switches JSON columns to jsonb on PostgreSQL, remaps polymorphic relation strings for consistency, and rescales legacy weight-based shipping breakpoints from kg×100 to kilograms.
packages/table-rate-shipping/database/migrations · high confidence
Tax zone lookups now filter for active zones and support state/country fallback
The tax zone resolution logic in the core package has been updated to ensure only active tax zones are returned. The main GetTaxZone action now attempts to match tax zones by state and then by country if a postcode match is not found, utilizing new GetTaxZoneState and GetTaxZoneCountry action classes. Additionally, all tax zone queries (postcode, state, and country) now explicitly filter for zones where the 'active' column is true, preventing inactive zones from affecting tax calculations.
packages/core/src/Actions/Taxes · high confidence
Test coverage
Added Opayo integration test suite; Added Stripe test infrastructure; Added admin test base case with Filament and Lunar service providers; Added core test case setup for Lunar package integration; Added database factories for shipping models; Added feature tests for Customer resource pages; Added test coverage for Product Resource pages; Added test coverage for Staff resource pages; Added test coverage for admin panel, core facades, and utility classes; Added test for customer group pricing edit action; Added test infrastructure and placeholder for PayPal tests; Added test infrastructure for the shipping module; Added test stub models for the Lunar core; Added test stubs and migration tests for Lunar v1.0; Added test stubs and unit tests for the Filament panel extension system; Added test suite for the search engine abstraction and Meilisearch integration; Added tests for Attribute Group resource pages and relation manager; Added tests for Brand resource search, attribute saving, and relation pages; Added tests for Collection Tree View and Product Options widgets; Added tests for Collection resource edit and child management; Added tests for Discount resource pages; Added tests for Media and Price relation managers; Added tests for Opayo payment integration and refactored test infrastructure; Added tests for Opayo payment processing and 3DSv2 handling; Added tests for OrderResource manage page; Added tests for ProductType resource create and edit pages; Added tests for TelemetryService behavior; Added tests for admin page extension capabilities; Added tests for configurable postcode resolver; Added tests for global search and form input trimming; Added tests for product creation in the admin panel; Added tests for product search functionality; Added tests for product variant inventory management; Added tests for the SystemTaxDriver; Added tests for weight-based shipping min\_quantity migration; Added unit test for Stripe webhook job event dispatch; Added unit tests for CouponValidator; Added unit tests for Filament admin resources; Added unit tests for OrderObserver shipping zone storage; Added unit tests for Stripe payment integration; Added unit tests for Stripe webhook processing and order actions; Added unit tests for StripeManager amount conversion and payment intent retrieval; Added unit tests for admin Livewire components and synthesizers; Added unit tests for admin form attribute converters; Added unit tests for admin panel extension capabilities; Added unit tests for cart actions and collection sorting; Added unit tests for cart line validation rules; Added unit tests for cart order creation validation; Added unit tests for cart session logout behavior; Added unit tests for cart shipping and line calculation pipelines; Added unit tests for cart, discount, pricing, and session managers; Added unit tests for collection search and breadcrumb labeling; Added unit tests for core base classes and console commands; Added unit tests for core field types; Added unit tests for core model observers; Added unit tests for core models and jobs; Added unit tests for database migrations and basic example; Added unit tests for discount type logic; Added unit tests for media, URL, and search traits; Added unit tests for order creation pipelines; Added unit tests for order reference generation; Added unit tests for search indexers; Added unit tests for shipping method drivers; Added unit tests for shipping model availability, rate tax calculation, and postcode sanitization; Added unit tests for shipping modifiers and service provider configuration; Added unit tests for shipping resolvers and postcode management; Added unit tests for shipping/tax casts and decimal validation rule; Added unit tests for tax zone resolution actions; Added unit tests for the Price data type; Added unit tests for the ShippingDiscount type; Added unit tests for the Staff model; Added unit tests for variant-to-product-option mapping logic; Removal of unit test suite; Removed test stub classes for cart modifiers and user models.
Dependencies
Migration to LunarPHP monorepo with Filament v4 and Laravel 12/13 support
The project has been restructured from a single 'GetCandy' package into a LunarPHP monorepo, splitting functionality into distinct packages for the core, admin panel, search, and various payment/shipping addons (Stripe, PayPal, Opayo, Meilisearch, Table Rate Shipping). This update upgrades the admin panel to use Filament v4.1 and requires PHP 8.3, while the core library now supports Laravel 12 and 13. Key dependency shifts include upgrading Stripe PHP to v16, Meilisearch PHP to v1.10, and replacing the previous search driver with support for Typesense and Meilisearch via the new search package.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Baseline
- First survey — no prior run to compare against. CAI 53.
Lenses
- Code Health 93
- Architecture 97
- Maturity 53
- Readiness 60
- Security 74
- Accessibility 41
Changes since last survey
- 300 commits — 204 feature/other, 96 fixes
By area
- packages/admin — 96 commits
- packages/core — 73 commits
- (repo) — 28 commits
- .github/workflows — 18 commits
- packages/table-rate-shipping — 18 commits
- docs/core — 15 commits
- (root) — 9 commits
- packages/stripe — 9 commits
- tests/core — 8 commits
- tests/admin — 5 commits
- .github/ISSUE_TEMPLATE — 4 commits
- skills/lunarphp — 4 commits
- .claude/skills — 3 commits
- tests/stripe — 3 commits
- packages/meilisearch — 2 commits
- .github/FUNDING.yml — 1 commit
- docs/.vitepress — 1 commit
- packages/opayo — 1 commit
- packages/search — 1 commit
- tests/shipping — 1 commit
Notable commits
- fix: :bug: fix(console): switch to components->info() (#2283)
- fix: Fix InvalidArgument in shipping options DTO (#2243)
- fix: Fix Price object cast error when editing tier and customer group prices (#2458)
- fix: Fix ProductVariant shippable cast in Lunar reference (#2455)
- fix: Fix admin activity log feed rendering (#2314)
- fix: Fix attribute fieldtypes in 1.5 (#2416)
- fix: Fix cart retrieval to prefer unmerged carts (and clarify active scope grouping) (#2399)
- fix: Fix collection breadcrumbs order on collections (#2374)
- fix: Fix collection group resource permission (#2391)
- fix: Fix container resolution and morph map for extended models (#1933)
- fix: Fix customer deletion FK constraints (#2395) (#2405)
- fix: Fix default color and icon for state in CustomerGroupRelationManager (#2330)
- fix: Fix default weight unit for product variants (#2384)
- fix: Fix discount conditions on collections (#2345)
- fix: Fix dropdown lookup state normalization for attribute edit forms (#2447)
- fix: Fix empty address creating/editing on orders (#2375)
- fix: Fix error in collection deletion (#2110)
- fix: Fix forceDelete product (#2075)
- fix: Fix hub product option mapping and new variant tax class (1.x) (#2640)
- fix: Fix line fetching in order creation (#1956)
- …and 280 more
Architecture
- 0 containers · 1 bounded contexts · 0 dependency edges (baseline)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
lunarphp/lunar was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 82f6e4a64585ac5f11ca1fce4b6897be870e691a — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.