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
Setting | Functionality |
---|---|
Blobs:DefaultLifeTime | None |
Blobs:Placeholder:Product | None |
Blobs:StorageLocation | None |
BlobStorage:Path | None |
BlockInvalidPhoneNumbers | Addresses |
BoardingPass:Required | Flights |
Bonver:EnableGiftcardEAN | None |
Bonver:EnableShipmentNotification | None |
Bonver:EndlessAisleFeature | None |
Bonver:Ftp:Host | None |
Bonver:Ftp:Password | None |
Bonver:Ftp:Username | None |
Bonver:IncludeDeliveryFields | None |
Bonver:IncludeHairTempleFields | None |
Bringly:ApiKey | Carrier |
Bringly:Enabled | Carrier |
Bringly:Endpoint | Carrier |
Buckaroo:Api:IsLive | PaymentMethods |
Buckaroo:Api:SecretKey | PaymentMethods |
Buckaroo:Api:WebsiteKey | PaymentMethods |
BusinessIsDebtor | Debtors |
BusyThreadCountReportThreshold | None |
BusyThreadReportFrequency | None |
CalculateAmountsBasedOnExTax | Orders |
CanCancelPlacedBundleLines | Orders |
CashDeposit:ValidateSafeBalance | FinancialPeriods |
CashDrawer:CashDrawerBlockingRequest | FinancialPeriods |
CashDrawer:IpCheckDisabled | FinancialPeriods |
CashDrawer:RequireRemark | FinancialPeriods |
CashDrawer:Timeout | FinancialPeriods |
CashJournal:Deposit:AllowOnlyFromSafe | FinancialPeriods |
CashJournal:MaximalAllowedDeviation | FinancialPeriods |
CashJournal:MinimalAllowedDeviation | FinancialPeriods |
CashPayment:AllowOnDeliveryOrders | PaymentMethods |
CashPayment:OpenCashDrawer | PaymentMethods |
CreateFinancialEvents | FinancialEvents |
CRM:Refund:AutoReturnGiftWrappingCosts | Refunds |
CRM:Refund:AutoReturnShippingCosts | Refunds |
CRM:Return:AutocompletionDelay | ReturnOrder |
CRM:Return:AutoPlaceOnReturn | ReturnOrder |
CRM:Return:RequireEmployeeVerification | ReturnOrder |
CRM:Return:RequiresOrderSecurityCode | ReturnOrder |
CRM:ReturnOrder:Handler | ReturnOrder |
CRM:Refund:AutoRefundOnReturn | ReturnOrder |
Customer:BlockChangeEmailAddress | Customers |
Customer:RequireEmailVerification:ExpireTime | Customers |
CustomerCanRegister | Customers |
CustomerOrganizationUnitsProvider | None |
CustomFields:EnableDefaultEditableByNone | CustomFields |
CustomFields:ValuesBasedOnDataType | CustomFields |
CycleCount:DaysOfWeek | CycleCounts |
CycleCount:OnlyCreatePastDue | CycleCounts |
CycleCount:ProductLimit | CycleCounts |
CycleCountAfterReservationOrderLineCancelled | CycleCounts |
DailyClockReport:EmailTo | WorkHours |
DefaultCountryID | OrganizationUnitSettings |
DefaultFulfillmentOrganizationUnitID | OrderFulfillments |
DefaultLanguageID | OrganizationUnitSettings |
DefaultLineActionType:Shop | OrganizationUnitSettings |
DefaultLineActionType:Webshop | OrganizationUnitSettings |
DefaultProductSearchTemplateRefreshIntervalInHours | ProductSearches |
DefaultShopProximityRange | OrderFulfillments |
DefaultTransportationTimeCalculator | Orders |
DeliveryDaysOfWeek | OrganizationUnitSettings |
GenerateCycleCountAfterNegativeStockAutoCorrect | CycleCounts |
MaxCycleCountsPerShop | CycleCounts |
MaxCycleCountsPerShopPerDay | CycleCounts |
CycleCount:LastStockMutationThreshold | CycleCounts |
WorkedHours:CorrectionTime | WorkedHours |
Demandware:InventoryID | None |
Demandware:SetOriginatingOnPickup | None |
Demandware:Temp:FixedBundleProductIDs | None |
Demandware:WarehouseOrganizationUnit:DE | None |
Demandware:WarehouseOrganizationUnit:ES | None |
Demandware:WarehouseOrganizationUnit:GB | None |
Demandware:WarehouseOrganizationUnit:HK | None |
Demandware:WarehouseOrganizationUnit:NL | None |
Demandware:WarehouseOrganizationUnit:SE | None |
Devices:DeviceProxy | None |
Devices:EnableTransportLogging | None |
Devices:UseFlagsType | None |
Devices:UseNewConfigurationQrForCFD | None |
Devices:UseNewConfigurationQrForCFD2 | None |
Devices:UsePrintr | None |
Devices:UseShiny | None |
DeviceStatus:DailyReportEmailTo | None |
DisableEmails | None |
DisableLineActionTypeSwitchForShippedLines | ShipmentSettings |
DisableManualStockCreationWhenUsingFifo | AdjustStock |
DisableThrottling | None |
DisableUserAddresses | Addresses |
Discount:DisabledActions | Discount |
Discount:DisabledConditions | Discount |
Discounts:AllowOnReturnOrders | Discount |
Discounts:AllowPriceRulesForInterbranchOrders | Discount |
Discount:EnableVerboseLogging | Discount |
Discount:EnableVerboseLoyaltyLogging | Discount |
Discounts:FreezeAfterPlaceOrder | Discount |
Discounts:PickProductAction:FilterOptionsOnStockAvailability | Discount |
Discounts:PickProductAction:ForceDefaultProductWhenOutOffStock | Discount |
Discounts:PickProductAction:PrefixDescriptionOnProductLine | Discount |
Discount:PseudoCouponCodeSuffix | Discount |
Discounts:RequireVerification | Discount |
Discounts:UnsetShippingMethod | Discount |
DisplayRecommendedRetailPrice | Pricing |
ElasticOrderSearch:FulfillmentStatus:Enabled | None |
ElasticOrderSearch:OrderDefinitionEnabled | None |
ElasticOrderSearch:ShippingMethodEnabled | None |
ElasticOrderSearch:SyncOrderWithoutLines | None |
ElasticOrderSearch:UserAgentAggregations:Enabled | None |
Email:Testing:DisableSmtpAuthentication | None |
Email:Testing:ForceSendEmailInTestMode | None |
Email:Testing:OverrideRecipientAddress | None |
EmailTransport | None |
EnableCostAndPurchasePriceViewingFunctionalities | Pricing |
EnableTransferOrders | Orders |
EPay:ClientPrefix | PaymentMethods |
EPay:Password | PaymentMethods |
EPay:PrimaryEnvironment | PaymentMethods |
EPay:SecondaryEnvironment | PaymentMethods |
EPay:TerminalID | PaymentMethods |
EPay:Username | PaymentMethods |
EVAPay:BaseUrl | PaymentMethods |
EVAPay:ExpirationTime | PaymentMethods |
EVAPay:ReminderTime | PaymentMethods |
EVAPay:Subject | PaymentMethods |
EvaPos:Url | None |
EvaSuite:Url | None |
EventExportConfigurations:AllowLocalEndpoints | EventExportConfiguration |
EventExports:Enabled | EventExportConfiguration |
EventExports:EnableEventExportConfigurations | EventExportConfiguration |
EventExports:Endpoint | EventExportConfiguration |
EventExports:Token | EventExportConfiguration |
ExternalIDResolveLeniencyThreshold | None |
Fashioncheque:ApiKey | PaymentMethods |
Fashioncheque:ApiKeySecret | PaymentMethods |
Fashioncheque:BaseUrl | PaymentMethods |
Fashioncheque:MerchantID | PaymentMethods |
FileTranfer:Ftp:ReadWriteTimeout | None |
FileTranfer:Ftp:Timeout | None |
FinancialPeriod:ExpectedOpenDays | FinancialPeriods |
FinancialPeriod:GenerateNumber | FinancialPeriods |
FinancialPeriod:Ledgers:ExportToBackendSystem | FinancialPeriods |
FinancialPeriod:RequirePCIQuestion | FinancialPeriods |
FinancialPeriodGeneralLedgerExportAuthorization | FinancialPeriods |
FinancialPeriodGeneralLedgerExportEndpoint | FinancialPeriods |
Firebase:ServiceAccount | None |
FixerIO:AccessKey | ExchangeRates |
FixerIO:EndPoint | ExchangeRates |
Franchiser:MailBookingsReport | None |
FullStockCount:AutoStartFullStockCountOnCreate | AdjustStock |
FullStockCount:DefaultRecountInterval | AdjustStock |
FullStockCount:ExternalCompletionThreshold | AdjustStock |
FunctionalityCategory:ProductionFileUrl | None |
FunctionalityCategory:TestFileUrl | None |
FutureAvailability:IgnoreOverduePurchaseOrderThresholdInDays | OrderFulfillments |
FutureAvailability:PercentageAvailable | OrderFulfillments |
FutureAvailability:ProductCapacityPlansPrefigureTimeSpan | OrderFulfillments |
FutureAvailability:PurchaseOrderProcessingTimeInDays | OrderFulfillments |
GC:AutoMemoryProfiler:Enabled | None |
GC:AutoMemoryProfiler:ThresholdMb | None |
GCP:DataLake:Bucket | None |
GCP:DataLake:Credential | None |
GCP:DataLake:Folder | None |
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
.
{
"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.
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:
{
"InvoiceID": 10141,
"TypeID": 35,
"TypeName": "UserEmailAddress",
"OldValue": "[email protected]",
"NewValue": "[email protected]",
"CreatedByID": 224,
"CreatedByFullName": "Pedro Pascal",
"CreationTime": "2024-04-26T10:54:02.283Z"
}
β Including partial Footer in NO CertifiedInvoice PDFβ
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
andSetDiscountProductOption
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.
π Exposing external user searchβ
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.
{
"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
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
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.