Xendit is deprecating the v2 invoice and card-charge endpoints. Checkout now redirects to the Xendit-hosted payment link, and the inline card form and SDK are removed. Existing v2 tokens can still be charged. Check any customisation of the Xendit card form.
Invoice and order contact widgets now show the partner's additional identifier when VAT is empty. The context key show_vat is renamed show_identifier, so update custom views that pass it.
The reversal wizard now passes the original entry's currency rate to the credit note, so reversing a foreign-currency invoice no longer creates exchange differences.
With delivery platforms such as UrbanPiper, an incoming order could reload drafts just as a payment was validated. The next customer's products then landed on the order that had just been paid.
Loading paid orders no longer refetches every sibling variant with inline images on each filter change. With large configurable products this was a multi-megabyte response.
Marking move lines as picked now uses two writes instead of one per move. On a picking with thousands of moves, 8 of the 8.2 seconds of button_validate went to re-running automation rules on each write.
Before killing a worker that hit its time limit, the server now sends it SIGQUIT. The log then shows the request path and the exact line being processed, which is usually the cause of a stuck request or cron job.
The ORM now adds a hint that lets PostgreSQL turn LEFT JOINs on optional many2one fields into INNER JOINs for positive conditions. This gives the query planner more join orders to choose from.