Breakingβ
No breaking changes.
Complianceβ
π¬π§ United Kingdom
β Total ex. tax changed to Subtotalβ
The Total ex. tax property in the UK's thermal receipt template has been changed into Subtotal.
π Duplicate receipts in Local modeβ
Sales made while in Local mode in countries with generic auditing providers will now automatically have a duplicate receipt printed for archiving purposes.
Details
Generic countries:
- Netherlands
- United Kingdom
- Ireland
- South Africa
- New Zealand
- Macau
- Hong Kong
- Denmark
- Switzerland
Countries which are currently still using the Whitelabel providers, but which will move to generic:
- Oman
- Bahrain
- Jordan
- United Arab Emirates
- Japan
Securityβ
π Force new security headers when downloading blobsβ
To prevent potential security issues from malicious phishing blobs, EVA can now optionally force clients to download non-media blob types - instead of attempting to render them.
This is enabled only by opting in, by setting Blobs:PreventInlineDisposition
to true.
Details
This optional security measure helps protect EVA users from malicious phishing blobs by forcing their clients to download these blobs, instead of attempting to render them. To achieve this, EVA now returns a Content-Disposition
header with value Inline for all media blob types, but for all others return Attachment, which forces that file download modal.
Additionally, some browsers may not blindly accept the mime type EVA proposes, but instead sniff for the actual mime type and make decisions based on that - which is why this change also introduces an X-Content-Type-Options
header with value Nosniff to prevent this. This will block attackers from uploading a text/html
blob and tell EVA it's an image/png
, which would force the above Content-Disposition
to inline, but then the browser could sniff it to be a HTML page and open it regardless.
π CORS response header settingsβ
EVA now allows for standard CORS response headers by means of two settings.
While it can be tested, we do not recommend their use in Production environments as of yet.
Details
- By setting
Cors:ContentSecurityPolicy
to true (defaults to false), EVA will always reply with a newContent-Security-Policy
header with value: default-src 'none'; frame-ancestors 'none' - By entering comma-separated values for
Cors:AccessControlAllowOrigin
(defaults to null), EVA'sAccess-Control-Allow-Origin
response header will now only echo the request headerOrigin
if it is present in this whitelisted set of configured values.
Propertiesβ
π PreCountedDifference propertyβ
For the sake of displaying how much quantity has changed during a Zoned Cycle Count, we've added a new property called PreCountedDifference to the ListZonedCycleCounts
service.
Details
The value displayed in the PreCountedDifference property will be calculated as follows:
- PreCountedQuantity - ExpectedPreCountedQuantity
If too much has been counted, the value will be positive. If too little has been counted, the value will be negative.
π TypeName in ListPaymentTransactionsβ
For the sake of adding a Payment type column in the Settlements overview of Admin Suite, we've added the TypeName property to the ListPaymentTransactions
service.
π Placement dates in SearchOrdersβ
To be able to filter orders on when they were placed (instead of just when their order/basket was first created), we are adding the following two properties to SearchOrders
:
- StartPlacementDate
- EndPlacementDate
π SerialNumberConfigurationID in GetProductDetailβ
To allow our front-end Apps to start adding serial number inputs, we've added the SerialNumberConfigurationID property to GetProductDetail
.
Mind that this is not included in the Results object itself, but is delivered alongside of it.
β SearchType in ListProductPropertyTypesβ
To allow for returning all searchable fields in a single call, we are adding a flag property SearchTypeMatchingMethod to ListProductPropertyTypes
.
Details
This new property in turn will affect the existing property SearchType in ListProductPropertyTypes
.
The property SearchTypeMatchingMethod can either be MatchesAll or MatchesAtLeastOne. The default is MatchesAll, as this was the way the service already worked originally.
Passing MatchesAll retrieves ProductPropertyTypes that have all of the passed flags set, while passing MatchesAtLeastOne retrieves the ones that have at least one of the passed flags set.
π AccountTypeID in UserRequirementsβ
The UserRequirements
related services and script now allow for including an AccountTypeID.
This allows you to apply requirements to specific account types.
Details
UserRequirements
CRUD services (CreateUserRequirement, UpdateUserRequirement, etc.) now have an optional AccountTypeID.
- When set, the requirement only applies to that specific type.
- When not set, it applies to all account types.
{
UserRequirementSetID: 1,
Display: true,
Preferred: true,
Property: "FirstName",
RequiredFor: 1, // Create
UserType: 2, // Customer
AccountType: 0, // Standard
}
The AccountType is also exposed in scripting via the UserVariable.
extend UserRequirementForCreate
set outputValue to true
if User.AccountType = 'Incognito' then
set outputValue to false
end
output outputValue
π Currency in ListProductCostPriceLedgerβ
To ensure the product cost price ledger can display the right comma's and such, the ListProductCostPriceLedger
now includes the Currency property.
Servicesβ
π New service: PushDiscountCouponβ
To make it possible to attach coupons to a user, we are adding a new service: PushDiscountCoupon
.
Details
You can attach an existing coupon to a user by means of the following properties in PushDiscountCoupon
:
- DiscountID
- UserID
- Coupon
- IsActive
- MaximumUsage
- ValidFrom
- ValidTill
- OrderID β nullable
Note that this creates one connection per Coupon to a User at a time - it is not meant to be used for creating connections in bulk.
{
"DiscountID": "DiscountBackendID_XYZ", -- required
"Coupons": [
{
"UserID": "User_xyz", -- can be null
"OrderID": "Order_xyz", -- can be null
"CouponCode": "SUMMERSALE20" -- required
"IsActive": true -- required
"MaximumUsage": 1 -- can be null
},
...
]
}
For the sake of clarity: this service is not to be used for updating coupons.
Settingsβ
π ParseBarcodeβ
We are introducing a new, optional way of how ParseBarcode
can handle serial numbers/barcodes which can be activated by setting SerialNumberBarcodeHandler:Enabled
to true.
Currently, if the ParseBarcode
does not find an exact match with a serial number, it will return Type: "NONE".
By setting the new SerialNumberBarcodeHandler:Enabled
to true however, the service will return several kinds of types and, if applicable, SerialNumberConfigurationID and ProductID.
Details
The following scenarios show what exactly the service might return:
- If
ParseBarcode
is called for a barcode that matches a SerialNumberConfigurationID while the SerialNumber was not yet registered, EVA returns the following:- Type: "SERIAL_NUMBER and the matching SerialNumberConfigurationID
- If
ParseBarcode
is called for a barcode that matches a SerialNumberConfigurationID while the SerialNumber was already registered as a product in stock, EVA returns the following:- Type: "SERIAL_NUMBER, the ProductID and the matching SerialNumberConfigurationID
- If
ParseBarcode
is called for a barcode that matches a SerialNumberConfigurationID while the SerialNumber was already registered as a sold product, EVA returns the following:- Type: "SERIAL_NUMBER, the ProductID and the matching SerialNumberConfigurationID
- If
ParseBarcode
is called for a barcode that matches multiple SerialNumberConfigurationID's, EVA returns the following:- an array containing all matching Configurations
- If
ParseBarcode
is called for a barcode that matches a SerialNumber for a product for which the Configuration was just changed, EVA returns the following:- the updated SerialNumberConfigurationID
- If
ParseBarcode
is called for a product barcode that matches a SerialNumberConfigurationID and it also matches the Product barcode, EVA returns the following:- Type: "SERIAL_NUMBER"
- If
ParseBarcode
is called for a product barcode that does NOT match any of the SerialNumberConfigurationID's but it does match the Product barcode, EVA returns the following:- Type: "PRODUCT_BARCODE"
- If
ParseBarcode
is called for a barcode that matches a SerialNumberConfiguration but also a user, EVA returns the following:- Type: "USER_CUSTOMID
- If
ParseBarcode
is called for a barcode that matches a SerialNumberConfiguration but also a station, EVA returns the following:- Type: "STATION
- If
ParseBarcode
is called for a barcode that matches a SerialNumberConfiguration but also an order, EVA returns the following:- Type: "ORDER"
β Removal of IgnoreConsumerInvoiceFiscalIDRequirementβ
We've removed the setting IgnoreConsumerInvoiceFiscalIDRequirement
since it is now redundant from a compliance perspective.
Other topicsβ
π InvoicedOrderLinePriceCorrection functionalityβ
To improve on the Price corrections change in Drop 71, we are now adding a new functionality to EVA that will determine whether a user is allowed to make such price changes: InvoicedOrderLinePriceCorrection.
Only users with that permission, or elevated permission, will be able to make price corrections from now on.
β Limits on suspended order durationβ
Because Suspended orders are processed on every order completion, we want to ensure the number of such orders does not keep growing indefinitely. Therefore, any order given the Suspended state will be resumed automatically after three months.
β Financial period reportsβ
First off: Interbranch and RTS orders will now be filtered out from PeriodClosingReports.
Secondly: the recently added Financial period blobs, which are created upon closing of a financial period, are now added to the Financial periods Data lake export as well.
β No packing slip for in-store ordersβ
While orders which are shipped "over the counter" are technically Ship lines, the packing slip which EVA auto-generates is redundant in this case. For that reason, EVA will no longer be generating packing unnecessary packing slips.
Details
Packing slips will no longer be generated for the following order types:
- CarryOut
- Reserve via POS
- Order via POS
- Delivery via POS
- Returns
To be extra clear, packing slips WILL be generated in the following situations:
- Delivery created via Admin Suite
- Interstore
π New stencil: StockReservationCancellationβ
We have added a new stencil template to EVA called StockReservationCancellation. This template will trigger when all lines in the C&C task are cancelled and as such allow for an automated informing of the customer of the cancellation.
This template contains the same properties as the existing StockReservation template.
Fixesβ
- Fixed an issue where creating an interaction would not lead to the correct case status being displayed.
- The ID of the stencil used will now also be displayed in case of receipts.
- Fixed an issue where a Gift with Product did no go through the right stock/assortment check.
Deprecationsβ
π Introducedβ
These deprecations are now announced for the first time. Usage of these services and/or fields will return the appropriate EVA-Warnings
header.
Deprecatedβ
Highestβ
- HighestΒ EVA.Core.Services.OrganizationUnits.GetOrganizationUnitsStructure is deprecated and will be removed in 2.0.812: Use GetOrganizationUnitsHierarchy instead. The functionalities have been stripped from that service, these can be found in GetAuthorizationStructure..
- GetOrganizationUnitsStructure
- HighestΒ EVA.Core.Services.OrganizationUnits.GetOrganizationUnitsStructureResponse is deprecated and will be removed in 2.0.812: The GetOrganizationUnitsStructure has been replaced by GetOrganizationUnitsHierarchy..
- GetOrganizationUnitsStructureResponse
Highβ
- HighΒ ID is deprecated and will be removed in 2.0.780: Use theΒ
Url
Β instead.- LiveGuardSyncGeneralByBlobResponse.ID
π« Effectiveβ
These deprecations are now effective. As of now, these services and/or fields are no longer available in EVA and can no longer be used.
Deprecatedβ
Highβ
- HighΒ PageConfig.Filter.StatusID is deprecated since 2.0.748: This is the old way of providing a status, use the enum property Status instead..
- ListRevisions.PageConfig.Filter.StatusID
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.