Thursday, August 14, 2025
23 changes · saas-18.2
Enhancements to existing features
Draft invoices no longer show outstanding credit or debit messages, matching the existing behavior of hiding the Outstanding Payments widget. This reduces confusion for users by keeping payment-related prompts out of draft invoices until they are posted.
Original PR description
Before this commit: --- Draft invoices can be reconciled with payments via the Bank Reconciliation screen, but the Outstanding Payments widget is hidden to avoid confusion. However, outstanding credits/debits messages were still displayed on draft invoices, leading to inconsistency. In this commit: --- Updated the form to hide outstanding credits/debits messages when the invoice is in draft, making the behavior consistent. Before: --- <img width="1258" height="298" alt="image" src="https://github.com/user-attachments/assets/376b3799-e721-4bd6-bf9c-cb56ca02bb5f" /> After: --- <img width="1258" height="257" alt="image" src="https://github.com/user-attachments/assets/374e33d5-c406-44c1-9309-40c124b45451" /> task-4987833
This update improves the experience when duplicating Italian electronic document type records. Instead of immediately hitting a duplicate-code error, the related view is adjusted so users can avoid creating conflicting records more easily.
Original PR description
In https://github.com/odoo/odoo/commit/3e557745f16c33ab3c1b5984d6297913a8849024, we added a contraint to avoid same code. The "issue" with that is that the Duplicate option instantly raises the constraint. It's not really user-friendly. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222611 Forward-Port-Of: odoo/odoo#218933
The partner follow-up process now checks related accounting entries in a clearer and more reliable way. This reduces the risk of internal query confusion and helps keep follow-up information accurate without changing the user workflow.
Original PR description
Refactored the SQL construction for checking the existence of related account.move records for res.partner entries. The account.move query is now built separately and referenced explicitly, making the code more readable and reducing the chance of ambiguity in field resolution. Using `SQL.identifier(query.table, "id")` ensures that the correct table is referenced in each condition, which is particularly important when dealing with multiple joins or subqueries. Forward-Port-Of: odoo/enterprise#83770
Resolved issues and error corrections
This update fixes unstable automated tests in the Mail module that could fail when server load was high. It helps keep release validation dependable without changing customer-facing behavior.
Original PR description
These tests were failing due to `expect.verifySteps()` being empty rather than the RPC response. The rpc response is asynchronous and awaiting the click doesn't necessarily mean the RPC had time to effectively happen, especially when runbot CPU load is high. Fixes runbot-error-160954 Forward-Port-Of: odoo/odoo#222839
Code cleanup and technical improvements
The accounting module was reorganized so tax total rounding is handled in its own reusable part. This makes it easier for localized or custom accounting modules to adjust rounding behavior without copying broader tax calculation logic, reducing maintenance risk.
Original PR description
Move the code block responsible for rounding `total_per_tax` aggregates inside `_round_base_lines_tax_details` into a dedicated helper method `_round_total_per_tax`. This refactor allows custom modules to override only the rounding logic without reimplementing the entire `_round_base_lines_tax_details` method, improving maintainability. Related: https://github.com/OCA/l10n-japan/pull/70 @qrtl QT5088 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222759
A flaky automated check for the HTML editor toolbar was adjusted to open the font size menu in a more consistent way. This helps reduce false test failures during validation, making release checks more dependable without changing user-facing behavior.
Original PR description
The fix at [1] fixed the case when the dropdown had not yet opened, but that was not really the cause of the issue here. It's unclear to me what is the issue exactly, but I've noticed this particular test did open the font size dropdown in a slightly different way than other tests which do not have the same non-deterministic issue. runbot-230945 [1]: https://github.com/odoo/odoo/pull/222583 Forward-Port-Of: odoo/odoo#222828
Point of Sale now plays the expected error sound when staff scan an unknown barcode, alongside the existing on-screen warning. This restores feedback that helps cashiers quickly recognize failed scans and avoid checkout confusion.
Original PR description
When scanning an unknown barcode, the error notification pop-up is displayed, but the error sound is not played. Steps to reproduce: ------------------- * Open PoS * Scan an unknown barcode > Expected: Both the 'BIP' and the error sound should play. Why this fix: ------------- This feature was present in 16.0 and 17.0, but was lost in 18.0 REF. It was reintroduced in 18.3 with this [IMP](https://github.com/odoo/odoo/pull/209478). opw-4987066 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222344
This update fixes an unreliable automated test for Odoo's messaging bus so it waits for the connection listener to be ready before continuing. This helps prevent random test failures and improves confidence in the release process without changing user-facing behavior.
Original PR description
This commit fixes the `test_postcommit` that fails in a non deterministic fashion. This test ensures bus notifications created in the post commit hook result in only one batch. To do so, the test listens on the connection with a selector. However, the main thread doesn't wait for the selector to be register before triggering the postcommit hook. This commit ensures the test waits for the selector to register the database connection before going further. runbot-77470 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#222810
This fix ensures time-off accrual tests run with a fixed date so results do not change depending on when they are executed. It helps keep automated validation reliable and prevents false failures in the HR time-off area.
Original PR description
Given that accrual plans are related to dates, all the testcase logic has to be inside 'with freezetime' to avoid date related errors Runbot-error: https://runbot.odoo.com/odoo/runbot.build.error/230722 Forward-Port-Of: odoo/odoo#222854
This fix ensures simulated time settings are only applied to the database currently being tested, instead of unintentionally affecting related databases such as log databases. It reduces the risk of confusing side effects during testing and helps keep database behavior predictable.
Original PR description
Filtering the postgres database was not enough, the log_db was also affected. Since only the order was impacted, this was creating strange side effect in databases like the log-db where it was only modified when the function exists. Checking the -d is more reliable and safer to avoid any side effect when testing with faketime. Forward-Port-Of: odoo/odoo#222805
The website theme switch loader now restarts its progress indicator correctly on repeated theme changes. This prevents users from seeing a frozen progress bar during later theme switches, making the website builder experience clearer and less confusing.
Original PR description
__Current behavior before commit:__ When switching a theme, the website loader is displayed with a progress bar. When the operation is finished, the loader is hidden and the progress bar interval is cleared. However, the variable holding the interval ID is not being reset. If the user switch theme a second time, the `initProgressBar` method doesn't start a new interval because its initial guard finds the old interval ID and exit prematurely. This resulted in the progress bar appearing to be stuck. __Description of the fix:__ This commit fixes the issue by removing the initial guard of the `initProgressBar` method. __Steps to reproduce:__ 1. Open the Website builder 2. Click on the "Theme" tab 3. Click on "Switch Theme" 4. Choose a Theme 5. The loader is progressing 6. Do every steps again 7. The loader is stuck at the beginning Forward-Port-Of: odoo/odoo#218356
Purchase orders viewed in the customer portal no longer fail when a listed product has no image. This prevents portal users from seeing an error and lets them access purchase order details normally.
Original PR description
In the purchase order portal template (`purchase.purchase_order_portal_content`), `image_data_uri(line.product_id.image_128)` was called without checking if the product had an image, leading to a rendering error when `image_128` is False. Steps to reproduce the bug: - create a product without an image - create a purchase order with that product - partner: portal user (e.g joel) - connect as portal user - go to the purchase order - the portal view will raise an error because it tries to render an image Solution: Added a conditional check to only render the `<img>` tag if the product image exists, preventing template evaluation errors. opw-5013230 Forward-Port-Of: odoo/odoo#222769
This fix allows Odoo's page template engine to handle longer expressions correctly on newer Python versions. It helps prevent template rendering failures after platform upgrades, improving stability without changing user-facing features.
Original PR description
Not entirely clear why it was apparently excluded, but apparently in 3.13 some qweb expressions require the use of `EXTENDED_ARG`. Specifically [1] makes the expression long enough that it needs at least one "long jump" which then requires an `EXTENDED_ARGUMENT`, here's the sizes for the expression in question in various Python versions: - 3.10: 102 bytes - 3.11: 188 bytes - 3.12: 214 bytes - 3.13: 272 bytes Thus it makes sense at at some point the earliest jumps in the expression (and `and`/`or` *are* jumps, since they're short-circuiting) would become "long". These increases in size can be due to a multitude of factors e.g. changes in inline cache details (3.11 and above), jumps becoming strictly typed and requiring `TO_BOOL` instructions (3.13), ... [1]: https://github.com/odoo/odoo/commit/cc68a012649f9eb331265deba3197abaf1700d97#diff-92dda03d204cc6ea8b7aacd0c07939843c83b1841f4a3049903844777d83c07bL154-R223 Forward-Port-Of: odoo/odoo#222939
The accounting dashboard now excludes draft invoices from the checked invoice view, so users see only finalized posted invoices there. This prevents misleading dashboard totals and helps finance teams review invoice status more accurately.
Original PR description
state = posted has been added in 18.0 but removed in https://github.com/odoo/odoo/commit/68fa35faa332615a2862935a82f778e38a2a3041#diff-6e3139ca3c848ecd9159cbee86a94aa51a3c7e0d2b62bbccfac1023c18a1edf5L586 initial opw-4349684 Forward-Port-Of: odoo/odoo#222817
This fix makes the bus test helper more reliable by preventing a timing issue that could cause false failures during automated checks. It also corrects how errors are reported so failures are clearer and do not trigger additional mistakes.
Original PR description
This change addresses two issues in the `waitForChannels` test utility: - Fixes a race condition. The `failTimeout` variable was sometimes accessed before its `setTimeout` declaration had been executed. This happens when a fast bus event triggers the `onWebsocketEvent` handler, resulting in a reference error. The variable is now declared at the beginning of the function, making it available before any access (fixes runbot-223252). - Corrects error in def.reject. `message` only takes one param, and a string does not have a join method.
Calendar list views now include meetings that have no assigned organizer when users group them by responsible person and creation date. This prevents valid meetings from being hidden, giving teams a more complete and reliable calendar view.
Original PR description
__Issue__ In the calendar list view, meetings with no organizer and default privacy (`privacy=False`) are excluded when grouping by Responsible and Created On. __Steps to Reproduce__ 1. Create a meeting with: - `privacy` set to default, - no `organizer` 2. Go to Calendar > List view. 3. Group by Responsible, then by Created On. → The meeting is missing from the view. __Fix__ Adjust the domain to include meetings where: - `privacy=False`, and - either `user_id` is unset or their settings are in the public allowed list. - opw-4841266 Forward-Port-Of: odoo/odoo#219903
This fixes an intermittent automated test failure around moving between a live chat session and the Discuss app. It helps keep quality checks stable so valid changes are less likely to be blocked by unreliable test results.
Original PR description
Before this commit, `test_session_history_navigation_back_and_forth` was sometimes failing. This test checks that browser history works correctly when navigating between a live chat session and the discuss app. The test creates a live chat channel via the `/get_session` route, then starts a tour which clicks the related record in the list view to open it in the Discuss app. However, `/get_session` initially sets `is_pinned` to False for the agent. When the active discuss channel is unpinned, another thread is set as the active thread. According to the timing, it can make the test fail. The fix resets bus notifications before starting the tour, ensuring consistent results. fixes runbot-230334,230340
Gantt popover cards now show standard labels like Name, Start, and Stop in the user’s selected language instead of always showing English. This improves the experience for multilingual users, especially when custom menus are created through Studio.
Original PR description
Steps to Reproduce: - Change the language to something other than English. - Create a new menu in the Appointment module using Studio. - Link that menu with the existing model (Resource Time of…
Steps to Reproduce: - Change the language to something other than English. - Create a new menu in the Appointment module using Studio. - Link that menu with the existing model (Resource Time of Detail). - Save the changes and add the Gantt view - Save the changes and close Studio. - View this new menu in the Gantt view Issue: - When clicking onto the kanban popover card for any record, the labels will remain as "Name" , "Start" , and "Stop" in English, and it will not translate. Reason: - [1] changed the rendering of default kanban card templates from XML to JS. This changed the default template to be static. Fix: - Add a call to the translation core tool "_t" on the three labels upon their generation in _getKanbanViewParams(). This ensures that the arch template that is generated is translated correctly into the user's set language. - Additionally, add these terms into the .pot file for web_gantt. This ensures that the proper translations are stored for transifex and the relevant translation team and that the call to _t will have a translation to reference in it's call. [1] : https://github.com/odoo/enterprise/commit/b2e31239041e6b7850888a3ae070c3f8a40ea5ee opw-4861899
Belgian and French reports now handle tiny rounding differences when comparing tax totals. This prevents reports from incorrectly flagging matching amounts as different due to hidden decimal precision.
Original PR description
Currently, the code was checking for a strict equality between two sums. However, it may happen that there are many decimals that aren't displayed on the UI, hence the strict equality check fails. For instance `30201.63 != 30201.629999999997`. Instead, we now use the `float_compare` which takes care of rounding issues. opw-5000147 Forward-Port-Of: odoo/enterprise#92356
This fix ensures Colombian electronic invoice document types are sent in the two-character format required by DIAN. It helps prevent invoice submissions from being rejected due to incorrectly formatted type codes.
Original PR description
The DIAN endpoint only accepts Electronic Invoice types with a length of 2 characters. This fix adds zero-padding to the problematic edi types. task: 4882683 Forward-Port-Of: odoo/enterprise#89925
The payroll test setup now includes the required Colorado state payroll calculation component. This prevents an internal test failure and helps ensure Colorado payroll accounting checks run reliably.
Original PR description
Issue: - Test case fails for the U.S. state of Colorado because the COINCOMETAX salary rule is defined in the l10n_us_hr_payroll_state_calculation module, but the test module test_l10n_us_hr_payroll_account does not depend on it. Fix: - Add a dependency on l10n_us_hr_payroll_state_calculation in the test_l10n_us_hr_payroll_account module. task-4949218 Forward-Port-Of: odoo/enterprise#90353
The update stops internal bank reconciliation widget records from appearing as selectable models in places like Knowledge properties. This prevents users from triggering errors when choosing models that are not meant to be searched or used directly.
Original PR description
To reproduce this issue, just try to perform a name_search/search_count/etc.. on `BankRecWidget` for example: - Example of Steps in Knowledge: - Open knowledge - Create an article - Create another article in the first one (child) - Add a properties - Select `Bank reconciliation widget` in Model - Traceback `BankRecWidget` and `BankRecWidgetLine` use ```py _auto = False _table_query = "0” ``` to avoid being stored in db. This kind of model doesn't work with several methods of the model api, such as `search_count`, `name_search` etc... This commit will add a models blacklist via ir_model._is_valid_for_model_selector opw-4763713 Forward-Port-Of: odoo/enterprise#90060 Forward-Port-Of: odoo/enterprise#88352
The outdated Sign Base Folder setting is now hidden because it no longer works and is planned for removal. Users should manage folder choices through Sign Document Templates instead, reducing confusion in configuration screens.
Original PR description
The setting no longer works and will be removed in future versions. Users should configure folders via Sign Document Templates instead. task-4879652 Forward-Port-Of: odoo/enterprise#88502