Thursday, August 27, 2026
19 changes · 19.0
Enhancements to existing features
This update adds dedicated UAE overtime work entry types for weekday, night, and overtime day work. It helps payroll teams calculate overtime pay more easily and consistently by using clearer overtime categories in salary rules.
Original PR description
Add UAE overtime work entry types (OVTWD, OVTWDN, OVTOD) to simplify overtime salary rule calculations using `worked_days['<code>'].amount`. Task: 6469393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update makes internal mail tests more resilient when running in parallel test environments. It prevents unusual test data from crashing the test suite, helping maintain smoother validation without changing customer-facing behavior.
Original PR description
If the value needs to be serialized for IPC (cough cough pytest-xdist) and a weirdo sets recordsets as message values, the serialization fails and the test suite crashes. Since this is just subtest identification it shouldn't be too much of an issue. Forward-Port-Of: odoo/odoo#284279 Forward-Port-Of: odoo/odoo#284178
The live chat settings now clarify that automatic chat opening only happens on larger screens. This helps teams avoid confusion when testing on phones or small screens, where visitors must tap the chat button manually.
Original PR description
The 'Open automatically' action only triggers the auto popup on larger screens (`ui.isSmall` is checked in `AutopopupService. allowAutoPopup`). On mobile/small viewports, only the chat button is shown and the visitor must tap it manually. The existing help text does not mention this, which could lead to confusion when the auto popup does not trigger during testing on mobile. Update the field's help text to explicitly state that automatic opening is limited to larger screens. opw-6459279 Forward-Port-Of: odoo/odoo#284785
The UAE localization setup now reuses one shared state mapping instead of rebuilding the same information repeatedly. This reduces small initialization overhead and keeps the implementation simpler, with no expected change to user-facing behavior.
Original PR description
This PR optimizes the `l10n_ae` module by eliminating repetitive code and improving performance during module initialization. The UAE state mapping used by `_get_ae_res_company` and…
This PR optimizes the `l10n_ae` module by eliminating repetitive code and improving performance during module initialization. The UAE state mapping used by `_get_ae_res_company` and `_get_ae_account_fiscal_position` was previously defined separately inside each method. As a result, the same dictionary was recreated on every function call, introducing unnecessary code duplication and runtime overhead. This PR extracts the mapping into a reusable module-level `_AE_STATE_MAPPING` constant. The template methods now reference this shared mapping and dynamically construct the corresponding XML IDs, avoiding repeated dictionary allocation and simplifying the implementation. ### Cause In `_get_ae_res_company` and `_get_ae_account_fiscal_position`, the UAE state mapping dictionary was recreated every time the methods were executed. Since these methods can be called repeatedly during chart of accounts template evaluation, this resulted in unnecessary allocations and duplicated code. ### Fix * Extract the UAE state mapping into a module-level `_AE_STATE_MAPPING` constant. * Reuse the shared mapping across template methods. * Dynamically construct the required XML IDs from the mapping. * Remove duplicated dictionary definitions from individual methods. * Reduce unnecessary object allocation during template evaluation. ### Benchmark The state mapping evaluation was benchmarked over 1,000,000 iterations: | Version | Execution Time | | ------- | -------------: | | Before | 0.0841s | | After | 0.0272s | This results in approximately **68% faster execution** for the benchmarked operation.
Deleting accounts is made faster by adding supporting database indexes used during dependency checks. This reduces delays for businesses managing or cleaning up their accounting records, especially in larger databases.
Original PR description
Without these indexes, the foreign key check when deleting an account can take a long time.
Deleting accounts in German reports is now more efficient. The change adds database indexes that help the system confirm whether an account is referenced, reducing delays during account cleanup.
Original PR description
Without these indexes, the foreign key check when deleting an account can take a long time.
Resolved issues and error corrections
Users auditing accounting reports can now switch between available views, such as pivot, graph, kanban, and list, when opening journal item details from a report cell. This makes it easier to analyze report figures in the format that best supports their review.
Original PR description
Problem: When auditing reports, the audit cell action was only showing the journal items in the list view, and not enabling other view modes (pivot, graph, kanban). Steps to reproduce: 1. Go to Accounting > Reporting > Balance Sheet 2. Click on any cell with a number in the report 3. Notice how the journal items are only shown in the list view, and you cannot switch to other view modes. Cause: The action was hardcoded to only show the list view. opw-6403704 Forward-Port-Of: odoo/enterprise#129214 Forward-Port-Of: odoo/enterprise#128563
The trial balance report no longer shows the unallocated earnings or losses line when it has a zero balance in all columns. This reduces clutter and helps users focus on meaningful financial information.
Original PR description
… zero The unallocated earnings/losses line was displayed even when its balance was zero in every column group, cluttering the report with uninformative rows. We therefore filter out lines whose balance is zero across all column groups.
Appointment invitation emails can now safely include public calendar links without triggering permission errors. This helps ensure attendees receive the expected email invitations reliably.
Original PR description
Since calendar attendee access tokens are restricted to system users, appointment mail templates must sudo token reads when generating public calendar links. This follows the same pattern as the calendar mail templates and avoids an AccessError when rendering attendee invitation emails. ref: https://github.com/odoo/enterprise/commit/88a3cca752a5f726cd0260b485fc93f65a268cf8 Task-4711415
Self-order websocket notifications no longer include full order details. This reduces unnecessary data sharing while keeping order status updates working for customers and staff.
Original PR description
Remove the order data from the websocket notification.
Customers can no longer set optional products on a sales order to zero or negative quantities through the portal. This prevents invalid order lines and keeps quantity adjustments that may reduce an order under salesperson control.
Original PR description
Since the fusion of `sale.order.option` model into `sale.order.line` model, the optional products (editable from portal) lines are not deleted when reaching a quantity of 0 or below. This could allow some customers to set negative quantities, which makes no sense as it's only something that should be set by the salesman if necessary. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix stops users from deleting a card's cover image in a way that leaves the page editor in an inconsistent state. It helps prevent confusing editor behavior and avoids an error that could occur when using the Cover Image options.
Original PR description
It was possible to remove the image inside a card cover while keeping the figure wrapper. The card option would then still consider that there was a cover image even though the image was gone, which could also lead to a traceback. Steps to reproduce: - Insert the `s_three_columns` snippet - Click on the image of one card - Either press "Enter", "Delete", "Backspace" - Hover the "Cover Image" options => The image is removed but the `<figure>` is still there, so the option is still considered active (leading to a traceback) task-6081728 Forward-Port-Of: odoo/odoo#280086
This fixes a display issue in the website builder where resize controls could be hidden behind the sidebar when editing animated page elements. Users can now clearly see and resize selected content, making page editing more reliable.
Original PR description
Steps to reproduce: - Drop a few snippets to make the page scrollable - At the bottom, drop the `s_three_columns` snippet - Click on the last Card - Add an animation "onScroll" (Effect - Slide, Intensity - 100) - Scroll top slightly to hide a part of the card behind the sidebar => The resize overlay is partially hidden The elements `.hb-row` have a z-index of 2, so they appear in front of the overlay which has a z-index of 1. It was decided to fully show the overlay to allow resizing. Keeping the overlay visible in front of the sidebar also allow the user to see where animated element is. task-6476269 Forward-Port-Of: odoo/odoo#282796
Delivery fee lines are now excluded from the Invoiced not Delivered report because they are not physical items to deliver. This prevents accounting teams from seeing incorrect outstanding delivery entries and improves the accuracy of revenue review data.
Original PR description
Issue: --- Delivery lines are included in `invoiced not delivered` report, which is wrong as delivery lines are not deliverable. Steps: 1- Create a SO with a good product and add a delivery line. Set the product line as delivered and create an invoice. 2- Open accounting, and from review tab, open `Invoiced not Delivered`. As you see, delivery lines are included in the report. Fix: --- On stable we could fix it inside `_get_accrual_domain` by checking if `delivery` is installed. On master we need to implement a solution to be able to differentiate the lines that won't be delivered. opw-6360894
This fixes an issue where unsaved translation text could disappear when a user dragged the translation dialog. Users can now reposition the dialog without losing work they have just entered, improving reliability when editing multilingual content.
Original PR description
Step to reproduce: - have atleast two language and install sale - open any product, hover over product, and click on Translation button - Enter a value for one of language - drag the dialog Observation: - we lose the data, we just entered and fallback to original data Cause: - Inputs used `t-att-value="term.value"`, bound to original data. Since this content is passed to Dialog via slot, it is rendered/patched as part of Dialog's render cycle, - Dragging updates Dialog's state, triggering a patch that re-evaluated the slotted template and reset input values (which comes from `term.value`) Fix: - bind value to `updatedTerms[term.id] ?? term.value` so edits survive patches triggered by the parent Dialog opw-6431521 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283514
This update fixes an internal automated test for mail mentions so it waits for the right suggestion list instead of being interrupted by unrelated status updates. It helps keep Odoo's validation pipeline stable without changing the experience for end users.
Original PR description
Before this commit, the test "select @ mention from the suggestion list being filtered" could fail on runbot, on the check that follows the first "@": Failed to find 2 of ".o-mail-Composer-suggestion" (Timeout of 10 seconds). Found 0 instead. This happens because the test holds a render open on ImStatus, a component the member list renders as well as the composer. The composer tells the server that the user is typing, the bus sends the status back, and the member list re-renders its ImStatus with another class. The hold catches that render, the one that also brings the suggestions on screen. This commit gives the children of NavigableList an inNavigableList environment flag, and holds the render only on an ImStatus that has it. https://runbot.odoo.com/odoo/error/946282 Forward-Port-Of: odoo/odoo#284484
This update replaces an older loop style with the preferred clearer wording in core server-related code. It helps automated quality checks pass and keeps the codebase consistent, with no expected impact on users or business workflows.
Original PR description
Ruff checks on runbot flagged `while 1:` Preferred syntax is to use `while True` [UP048](https://docs.astral.sh/ruff/rules/while-one) runbot-945983 Forward-Port-Of: odoo/odoo#284490 Forward-Port-Of: odoo/odoo#283962
A small configuration error in Accounting report protections was fixed. The change ensures two important invoice-related reports are correctly protected from accidental deletion, helping preserve expected system behavior.
Original PR description
On `ir.actions.report` we want to block the unlinking of specific reports in odoo. However, when the list was created a comma was missed between `action_account_original_vendor_bill` and `account_invoice_without_payment` which means we were actually protecting against people unlinking `action_account_original_vendor_billaccount_invoice_without_payment`. Adding in that comma will allow these two records to be properly protected. task-none Forward-Port-Of: odoo/odoo#283323
This fix prevents duplicate emails from being sent when employees submit expenses across multiple companies. It helps keep expense communication cleaner and avoids confusion for approvers and employees.
Original PR description
Fix a small issue resulting in mail duplication when submitting expenses from multiple companies that appeared in the infamous 704a5a19 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283013