Skip to main content
Arrow Backward IconBack to Overview

Core 2.0.735

April 30, 2024

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

Will be released to production in EUW and ASE on May 6, 2024*

Will be released to production in CUS on May 7, 2024*


release notes image

Breaking‍

No breaking changes.

Settings & functionalities‍

πŸ†• Matching settings to functionalities​

A new batch of settings have had functionalities attached.

You can read more about the details below, or check the affected settings directly.

This batch of settings & functionalies was intended to go to Test with Core drop 2.0.734, and to Production with this week's drop. Instead it's introduced to Test now, and will be going to Production next week with Core drop 2.0.736. This change is not impacting the flow for any following batches.

Details

Context: We intend for each setting to be linked to a specific functionality within EVA. This ensures that only designated roles will have the ability to modify certain settings, allowing for more precise control over your environments.

Example: For instance, the setting APIGiftCard:BaseUrl will be associated with the functionality named GiftCardConfiguration.

Implementation Plan: Given the extensive nature of EVA's settings (approximately 1500 in total), we will be rolling these out in batches, once every EVA Drop - effectively once every four weeks. The first and second batch of these adjustments have already been included in EVA Core drop 2.0.726 and 2.0.730.

Timeline: This new batch of changes is now available on your Test and Acceptance environments. These changes will be deployed to Production environments next week with EVA Core drop 2.0.736 (May 7). We anticipate completing this process over approximately 6 more EVA Drops until all settings are included.

Action Required: We encourage you to review this batch of settings, which are already documented on our Docs. Ensure that the roles assigned within your organization align appropriately with the functionalities necessary for access to these settings.

List of settings combined with functionalities in this EVA Core Drop
SettingFunctionality
Blobs:DefaultLifeTimeNone
Blobs:Placeholder:ProductNone
Blobs:StorageLocationNone
BlobStorage:PathNone
BlockInvalidPhoneNumbersAddresses
BoardingPass:RequiredFlights
Bonver:EnableGiftcardEANNone
Bonver:EnableShipmentNotificationNone
Bonver:EndlessAisleFeatureNone
Bonver:Ftp:HostNone
Bonver:Ftp:PasswordNone
Bonver:Ftp:UsernameNone
Bonver:IncludeDeliveryFieldsNone
Bonver:IncludeHairTempleFieldsNone
Bringly:ApiKeyCarrier
Bringly:EnabledCarrier
Bringly:EndpointCarrier
Buckaroo:Api:IsLivePaymentMethods
Buckaroo:Api:SecretKeyPaymentMethods
Buckaroo:Api:WebsiteKeyPaymentMethods
BusinessIsDebtorDebtors
BusyThreadCountReportThresholdNone
BusyThreadReportFrequencyNone
CalculateAmountsBasedOnExTaxOrders
CanCancelPlacedBundleLinesOrders
CashDeposit:ValidateSafeBalanceFinancialPeriods
CashDrawer:CashDrawerBlockingRequestFinancialPeriods
CashDrawer:IpCheckDisabledFinancialPeriods
CashDrawer:RequireRemarkFinancialPeriods
CashDrawer:TimeoutFinancialPeriods
CashJournal:Deposit:AllowOnlyFromSafeFinancialPeriods
CashJournal:MaximalAllowedDeviationFinancialPeriods
CashJournal:MinimalAllowedDeviationFinancialPeriods
CashPayment:AllowOnDeliveryOrdersPaymentMethods
CashPayment:OpenCashDrawerPaymentMethods
CreateFinancialEventsFinancialEvents
CRM:Refund:AutoReturnGiftWrappingCostsRefunds
CRM:Refund:AutoReturnShippingCostsRefunds
CRM:Return:AutocompletionDelayReturnOrder
CRM:Return:AutoPlaceOnReturnReturnOrder
CRM:Return:RequireEmployeeVerificationReturnOrder
CRM:Return:RequiresOrderSecurityCodeReturnOrder
CRM:ReturnOrder:HandlerReturnOrder
CRM:Refund:AutoRefundOnReturnReturnOrder
Customer:BlockChangeEmailAddressCustomers
Customer:RequireEmailVerification:ExpireTimeCustomers
CustomerCanRegisterCustomers
CustomerOrganizationUnitsProviderNone
CustomFields:EnableDefaultEditableByNoneCustomFields
CustomFields:ValuesBasedOnDataTypeCustomFields
CycleCount:DaysOfWeekCycleCounts
CycleCount:OnlyCreatePastDueCycleCounts
CycleCount:ProductLimitCycleCounts
CycleCountAfterReservationOrderLineCancelledCycleCounts
DailyClockReport:EmailToWorkHours
DefaultCountryIDOrganizationUnitSettings
DefaultFulfillmentOrganizationUnitIDOrderFulfillments
DefaultLanguageIDOrganizationUnitSettings
DefaultLineActionType:ShopOrganizationUnitSettings
DefaultLineActionType:WebshopOrganizationUnitSettings
DefaultProductSearchTemplateRefreshIntervalInHoursProductSearches
DefaultShopProximityRangeOrderFulfillments
DefaultTransportationTimeCalculatorOrders
DeliveryDaysOfWeekOrganizationUnitSettings
GenerateCycleCountAfterNegativeStockAutoCorrectCycleCounts
MaxCycleCountsPerShopCycleCounts
MaxCycleCountsPerShopPerDayCycleCounts
CycleCount:LastStockMutationThresholdCycleCounts
WorkedHours:CorrectionTimeWorkedHours
Demandware:InventoryIDNone
Demandware:SetOriginatingOnPickupNone
Demandware:Temp:FixedBundleProductIDsNone
Demandware:WarehouseOrganizationUnit:DENone
Demandware:WarehouseOrganizationUnit:ESNone
Demandware:WarehouseOrganizationUnit:GBNone
Demandware:WarehouseOrganizationUnit:HKNone
Demandware:WarehouseOrganizationUnit:NLNone
Demandware:WarehouseOrganizationUnit:SENone
Devices:DeviceProxyNone
Devices:EnableTransportLoggingNone
Devices:UseFlagsTypeNone
Devices:UseNewConfigurationQrForCFDNone
Devices:UseNewConfigurationQrForCFD2None
Devices:UsePrintrNone
Devices:UseShinyNone
DeviceStatus:DailyReportEmailToNone
DisableEmailsNone
DisableLineActionTypeSwitchForShippedLinesShipmentSettings
DisableManualStockCreationWhenUsingFifoAdjustStock
DisableThrottlingNone
DisableUserAddressesAddresses
Discount:DisabledActionsDiscount
Discount:DisabledConditionsDiscount
Discounts:AllowOnReturnOrdersDiscount
Discounts:AllowPriceRulesForInterbranchOrdersDiscount
Discount:EnableVerboseLoggingDiscount
Discount:EnableVerboseLoyaltyLoggingDiscount
Discounts:FreezeAfterPlaceOrderDiscount
Discounts:PickProductAction:FilterOptionsOnStockAvailabilityDiscount
Discounts:PickProductAction:ForceDefaultProductWhenOutOffStockDiscount
Discounts:PickProductAction:PrefixDescriptionOnProductLineDiscount
Discount:PseudoCouponCodeSuffixDiscount
Discounts:RequireVerificationDiscount
Discounts:UnsetShippingMethodDiscount
DisplayRecommendedRetailPricePricing
ElasticOrderSearch:FulfillmentStatus:EnabledNone
ElasticOrderSearch:OrderDefinitionEnabledNone
ElasticOrderSearch:ShippingMethodEnabledNone
ElasticOrderSearch:SyncOrderWithoutLinesNone
ElasticOrderSearch:UserAgentAggregations:EnabledNone
Email:Testing:DisableSmtpAuthenticationNone
Email:Testing:ForceSendEmailInTestModeNone
Email:Testing:OverrideRecipientAddressNone
EmailTransportNone
EnableCostAndPurchasePriceViewingFunctionalitiesPricing
EnableTransferOrdersOrders
EPay:ClientPrefixPaymentMethods
EPay:PasswordPaymentMethods
EPay:PrimaryEnvironmentPaymentMethods
EPay:SecondaryEnvironmentPaymentMethods
EPay:TerminalIDPaymentMethods
EPay:UsernamePaymentMethods
EVAPay:BaseUrlPaymentMethods
EVAPay:ExpirationTimePaymentMethods
EVAPay:ReminderTimePaymentMethods
EVAPay:SubjectPaymentMethods
EvaPos:UrlNone
EvaSuite:UrlNone
EventExportConfigurations:AllowLocalEndpointsEventExportConfiguration
EventExports:EnabledEventExportConfiguration
EventExports:EnableEventExportConfigurationsEventExportConfiguration
EventExports:EndpointEventExportConfiguration
EventExports:TokenEventExportConfiguration
ExternalIDResolveLeniencyThresholdNone
Fashioncheque:ApiKeyPaymentMethods
Fashioncheque:ApiKeySecretPaymentMethods
Fashioncheque:BaseUrlPaymentMethods
Fashioncheque:MerchantIDPaymentMethods
FileTranfer:Ftp:ReadWriteTimeoutNone
FileTranfer:Ftp:TimeoutNone
FinancialPeriod:ExpectedOpenDaysFinancialPeriods
FinancialPeriod:GenerateNumberFinancialPeriods
FinancialPeriod:Ledgers:ExportToBackendSystemFinancialPeriods
FinancialPeriod:RequirePCIQuestionFinancialPeriods
FinancialPeriodGeneralLedgerExportAuthorizationFinancialPeriods
FinancialPeriodGeneralLedgerExportEndpointFinancialPeriods
Firebase:ServiceAccountNone
FixerIO:AccessKeyExchangeRates
FixerIO:EndPointExchangeRates
Franchiser:MailBookingsReportNone
FullStockCount:AutoStartFullStockCountOnCreateAdjustStock
FullStockCount:DefaultRecountIntervalAdjustStock
FullStockCount:ExternalCompletionThresholdAdjustStock
FunctionalityCategory:ProductionFileUrlNone
FunctionalityCategory:TestFileUrlNone
FutureAvailability:IgnoreOverduePurchaseOrderThresholdInDaysOrderFulfillments
FutureAvailability:PercentageAvailableOrderFulfillments
FutureAvailability:ProductCapacityPlansPrefigureTimeSpanOrderFulfillments
FutureAvailability:PurchaseOrderProcessingTimeInDaysOrderFulfillments
GC:AutoMemoryProfiler:EnabledNone
GC:AutoMemoryProfiler:ThresholdMbNone
GCP:DataLake:BucketNone
GCP:DataLake:CredentialNone
GCP:DataLake:FolderNone

Specific topic‍

πŸ†• New data lake export: Assortments​

It's now possible to optionally export assortments.

Details

By setting DataLake:ExportAssortments explicitly to true, you will be able to export assortments to your data lake.

Additionally, the following cron taksk must be set: EVA.DataLake.Tasks.ExportAssortments (see Scheduled tasks).

You can expect the consequent file path to look as follows: EVA.DataLake.Tasks.ExportAssortments.

Sample

{
"GenerationTime": "2024-04-24T14:50:07.550575Z",
"OrganizationUnits": [
{
"ID": "c750d885-c05a-586a-b43c-f367bd3afc2e",
"Name": "EVA",
"BackendID": "EVA"
},
{
"ID": "0442007b-4703-5cb5-add4-be50558480d9",
"Name": "Webshop NL",
"BackendID": "WEBSHOP_NL"
}
],
"Products": [
{
"ProductID": 1,
"ProductBackendID": "PRODUCT_1",
"Start": null,
"End": null,
"ProductStatus": ["DisableDelivery", "UseUp"]
},
{
"ProductID": 987,
"ProductBackendID": null,
"Start": "2024-04-01T00:00:00.000",
"End": null,
"ProductStatus": []
}
]
}

βœ… Sentinel.local​

We are dropping support for sentinel.local from the mDNS service. This means afterwards only watchtower.local will resolve on the local network to the address of the Watchtower.

This requires no further action from you.

πŸ†• ReservationCleanupTaskCreated order ledger​

EVA features a new order ledger type: ReservationCleanupTaskCreated. It will be triggered whenever a ReservationCleanupTask is made throughout EVA.

πŸ†• GenerateUserCouponOnOrderReturn extension point​

We're introducing a new extension point that will allow for generating coupons on order returns: GenerateUserCouponOnOrderReturn.

Details

This extension point will trigger when return orders are paid/refunded.

The extension point exposes the return order details in the same generic structure as we do throughout the scripting functionality.

The expected output of the script is a discount BackendID that will be used to generate a coupon. The discount is required to be of trigger type Coupon(2) and have CouponsGeneratedByOtherDiscount: true.

Sample

extend GenerateUserCouponOnOrderReturn

set discountBackendID to ''

if Order.TotalAmountInTax < 0 and Order.TotalAmountInTax > -10 then
set discountBackendID to 'discount-coupons-from-return-script'
end

output discountBackendID

πŸ†• Repair OU type​

To allow for filtering on OUs capable of repairing items, we are adding it as an additional OU type called RepairCenter.

πŸ†• Optional security improvement: ExternalLogin functionality​

We are introducing an additional, optional new security feature, based on the ExternalLogin functionality.

By enabling it, EVA will add an additional check to your employee login and reject it in specific cases when the employee matches certain conditions, such as not being on a store's WiFi connection.

Details

Current flow​

When you log in as employee, and you have not selected a specific store to log in to, EVA will search for stores in your subnet and auto-select these if found. However, if none were found, then EVA will search for stores that you have the ExternalLogin functionality for and auto-select these if found. When this also yields nothing, EVA will either reject your login call, or will attempt to downgrade your login attempt and proceed as customer.

Optional flow​

With this ticket, a new setting Security:RequireExternalLoginFunctionality is introduced, which does not modify the above, but adds an additional check when true (false by default). This check will reject your login with a NotAuthorized when all of these conditions are met:

  • You log in as employee
  • You log in to a store
  • Your IP address is not in the subnet of the store
  • (You are not on a watchtower)
  • You do not have the ExternalLogin functionality in this store

The β€œstore” in these conditions can either be a store submitted with the Login call explicitly, or auto-selected by any of the automatic rules (like these above).

All Login calls are governed by this (e.g. username/password logins, but also PIN logins).

Not enabled by default​

To reiterate: we are not enforcing this extra layer of security, because it does limit your employees in how they can use EVA. For example in case of 4G failovers when your store's internet connection is failing and you have no Watchtower to catch that.

But it's something you can opt in for, so employees can only log in to stores when they are connected to that very store's WIFI connection, limiting the attack surface for outsiders.

Cases‍

βœ… Webhook events for cases​

To make it easier to differentiate which webhook events are relevant for Case updates, without having to resort to calling GetCaseByID for minor details, we are making several changes to the Cases webhook and the extension points related to cases.

Extension point details

The EventExport extension point now includes the following data to increase scripting options:

  • Status
  • Topic
  • Related items
  • Custom fields
  • Originating OU
  • and more.

Moreover, these options are not limited to the EventExport extension point, but apply to all scripts that hold a Case variable.

Keep in mind that you can check all available variables of extension points via the ParseScript service.

Webhook details

We are increasing the events that trigger the Updated type of the Cases target webhook:

  • Adding/removing products from cases
  • Adding/removing blobs from cases

βœ… Delaying communication on cases​

We now prevent customers from receiving multiple emails related to their case in a small timeframe.

Details

To prevent customers from receiving multiple mails, such as a "Your case is updated" email, we will now only send out communication after 1 minute of no activity has passed.

Additionally, the CaseUpdatedEmail stencil now includes a condition to prevent it from being sent based on activity in the first minute after the case has been created.

Compliance‍

πŸ†• Compliance changes​


πŸ‡ͺπŸ‡Έ Compliance changes in Spain

πŸ†• Time zone and timestamp on thermal receipts​

The thermal receipt stencils has been updated to accomodate the different time zones across Spain, including Canary Islands). Further, the new timestamp format is DD.MM.YYYY - HH:mm:ss, replacing the previous format, DD.MM.YYYY, HH:mm:ss.

πŸ†• Retrying failed privacy removal requests​

In exceptional cases a privacy removal request might fail. EVA now has a mechanism in place to retry such requests automatically.

Details

Until now EVA had no automatic ways of retrying failed privacy removal requests, which is why we've added a new task mechanism which will retry a failed request based on the following interval:

  • 1 hour
  • 3 hours
  • following day - this goes up to 5 days.

If the request still fails after these 5 days, the request will have a new status called Failed (3) to indicate it could not be processed.

πŸ†• E-invoicing history​

We will be adding modification history (read: Interaction logs) to e-invoicing by introducing a new ledger on invoices.

Details

Whenever a change is made to the InvoiceUserData a new entry is added to the InvoiceLedgers.

An entry in the InvoiceLedgers table looks as follows:

Sample

{
"InvoiceID": 10141,
"TypeID": 35,
"TypeName": "UserEmailAddress",
"OldValue": "[email protected]",
"NewValue": "[email protected]",
"CreatedByID": 224,
"CreatedByFullName": "Pedro Pascal",
"CreationTime": "2024-04-26T10:54:02.283Z"
}

The partial Footer in the Norwegian CertifiedInvoice PDF stencil is now properly referenced.

CreditNoteNumber​

To ensure compliance with Italian law when working with GlobalBlue, we have added the CreditNoteNumber to credit note invoices.

Properties‍

βœ… Support for large sets in GWP and ProductSetFreeProduct​

Right now large products sets in a Gift with Purchase and ProductSetFreeProduct action conditions can get an "Out of memory exception". To prevent such issues, we will be taking 2 steps:

  • Enforcing a limit on the results returned
  • Support for handling such larger product sets

Both are a WIP and not in place yet.

Details

As a first step to have EVA handle these situations, we have:

  • Added 2 new booleans in the PrefigureDiscounts service
    • HasMoreDiscountPickProductOptions
    • HasMoreLineDiscountProductOptions

These allow us to indicate if there are more options available than loaded in DiscountPickProductOptions and LineDiscountProductOptions respectively.

  • SetPickProductDiscountOptionsForOrderLine and SetDiscountProductOption now accept a boolean called DisallowSelectionOutsideProductOptions.

We currently allow employees to overwrite the selection with any product (when you need a replacement because no available option is in stock for example). With the new boolean, it’s possible to opt out of that and enforce that the selection always needs to be within the options.

The next steps will be to enforce a lower limit on the options in PrefigureDiscounts and introduce new services for fetching the options paginated.

To expose when external user search is available, we now display it as a ExternalUserProvider:Enabled property in the GetApplicationConfiguration service.

This property will return true if the the setting ExternalUserProvider:BaseUrl has been configured.

Services‍

πŸ†• Data lake exports and backfill​

We have made changes several changes to the Data lake functionality and the DataLakeBackfill service, both in regards to users.

Details

The DataLakeBackfill service now includes UserBatches (6), which allows you to manually re-export users based on a From and To property.

You can now change the default way in which users are exported in the Data lake exports by using these two settings:

  • The DataLake:ExportUsersInBatches setting - which defaults to false - lets you start exporting regular user changes as batches instead.
    • This batch time is currently set to 5 seconds.
  • The DataLake:ExportUsersIndividually setting - which defaults to true - lets you disable exporting of regular user changes individually (which is helpful if you rely on the above).

By having these two settings you can first test the batched users and then move to batched users exclusively.

Lastly: we have added both CreationTime LastModificationTime to users which goes for both the individually exported users as well as the batched ones.

πŸ†• Validating discounts​

Certain changes to discount are not possible, for example changing the action of already used discount. Such a change is performed by UpdateDiscount in the back end, but errors from this service are not shown in Admin Suite.

To facilitate the display of such errors in the front end, we've added an ID property to ValidateDiscount. This will allow for specifying the discount's ID and will result in any errors being shown in the front end.

πŸ†• Unresolved products in async pricelists​

We are introducing two new services to EVA to allow for the async processing of price lists and the display of any unresolved products.

Details

The new service PushPriceList_Async will be used for processing price lists in an async manner, which will replace (and allow for deprecation of) the current PushPriceList's WaitForCompletion property.

This service will return an async result ID, which can then be used in the new PushPriceList_AsyncResult service. This service's response will give you the PriceListID and any unresolved products.

Sample
{
"PriceListID": 75,
"UnknownProducts": [
"935353000011",
"9035300013",
"3535",
"DTEASLFLSA",
"XXXSDFSF"
],
"Metadata": {
"ExternalIDs": {},
"IsAsyncResultAvailable": true
}
}

Settings‍

πŸ†• Choosing a shipping moment​

To allow for more customization options for shipping moments of service products, we're introducing Shipment:ShipRemainingLinesWithLastInStoreShipment.

This setting defaults to true, which means current behavior is unchanged.

Details

Currently, service products are shipped with the last shipment of an order. While this works well in case of orders consisting out of just carry-out and service products, it can cause confusing situations when it comes to more mixed orders.

When the order consists of carry-out, delivery and service products, the service products will not be shipped until the delivery products are. In that case, a receipt will state these service products as To be shipped, even though the services have already been rendered.

By setting Shipment:ShipRemainingLinesWithLastInStoreShipment to false, the current behavior will change to ship these kinds of products with the first shipment - in this case the carry-out.

πŸ†• Reservation task for orders waiting on stock​

To ensure any orders which are waiting on stock won't be delayed by missing out on available stock, we are introducing two settings. These settings will result in reservation tasks being created once the right stock comes in.

Details
  • By setting Orders:Reservations:UseStockReservationTasksOnReceipt to true, a reservation task is created automatically once you receive the PO which was created on behalf of the order (type) order in question.
  • By setting StockReservation:ReactivateReservationTasksOnSufficientStock to true on the pickup OU, a reservation task will be triggered automatically when enough stock is available to fulfill the reservation task for the order in question - even when the PO created for that order is not yet received.

The latter process runs based on a nightly background task, but can be triggered/scheduled as well through the ActivateReservationTasksWithAvailableStock task.

πŸ†• Improved replenishment proposals​

We are introducing a setting which will allow EVA to automatically cancel old (unplaced) replenishment proposals and create new ones better suited to the current situation.

Details
The following new flow can only be enabled by setting `Replenishment:CancelPreviousUnplacedPurchaseOrders` to *true*.

When set to true, previous replenishment orders (last 14 days) will be cancelled before the new orders are created for a new replenishment proposal. This is because replenishment takes incoming orders into account - so old replenishment orders influence your new replenishment.

The flow when set to false:

  • Replenishment creates order to order 6 products
  • 1 product gets sold
  • Next day: replenishment creates order to order 1 product

When set to true:

  • Replenishment creates order to order 6 products
  • 1 product gets sold
  • Next day: previous order gets cancelled (if not placed) and replenishment creates order to order 7 products

Fixes‍

  • In some specific cases duplicate customer Updated events were sent out.
  • We have removed the limitation on ModifyQuantityOrdered for products with serial requirements.

    the service can now be used to increase the amount of order lines in orders in case of giftcard products - as introduced in Core drop 2.0.733

  • The ListRepairs pagination was fixed.
  • The billing address included in the export will no longer be incorrectly changed to the address of the OU instead of the customer's.
  • The SearchProducts call will no longer include products in the assortment which had failed to be deleted during the corresponding deletion process.
  • Vertex and Avatax will have correct taxes applied in edge cases concerning bundles and invoices.

Deprecations‍

⚑ Removed from typings​

These deprecations are now halfway through their deprecation timeline. As of now, these services and/or fields will no longer be exposed by our typings.

Deprecated​

Medium​

  • MediumΒ Status is deprecated and will be removed in 2.0.751: No longer used..
    • GetGiftCardOptionsResponse.Status
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.