The SCSS that kept fa-* and oi-* classes working was removed when the web client switched to Material Symbols. The new upgrade_code script rewrites icon usages in XML, JS and other files of custom modules. Run it on your addons before upgrading to 20.0.
Depending on the PostgreSQL version, foreign key violations can be raised as RESTRICT violations. The ORM now treats both the same way, and custom code catching only ForeignKeyViolation should do the same.
Warnings about unsupported domain values, such as NewId or records, and about upper-case operators now name the code that built the domain. Run your test suite and outdated patterns in custom modules are easy to find.
The new pos_sumup module pairs SumUp readers and handles payments, cancellations and full or partial refunds through SumUp's cloud API. It is a backport from master.
When several terminals share a provider, for example five Adyen readers, each device can pick its default. The payment screen then shows one button per provider instead of every terminal.
The OdooBot check no longer counts partners on every call, and res.partner.email_normalized gets an index. Before, this was a full table scan once per invoice in the send wizard.
Bookkeepers can now mark an e-invoice that was cancelled on GİB or Nilvera as cancelled in Odoo. Odoo does not report the cancellation to the authorities.