Skip to main content
Arrow Backward IconBack to Overview

Core 2.0.748

July 30, 2024

Released on all test and acceptance environments on July 30, 2024

Will be released to production in EUW and ASE on August 5, 2024*

Will be released to production in CUS on August 6, 2024*


release notes image

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 new Content-Security-Policy header with value: default-src 'none'; frame-ancestors 'none'
  • By entering comma-separated values for Cors:AccessControlAllowOrigin (defaults to null), EVA's Access-Control-Allow-Origin response header will now only echo the request header Origin 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.

Sample CreateUserRequirementRequest
{
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.

Sample Script

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.

Sample
{
"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
},
...
]
}
Addition 16-08-24

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
Impact descriptions

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.