Breaking
Security settings
Security settings have been grouped and now all require a new (unscoped) functionality Security, which is not automatically granted when this release hits.
While this will not impact your current setting configuration, for future changes your environment administrators will have to manually attach this new functionality to the corresponding roles authorized to make calls on application security in your organization. Please note that support is available: if you are unsure, you can request New Black to assist you.
Compliance
🇷🇴 Romania
✅ Requiring full company information
To ensure the creation of proper invoices in Romania, EVA now requires users to complete the following data when creating companies:
- Company name
- VAT number
- Billing address
- Address 1
- Zipcode
- City
🇵🇱 Poland
🆕 Email Receipts for Polish Customers
To complement the NTH integration in Poland, EVA can now optionally send consumers in Poland their digital receipts via email for e-commerce orders.
Details
New setting: EVA will now send digital receipts by email based on a new setting
Auditing:Poland:NTH:MailEReceiptToCustomer
. By default, this setting is false. When set to true, EVA will email the receipt to the customer's email address.Configuration
- Email Template: The email uses the existing ElectronicReceipt stencil template, which needs to be set up and maintained by you. The eReceipt will be included as an attachment.
- SMTP Settings: These need to be configured at the root level since there is no middleware context.
- Template Hierarchy: The ElectronicReceipt stencil should be set for the specific Organization Unit (OU) where the order was made. If not found, EVA will search up the OU hierarchy and use the default stencil message if necessary.
- Disable Emails Setting: Ensure
DisableEmails
is set to false on the webshop or inherited from the root.
Failure Case: The only failure scenario is if the ElectronicReceipt stencil is explicitly disabled.
Failure notifications: NTH Rejection/Failure Notification Emails now use a new
NTHRejectionNotification
stencil template for further customization.
🇩🇪 Germany and 🇦🇹 Austria - Action may be required
🆕 CleanUpFiskalyResourcesTask
We are introducing the task CleanUpFiskalyResourcesTask. This task, which can be applied for only one OU at a time, updates the SCU(Signature Creation Unit) for closed stores with the status Decommissioned in the Fiskaly dashboard.
The user that performed the task will be emailed the SyncStoresWithFiskaly template.
This template has also been updated: its IsSynced property is replaced with the Status property, which properly reflects all states. Please update your template to be able to get the right update when this template is triggered.
🇸🇪 Sweden
✅ Mandatory billing details
Billing details are now mandatory in Sweden when the following user information is present:
- Company name
- VAT number
Properties
✅ CreatedByID
You can now view all employee IDs involved in a sale, including those who created the order, added/sold products and who completed the sale. This ensures accurate tracking of contributions for commission purposes.
Details
With this update, the GetOrder
and payment-transaction related APIs such GetPaymentTransaction
now include the CreatedByID property for all users involved in a transaction. This means:
- When the same individual creates and completes an order, the same ID is shown in both order and payment data.
- If different users are involved in selling items and completing payments, their respective IDs are displayed separately.
- In cases where multiple users are involved in selling and completing an order, all relevant IDs are shown in the
GetOrder
andGetPaymentTransactionsForOrder
(and such) responses.
For example:
- an order might be created by employee A;
- two items added by employees by B and C separately;
- payment is done in two different transactions by D and E respectively.
EVA will in this case ensure that the IDs of A-E will be registered, ensuring everyone is recognized for their role in the transaction process.
{
"PaymentTransactions": [
{
"ID": 42522,
"CreatedByID": 703,
"DeviceID": 182,
"OrderID": 76289,
"PaymentDate": "2024-11-01T16:00:36.577Z",
"Amount": 25.0000,
"Status": 10,
"IsConfirmed": true,
"PendingOrConfirmed": true,
"PaidAmount": 25.0000,
"PaymentName": "Cash",
"Change": 0.0000,
"TypeID": 9,
"Type": {
"Code": "CASH",
"Name": "Cash",
"IsRoundingType": false,
"PrintOnDocuments": true
},
"CurrencyID": "EUR",
"ExchangeRate": 1.0,
"Description": "Cash",
"SettledAmount": 0.0000,
"IsSettled": false,
"RequiresCapture": false,
"CaptureMoment": 0,
"HasDispute": false,
"HasUnresolvedDispute": false,
"IsRefund": false,
"IsAuthorizationAdjustment": false,
"IsAuthorizationExpired": false,
"AvailableActions": {
"Cancel": false,
"Refund": false,
"Update": false,
"Approve": false,
"Capture": false
}
},
{
"DeviceSerialNumber": "P400Plus-27547",
"ID": 42523,
"BackendID": "DKG7RTVQN82",
"CreatedByID": 1700,
"DeviceID": 144,
"OrderID": 76289,
"PaymentDate": "2024-11-01T16:01:12.393Z",
"Amount": 30.2300,
"Status": 10,
"IsConfirmed": true,
"PendingOrConfirmed": true,
"PaidAmount": 30.2300,
"PaymentName": "PIN",
"Change": 0.0000,
"TypeID": 3,
"Type": {
"Code": "PIN",
"Name": "PIN",
"IsRoundingType": false,
"PrintOnDocuments": true
},
"CurrencyID": "EUR",
"ExchangeRate": 1.0,
"Description": "PIN",
"SettledAmount": 0.0000,
"IsSettled": false,
"RequiresCapture": false,
"CaptureMoment": 0,
"HasDispute": false,
"HasUnresolvedDispute": false,
"IsRefund": false,
"IsAuthorizationAdjustment": false,
"IsAuthorizationExpired": false,
"AvailableActions": {
"Cancel": false,
"Refund": false,
"Update": false,
"Approve": false,
"Capture": false
}
}
]
}
✅ PrimaryProductIDs / RelatedProductIDs
To accommodate large product sets and and the exposing of group relations, we are refactoring the ProductRelations
services.
Details
We are deprecating the following properties in favor of their plural form for all relevant service responses:
- PrimaryProductID > PrimaryProductIDs (made into an array)
- RelatedProductID > RelatedProductIDs (made into an array) .
This allows for exposing Group relations and a more compact result for Uni- and Bi-dynamic relations.
Note however that this is not effective immediately: we are introducing a new (and immediately deprecated) root level setting called GroupProductRelations
. This new setting acts as an opt-in to this new behavior to allow for backward compatibility.
The following samples are based on the ListProductRelations
service response for dynamic product relations (other services will yield similar results).
// Unidirectional relation between product 1 and products 2, 3. Note that Bi-directional is similar.
// From
"Relations":[
{
"PrimaryProductID":1,
"RelatedProductID":2
},
{
"PrimaryProductID":1,
"RelatedProductID":3
}
]
// To
"Relations":[
{
"PrimaryProductID":1,
"PrimaryProductIDs":[1],
"RelatedProductIDs":[2, 3]
},
]
// Group relation for products 1, 2, 3, queried for product 1.
// From the previous implementation response
"Relations":[
{
"PrimaryProductID":1,
},
]
// To
"Relations":[
{
"PrimaryProductID":null, // No primary product, they are all related to each other
"RelatedProductIDs":[1, 2, 3]
},
]
// Instead of
"Relations":[
{
"PrimaryProductID":1,
"RelatedProductID":2
},
{
"PrimaryProductID":1,
"RelatedProductID":3
}
]
Services
🆕 DownloadStockOverview
We are introducing a new service for the purpose of downloading large stock overviews: DownloadStockOverview
Details
DownloadStockOverview
can be used for downloading a stock overview in the form of an Excel file for multiple OUs or sets.
Requires the functionality stock.view.
This service will be incorporated into Admin Suite for easy access to the overviews.
🆕 Access Foreign Card Data in GetOrder API
You can now access foreign card data for Dynamic Currency Conversion (DCC) transactions through the GetOrder
API.
This update allows you to view original currency amounts, foreign currency payment amounts, and exchange rates for transactions involving foreign cards.
Details
- New Functionality: The
GetOrder
andGetPaymentTransaction
APIs now include data for DCC transactions, providing details such as CurrencyConversions, Amount, Rate, and CurrencyCode. - Access Requirements: This data is available to API users with the PaymentData.View permission.
- Current Limitations:
- This feature is currently implemented only for the Adyen payment processor.
- API users without the PaymentData.View functionality and employees (regardless of the permission) cannot access this data.
- Behavior:
- When the card currency matches the order currency, the CurrencyConversions object is not shown.
- If a foreign currency is used, the conversion details are available whether Adyen or the bank performs the conversion.
- Local Mode: Uses EUR for currency rates when specific rates cannot be retrieved.
{
"PaymentTransaction": {
"ID": 4200,
"BackendID": "P6FLNK",
"DeviceID": 144,
"OrderID": 75620,
"Data": "{\"AuthCode\":\"123456\",\"MerchantAccount\":\"NewBlackPOS\",\"CurrencyConversions\":[{\"Amount\":14.31,\"Rate\":1.4309,\"CurrencyCode\":\"SGD\"}],\"MerchantReference\":\"EVA-70-42\"}",
"PaymentDate": "2024-10-29T15:52:58.47Z",
"Amount": 10.0000,
"Status": 10,
"IsConfirmed": true,
"PendingOrConfirmed": true,
"PaidAmount": 10.0000,
"PaymentName": "VISA",
"Change": 0.0000,
"TypeID": 258,
"Type": {
"Code": "VISA",
"Name": "VISA",
"IsRoundingType": false,
"PrintOnDocuments": false
},
"CurrencyID": "EUR",
"ExchangeRate": 1.0,
"Description": "PIN",
"SettledAmount": 0.0000,
"IsSettled": false,
"RequiresCapture": false,
"CaptureMoment": 0,
"HasDispute": false,
"HasUnresolvedDispute": false,
"IsRefund": false,
"IsAuthorizationAdjustment": false,
"IsAuthorizationExpired": false
}
}
✅ PushReturnOrder
The following change is introduced as part of a bigger development - this feature is not ready for use
We've extended the PushReturnOrder
service with two new properties to allow for creating return offer orders:
- IsOffer -> optional boolean which defaults to false.
- OfferExpirationDate -> nullable dateTime. If not provided, the default value from a setting (which is still upcoming) will apply.
🆕 Serial number support for CompleteReservationCleanupTask
Serial number support has been added for the CompleteReservationCleanupTask
, enabling the functionality to provide or withhold serial numbers based on requirements.
🆕 PushLoyaltyPrograms
To allow for pushing multiple Loyalty programs at once, we are introducing the following service: PushLoyaltyPrograms
.
Details
While this service works similarly to the single service, it's been adjusted for a list of loyalty programs.
It's currently limited to 1000 programs at once.
{
LoyaltyPrograms: [{
// ... same as PushLoyaltyProgram
}],
DisableEventExports: true,
}
// Response
{
SuccessfullyAdjustedLoyaltyPrograms: [{
ID: 1
}],
FailedToAdjustLoyaltyPrograms: [{
BackendID: "some-lp-bid",
ErrorIdentifier: "LoyaltyPrograms:CannotUpdateConditionType"
}]
}
✅ GetAssemblyNameForDeviceTypes
You can now see the assembly name Upos810T as an option when creating or editing a Cash Drawer or Fiscal Thermal Printer in the Admin Suite.
Settings
🆕 Anonymous access
Access to anonymous services can be managed through a new setting: AllowEcommerce
.
This new setting defaults to true, but when set to false it will revoke all public access to all anonymous EVA services.
This can be used in scenarios where your use of the EVA platform is limited only to in-store transactions. However, even in that scenario, some services need to remain publicly available, like Login
and ResetUserPassword
. Those services have therefore been split off and are listed as "public" instead, and as such remain unaffected by the above setting.
So, hence forth, EVA distinguishes between two types of public services; "anonymous" and "public".
✅ Security settings
The defaults of some settings have been adjusted to enhance security.
While existing environments will have their current values inserted into their database through a migration, ensuring they are not affected by this change, we would like to remind you that setting the following values will result in a more secure environment:
- Security:RequireExternalLoginFunctionality now defaults to true
- Security:UseContextIndependentFunctionalityChecksAndFiltering` now defaults to true
- SignalR:ClientAppHub:LimitOnIPAddress now defaults to true
- This new setting ensures the CFD, POS and remote barcode scanner, as well order and session transfers can only run within the subnet of the OU.
Security:AllowLoginWithApiKeys
now defaults to falseMagicLink:Enabled
now defaults to false
Additionally, some legacy settings were cleaned up in the process:
Details
LoginWithIdentificationPin:Length
LoginWithIdentificationPin:CreateLength
LoginWithIdentificationPin:GenerateLength
AllowLegacyAccessControl
AllowOrganizationUnitSelection
CustomerCanRegister
(was replaced withSecurity:AllowEcommerce
)
Other topics
🆕 More DataLakeBackfill types
We are adding the following new types to the DataLakeBackfill
service:
- Stock mutations
- User Tasks
- ZonedCycleCounts
- Shipments
Details
The following list displays all types which are now available for backfilling your Data lake.
- FinancialPeriods = 1
- Orders = 2
- Invoices = 3
- Users = 4
- Discounts = 5
- UserBatches = 6
- Cases = 7
- Shipments = 8
- ZonedCycleCounts = 9
- UserTasks = 10
- StockMutations = 11
Furthermore, we've changed the way EVA handles the date/time for these datapacks: these now correspond to the actual data creation date, rather than the export date.
🆕 Voucher Printing Functionality
The following change is introduced as part of a bigger development - this feature is not ready for use
We're laying the groundworks for printing vouchers directly from your orders, making it easier to manage and distribute promotional coupons.
Details
- New Service:
PrintCouponsForOrder
allows you to print all generated coupons by providing the OrderID and StationID. - Updated Stencils: ThermalReceipt and CertifiedInvoice stencils now include GeneratedCoupons.
- New Stencil: PrintOrderCoupon is used for printing the coupons.
- Document Retrieval:
GetAvailableDocumentsForOrder
now indicates if coupons are available, with the type GeneratedCouponsReceipt. Only the OrderID is required to print coupons, and no discount/coupon metadata is needed.
🆕 Updates to Data lake packages
We're extending the following Data lake packages with a few new properties:
- ZonedCycleCounts
- UserTasks
- Orders
- Stock
Details
The following properties were added to the Datalake exports:
ZonedCycleCounts:
Result.Page.CompletionTime
Result.Page.CreatedByID
Result.Page.CreationTime
Result.Page.OrganizationUnitID
Result.Page.ProductID
Result.Page.IsActive
Result.Page.IsCompleted
ProductBackendID
UserTasks:
CreationTime
Orders:
Result.Lines.Reference
Stock:
StockLabel.ID
StockLabel.Name
Stock mutations:
AutomaticCorrectionQuantity
✅ OU Subnet input
EVA now prevents you from entering faulty subnets for OUs (which could break the Login
flow).
Fixes
- Fixed an issue with the AutoShip feature for Tap to Pay payments.
- We fixed an issue when accessing cases with deleted parent topics.
- We addressed two issues which could cause cycle counts with multiple products to not be created.
- EVA now displays the right error result for a failed
PushCompany
attempt. - Loyalty program users were incorrectly allowed to purchase more than one product at a subscription price despite a
QuantityLimitPerUser
setting. - The tax table was not being populated in the
GetOrder
function for exchange orders when the total amount was zero.
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
High
- High DownloadOverview is deprecated and will be removed in 2.0.794: Use
DownloadStockOverview
instead.- ListStockForOrganizationUnits.DownloadOverview
- High PageConfig.Filter.BackendID is deprecated and will be removed in 2.0.794: Use
ProductIDs
instead.- ListStockForOrganizationUnits.PageConfig.Filter.BackendID
- High PageConfig.Filter.Barcode is deprecated and will be removed in 2.0.794: Use
ProductIDs
instead.- ListStockForOrganizationUnits.PageConfig.Filter.Barcode
- High PageConfig.Filter.CustomID is deprecated and will be removed in 2.0.794: Use
ProductIDs
instead.- ListStockForOrganizationUnits.PageConfig.Filter.CustomID
- High PageConfig.Filter.ProductID is deprecated and will be removed in 2.0.794: Use
ProductIDs
instead.- ListStockForOrganizationUnits.PageConfig.Filter.ProductID
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.