Monday, February 2, 2026
15 changes · saas-18.4
Enhancements to existing features
This update adjusts the National Social Security Fund (NSSF) contribution limits to align with the latest regulations under the NSSF Act 2013. The changes, effective for 2026, update the maximum earnings thresholds, ensuring accurate payroll calculations for businesses operating in Kenya. This ensures compliance with Kenyan tax laws.
Original PR description
This commit updates the NSSF Lower and Upper Earnings Limits in accordance with the 4th year of implementation of the NSSF Act 2013. - Set Lower Earnings Limit (Tier 1) to 9,000. - Set Upper Earnings Limit (Tier 2) to 108,000. - Resulting max combined contribution is now 6,480. Task: 5485002 Forward-Port-Of: odoo/enterprise#105019
Resolved issues and error corrections
Users who do not have permission to view eCommerce reporting will no longer see the menu option in the Website app. If they somehow try to open it directly, they now receive a clear access error instead of being silently redirected to the website, reducing confusion and improving permission handling.
Original PR description
__Steps to reproduce on runbot:__ 1. Login with Mitchell Admin 2. Remove Marc Demo from the `sales_team.group_sale_salesman` access group (User: Own Documents Only) 3. Login with Marc Demo 4. Open…
__Steps to reproduce on runbot:__ 1. Login with Mitchell Admin 2. Remove Marc Demo from the `sales_team.group_sale_salesman` access group (User: Own Documents Only) 3. Login with Marc Demo 4. Open the Website app and go to Reporting > eCommerce => You are redirected to the website in frontend mode __Reason:__ Clicking on the eCommerce reporting menu calls `action_dashboard_redirect`, which redirects to the website if the user is not in `base.group_system`, `website.group_website_designer`, or `sales_team.group_sale_salesman`. Since Marc Demo is not in any of these groups, he is redirected to the website without any message, which is not very user friendly. __Fix:__ - Add the groups to the menu to prevent showing it if the user does not have access to it anyway. - Raise an access error instead of redirecting to the website to make it clear to the user that they cannot open the dashboard even if they could see it. This also fixes [`TestMenusDemo`] by preventing this menu from being tested with the demo user in case he doesn't have access to it. [`TestMenusDemo`]: https://github.com/odoo/odoo/blob/736b71202db840ba6a7ed7e7f014b5b7c493d589/addons/web/tests/test_click_everywhere.py#L41C9-L41C41 runbot-234747 Forward-Port-Of: odoo/odoo#244963
This update fixes several issues in Odoo's internal Hoot testing system, making automated tests more accurate and less likely to miss failures. It improves simulated network behavior, clarifies test error messages, and tightens validation so problems are caught earlier during development.
Original PR description
### [FIX] Hoot fixes This PR contains several fixes for the Hoot system. See each commit description for more details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246339 Forward-Port-Of: odoo/odoo#244726
This fixes an issue where product display names could appear in the wrong language after switching language context within the same process. Businesses using multilingual product catalogs will see more reliable translated product names for users and customers.
Original PR description
Description of the issue/feature this PR addresses: Compute of display_name in different languages that can be returned incorrect Current behavior before PR: When accessing two times in the same method the display_name of a configured product but the second time having a .with_context(lang=lang) other than the previous language, the returned display name will not be in the specified language as the cached value will be returned. Desired behavior after PR is merged: _compute_display_name should always take into account a change of language in context when the value is accessed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246489 Forward-Port-Of: odoo/odoo#242829
This fixes duplicated warning message logic in the Sales payment link wizard. It helps keep the checkout/payment workflow more reliable and easier to maintain without changing the user-facing process.
Original PR description
After #245772, the compute method `_compute_warning_message` is duplicated. runbot-238757
This change fixes an unreliable automated test for saving images on the website. It helps reduce false test failures, making releases and maintenance more predictable without changing the user experience.
Original PR description
The purpose of this commit is to fix the non-deterministic test “Save image with correct parameter.” There is no guarantee that ‘modify_image’ will be executed during the next animationFrame. Solution: Use “expect.waitForSteps” to wait for “modify_image” to be executed. error-238377 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
This fix ensures the website editor’s automated test helper waits for the correct loading screen before continuing. It reduces random test warnings and improves confidence in website editing changes without altering customer-facing behavior.
Original PR description
`insertSnippet` has a step to wait for `o_loading_screen` to disappear, but it is querying the iframe inside the dialog instead of the main iframe. This issue causes the following undeterministic warning error: ``` should not have any "characterData", "remove" or "add" mutations in current step when you update the selection ``` Ensure we are waiting for the loading screen of the correct iframe. runbot-229803 Backport-Of: https://github.com/odoo/odoo/pull/246750
This fix moves an Irish localization accounting setup update to a later migration step, after all related modules are loaded. This prevents warning messages during upgrades and helps keep the Irish chart of accounts update process smoother and more reliable.
Original PR description
We faced a warning because this update doing a try_loading is called in `post-` scripts (after the module is loaded) and not in `end-` scripts (when all modules are loaded). All l10n_* modules were changed in this PR: https://github.com/odoo/odoo/pull/183359 Regarding the changes in this PR related to Registry: https://github.com/odoo/odoo/pull/186467 see: https://github.com/odoo/odoo/pull/222186 upg-3828301 **Reference Image** <img width="1769" height="39" alt="2026-01-28_18-44" src="https://github.com/user-attachments/assets/8aa5f213-b150-403b-b2a1-0bc9ed4a4ccc" /> 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#246541
This update fixes an issue where the UrbanPiper store identifier field was visually overflowing its container. The changes include wrapping the field and button in a container with a flexible width, ensuring a cleaner and more professional appearance for users interacting with the UrbanPiper integration.
Original PR description
Before this commit: --- - The UrbanPiper store identifier field could overflow its container. After this commit: --- - Wrap the store identifier field and action button in a container. - Apply `overflow-hidden` and flexible width to the store identifier field. task-5472992 Forward-Port-Of: odoo/enterprise#103464
This update fixes an issue where the rental report was displaying only the start date instead of the correct date range for each rental order. The fix ensures the report accurately reflects the start and return dates, providing more reliable rental reporting.
Original PR description
The rental report is a daily report with x rows by rental order, with x the days between the start and return dates. With generate_series inside the select, the query was creating x rows with the same id, resulting in the date field not being correctly displayed (one unique date, the start date). This fix corrects the generation of the report to display the real date on each row. opw-5266525 Forward-Port-Of: odoo/enterprise#104764
This update resolves an issue preventing the correct default packaging type from being applied to service products in the Kenyan EDI (OSCU) version of Odoo. The previous XML ID was invalid, and this change ensures service products are packaged appropriately for EDI reporting, improving compliance.
Original PR description
Update the xmlid for the default packaging type for service products, the previous one `l10n_ke_edi_oscu.packaging_type_ou` seems to have never existed. opw-5220129 Forward-Port-Of: odoo/enterprise#105905
This update resolves an issue where documents actions were incorrectly displayed and triggered when a language was disabled. The system now filters actions to only include those associated with the currently active languages, ensuring a smoother user experience and preventing errors.
Original PR description
Filter Embedded Actions Based on Active Languages ### Impacted versions: 18.0 and later ### Steps to reproduce: - Install at least 2 languages - Install documents and accounting or other app to have actions on select - Uninstall one language - You will get an error when trying to activate again actions on select (also appears on network interface) ### Current behavior: When a language is deactivated, its corresponding translations may still appear in server actions, leading to errors when trying to add them to the context. This issue is now resolved by filtering actions to only include those linked to active languages. Task: [5420820](https://www.odoo.com/odoo/project/49/tasks/5420820) Forward-Port-Of: odoo/enterprise#102938
This update resolves an issue preventing the automatic creation of vendor partners from XML invoices. The problem stemmed from incorrect state detection when the 'Departamento' XML tag was missing, leading to creation failures. This ensures invoices are correctly processed and vendor information is accurately added to the system.
Original PR description
If the xml file has a tag "Departamento" without a value, the vendor partner creation fails because the state is searched with an empty string and detects a state that is not correct because the xml has no state value. Task Adhoc side: 109004 Forward-Port-Of: odoo/enterprise#105801
This update fixes a translation issue where warnings on Swiss payroll slips didn't correctly display translated field names. The fix ensures that all missing information fields are translated into French (CH) for improved clarity and compliance. This improves the user experience for French-speaking Swiss users.
Original PR description
The warnings that appear on a payslip when the employee's form misses information are not fully translated Steps to reproduce: 1. Install module l10n_ch_hr_payroll 2. Switch to "My Swiss Company" and change language to French (CH) 3. Open app "Paie" and create a new employee (only add a name) 4. Click on "Contrats" in the stat button and create a new contract for the employee (only add a name), save it and set it as "En cours" in the status bar 5. Go to "Fiches de paie" > "Toutes les fiches de paie" and create a new payslip 6. Add the newly created employee to the payslip 7. The warnings in the form displaying the missing fields from the employee form do not translate the name of the missing fields Solution: Use `get_description` to get the translated name of the missing fields opw-5403634 Forward-Port-Of: odoo/enterprise#104499
A recent test failure related to restaurant appointment tours has been resolved. The fix ensures the test environment uses a consistent, simulated time, preventing inconsistencies and making the tour's behavior predictable. This improves the reliability of our test suite.
Original PR description
The `RestaurantAppointmentTour` was failing inconsistently because the browser used the real system clock during the initial Point of Sale load, while the test data was created for a specific mock date (Jan 28). Because the PoS logic filters appointments based on the current time, the test data was being misinterpreted or "normalized" by the application before the tour had a chance to freeze the clock. Moving `Chrome.freezeDateTime` to the absolute first step of the tour ensures the simulated time is applied as early as possible, making the test deterministic. runbot-232601 Forward-Port-Of: odoo/enterprise#106024