Broadleaf Microservices
  • v1.0.0-latest-prod

Frontend Compatibility and Release Notes

Unified Admin Release Notes for 1.10.11

Important Updates

  • Now supports Node 18. Node 14 has reached end-of-life and we recommend upgrading to Node 18 as soon as possible since Node 16 reaches end of life in September 2023.

    • Upgrading Node is not required to use this update.

  • If building your own images of Admin Starter, it is required to add a new dependency to your project on luxon, which was introduced to address timezone issues in date-pickers.

    • Run yarn add luxon.

Features & Enhancements

  • Introduced new column type LOOKUP_COLUMN that allows specifying a .hydrationEndpoint() to lookup and display the name of an entity based on its ID in a grid column.

  • ContentItemSelect enhancements:

    • Introduced new overlapModal attribute. This is helpful to style the related slideover functions with a higher z-index to overlap simultaneously open modals, when defined inside of one.

    • Enhanced the EditContentButton to allow for inline creation of ContentItems from external screens

    • Introduced the ItemBrowserModal component used to browse for existing content items inside a FolderBrowser when selecting in external screens.

      • To use this component, the type CONTENT_ITEM_BROWSE_MODAL must be specified as the modalComponent metadata attribute of a LookupField.

Product Assets Management

Introduced a new drag-and-drop component for Product Assets. Note: This feature is disabled by default, as assets need a predefined sort order to display correctly. For more information, see CatalogServices Release Notes.

Product Characteristics Management

Introduced new components for managing characteristics on products. See: CatalogServices Release Notes.

Slide-Over Forms Support

Added support for slide-over update and create forms: * UPDATE_VIEW as a row action * CREATE_VIEW as a grid action

New Field Type: SELECT_LIST

Added a SELECT_LIST field type to allow users to choose from a list of options (e.g., variants when creating a product).

Time Zone Preferences

Admin users can now change and save their default time zone.

Content Item Enhancements
  • The Content Item form now includes a Base URI field, displaying the model’s URI if accessible.

  • When cloning a content item, the cloned item now automatically opens for editing (unless marked as embedded).

  • Added a modal for selecting the content model when creating a new nested content item, replacing the previous dropdown selection.

Admin User Enhancements
  • The create/edit form now includes a default application field, used for pre-selecting an application on user sign-in. Note: This is only relevant if the user has assigned applications.

  • A new "My Profile" option was added to the user drop-down menu, allowing users to update their email, phone, and default application.

Session Management Enhancements

Support for the new Remember-Me Login feature: * useKeepSessionAlive now silently extends the session when a remember-me cookie is available. * If the maximum session expiry date is reached, a modal prompts the user to log out or restart the session. * If no action is taken, the user is logged back in automatically. * New configurable settings: - VITE_AUTH_PROVIDER_OAUTH_REMEMBERMEURL (default: /auth/remember-me-continuation) - VITE_AUTH_PROVIDER_OAUTH_HEADERS_REMEMBERMEAVAILABLE (default: X-Remember-Me-Available)

Field & Grid Enhancements
  • Added "Data Driven Enums" as a field type for entity creation.

  • Enhancements to FieldArrayGrid:

    • Introduced drag-and-drop reordering.

    • Improved UX for adding new items.

  • Added a save/discard prompt before promoting changes.

  • Enhanced pagination details for admin grids.

  • Added custom CSS support for admin grids.

  • Introduced a new action type (INLINE_GRID_SELECT) that renders a select box and fires an endpoint when the value changes.

  • All field components now save their label from metadata as the custom field label.

  • TextAreas in the admin are now resizable.

  • Updated ActionListGridFormRowAction initial value mapping to allow row data to be used as the root for the initial values object used in the context request and the ModalFormAction for the row.

    • This is enabled by adding the useRowAsRootInitialValues attribute via metadata and having its value be true.

    • Tracking info is also added to the context request when the useRowAsRootInitialValues attribute is true.

  • Registered a new FORM secondary action component for entity views named EntityModalFormAction that simply renders a form configured via metadata and allows submitting to an endpoint.

  • Add changes to allow helptext and hints on select grids and pass along filtering information which should be used when determining inclusions/exclusions.

  • Fixed ListGridRow so selected rows can correctly be highlighted in a grid, improving visibility of user’s actions.

Change Highlight Enhancements

Introduced dirty state tracking for form fields in FieldDecorations and CollectionField components. This includes determining if a field’s current value differs from its initial value and providing a method to revert changes. * Fields that are changed from their initial value are immediately highlighted and marked as "Unsaved" * Each field highlight has a Revert icon that allows users to click it to revert the change

Audit History

Introduced a new Audit History modal that tracks entity changes.

UI & UX Enhancements
  • Introduced an ActionGroup concept to allow grouping of actions on admin grids.

  • Facet label translations are now visible in the admin.

  • Added support for SVG file uploads in the asset dropzone.

Business Type Enhancements

  • Implemented exponential polling for metadata changes when loading BusinessTypeFields component.

    • Exponential polling increases the delay between poll requests at an exponential rate — after each failed request, the next request delays by a multiple of the previous attempt time, and so increases with each failure.

Order Fulfillment Workflow Views
  • Implemented Workflow sub-views for Order Fulillment

    • Registered existing blFulfillmentViewBody as FULFILLMENT_SUMMARY view to allow it to be used as a view in metadata

    • Use new blFulfillmentViewSection component to render sub-views for FulfillmentView like blOrderViewSection does for OrderView.

      • Enabled via an attribute on FulfillmentView, supportViewsForBody, or else the old behavior with no sub-views is used

    • Added blFulfillmentViewNav sub-component of blFulfillmentViewHeader to allow navigating between FulfillmentViewSections

    • Added new FulfillmentWorkflowViewSection, registered as FULFILLMENT_WORKFLOW, to support viewing and managing an external Workflow for a Fulfillment.

      • Supports polling and form components

      • Establishes form state with following shape (reference Workflow documentation for detailed properties)

interface FormState extends Workflow {
  history?: WorkflowHistory;
  orchestrationMap?: SimpleOrchestrationMap;
  tracking: Tracking;
}
  • Introduced actions to issue commands to the workflow update endpoint that are expected to be rendered on the RESIDENT_GRID representing the SimpleOrchestrationMap:

    • WORKFLOW_COMMAND as a ROW positioned action

    • WORKFLOW_COMMAND as a GRID positioned action

    • These actions will have access to:

      • the React.Dispatch for managing the Workflow’s state with the following state actions:

        • queueFetch to queue fetching the full workflow, fetching history and the orchestration map will happen automatically after fetching the workflow.

        • startFetch to indicate the fetch for the Workflow is taking place

        • startFetchHistory for History

        • startFetchOrchestrationMap for the SimpleOrchestrationMap

        • successFetch to indicate the Workflow was successfully fetched, the Workflow is passed as an argument

        • successFetchHistory for History

        • successFetchOrchestrationMap for the SimpleOrchestrationMap

        • failureFetch to indicate the Workflow was not successfully fetched, the Error is passed as an argument

        • failureFetchHistory for History

        • failureFetchOrchestrationMap for the SimpleOrchestrationMap

      • ContextParams with the following shape, users can use this to determine what template variables are available, e.g., ${workflowId} in /workflows/${workflowId}

interface IFulfillmentContextParams {
  tracking: Tracking;
  id?: string;
  parent?: OrderFulfillment;
  fulfillment?: OrderFulfillment;
  fulfillmentId?: string;
  orderId?: string;
  workflowId?: string;
  workflow?: Workflow;
}
  • Each takes the following attributes via metadata

    • iconColor: The color of the icon, primary, secondary, danger, and default

    • iconName: The name of the icon to render for the command if any. See new reference in Developer Settings modal for options.

    • commandType: The command to issue against the Workflow such as GOTO, PAUSE, RESUME, or CANCEL

      • EnumSwitchField is undeprecated

        • Added displaySingle attribute to allow a better read-only experience. In this case, only the current value is rendered. This allows the configured color for the value to render instead of being greyed-out.

      • Fixed warning about formik state missing for TimeZoneSelector field in Admin header.

      • Added support for rendering GRID positioned actions on all list grids conditionally

      • Added section to Developer Settings modal to show the list of all icons supported by the SVG component. This renders a collapsible group with the icon displayed next to its key. The key is used to actually render the icon. This supports users who want to create their own components that use icons as well as as a reference for existing components that support setting the icon name as an attribute like the new WORKFLOW_COMMAND actions.

<SVG name="dots-horizontal-triple" />
  • Improved rendering of JSON_PAYLOAD fields so that their label styles match other Field type components'. Before they were always extra large and bold, which is only appropriate when the JSON_PAYLOAD field is used to represent the payload for the entire entity not just a single field.

    • To render with the bold style requires that the field name is jsonPayload. This is generally only applicable when EntityForm#showPayload attribute is true

  • Enabled overrides for the following OMS components to make extending easier:

    • OrderViewLayout: blOrderViewLayout

    • OrderViewHeader: blOrderViewHeader

Subscription Workflow Views
  • Implemented Workflow sub-views for Subscription.

    • Registered new component WorkflowDetailView as WORKFLOW_ENTITY_FORM view to allow it to be used as a view in metadata

    • Use new WorkflowDetailView component to render generic Workflow sub-views for any view or entity.

      • This component is leveraged to display Workflow details in a slide-over component for Subscription Workflows, and are displayed when the details button is clicked for an entry in the Subscription Workflow grid in the Subscription Update form.

    • Updates were made to EntityView components such as Entity, Content, Layout, Header, and TitleBar in order to pass in nested, nestedCallback, and nestedCancelCallback props in order to display the proper type of exit button in the TitleBar when the Entity is nested or not.

      • By default, nested is false and will have a BackButton displayed in the TitleBar which when clicked will signal to the React Router to go back to the indicated location in the state. If the Entity is nested, a CloseButton is displayed in the TitleBar that when clicked will merely close the nested view component that is overlaid over the main view component.

Column Enhancements
  • Enabled MoneyColumn to be able to support simple amount values.

CSR Enhancements
  • Added support for CSRs to be able to add Offers to existing Subscriptions.

Miscellaneous Enhancements
  • Aliased Workflow entity to data field in form state.


Bug Fixes

Entity & Grid Fixes
  • Fixed how collections are handled in the entity creation flow.

  • Fixed reordering on grids when implicitFilters are absent.

  • Grids now determine their initial state correctly.

  • Fixed dropdown field display within nested content items.

  • Fixed an issue where conditionally hidden list grid columns still occupied space.

Content & Model Fixes
  • Fixed an issue where cloning content with an empty URI field set the value to undefined-copied.

  • Fixed deeply nested content items not being tied to the correct parent in sandboxing.

  • Fixed an issue where changing a content model’s field to a collection could break existing content.

Admin UI Fixes
  • Fixed styling for help texts.

  • Fixed z-index issues with select dropdowns and HTML editor tools.

  • Fixed display issues with the settings dropdown.

Session & Authentication Fixes
  • Fixed 403 Unauthorized errors caused by incorrect cache values.

  • The page now fully reloads when changing the admin’s time zone.

Permissions & Visibility Fixes
  • The Deploy button is now hidden when the user lacks deployment permissions.

  • Fixed an issue where the Promote action was not visible after product option generation.

  • Fixed an issue where Product Types appeared editable when they were not.

Order & Inventory Fixes
  • Fixed a crash on the order details page due to an undefined total.

  • Inventory checks in the fulfillment status change modal now only run when the status is PENDING_INVENTORY.

Filtering & Searching Fixes
  • Fixed an issue where filtering by a boolean field did not apply correctly.

  • Fixed an issue with product faceting when facet values contained a % character.

  • Fixed issues with exports when grid filters were applied.

  • Fixed an error when using the filtering with Non-Latin script, such as Arabic.

Characteristic Translation Fixes
  • Fixed an issue where translations were allowed to be made for characteristics with no values and numeric or boolean type characteristics, which causes an exception

Miscellaneous Fixes
  • Fixed integer fields not being cleared when a default value was set.

  • Fixed issues with the ToggleSwitch component’s tab index, improving keyboard navigation.

  • Fixed case sensitivity in admin routes.

  • Fixed an issue in ExternalAssetCollection to inform the component to use the asset’s contentUrl instead of its url when viewing an asset’s details.

  • Fixed an issue where Business Type Modify and Create forms were being fetched before they were created.

  • Fixed an issue where the Quantity Selector in Fulfillment Workflow modals was being styled incorrectly due to undefined class names being passed into the component.

  • Fixed issue where Subscriptions were being marked as non-mutable by removing application data from context parameters when the applicationDiscriminated attribute is explicitly false for EntityGrid and EntityLongView components.


Unified Admin Release Notes for 1.10.12

Features & Enhancements

Support Node 20

This was a simple change to the node engines in the package.json to accept Node 20 after testing.

Support multiple routes mapped to the same path but with other distinct properties
Important
This relies on changes made to Admin Metadata Services 2.1.4 and Catalog Services 2.1.5.
Tip
To revert to the prior behavior, set VITE_METADATA_ROUTER_ALLOWMULTIPLEROUTESPERPATH=false.

This allows multiple routes to be mapped to the same path, e.g., /products, and be distinguished by some other property like scope or component ID. It will render the first match that is authorized to be seen rather than just the first match.

  • Added new multi-route rendering component, ComponentRoutes.

    • This component will use a new endpoint in AdminServices to read all of the metadata by component ID for the Routes matching a given path, e.g., /product. This endpoint can be changed using VITE_METADATA_COMPONENTS_URL, which is /metadata/component by default.

    • It will check the permissions of each Route by their scopes and render the first one that is authorized and has metadata returned from the backend.

    • Overridable via blComponentRoutes key.

    • Internally uses new ComponentRouteRenderer to render the authorized and resolved metadata for the Route.

      • Overridable via blComponentRouteRenderer key.

  • Made pre-existing single route rendering components overridable:

    • ComponentRoute as blComponentRoute

      • This wraps ComponentRouteRenderer in a react-route Route

      • With the above changes, this will only be used if there is only one Route mapped to a path.

    • ComponentRouteRenderer as blComponentRouteRenderer

      • This handles resolving metadata for a Route and checking user access to it

  • Added support restricting routes by matching all scopes not just any

    • Using new scopeMatchType property on Route, taking values ANY and ALL. Default is ANY.

  • Support configuring a label for the customizable views of a business type using the _adminLabel attribute on the augmented metadata

Refactored styling for key layout components to use classnames and external stylesheets to enhance customizability
  • Added better semantic HTML tags for certain elements

    • To revert to using divs, set VITE_MAIN_LAYOUT_VERSION=v1

    • Marking the main content of the app in BaseLayout

    • Wrapping the main Navigation in nav

    • Using lists and list elements where appropriate

    • Using buttons on clickable components that are not links

    • Using section, header, and footer to better describe the organization of components

  • Added component name style classnames to various components of the Navigation and Header

    • Moved the tailwind utility classes to external CSS to take advantage of the cascading nature of CSS for easier overriding

    • Made the subcomponents of these overridable

Miscellaneous
  • Enhanced the existing logic for setting the nameLabel for custom attributes to place it at the FieldTypeRenderer level.

  • Added an additional status message to the SandboxRibbon that displays the total amount of changed items in a user’s sandbox across all entities.

    • The text also serves as a link that redirects to the My Changes page for the user.

  • Enhanced the Admin navigation menu sections to be able to be toggled open and closed by clicking on the menu section title.

  • Added support to AssetBrowserView for a default sort to be provided via metadata

  • Make the progress bar in FulfillmentViewDetails and the FulfillmentCardBody customizable via metadata.

    • A custom mapping of Fulfillment Statuses to Percentages can be provided via the fulfillmentStatusToPercentageMap metadata attribute. Otherwise, the default mapping based on the out-of-box fulfillment statuses will be used.

  • Enhanced EntityLongView component to include the parent ID of a nested component in the Formik initial values as part of the attributes.

  • Added new attributes to EntityGridView to support restricting visibility of grids to tenant-only, application-only, or specific application contexts.

    • tenantOnly: Boolean flag.

    • applicationOnly: Boolean flag.

    • restrictionApplications: Array of strings that are the IDs of the applications the grid is restricted to.

Bug Fixes

Miscellaneous
  • Fixed losing Application and Catalog context after cache timeout by using stale-while-revalidate caching strategy

  • Added validation for required fields in Add New Field Augmentation form

  • Fixed Workflow Orchestration Map in Workflow Details view

  • Fixed precision of matching Admin Navigation menu items based on the current route so that routes with similar names are not matched.

    • For example, /workflow should not match /workflows

  • Fixed bug where the Add New Field modal for modifying Business Type Create/Update forms could be submitted without required fields having any values — applied validation methods to all required fields.

  • Fixed bug where the Modify Update Form button does not display if the Business Type name contains the word create.

  • Fixed business type fields being clickable when form is disabled/read-only

  • Fixed instances where we were still using tw-shadow-outline instead of tw-ring

  • Added missing variant for motion-reduce

  • Fixed cases where we used transition or transform instead of tw-transition and tw-transform

  • Fixed some cases where we used group instead of tw-group

  • Added missing localizable message property for the User Settings dropdown in the header

    • Header.user-settings.label

  • Resolved an issue where Customer Segment Rules containing two or more rules with special characters (e.g., @, ., etc.) in their values were incorrectly displayed as a single concatenated string after saving and reviewing.

  • Fixed the behavior when selecting a new folder so that the Asset item filter and sort params are not cleared. Instead, these will be retained when switching folders.

  • Fixed an issue where the ApplicationSelector would fail to list all the applications if the number of applications exceeded the page size.

    • Introduced new TenantService#getApplicationsWithQuery method, which supports pagination with querying.

    • Modified the ApplicationSelector to fetch applications directly using the new method, instead of relying on the TenantContext.

  • Fix Default Application implementation to account for users with Tenant access but also have restricted applications & a default application ID assigned to them

  • Fixed issue where clicking only the text link of the My Profile button would redirect to the /my-preferences page — redirecting is now done at the dropdown item level instead of a child Link component

  • Fixed issue where ApplicationSelector was not allowing users to exit out of the default application

  • On mobile devices: Fixed the icon used to expand or collapse the navigation menu in the header to be the same height as the header. Previously it was slightly overhanding the header.

  • Fixed the sandbox ribbon messaging sometimes causing the main content to be pushed underneath the sidebar when the navigation menu was open.

    • The text will not be truncated rather than forcefully extending the ribbon’s width.

    • This usually only happened on tablet sized screens when many changes had been made to an entity in a sandbox.

  • Fixed Rule (SpEL) and Query (RSQL) builders not displaying values on initial modal render

    • The form state was not initialized immediately when the modal was opened, causing the Rule and Query builders to show blank values. To fix this, the modal now waits to render until the form state is initialized.


Auth JS SDK Release Notes for 1.6.3

Features & Enhancements

  • Changes to support the new Remember-Me Login feature. Visit the Auth React documentation for more details on this feature.

    • Add a new redirectToRememberMeUrl method accessible through the useAuth hook.

    • Updated the SessionExpiry type to include a rememberMeAvailable boolean denoting whether a remember-me cookie is available.

    • Introduced new handling for invalid_grant errors coming from requests to get new access tokens. Visit the cross-origin support section for more details on this flow.

  • Upgraded Axios dependency.

  • Updated type documentations.

Bug Fixes

  • Fixed a bug where the SessionExpiry object returned from _requestAuthToken was getting its requiresLoginAt value from the max response header instead of exp.


Commerce SDK Release Notes for 1.7.0

Requirements

  • Node 20 supported since 1.6.3.

    • No migration or code changes required.

    • Node 14 and Node 16 have reached end of life and Node 18 will reach it in May 2025.

Important Updates

Features & Enhancements


Commerce Quote Microfrontend Release Notes for 1.1.0

Tip

This release is compatible with Release Trains starting in the 2.2.x line.

Important

Minimum React version upgraded to React 18. Minimum Node version upgraded to Node 18.

Features & Enhancements

  • Minimum React version upgraded to React 18.

  • Common concerns such as icons, the component registrar and renderer, and the client registrar were moved to the @broadleaf/commerce-shared-react library.

Bug Fixes

  • Fixed types for formatted amount

  • Reduced log noise

  • Fixed quote browse page handling of auth check

  • Added QuoteItemList to wrap all quote items listed in quote details


Payment JS SDK Release Notes for 1.3.3

Bug Fixes

  • Fix that anonymous CSR can shop as guest

    • Added check for customer ID before attempting to fetch the customer, since anonymous guests do not have a customer ID.


Commerce Next.js Starter Release Notes for 1.6.5

Features & Enhancements

  • Improved null safety by adding optional chaining to various parts of the storefront, specifically for when Fulfillment Groups are undefined or when Select fields have no options.

  • Changes to support new Remember-Me Login feature.

  • Added a modal to prompt the user to log out or stay signed in when the end of session is about to be reached. If no action is taken by the end of the session, the user is automatically signed back in. This leverages the new /remember-me-continuation endpoint. This modal behavior will only engage when all the following conditions are met:

    • Refresh token rotation is disabled

      • This is configured via property NEXT_PUBLIC_AUTH_USE_REFRESH_TOKENS, which has a default value of false.

    • Remember-Me is currently enabled by the user

    • The user’s maximum session expiration is about to be reached

      • This value can be configured with NEXT_PUBLIC_EXPIRATION_COUNTDOWN_INTERVAL, which has a default value of 180000 ms.

Note
This implementation relies on a non-cross-origin setup, reason for which it is only engaged when the refresh token rotation is disabled. For more information on how Remember-Me Login works in a cross-origin setup, visit the Auth React documentation

Bug Fixes

  • Anonymous CSR user now treated as a guest customer on site

  • Added missing fields that were preventing adding billing address for a customer account

  • Fixed UX issues with the edit Roles selector for Account Members

    • Expanded the Roles selector component when the list grows to better see the roles

    • Fixed an issue when the selectors' dropdown does not highlight which roles are already selected once the user has multiple roles

    • Fixed an issue when a user can’t remove previously added roles because the dropdown does not know which roles are already selected

  • Fixed stuttered loading behavior on the PDP by fixing the loading procedure of components on the page

  • Fixed alignment issue of select fields across the storefront

  • Fixed issue where the CSR price override was throwing a currency mismatch error due to the override request not including the desired currency for the cart and fulfillment prices

  • Fixed visual bug where the sale price blinks in and out while fetching the contract price

  • Disabled looping in the Product slideshow by default

  • Implemented fixes to prevent incorrectly redirecting to sign in when authentication is still loading, and decreased page reloads to trigger when the account has been updated

Services

Admin Navigation Release Notes for 2.2.0-GA

New Features & Notable Changes

  • Update seed data to support new concepts from Catalog Services 2.2.0 and Search Services 2.2.0

    • Add admin menu item for Characteristics management

    • Add admin menu item for Relevancy Rules and Relevancy Rule Groups management


Admin User Release Notes for 2.2.0-GA

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

New Features & Notable Changes

  • Added new field DEFAULT_TIME_ZONE to the BLC_ADMIN_USER table. The field value is used to format the dates in the Admin panel if specified. It is updated when the user changes the default time zone in the Admin panel.

  • Added new field DEFAULT_APPLICATION_ID to the BLC_ADMIN_USER table. The field value is used to pre-select application on user sign in. It overrides setting of default application on tenant level for a specific user. Makes sense only when user has access to applications and has applications assigned.

  • Allow an admin to send a reset password email to another admin user

Upgrade Guide

Migration notes
Note
If using liquibase to pull in base Broadleaf changelogs, then it is not necessary to manually run this script.
Add column for Admin User default timezone
ALTER TABLE ADMINUSER.BLC_ADMIN_USER ADD DEFAULT_TIME_ZONE VARCHAR(255);
Add column for Admin User default application
ALTER TABLE ADMINUSER.BLC_ADMIN_USER ADD DEFAULT_APPLICATION_ID VARCHAR(36);

Asset Release Notes for 2.0.3-GA

Important Updates

Spring Boot Upgrade
  • As of Broadleaf Release Train 2.1.3-GA, all microservices have been upgraded to Spring Boot 3.3

StorageProvider Path Changes

This release makes changes to the internal logic used by StorageProvider implementations such as FilesystemStorageProvider and GoogleCloudStorageProvider to determine the 'actual path' used to store asset data.

The primary motivation for this change is to mitigate the possibility of a 'collision', where two assets with distinct URL values could still be assigned the same 'actual path' in the StorageProvider. The new approach guarantees uniqueness in the 'actual paths'.

High level takeaways for this change:

  • All new assets created with 2.0.3+ of AssetServices will use the new path calculation logic and be stored/resolved at the new paths

  • Existing assets created prior to 2.0.3 will continue to be resolvable from their current locations

  • This does not require any migration of existing asset data

Detailed changes:

  • Introduce a new StorageLocationMapping entity and supporting service/repository to map between 'original' and 'actual' storage provider locations

  • Add new cache configuration properties for StorageLocationMapping (broadleaf.asset.cache.storage-location-mapping.by-provider-type-and-original-location-enabled and broadleaf.asset.cache.storage-location-mapping.by-provider-type-and-original-location-ttl).

    • This cache is disabled by default.

    • DefaultContentResolver.readResourceWithMetadata has been updated to not engage any caching behavior when processing a request with image effects. This only affects how StorageLocationMapping records are fetched.

  • Update FilesystemStorageProvider

    • Update the storage path calculation logic to use a globally unique filename and leverage StorageLocationMapping to track the mapping

    • FilesystemStorageProvider#getHashedResourcePath is now only used to support resolving existing assets for backward compatibility.

      • If you have overridden this method in your project to customize the logic, then consider reviewing and adding similar logic to the new FilesystemStorageProvider#calculateHashedStorageLocationDirectory method, which is used to generate the hashed directory prefix for new assets.

    • FilesystemStorageProvider#mapGivenPathsToHashedPaths is deprecated and now no longer called by the framework

      • If you have overridden this method in your project to customize the logic, you may consider reviewing these replacement methods and potentially add your customizations to them instead: FilesystemStorageProvider.generateActualStorageLocations() and FilesystemStorageProvider.resolveExistingActualStorageLocations()

    • Due to the internal filename naming changes, any callers of the already-deprecated FilesystemStorageProvider.readResource() and FilesystemStorageProvider.readResources() methods will now see a different filename value in the result. Callers of the newer FilesystemStorageProvider.readStreamableResourceWithMetadata()/FilesystemStorageProvider.readStreamableResourcesWithMetadata() will see the original value.

  • Update GoogleCloudStorageProvider

    • Update the storage path calculation logic to use a globally unique filename and leverage StorageLocationMapping to track the mapping

    • GoogleCloudStorageProvider.getBlobId is deprecated and now no longer called by the framework

      • If you have overridden this method in your project to customize the logic, you may consider reviewing these replacement methods and potentially add your customizations to them instead: GoogleCloudStorageProvider.generateActualStorageLocations() and GoogleCloudStorageProvider.resolveExistingActualStorageLocations()

    • GoogleCloudStorageProvider#getHashedResourcePath is now only used to support resolving existing assets for backward compatibility. The new approach does not use hashing.

Bug Fixes

  • Updated methods DefaultStorageService#mapEligibleProperties and DefaultStorageService#generateAssetForUploadRequest to be access-level protected

  • Allow altText and title to be supplied on the asset upload request

  • Folders and assets now sorted alphabetically by default

  • Fix issue that prevents assets with string content in name to be found

  • GoogleCloudStorageProvider.deleteResource() now throws the BLC StorageException when a requested item is not successfully deleted. This is now consistent with the expectations defined in the StorageProvider interface.

  • GoogleCloudStorageProvider.deleteResources() now throws the BLC BulkStorageException instead of the BLC StorageException when it internally encounters com.google.cloud.storage.StorageException. This is now consistent with the expectations defined in the StorageProvider interface.

  • Fixed an issue where DefaultStorageService and ImageMagickImageOperationService did not invoke StorageProvider.addResourceFromStream() with a try-with-resources for the InputStream. The input stream may have been left open in the event of an error.

  • Updated addResourcesFromStreams(), deleteResources(), and addResourcesFromFiles() implementations in FilesystemStorageProvider and GoogleCloudStorageProvider to ensure that the success/failure responses given back to the caller (either in BulkAddResourcesResponse or in BulkStorageException) always return by the original path the caller provided rather than any cleaned representation. This ensures the caller can track success/failure purely by the path they gave rather than receiving a path they do not recognize, matching the original intent of the API contract.

  • Decouple the @EnableConfigurationProperties(AssetCacheProperties.class) from the registration of the Ignite specific configuration in AssetCacheAutoConfiguration, increasing flexibility

Schema Changes

The database schema has changed as part of this version.

'Create/Update' Changes

Create/update changes (new tables, new columns, etc) are automatically included in the updated *changelog-master.xml after you upgrade to the new Asset Services JAR. The new changesets inside will run automatically to migrate existing data.

Database Platform Create/Update Changelog File Name

PostgreSQL

db/changelog/asset.postgresql.changelog-master.xml

MariaDB

db/changelog/asset.mariadb.changelog-master.xml

MySQL

db/changelog/asset.mysql.changelog-master.xml

Oracle

db/changelog/asset.oracle.changelog-master.xml

YugabyteDB

db/changelog/asset.yugabytedb.changelog-master.xml


Auth Release Notes for 2.2.0-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

Important Updates

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

New Seed Data

  • Added permissions/scopes for new entities and concepts introduced in other services for the 2.2.0 Release Train. These are included in the auth.starter.required.data.changelog.xml file.

    • Introduce CHARACTERISTIC permissions and scopes

    • Introduce CONSOLIDATED_INVENTORY_AVAILABILITY permissions and scopes

    • Grant the inventoryclient the READ_ORDER and READ_ORDER_FULFILLMENT permission/scopes

    • Grant the orderopsclient the ALL_INVENTORY_RESERVATION permission/scopes

    • Grant the catalogbrowseclient the READ_INVENTORY_SUMMARY permission/scopes

    • Introduce RELEVANCY_RULE_GROUP and RELEVANCY_RULE permission/scopes

  • Added openapi client scope & permission for PRODUCT_BUSINESS_TYPE


Bulk Operations Release Notes for 1.0.2-GA

Important Updates

Spring Boot Upgrade
  • As of Broadleaf Release Train 2.1.3-GA, all microservices have been upgraded to Spring Boot 3.3

Notable Features

  • Introduced support for bulk operations for the new Category membership type of AUTO_INCLUDE which will add CategoryProducts automatically when a Product qualifies according the Product membership rules


Cart Services Release Notes for 2.2.0-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

Note
Includes changes in 2.0.2-GA

Important Updates

New Features & Notable Changes

  • Added new fields on CartItem to track recurring and usage pricing.

  • Added new fields on Adjustment to track the type of discount, free trial length, and recurring discount start and end periods.

  • Both Cart and CartItem received new computed fields and helper methods to handle the new recurring prices to allow more easily working with and display these values in a storefront application.


Cart Operation Release Notes for 2.2.0-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

New Features & Notable Changes

  • This version includes all changes up to 2.1.4 Release Notes

  • Allowed more control when selecting which asset to show in the cart for an item from one of the Product’s assets besides simply choosing the primary. Instead, users can now configure a preferred asset tag to match against. By default it is cart.

  • Added properties to configure whether the Variant’s name is used as the item’s name instead of the Product’s. This will be true by default.

    • New properties:

      • broadleaf.cartoperation.service.preferred-asset-tag with default cart

      • broadleaf.cartoperation.service.use-variant-name-in-cart with default true

  • Introduced support for Product Characteristics and Product Terms.

  • Introduced support for recurring and usage pricing concepts.

    • Primarily this looks like being able to include characteristics marked as targetableForPricing and product terms in PriceableTarget payloads.

    • See Cart Services 2.1.0 Release Notes for related domain changes.

    • Includes support for including characteristics marked as targetableInRuleBuilders in Offer Engine requests.

  • Introduced support for new recurring and free trial offers.

Adyen Payment Gateway Support

This release includes support for the Adyen payment integration.

  • Added an ability to send the additional data in the CheckoutProcessRequest, needed to execute payment transactions, esp. properties that should not be persisted to the Payment#paymentMethodProperties. See CheckoutProcessRequest#sensitivePaymentMethodData

Bug Fixes

  • Resolved a bug where a failed payment transaction causes the PaymentSummary in the CheckoutResponse to be out of date

  • Resolved issue when a failure in DefaultCheckoutService#createOrderNumber method doesn’t create order but still charges a payment

Important

This release includes a potentially breaking change if you have an override/implementation of one of the following methods:

  • CheckoutService#processCheckout(…​)

  • CheckoutWorkflow#execute(…​)

    • DefaultCheckoutWorkflow#executeActivity(…​) (protected method)

  • RequiresSecurePaymentInformationActivity#execute(…​)

  • PaymentTransactionExecutionService#executeCartPaymentTransactions(…​)

  • DefaultPaymentTransactionExecutionService#executeCartPaymentTransactions(…​) (protected method)

  • DefaultPaymentTransactionExecutionService#executePaymentTransaction(…​) (protected method)

  • DefaultPaymentTransactionExecutionService#buildTransactionExecutionRequest(…​) (protected method)

If this effects your project, you’ll encounter a compilation issue. These compilation issues should be simple to resolve - ie look to gather data from the provided SensitivePaymentMethodData objects, or simply pass them along to the next service component.

In short, these method signature changes within the CartOps were needed to effectively pass the SensitivePaymentMethodData representations through the checkout process, & do so in a way that is very intentional about which components do/do not have access to the data.

This change was also made to future-proof these method signatures by passing objects, rather than simple params.

  • Fix bug where a failed payment transaction causes the PaymentSummary in the CheckoutResponse to be out of date

  • Fixed issue where the CSR Price override would not be applied by setting the standardRecurringPrice for order line items with overridePrice when applying offers.


Catalog Release Notes for 2.2.0-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

Important Updates

New Features & Notable Changes

  • Updated BusinessTypeService and BusinessTypeRepository to introduce a method that can find BusinessType by ID as well as additional RSQL filters

  • Refactored logic that built BusinessType instances from DefaultProductType values into its own DefaultProductTypeBusinessTypeBuilder component. BusinessTypeEndpoint now injects and uses this component instead of having the logic inline within itself.

  • For BusinessType instances built for DefaultProductType values, added logic to set a reserved corresponding ID for BusinessType.id instead of keeping it blank. The ID mapping is defined in DefaultProductTypeBusinessTypeBuilder.

  • Introduced Product Characteristics.

  • Introduced the ability to define available terms for Products.

  • Introduced support to be able to add Products with a rule-based Category Item Choice Product Option to cart.

  • Introduced the ability to Sync Characteristics and translations for any missing Characteristics for Product Business Types and default any values as applicable.

  • Added priceDataViewType as a property in CatalogMetadataProperties to dictate changes in the metadata for Products and Option Templates to either display default views or recurring/subscription-specific views.

  • Introduced a new /product-types/all endpoint in BusinessTypeEndpoint to serve the purpose of returning all non-paginated BusinessType records.

    • Deprecated the previous conflicting request mapping at /product-types

    • Updated the BusinessType metadata configuration to use the new endpoint path instead of the old one.

    • Updated the BusinessType metadata configuration to remove the narrowedPaging() configuration when using the endpoint, since neither the previous nor current implementation of that endpoint support pagination.

Bug Fixes

Fix CatalogEntityDeletedEventHandler Failures with Deactivated Applications

CatalogEntityDeletedEventHandler implementations would fail on a security validation when run against data from a deactivated application (see Application.deactivated). To address this, each of the out of box implementations have been updated to disable security policy validation before invoking any CRUD methods to find/remove data. This is a safe change, as the cleanup handlers are always run internally by the system (rather than by any user/client). Almost all policy validations are skipped in such an environment already, but the Application.deactivated check is an exception, and the CatalogEntityDeletedEventHandlers are a rare case which actually attempt to deal with deactivated applications. Thus, explicitly bypassing security validation in this flow is necessary.

The changes:

  • Introduce a new doWithoutPolicyValidation() method in AbstractCatalogEntityDeletedEventHandler

  • Update all out of box implementations of CatalogEntityDeletedEventHandler to wrap their CRUD service invocations with the new doWithoutPolicyValidation() method

Note
If you have introduced your own CatalogEntityDeletedEventHandler or customized one of the out of box implementations, you may want to check that your custom code flows also bypass security validation.
Removal of Sandbox Behavior from BusinessType

The BusinessType domain was always meant to be non-sandboxable, and all operations against this domain from the Broadleaf admin have been 'production' level accordingly. However, the Trackable configuration of JpaBusinessType did not explicitly exclude sandbox behavior. This meant that theoretically, it was possible to create sandbox-level records for this domain if requests were made by a custom API caller.

With this release, JpaBusinessType has been explicitly annotated with @TrackableExtension(TrackableBehavior.APPLICATION), which excludes it entirely from supporting sandbox behavior.

Clients who have exclusively been managing this domain from the Broadleaf admin will not be impacted by this change, as the Broadleaf admin has always affected this domain at the production (non-sandbox) level.

For clients that believe they may have sandbox-level BusinessType records, here are some recommended steps:

  • First, examine the change summaries in the BLC admin’s 'Application Updates' section. From here, you can audit and manage (deploy/reject/etc) any changes to BusinessType domains until there are no more pending changes.

  • At this point, all that should be left in the CatalogServices database are production level records and 'obsolete' sandbox level records. The goal now is to find and remove those obsolete records.

    Note
    Technically, this step to remove obsolete sandbox records is optional. However, we include it in case clients find it helpful.
    • You can run the following SQL to see the BusinessType records who exist in the datastore with a sandbox-archived state

      SELECT id, context_id, name, trk_level, trk_sandbox_archived
      FROM catalog.blc_product_business_type
      WHERE trk_sandbox_archived = 'Y'
      • Inspect these results and verify that these obsolete records are indeed okay to remove

    • You can run the following SQL to see the Notification State records that would become orphaned if those business types were deleted:

      SELECT id
      from catalog.blc_notification_state
      WHERE entity_type = 'com.broadleafcommerce.catalog.provider.jpa.domain.product.type.JpaBusinessType'
        AND container IN (SELECT id
                          FROM catalog.blc_product_business_type
                          WHERE trk_sandbox_archived = 'Y')
    • If everything looks fine to remove, then you can first execute a DELETE on the blc_notification_state table with the same criteria as above, and then execute a DELETE on the blc_product_business_type table, again with the same criteria as above.

Additional Bug Fixes
  • Added a new GET endpoint to fetch BusinessType records, replacing a now-deprecated endpoint.

    • Previously, there were several different GET operations mapped to the same /product-types path, distinguished only by request parameters. While technically functional, the operations deserved to be more clearly disambiguated due to their differing semantics and response schemas. Thus, this existing mapping has been deprecated:

      • GET /product-types?includeDefaults=(boolean)&includeTemplates=(boolean), returning List<BusinessType>

    • The replacement endpoint is:

      • GET /product-types/all?includeDefaults=(boolean)&includeTemplates=(boolean), returning List<BusinessType>

    • The BusinessType admin metadata configuration has been updated to use the new endpoint path instead of the old one. Furthermore, the narrowedPaging() configuration has been removed when calling this endpoint, as neither the previous nor current implementation of the endpoint supports pagination.

  • Refactored Product Characteristic value handling and updated Characteristic field labels to fix issues with default values and labels.

  • Fixed issue where translations were allowed on numeric characteristic values.

API Changes

Characteristics
Table 1. New Endpoints
Path Description

GET /characteristics

Read a page of Characteristics, accepting RSQL filters and a name (q) filter.

POST /characteristics

Create a new Characteristic.

GET /characteristics/{id}

Read a single Characteristic by ID.

PATCH /characteristics/{id}

Patch a single Characteristic by ID.

PUT /characteristics/{id}

Replace a single Characteristic by ID.

DELETE /characteristics/{id}

Delete a single Characteristic by ID.

PUT /characteristics/{id}/translations/{locale}

Replace the translations for a single Characteristic by ID for a given locale.

Business Types
Table 2. New Endpoints
Path Description

GET /variant-permutations?typeKey={typeKey}

Read all VARIANT_OPTION Characteristics by BusinessType typeKey to facilitate configuring which characteristic values to use when creating new Products of that type.


Catalog Browse Release Notes for 2.1.0-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

Important Updates

New Features & Notable Changes

  • Introduced support for Product Characteristics and Product Terms.

  • Introduced support for recurring and usage pricing concepts.

    • Primarily this looks like being able to include characteristics marked as targetableForPricing and product terms in PriceableTarget payloads.

  • Includes a number of enhancements around product detail hydration.

    • Introduced ability to fully hydrate Products in Search Requests—not just pricing, assets, or tags. This behavior is controlled by a parameter on the Catalog Search request: hydrateFully. False by default.

    • Introduced ability to minimize the payload size for Assets so that they don’t include the ContextState, which is not valuable in a commerce scenario. Controlled by broadleaf.catalogbrowse.catalogprovider.asset-minification-enabled, which is true by default.

    • Added the ability to pass RSQL filters to filter the assets or tags fetched when hydrating them onto Search Results using the assetFilters and tagFilters params.

  • Introduced support for Recommendation Engine Services via Browse Content.


Content Release Notes for 2.0.8-GA

Security

To review the security related content, see Release Train 2.1.5 notes for the full details.

New Features & Notable Changes

  • New Entity: Custom Content Field

    • This is a new entity that can define a reusable content field, which can be either an enumerated value or hydrated via a lookup operation.

    • A Custom Content Field can be created and configured in the new admin section, Content Management > Content Fields

    • These fields can be used in Content Models using the new “Reference” Field Type option

  • Now sort Content Items by Last Updated by default since that is visible in the grid

Bug Fixes

  • Fixed an error where "Undo Overrides" would accidentally delete the values of non-overriden content fields.

    • Updated DefaultContentItemService#removeFieldDataForContent to exclude inherited records when fetching the collection of FieldData to delete for a given ContentItem. This way, we will only delete field data records that are directly related to the content item record that represents the override, rather that its parent’s.


Customer Release Notes for 2.1.0

Important Updates

New Features & Notable Changes

  • Introduced support for Recommendation Engine Services via Customer Modified messaging.

    • The Customer Modified messaging configuration is featured in its own separate class to support the balanced configuration setup.


Fulfillment Services Release Notes for 2.0.4-GA

Enhancements

  • Update parsing discriminated properties to be case insensitive by utilizing CaseInsensitiveMap.

    • e.g. broadleaf.orderoperation.* will be parsed the same as broadleaf.ORDEROPERATION.*

  • Added a new NUMBER_OF_ITEMS enum option to BandField enum.

    • This field is not utilized OOB and is added for customization purposes.

Bug Fixes

  • Fixed typo in Create Fulfillment Origin form.


Import Release Notes for 2.1.0-GA

Important Updates

  • This version includes all changes up to 2.0.4 Release Notes.

  • Support new concepts introduced in Catalog Services 2.2.0

    • Update CompleteProductImportSpecification to support 'characteristics' and 'terms' headers

      • support for new Terms on a Product

      • support for new Product Characteristics on a Product

Example Expanded Scope of Support:

Business Type Terms Product Characteristics

PHONE

name::finance;durationType::MONTHS;durationLength::36

"cameraMegapixel::50MP + 5MP + 2MP"

PHONE

name::commitment;durationType::MONTHS;durationLength::24

"numberTest::12345"


Inventory Release Notes for 2.1.0-GA

Important Updates

Introduce support for Preorder and Backorder Inventory (Future Stock)
  • Introduced the following fields on SkuInventory (please see the upgrade guide below for DB migration notes)

    • futureStockEnabled - drives whether this inventory should allow configuration of future stock

    • futureStockLimited - drives whether availability checks will be made when reserving future stock

    • futureStockType - describes whether this is a 'preorder' or 'backorder' future stock

    • expectedFutureRestockDate - describes the expected date the future stock will become available

  • The existing SkuInventory.quantityOnOrder field is now properly leveraged for future stock to indicate the pre-order or back-order quantity, and the SkuInventory.updateQuantityAvailable() method now incorporates its value.

  • SkuInventoryAvailabilitySummary now includes details about future stock

  • Introduced a new FUTURE_STOCK_RESERVED transaction type

    • When an order is placed, any quantity requested that is not immediately available will be reserved as this type instead of as a hard reservation

  • Various SkuInventory-managing components (ex: SkuInventoryAdjustmentService, SkuInventorySummaryService, StockChangeNotificationService) have been updated to consider future stock in their behavior

  • Introduce new OrderCreatedInventoryAdjustmentMessageListener to supersede the now-deprecated OrderSubmittedInventoryAdjustmentMessageListener

    • See the broadleaf.inventory.messaging.order-submitted.legacy.enabled property for controlling the implementation that is used

    • Introduce a new OrderProvider to support the new implementation

  • Introduce new InventoryTransactionChangeNotificationProducer and FutureStockAvailabilityChangeNotificationProducer message producers

  • Update metadata configuration to support the new domain fields

  • Update /available-quantities endpoint to support a new availableNow parameter driving whether this lookup should only find inventory quantities that are available now, and not in the future

Upgrade Guide

Liquibase Change Sets

The database schema has changed as part of this version.

'Create/Update' Changes

Create/update changes (new tables, new columns, etc) are automatically included in the updated *changelog-master.xml after you upgrade to the new Inventory Services JAR.

Database Platform Create/Update Changelog File Name

PostgreSQL

db/changelog/inventory.postgresql.changelog-master.xml

MariaDB

db/changelog/inventory.mariadb.changelog-master.xml

MySQL

db/changelog/inventory.mysql.changelog-master.xml

Oracle

db/changelog/inventory.oracle.changelog-master.xml

YugabyteDB

db/changelog/inventory.yugabytedb.changelog-master.xml


New Features & Notable Changes

  • Added discrete cache invalidation

    • This new feature allows invalidating the caches when one of the entities is changed/deleted so that the new changes will be immediately available without needing to wait until the cache has expired.

    • See the Menu configuration docs for details on how to configure this feature and for the full list of configurable properties.


Notification Release Notes for 2.1.2-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

New Features & Notable Changes

  • Updates were made to usages of the ContextRequest domain:

    • Deprecated forceCatalogForFetch in favor of forceFilterByCatalogIncludeInheritance.

    • Introduced forceFilterByCatalogIncludeInheritance flag that controls the narrowing logic to only filter on the specified catalog within the context rather than the whole catalog hierarchy.

  • Updated MessageProperties to use CaseInsensitiveMap when storing the tenant and application related properties.

    • ENV properties will be converted to lowercase by Spring — in the case of UUIDs for Applications and Tenants, there can be a mismatch when the casing changes, so CaseInsensitiveMap addresses this issue.

Bug Fixes

  • Fixed an issue where the cancellation email for orders or items was not sent due to a template error.


Offer Release Notes for 3.1.0-GA

Important Updates

Spring Boot Upgrade
  • As of Broadleaf Release Train 2.0.0-GA, all microservices have been upgraded to Spring Boot 3.

New Features & Notable Changes

Subscription and Free Trial Discounts

Broadleaf Release Train 2.2.0 introduced new price types for Recurring (or Subscription) and Usage prices. Previously only upfront prices were supported out of box. Likewise, Offers now can discount recurring prices or provide free trial periods.

Domain Changes
  • Offer

    • freeTrial: Whether the offer applies a free trial for the targeted item(s).

    • freeTrialLength: How long the free trial lasts

    • freeTrialLengthUnits: The units for the free trial. Default values include: DAYS, WEEKS, and MONTHS.

    • subscriptionDiscount: Embedded object.

      • discountCurrentOrder: Deprecated as the new price fields make this flag unnecessary.

      • endPeriod: Is now nullable.

    • friendlyOfferType: Deprecated in favor of new offerTemplate that supports better localization of labels.

    • offerTemplate: A computed field to replace friendlyOfferType that indicates the template or pattern followed to create the offer. This primarily drives metadata to show or hide fields applicable to certain combinations of configuration flags.

DTO Changes

The following lists the changes to DTOs related to making requests and receiving responses from the Offer Engine.

  • Added new fields to Adjustment

    • type with the following options:

      • ORDER_DISCOUNT: Standard adjustment type. All out of box adjustments prior to 3.1.0 would have this type.

      • FUTURE_CREDIT: Indicates the discount should be applied to a future order as a credit. Future credits could be applied previously and used a separate isFutureCredit flag, although this feature was and is not fully implemented. This has been rolled into the new type field instead of using a separate flag.

      • RECURRING_DISCOUNT: Indicates the adjustment should be applied to the recurring (or subscription) price instead of the upfront price and should not affect the order subtotal at time of checkout.

      • FREE_TRIAL: Indicates that the subscription item should have its first billing period delayed for a period of time.

    • freeTrialLength: Indicates to the billing engine how long a free trial period is.

    • freeTrialLengthUnits: Indicates to the billing engine what the units are for freeTrialLength. Default options are: DAYS, WEEKS, and MONTHS.

    • beginPeriod: For recurring discounts, indicates when the discount should start being applied.

    • endPeriod: For recurring discounts, indicates when the discount should stop being applied. Null indicates never.

  • Added new fields to LineItem, LineItemDto, and EnhancedLineItem

    • standardRecurringPrice: Indicates the standard recurring price details including

      • price

      • periodFrequency: How often the price should be billed

      • periodType: The type of period. The default options are MONTHLY, QUARTERLY, and ANNUALLY.

      • periodLimit: The number of periods the price should be charged. Only applicable when the originating Price List was not STANDARD.

      • termDurationLength: If there are terms for the price, this is the length.

      • termDurationType: The type of duration. The Default options are DAYS, WEEKS, MONTHS, YEARS.

    • saleRecurringPrice: Indicates the sale recurring price details. Same structure as standardRecurringPrice. Important since not all offers may be applied to a sale price.

  • Added new fields to ItemResponse

    • baseRecurringPricePerItem: The price from which adjustments were calculated. This may be the originating LineItem’s standard or sale recurring price.

    • appliedToSalePrice: Whether the adjustments applied to the item used its sale or standard (non-recurring) price.

    • appliedToSaleRecurringPrice: Whether the adjustments applied to the item used its sale or standard recurring price. This is separate from appliedToSalePrice to allow mixing discounts for items with both recurring and upfront prices.

    • recurringAdjustedTotal: The final total recurring price after adjustments are applied.

    • recurringSavings: The total of all recurring price savings.

    • freeTrialApplied: Whether any of the adjustments applied were free trials.

  • Added new fields to ItemResponseDetail

    • appliedToSalePrice: Whether the adjustments applied to the item used its sale or standard (non-recurring) price.

    • appliedToSaleRecurringPrice: Whether the adjustments applied to the item used its sale or standard recurring price.

    • recurringSavings: The total of all recurring price savings.

    • recurringAdjustedTotal: The final total recurring price after adjustments are applied.

  • Deprecated fields on ItemResponseDetail

    • beginPeriod: No longer valid since more than one subscription discount may be applied. Instead each ItemAdjustment should be consulted by the caller.

    • endPeriod: No longer valid since more than one subscription discount may be applied. Instead each ItemAdjustment should be consulted by the caller.

Upgrade Notes if using Subscription Discounts before 3.1.0

Offers already had fields, hidden by default, that allowed configuring subscription discounts. However, the feature was incomplete and require customization to implement fully—such as setting the #isSubscription flag on OrderLineItemDto. Anyone upgrading who is using the old version of the feature should ensure that subscription OrderLineItemDtos sent to the Offer engine are updated to include the subscription price as part of the new #standardRecurringPrice and #saleRecurringPrice structures as applicable.

Also, expect that ItemResponseDetails will not populate #beginPeriod and #endPeriod since more than one subscription discount may be applied. Instead use the ItemAdjustments on the details, which are per discount.

Offer Templates

A new computed field has been introduced on the Offer domain to help drive the Admin UI to handle the variety of complex Offer configurations called offerTemplate. In the Admin this will be labeled as "Offer Type" and the existing field with that name will be changed to "Offer Target Type" to clarify the intent of each.

See Offer Types for more details.

Cache Invalidation
  • Added a OfferCachePropertiesEnvironmentPostProcessor to support automatically registering message binding properties if the cache invalidation enabled property is set as a JVM property, and has a value of true.

    • See Cache Invalidation in the Offer configuration docs for details on how to configure this feature and for the full list of configurable properties.

  • Additionally, this change removes and updates some of our Beans in the Order Services to better follow configuration patterns and resolve issues that prevented CamelClusterService from working correctly. The previous configuration pattern negatively affected message retries. See the table in the collapsed block below:

    Details
    Class Bean Change

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationDomainMapperManagerSupplier

    Removed as it was a supplier bean

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationNotificationManagerSupplier

    Removed as it was a supplier bean

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationIgnoredRepositoriesSupplier

    Removed as it was a supplier bean

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationNotificationStateRepositoriesSupplier

    Removed as it was a supplier bean

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationNotificationHandler

    Update arguments from ()

                (PromotionCacheInvalidationProducer producer,
                PromotionCacheInvalidationMessagingProperties properties,
                List<IgnoredNotificationStateRepository> ignoredRepositories,
                @Qualifier("promotionCacheInvalidationMessageFactory") MessageFactory<PromotionCacheInvalidationRemoteEvent> promotionCacheInvalidationMessageFactory,
                MessageSerializationHelper helper)

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationRetryClusterService

    Update arguments from ()

                (CamelClusterService camelClusterService,
                PromotionCacheInvalidationMessagingProperties properties,
                @Nullable List<NotificationStateRepository> repositories,
                @Qualifier("promotionCacheInvalidationNotificationHandler") NotificationHandler handler,
                List<IgnoredNotificationStateRepository> ignoredRepositories,
                @Nullable DataRouteReference reference)

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationHelper

    Update arguments from ()

                (PromotionCacheInvalidationMessagingProperties properties,
                ObjectProvider<DomainMapperManager> mapperManager)

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationNotificationStateMapperMember

    Update arguments from ()

                (NotificationStateService notificationStateService,
                @Qualifier("promotionCacheInvalidationNotificationHandler") NotificationHandler handler,
                PromotionCacheInvalidationHelper promotionCacheInvalidationHelper)

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationMessageFactory

    Update arguments from ()

                (PromotionCacheInvalidationHelper promotionCacheInvalidationHelper)

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationNotificationImmediateSender

    Update arguments from ()

                (@Qualifier("promotionCacheInvalidationMessageFactory") MessageFactory<PromotionCacheInvalidationRemoteEvent> promotionCacheInvalidationMessageFactory,
                PromotionCacheInvalidationMessagingProperties properties,
                PromotionCacheInvalidationProducer producer,
                @Qualifier("promotionCacheInvalidationNotificationStateMapperMember") PromotionCacheInvalidationNotificationStateMapperMember domainMapperMember,
                PromotionCacheInvalidationHelper promotionCacheInvalidationHelper,
                ObjectProvider<NotificationManager> notificationManager)

    PromotionCacheInvalidationMessagingConfiguration

    promotionCacheInvalidationEventListener

    Update arguments from ()

                (ObjectMapper objectMapper,
                ApplicationEventPublisher publisher)
External Adjustments API
  • Added first-class support for allowing third-party APIs to add and return external offers onto orders when they are being processed through the Offer Engine.

See the tutorial on adding a new external offer provider for more detailed documentation around this feature.

Additional New Features & Notable Changes
  • Added support for qualifying multiple voucher offers per order if it’s unlimited

  • Added support for cart subtotal threshold based Free Gift offers without any qualifier criteria

  • Allow the selection of BUNDLE typed products for Free Gift offers

    • This is to support a more dynamic setup for Free Gift offers, e.g. a bundle product that consists of 2 itemA and 3 itemB can be used solely for the purpose of being free gifts, while the bundle product itself cannot be individually sold nor searchable

  • Adds the option of an Offer which has an item associated with it. Unlike a Free Gift, this will have a cost but it should be at a reduced price from the original price.

Enhancements

  • Improve performance during the generation of offer codes in order to reduce the amount of processing needed to generate large amounts of codes.

    • This includes updating the ModelMapperMappable implementation of JpaOfferCode to perform mappings directly via a 'preconverter' instead of the previous TypeMap mappings-based approach.

    • The changes here also bypasses a slower merge() call for a faster persist() as the generated codes are always new and would not need any potential updates.

Bug Fixes

  • Several currency mismatch issues were addressed where the currency from the LineItem was not used to initialize computed prices, leading to the system default currency being used instead in some cases.

  • CombinabilityOverrides being incorrectly detected when an Offer was stackable and had no combinability overrides has been addressed.

  • Fixed an issue where subscription BOGO items would not correctly set dates and have the incorrect value for the applyToFuturePeriods flag.

  • Marketing message priority field is now honored(sorted by it) when fetching/showing messages

  • Fixed bug where 2 Free Gift offers can both be applied in the same order

    • Exposed the combinability fields for Free Gift offers and default it to OTHER_TYPES

  • Fixed issues around the usage and messaging for max usages on offers.

  • Fixed an issue where items with a sale price caused a NPE after attempting to grab information not needed for tiered candidate offers.


Order Services Release Notes for 2.1.0-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

  • This version now requires DataTracking 2.0.3+

New Features & Notable Changes

  • Added new fields on OrderItem to track recurring and usage pricing.

  • Added new GET endpoints around the FulfillmentCaptureClaimSummary domain which should be used to replace the matching deprecated endpoints.

    • Previously, there were several different GET operations mapped to the same /fulfillment-capture-claims path, distinguished only by request parameters. While technically functional, the operations deserved to be more clearly disambiguated due to their differing semantics and response schemas. Thus, these existing mappings have been deprecated:

      • GET /fulfillment-capture-claims?paymentId, returning FulfillmentCaptureClaimSummary

      • GET /fulfillment-capture-claims?paymentIds, returning List<FulfillmentCaptureClaimSummary>

      • GET /fulfillment-capture-claims?fulfillmentId, returning FulfillmentCaptureClaimSummary

    • The replacement endpoints are:

      • GET /fulfillment-capture-claims/summaries/by-payment-id?paymentId, returning FulfillmentCaptureClaimSummary

      • GET /fulfillment-capture-claims/summaries/by-payment-ids?paymentIds, returning List<FulfillmentCaptureClaimSummary>

      • GET /fulfillment-capture-claims/summaries/by-fulfillment-id?fulfillmentId, returning FulfillmentCaptureClaimSummary

  • Added the concept of a Preorder and Backorder item.

    • A Preorder is an order for an item which has never had available stock but will become available at a later date.

    • A Backorder is an order for an item which has run out of stock but has plans to become available again at a later date.

    • See the 2.1.0 Inventory Service release notes for more details.

  • Backend and metadata for order services has been updated so it can be utilized at the Tenant level of the Admin application.

    • The order view can now be accessed when an application is not selected on the Admin. This results in a combined list of all orders that fall under a Tenant.

    • Orders at the Tenant level are not read only, allowing a user to update the orders without need to update them at the application level.

    • The Orders view can also be filtered by Application now, allowing easy access to view specific Application orders from the tenant level.

    • Note: Backend logic for endpoints has been modified to allow for Tenant only contexts. This may require updates to customized endpoints.

Enhancements

  • Order items now contain additional pricing information, specifically the concepts of Recurring price and Usage price.

    • Recurring price will be utilized by an item that requires payment at an interval; e.g. a subscription.

    • Usage price will be utilized by an item that requires payment per some usage metric e.g. cost per API call for a website or usage of data on a phone plan.

    • See the 2.1.0 Pricing Service release notes for more details.

  • RSQLParser bean now has a orderServiceConsolidationRsqlParser qualifier.

  • Added a dependency for the cart-services-client onto Order services.


Order Operation Release Notes for 2.1.0-GA

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

Important Updates

  • Support new concepts introduced to other services in the 2.2.0 Release Train

    • Add mechanisms to interact with InventoryServices to support preorder and backorder concepts. See the 2.1.0 Inventory Service release notes for more details.

      • A Preorder is an order for an item which has never had available stock but will become available at a later date.

      • A Backorder is an order for an item which has run out of stock but has plans to become available again at a later date.

      • This includes mechanisms to split the fulfillment if necessary and update the fulfilment for future-stock items to PENDING_INVENTORY

      • This includes mechanisms to set an inventoryLastUpdated attribute on fulfillments after inventory services emits a message indicating pending inventory may now be available. This is surfaced in the admin metadata.

    • Ensure recurring/usage pricing details are passed between CartItem and OrderItem in DefaultCartOrderGenerationService

  • Updated the GET endpoints for retrieving a FulfillmentCaptureClaimSummary to utilize a new set of endpoints with discrete uri mapping. See the Order Service release notes for more details.

    • If you are updating Order Operation Services to version 2.1.0+ (Release Train 2.2.0+) but not Order Services, you will need to manually set the uri path properties of these endpoints to an empty string. This will call the old endpoints in Order Services.

    • The properties, once updated should look like:

broadleaf:
    orderoperation:
        orderprovider:
            summary-by-payment-id-subpath: ""
            summary-by-payment-ids-subpath: ""
            summary-by-fulfillment-id-subpath: ""

See the configuration documentation for more details.

Enhancements

  • Order items are now generated from the cart with additional pricing information, specifically the concepts of Recurring price and Usage price.

    • Recurring price will be utilized by an item that requires payment at an interval; e.g. a subscription.

    • Usage price will be utilized by an item that requires payment per some usage metric e.g. cost per API call for a website or usage of data on a phone plan.

    • See the 2.1.0 Pricing Service release notes for more details.

  • Update DiscriminatedProperties to utilize CaseInsensitiveMap when binding application and tenant ID property key prefixes This ensures properties supplied via YAML vs environment variables are not treated as separate properties purely due to a case mismatch.

    • This affects OrderOperationPaymentProperties (broadleaf.orderoperation.service.payment.*)

  • Updated requests to ReturnOperationEndpoint to utilize application information to allow for Tenant level requests.

Bug Fixes

  • Fixed an issue with a null customer name which prevented billing addresses from being correctly persisted.

  • Fixed an issue with paged requests and responses not being correctly serialized and deserialized.

  • Fixed an issue where deeply nested (at least 3 levels) dependent order items were not correctly hydrating information, causing a null value for the Order Item’s refundAmount.


Payment Transaction Release Notes for 2.0.6-GA

New Features & Notable Changes

  • Replace property usages of forceCatalogForFetch for forceFilterByCatalogIncludeInheritance.

  • Added failureType reason to the checkout rollback event.

  • Reduce log level for Resource Lock exception in payment webhook logging.

  • Added support for payment transaction result audit & transaction updates.

    • Add new payment transaction results audit table, BLC_PAYMENT_TX_RESULT_AUDIT.

    • On webhook update events, copy previous transaction results to the new results audit domain to store transaction result history. Then update the payment transaction with the updated results from the webhook.

Bug Fixes

  • Fixed potential NPE in the Payment Reversal Job, by setting a default value of zero when a monetary amount is null.


Pricing Release Notes for 2.1.0-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

Important Updates

New Features & Notable Changes

  • Added a new bulk read PriceData endpoint to be used by Data Exchange Service.

  • Introduced Price Data views metadata improvements:

    • Introduced PricingMetadataProperties as a properties class available to metadata classes, and used in PricingServicesMetadataAutoConfiguration to dictate views.

      • Added a priceDataViewType property that determines the type of Price Data view to display.

      • Added a displayFlashSaleFieldsInPriceDataGrid property that determines whether to include Flash Sale fields in the Price Data grid.

    • Updated the wording related to Flash Sale pricing.

Introduced support for recurring and usage type prices.
  • A single PriceData can be used to define an upfront price (the normal price) along with a recurring and usage price.

  • The recurring price includes defining the billing period frequency and optional terms, e.g., bill monthly for 36 months, bill quarterly indefinitely, bill annually for 10 years.

  • The usage price includes defining units for what is being used and the amount to charge for, e.g., per minute, per gigabyte, per message.

  • Supports also targeting a characteristic value in combination with the Product’s SKU to associate pricing.

  • Supports targeting a Product’s terms in combination with a SKU to associate pricing.

  • PriceInfo payload now contains fields for RecurringPriceDetail and UsagePriceDetail

  • PriceTypeDetail payload also contains RecurringPriceDetail and UsagePriceDetail for the best price of a particular type to support strike-through pricing display.

  • PriceableTarget payload supports specifying Product Terms or Characteristics for which to get pricing for.

Bug Fixes

  • Fixed issue where repositories were breaking extensibility by having hard-coded framework entity class names.

  • Fixed issue where if the PriceList uses a different currency than the system default, when reading or updating the PriceDataTier, the currency returned will be the system default instead of the PriceList currency.

  • Fixed issue where some Price Data fields would be reset when a linked or parent field would be updated.


Ratings and Reviews Release Notes for 2.0.2

Bug Fixes

  • Fixed an issue where parent product rating summaries were not being correctly hydrated

    • This includes not having variant summaries reflected in the parent.


Sandbox Release Notes for 2.1.3-GA

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

Important Updates

Important
The changes here are important, please ensure to read through them.
Mitigation of NotificationState buildup
Important
The changes described here are impactful and all clients are advised to read and follow these instructions.

Until now, NotificationAwareDomainMapperMember in SandboxServices was responsible for eagerly creating 'dormant' NotificationState records. These dormant records were effectively 'placeholders' that would not be eligible for send, retry, or even the common 'prune' logic in DataTracking. The expectation was for downstream operations to on-demand initialize these records for send as needed.

However, this led to a large buildup of NotificationState instances in the datastore, since if a transition operation was never performed, its NotificationState would never be cleared.

With this release of SandboxServices, a variety of changes have been introduced to mitigate this problem.

Changes to reduce future buildup

While NotificationAwareDomainMapperMember will still eagerly create 'dormant' notification states, these changes eliminate situations where records were being unnecessarily created.

  • Updated NotificationAwareDomainMapperMember to only initialize NotificationStates on entities where they are relevant rather than on all entities universally. For example, the various transition message states like PROMOTE are only relevant to ChangeSummary, but were being initialized on all the other domains like ChangeSummaryGroup and Sandbox. By being more intentional about when initialization occurs, we can reduce 'dead' bloat.

    Note
    As part of this change, NotificationAwareDomainMapperMember.setupGeneralNotificationContainerStates() is now a no-op since all other state initializations have been moved to other entity-specific methods. Please review the latest state of the class if you have overridden it.
  • Updated NotificationAwareMapperMember to only create SCHEDULE_DEPLOY notification states for ChangeDeploys that are being created with the SCHEDULING status. This reduces the amount of unnecessary bloat being generated. Previously, SCHEDULE_DEPLOY messages were being created for all ChangeDeploys, but only being initialized for send for SCHEDULING ChangeDeploys. With these changes, creation and initialization of the state are both gated on the SCHEDULING status.

Changes to periodically purge dormant states

These changes are focused on adding a scheduled mechanism to purge dormant notification states after a certain time period.

  • Introduced a new SandboxNotificationPruneRepository that will delete 'dormant' NotificationStates whose ULID timestamps match a value older than a configurable cutoff

  • Introduced a new SandboxNotificationPruneService that will engage the repository purge logic on a scheduled basis

Note
Please also see the configuration properties documentation.
Important

As there was no previous mechanism to purge 'dormant' NotificationState records, clients may find that there are a very large number of such records in their SandboxServices datastore. Because of this, the first execution of this purge job may be long-running as it works through removing this buildup. The aforementioned configuration properties around this job may be helpful to review to tune the execution settings.

Changes to make operations flexible on whether eagerly-created NotificationState records must be present

Many existing operations in SandboxServices were assuming the eagerly created NotificationState records were always present, and would not succeed if they were missing. These changes update those operations to gracefully handle the case when no eagerly created records exist. This is particularly important with the introduction of the above-mentioned scheduled purges of dormant states.

  • Modified JpaCustomizedChangeSummaryRepository#batchUpdateNotificationStates to insert new NotificationState records when they are missing instead of assuming they always exist. This assumption was already failing in certain niche cases, but is even more important to resolve with the new purging logic.

  • Introduced a new overload of the updateVals() method in the ChangeSummary service and repository that can insert a notification state if it does not already exist, and update DefaultIndexNotificationService to use this new method. As a result, the flow will still work even if there is no eagerly created BATCH_INDEX_REQUEST notification state available.

  • Introduced a new overload of the updateVals() method in the ChangeDeploy service and repository that can insert a notification state if it does not already exist, and update DefaultDeploymentRequestHandler to use this new method. As a result, the flow will still work even if there is no eagerly created UNSCHEDULE_DEPLOY notification state available. We lean into this by updating NotificationAwareDomainMapperMember to no longer initialize UNSCHEDULE_DEPLOY notification states in any capacity.

Miscellaneous Bug Fixes
  • Addressed an issue where Instant to JDBC Timestamp conversion logic specifically in JpaCustomizedChangeSummaryRepository was using a locally generated timestamp instead of converting the actual input value

  • Consolidated Instant to JDBC Timestamp conversion logic in various repositories to a new JdbcConversionUtils class

  • Fixed a bug where SANDBOX_DELETE notification states were being created, but never initialized in a way that would make them eligible for message send retry. If the explicit first-time notificationManager.handle() call failed, the notification state would never be found by the scheduled retry handler because its fields were insufficiently initialized. With the latest changes, the SANDBOX_DELETE state is now created and initialized only in the NotificationAwareDomainMapperMember.deleteMap() method, which engages at the time someone actually deletes a Sandbox.

  • Fixed a bug where sandboxIndexThreadPoolTaskExecutor bean was not overridable by clients


Scheduled Job Release Notes for 2.1.4-GA

New Features & Notable Changes

Support for Flash Sale
  • A new scheduled job that will purge (hard delete) any PriceDataUsageDetails that are older than 30 days was added, which will run every day at midnight by default. The usage date threshold can be configured via the purgePriceDataUsageDetailsOlderThan scheduled job detail.

  • Please refer to Purge PriceDataUsageDetails Scheduled Job for more details.

Support to view Scheduled Job Execution Details
  • Users can now view the execution details of any scheduled job similar to that of Import/Export and Reindex jobs.

    • Execution details like Trigger Time, Start Time, End Time, Execution Status, Notes and Errors can be viewed. This is supported by the new domain ScheduledJobExecutionDetail.

    • A new flag trackExecutionDetails has been added to the ScheduledJob domain to enable/disable tracking of execution details.

    • On the Admin UI, a new section Execution Details is displayed when the trackExecutionDetails flag is enabled. It contains a grid that displays the execution details of the scheduled job as shown in the screenshot below.

    • This is powered by the new ScheduledJobStartedEvent and ScheduledJobCompletedEvent events that are published when a scheduled job starts and completes respectively.

  • As an example, the PURGE_PRICE_DATA_USAGE_DETAIL scheduled job has been configured OOB to track its execution details. Any scheduled jobs that you desire to track the execution details of would have to be explicitly enable and add logic to opt in.

Execution Details Grid
Steps to opt in for tracking Scheduled Job Execution Details:
  1. Enable the flag trackExecutionDetails for the scheduled job.

  2. Add the following spring cloud stream binding in the service where the scheduled job listener is located:

  3. Add ScheduledJobStartedEventProducer and ScheduledJobCompletedEventProducer to @EnableBinding in the AutoConfiguration class.

  4. Lastly, update the scheduled job listener wire the producers and add the methods for tracking the start and end times of the job.

spring:
    cloud:
        stream:
            bindings:
                scheduledJobStartedEventOutput:
                    destination: scheduledJobStarted
                scheduledJobCompletedEventOutput:
                    destination: scheduledJobCompleted

Bug Fixes

  • Fixed an issue where scheduled jobs could cause an issue with notifications causing connection leaks.


Search Services Release Notes for 2.2.0-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

New Features & Notable Changes

Support Relevancy Rules
Overview

Within Search, the ability to boost documents based on certain field criteria was added. This functionality is supported with the new domain, Relevancy Rules, and is supported per Search Settings. This allows the Relevancy Rules to be configured per Application & settings context (Admin or Storefront).

Additionally, the ability to see boosted scores for Solr documents was added via a parameter on the Search Request.

For further documentation, see:

Permissions

New Permissions are required for working with the new domain in the Admin.

Note
This step is not necessary if running Project Initializer’s data module
To be run against the Auth schema.
-- Scopes
INSERT INTO BLC_SECURITY_SCOPE (ID, NAME, OPEN) VALUES ('-511', 'RELEVANCY_RULE', 'N');
INSERT INTO BLC_SECURITY_SCOPE (ID, NAME, OPEN) VALUES ('-512', 'RELEVANCY_RULE_GROUP', 'N');

-- Permissions
INSERT INTO BLC_USER_PERMISSION (ID, ARCHIVED, LAST_UPDATED, NAME, IS_ACCOUNT_PERM, USER_ASSIGNABLE) VALUES ('-515', 'N', '1970-01-01 00:00:00.000000', 'ALL_RELEVANCY_RULE', 'N', 'Y');
INSERT INTO BLC_USER_PERMISSION (ID, ARCHIVED, LAST_UPDATED, NAME, IS_ACCOUNT_PERM, USER_ASSIGNABLE) VALUES ('-516', 'N', '1970-01-01 00:00:00.000000', 'READ_RELEVANCY_RULE', 'N', 'Y');
INSERT INTO BLC_USER_PERMISSION (ID, ARCHIVED, LAST_UPDATED, NAME, IS_ACCOUNT_PERM, USER_ASSIGNABLE) VALUES ('-517', 'N', '1970-01-01 00:00:00.000000', 'ALL_RELEVANCY_RULE_GROUP', 'N', 'Y');
INSERT INTO BLC_USER_PERMISSION (ID, ARCHIVED, LAST_UPDATED, NAME, IS_ACCOUNT_PERM, USER_ASSIGNABLE) VALUES ('-518', 'N', '1970-01-01 00:00:00.000000', 'READ_RELEVANCY_RULE_GROUP', 'N', 'Y');

-- Permissions Scopes
INSERT INTO BLC_PERMISSION_SCOPE (ID, PERMISSION, IS_PERMISSION_ROOT, SCOPE_ID) VALUES ('-511', 'RELEVANCY_RULE', 'Y', '-511');
INSERT INTO BLC_PERMISSION_SCOPE (ID, PERMISSION, IS_PERMISSION_ROOT, SCOPE_ID) VALUES ('-512', 'RELEVANCY_RULE_GROUP', 'Y', '-512');

-- Role Permissions
-- Full Access
INSERT INTO BLC_ROLE_PERMISSION_XREF (ROLE_ID, PERMISSION_ID) VALUES ('-2', '-515');
INSERT INTO BLC_ROLE_PERMISSION_XREF (ROLE_ID, PERMISSION_ID) VALUES ('-2', '-517');
-- Partial Access
INSERT INTO BLC_ROLE_PERMISSION_XREF (ROLE_ID, PERMISSION_ID) VALUES ('-1', '-516');
INSERT INTO BLC_ROLE_PERMISSION_XREF (ROLE_ID, PERMISSION_ID) VALUES ('-1', '-518');

-- Client Scopes
INSERT INTO BLC_CLIENT_SCOPES (ID, SCOPE) VALUES ('openapi', 'RELEVANCY_RULE');
INSERT INTO BLC_CLIENT_SCOPES (ID, SCOPE) VALUES ('openapi', 'RELEVANCY_RULE_GROUP');

-- Client Permissions
INSERT INTO BLC_CLIENT_PERMISSIONS (ID, PERMISSION) VALUES ('openapi', 'ALL_RELEVANCY_RULE');
INSERT INTO BLC_CLIENT_PERMISSIONS (ID, PERMISSION) VALUES ('openapi', 'ALL_RELEVANCY_RULE_GROUP');
Recommendation Engine
  • Add backend support in Search for handling the Recommendation Engine.

    • This introduces new domains and inter-service calls utilized by the Recommendation Engine to be utilized in search operation e.g. the SearchRecommendation domain or the ExternalRecommendationProvider. See the Recommendation Engine documentation for more details.

Additional New Features & Notable Changes
  • Automatically delete Facets and Sort options after deleting a related Field.

    • The broadleaf.search.auto-delete-related-search-entities=true property is used to enable or disable this feature. It is enabled by default.

  • Added a configurable delay between start times of indexer threads to spline CPU spikes during the initial launch of index thread executors

    • The broadleaf.indexer.pause-between-threads-start property is introduced, default is 2000 ms

  • Added additional customizability around Field Sorts.

    • Field Sorts can now be individually labeled for ascending and descending options and can be restricted to only ascending or only descending.

  • Added additional event handling for indexing products so they can correctly show up in the back end sorting views before promoting.

Enhancements

  • Added a delay between the start of indexing threads to reduce overlap of threads occurring at the same time.

  • Replaced instances of isForceCatalogForFetch with isForceFilterByCatalogIncludeInheritance due to deprecation.

    • This should be updated in any customizations when upgrading to this version.

  • Added logic and changelogs to allow Search to utilize applicationName and apply narrowing to it.

    • This is mainly utilized to help functionality around Tenant level order views.

    • Updates the BLC_FIELD table changelog so the entries can correctly be populated.

  • Added an optimization which determines if microservice interlink requests should be optimized with a direct method call when the targeted service is colocated in the same flexpackage. This saves on expenses related to socket creation, json serialization/deserialization, and SSL encryption and handshake.

    • Utilizes an optional property broadleaf.indexer.catalog.service.loopbackOptimizationEnabled which is enabled by default.

    • This is must be paired with a property outlined in 2.0.5 MicroExtensionCommon.

Bug Fixes

  • Fixed an issue where pending marketplace catalogs would not surface products in the Admin application for the parent.

  • Removed wildcard characters from groupIndexableType equals filters to prevent the filter from acting as a "like" instead of "equals".

  • Fixed a bug where a decoder would throw an error when encountering a % for a Solr filter.

  • Added the ability to override locale in search requests to fix an issue where translations would not show up for Facets in the Admin list grids.

  • Fixed a NPE issue in the DefaultDocumentBuilderHelper where a rootObject could be null and unchecked.

  • Fix search of products from marketplace catalogs with pending status in admin and storefront context


Shipping Release Notes for 2.0.2

Enhancements

  • Update DiscriminatedProperties to utilize CaseInsensitiveMap when binding application and tenant ID property key prefixes This ensures properties supplied via YAML vs environment variables are not treated as separate properties purely due to a case mismatch.


Tenant Services Release Notes for 2.1.4-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

New Features & Notable Changes

  • Added new field DEFAULT_APPLICATION_ID to the BLC_TENANT table. The field value is used to pre-select application on user sign in. This setting can be overridden on user level. Makes sense only when user has access to applications and has applications assigned.

Enhancements

  • Removed the Content > Profiles view from the admin.

    • This view is chiefly utilized by Tenant users to configure profiles for Applications and did not make sense to surface to application level admins.

Bug Fixes

  • Added null handling on CatalogRef filters to prevent null value issues when reading from the DB.

Vendor Catalogs assigned in an Application’s Isolated Catalogs
Important

This is only relevant if broadleaf.common.data.application.configuration.allow-vendor-catalog-in-application-isolated-catalogs is enabled. Most clients do not use this feature, and can ignore these changes.

As of TenantServices 1.7.15+, 2.0.1+, and 2.1.0+, when a vendor catalog is assigned as one of an application’s isolated catalogs, the implicit catalog created for the relationship will also have its Catalog.vendorRef set to match its parent.

With these changes, we also included a migration script, which is responsible for ensuring any existing implicit catalogs in the datastore also have their vendorRef values correctly initialized.

If you have not already done so at the time you upgraded to one of those previous versions, please ensure to run that migration script now (it should still work on the current release). The changes in the current release rely on the datastore state being correct.

In the current release:

  • Updated the metadata to automatically filter/include vendor catalogs in the lookup results when assigning catalogs to an application, depending on the value of broadleaf.common.data.application.configuration.allow-vendor-catalog-in-application-isolated-catalogs

    • If you were previously overriding the metadata for this purpose, you can now remove your customizations as the default lookup should handle both scenarios

  • Relax the validations around vendor catalog assignments as isolated catalogs

    • Vendor catalogs can now be 'visible as assigned'

    • Vendor catalogs no longer have to be 'excluded from add'

Upgrade Guide

Migration notes
Note
If using liquibase to pull in base Broadleaf changelogs, then it is not necessary to manually run this script.
Add column for Admin User default timezone
ALTER TABLE TENANT.BLC_TENANT ADD DEFAULT_APPLICATION_ID VARCHAR(36);

Vendor Release Notes for 2.0.2

Enhancements

  • Removed a dependency for common-translation that was being unused.

Tax Provider Libraries

Payment Integration Libraries

Adyen Release Notes for 1.0.2

New Features & Notable Changes

  • Webhook handler changes to support CAPTURE_FAILED, REFUND_FAILED, and REFUND_REVERSED webhook events.

Bug Fixes

  • Fixed a bug where Adyen Paypal Express Checkout was using subtotal instead of transaction total to account for discounts.

  • Fixed Adyen provider URL configuration issues.

  • Fixed an issue when the "paymentPspReference" value is incorrectly set when using the AUTHORIZE_AND_CAPTURE transactions with 3ds verification or other external interaction.

  • Use REQUIRES_HOSTED_PAYMENT_PAGE_INTERACTION failure type instead of REQUIRES_EXTERNAL_INTERACTION to fix an issue with Klarna payments.

  • Fixed an issue where the failure type is incorrectly determined for the Klarna payment.

  • Added fix for webhook handling of Authorize & Capture Transaction type during transaction result updates.

Common Libraries

Unresolved directive in full-content.adoc - include::../common-libraries/common-libraries-2.0.6.adoc[leveloffset=2]

Extension Modules