Breaking
No breaking changes.
Compliance
🇷🇴 Romania
- The payment types from the fiscal printer have been mapped to the corresponding payment types in EVA, resulting in the correct payment types being displayed on the fiscal receipts.
🇲🇴 Macau
✅ Optional ZipCode
- The ZipCode property for Macau can now be made optional by including its country code MO in the existing
Addresses:ZipCodeOptionalCountries
setting.
See also the Compliance in Macau documentation.
🇨🇳 China
✅ Certified invoice thermal stencil
We have made several updates to the CertifiedInvoice thermal stencil for China.
- The header text is changed from 销售单 to 销售单号
- The following label for quantity has been added: 数量
- We've added a Unit price column to the product grid: 单价
- The VAT table below the total amount is removed from the receipt
🇬🇧 United Kingdom
✅ Document type logic
Instead of having to choose one over the other, the Document type logic for the United Kingdom now works side-by-side with the address requirements necessary for complying with the UK's Anti money laundering protocol.
🇦🇪 UAE
Updated Stencils and Translations
We've updated the UAE stencils for Certified Invoices, including both thermal and PDF formats, along with the Arabic translations.
✅ Fixes
- Solved the case where refunds failed on non-fiscal stations.
Properties
🆕 FairMarketValue
For the proper handling of discounts by Vertex, EVA can now additionally send in a new property: FairMarketValue.
This property is sent in alongside the UnitPrice and ExtendedPrice properties when a discount is involved. The ExtendedPrice, which equals UnitPrice * Quantity, will be set to 0 in that case.
Sample
{
"lineItemId": "130439",
"lineItemNumber": 2,
"product": {
// Details about the product go here
},
"quantity": {
// Details about the quantity go here
},
"unitPrice": 125,
"fairMarketValue": 125,
"extendedPrice": 0,
"inputTotalTax": null,
"seller": {
// Details about the seller go here
},
"customer": {
// Details about the customer go here
}
}
🆕 AllowPartialPayment
To allow for more customization in loyalty program payments, EVA now incldudes a new AllowPartialPayment property in all relevant services.
Services
ListLoyaltyProgramPaymentTypes
GetLoyaltyProgramPaymentType
CreateLoyaltyProgramPaymentType
UpdateLoyaltyProgramPaymentType
When the AllowPartialPayment property is set to false (which is the default) you can only pay with the calculated amount, while setting it to true allows you to pay up until the calculated amount (though not over).
🆕 Quantities in Cookbook
To facilitate the verification of suspense accounts, we're adding the following two properties to both Cookbook 1.0 and Cookbook 2.0:
- OrderLine.QuantityShipped
- StockMutation.MutationQuantity
🆕 Customer context in prefigure discount
The PrefigureDiscount
service now accepts a UserID which the prefigure can consequently use for displaying more relevant discounts. This entails hiding discounts the customer has already used for example.
When an OrderID is provided, the UserID is ignored. If neither an OrderID nor UserID is given, EVA falls back to the logged-in user - so long as it's not an anonymous user or employee.
Customers cannot provide a UserID of another user.
Services
🆕 GetUserBoughtProductBySerialNumber
We're introducing a new service to EVA called GetUserBoughtProductBySerialNumber
.
By using this service with a serial number, EVA will return the current owner of that serial number.
Sample
{
"SerialNumber": "6952398409",
"IncludedProductProperties": [
"product_type"
]
}
{
"ID": 51,
"UserID": 1946,
"UserFullName": "Pedro Pascal",
"Product": {
"product_id": 107,
"product_type": 1
},
"SerialNumber": "69523984069",
"SerialNumberRegistrationStatus": 1,
"LastPurchaseDate": "2024-08-01T00:00:00Z",
"LastPurchasedQuantity": 0,
"TotalPurchasedQuantity": 0,
"IsUnderWarranty": true,
"WarrantyExpiryDate": "2024-09-04T00:00:00Z",
"AdditionalWarrantyInfo": "Under warranty today + 5 days.",
"Details": [
{
"ID": 1317,
"FromExternal": false,
"PurchaseDate": "2024-08-01T00:00:00Z",
"PurchasedQuantity": 0
}
]
}
🆕 Enforcing MaxAmountPerOrder
The cash limit specified in the MaxAmountPerOrder property, introduced in Core drop 2.0.750, is now enforced in the CreatePayment
service.
🆕 PushSerialNumbers
EVA now features a new service called PushSerialNumbers
.
Details
This Async
API-user only service allows for pushing in serial numbers with the following properties:
- OrganizationUnitID (optional)
- ProductID (required)
- SerialNumber (required)
- StockLabelID (optional)
It requires the user to have the SerialNumber.Create functionality.
🆕 Expose payment method name and ID
To allow for better payment method grouping in our front ends, we are exposing PaymentMethodName and PaymentMethodID in the in AvailablePaymentMethods object.
Details
More specifically, EVA will now display PaymentMethodName and PaymentMethodID in the Types object of AvailablePaymentMethods.
This is available in the following services:
GetAvailablePaymentMethods
GetOrder
GetShoppingCart
with AdditionalOrderDataOptions.IncludeAvailablePaymentMethods = trueGetAvailableRefundPaymentMethodsForOrder
🆕 Registering OU in UserBoughtProducts
While timezones were already taken into account for user-bought products, this used to be based on the context of the user. To support more precise timezones for user-bought products however, EVA now allows for registering the organization unit via RegisterUserBoughtProduct
, AddUserBoughtProductDetail
and PushUserBoughtProduct
.
If no OU is provided, EVA will fall back to the current OU (with the order OU being leading, if applicable).
This OU is included in the UserBoughtProducts Data lake export.
Sample
{
"OrganizationUnitID": "53",
"PurchaseDate": "2024-09-02T22:00:00.000Z",
"PurchasedQuantity": 2,
"UserID": 262,
"ProductID": 108,
"SerialNumber": "53248",
"IsUnderWarranty": false
}
{
"UserID": 262,
"BoughtProducts": [
{
"ProductID": 107,
"SerialNumber": "523423",
"IsUnderWarranty": true,
"WarrantyExpiryDate": "2024-09-18T22:00:00.000Z",
"AdditionalWarrantyInfo": "YES",
"Details": [
{
"OrganizationUnitID": "ALMERE-HOUT",
"PurchaseDate": "2024-09-02T22:00:00.000Z",
"PurchasedQuantity": 5
}
]
}
]
}
{
"GenerationTime": "2024-09-04T07:54:36.3373155Z",
"ID": "euw763",
"ProductID": "euw107",
"ProductName": "Example SerialNumber RequiredForSale",
"SerialNumber": "523423",
"IsUnderWarranty": true,
"WarrantyExpiryDate": "2024-09-18T22:00:00Z",
"AdditionalWarrantyInfo": "YES",
"UserID": "euw262",
"UserBackendID": "507f6278-eb0e-49f2-8397-8706388d1695",
"UserCountryID": "NL",
"LastPurchasedQuantity": 5,
"TotalPurchasedQuantity": 5,
"IsDeleted": false,
"Details": [
{
"OrganizationUnitID": "euw53",
"PurchaseDate": "2024-09-02T22:00:00Z",
"PurchasedQuantity": 5
}
]
}
✅ Pricelist BackendID
You can now create a new price list using a BackendID from a previously deleted price list.
Settings
🆕 Deprecated EnableUserBoughtProductFunctionalities setting
The EnableUserBoughtProductFunctionalities
setting, which was used to manage user access to the user bought products features, has been deprecated. EVA will now automatically handle functionalities and scopes related to this service without requiring this setting.
This change adheres to our standard approach and simplifies the process. Originally, this setting served as a temporary measure when features and scopes for user bought products were first implemented.
🆕 SplitUserSubscriptions
EVA now features a new setting called SplitUserSubscriptions
.
This setting allows you to indicate if loyalty subscriptions need to be returned in subscription related service calls or not. While the setting remains in its default state, (false), EVA will return the loyalty subscriptions in service calls.
For more detailed docs from a front-end point of view, please see Separate Loyalty Programs from Subscriptions.
Other topics
✅ Loyalty program payments
To prevent issues with refunds in combination with loyalty payments, EVA now prevents users from removing customers from orders which already have loyalty payments.
Additionally, users can now go back and forth between checkout and basket, while making changes which impact payment types without issues.
🆕 Succesful logins in event exports
To facilitate tracking when a user made their last (successful) login to your ecom website, the Customer event export now features an additional event type: login_successful.
Fixes
- Fixed a bug that caused an error message to appear when deleting a user, even though the user had the appropriate permissions.
- Fixed an error caused by using multiple payment types with loyalty programs.
- Fixed a bug where payment retries on abandoned orders using a loyalty program payment type with Up to Tax, excluded tax from the due payment amount.
- Resolved an issue where the User budget payment option in a loyalty program failed to cover all eligible products listed in the selected price list during budget deductions.
- Fixed an issue where switching pages based on the
SearchStockMutations
service could have a delay. - Fixed an issue where serial number validation could incorrectly result in an error when providing new/unknown serial numbers via
ShipExternalOrder
. - Fixed an issue with mixed orders and the nShift plugin.
- An RTS cleanup task (read: stock movement) is now also triggered for lines in RTS orders that are partially shipped.
- EVA now prevents updating cash handlers for OUs with a currency different from the main currency, as well as the creation of OU currencies with existing cash handler/currency combinations.
- Fixed a race condition issue when scripting with OrderCustomStatus/Type.
- Made a change to visibility groups (VG) to allow stores to see purchase orders which are sent to them from warehouses in a different VG (which normally speaking can't see each others orders).
Deprecations
⚡ Removed from typings
These deprecations and requirements are halfway to coming into effect. With these deprecations, the following services and/or fields are no longer be exposed by our typings. Failing to enter the mentioned required fields after the specified core release, will mean the services will no longer work.
Deprecated
High
- High IsDeleted is deprecated and will be removed in 2.0.769: All users in the response are not deleted.
- GetUserResponse.IsDeleted
Required
High
- High Field Products.VariationValues.Value is required and will be enforced as such in 2.0.769.
- ImportProducts.Products.VariationValues.Value
🚫 Effective
These property and setting deprecations and are now effective. As of now, these services and/or fields are no longer available in EVA and can no longer be used.
Setting
Highest
- Highest ClientDeprecations:MaxVersionsBehind is deprecated since 2.0.753 - ignoring configuration and forcing value null: If set, when the current EVA version is the set amount behind used
EVA-API-Version
request header, app settingClientDeprecations:IsOutdated
returnsfalse
and requests are denied withClientRefusedException
errors. - Highest ClientDeprecations:WarnVersionsBehind is deprecated since 2.0.753 - ignoring configuration and forcing value null: If set, when the current EVA version is the set amount behind used
EVA-API-Version
request header, yieldsclient_is_outdated
warning response headers.
Deprecated
High
- High PageConfig.Filter.Hash is deprecated since 2.0.753: Use Hashes instead..
- ListPrivacyRemovalRequests.PageConfig.Filter.Hash
- High PageConfig.Filter.UserID is deprecated since 2.0.753: Use UserIDs instead..
- ListPrivacyRemovalRequests.PageConfig.Filter.UserID
For more details on the impact categories, please see When are changes communicated?.
Release dates may vary
The exact date for deploying a Core release to production environments may vary. See How we handle Core releases for more details.