Wednesday, December 10, 2025
26 changes · master
Resolved issues and error corrections
Saudi consumer invoices now show the required title "Simplified Tax Invoice" during phase 1 as well as phase 2 processing. This helps businesses meet ZATCA invoicing requirements consistently and reduces compliance risk for B2C sales.
Original PR description
For B2C invoices, the invoice's title must be "Simplified Tax Invoice". This was only applied to phase 2 ZATCA in "l10n_sa_edi". This change makes sure to apply the same requirement for phase 1 invoices. Task-5322118 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#237854 Forward-Port-Of: odoo/odoo#237505
Mentions in the HTML message composer now automatically include a space afterward. This prevents words from sticking to names, making messages clearer and easier to read.
Original PR description
This commit fixes an issue where there was no space inserted after a mention in the HTML composer. task-5354233 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238508
This fix ensures emojis are correctly converted even when they appear at the very end of a message in the HTML composer. Users get more consistent message formatting in Odoo Discuss and other mail composer experiences.
Original PR description
Currently, emojis are not transformed when they are at the end of the HTML composer content. This is due to the regex used in the `formatEmojisInHtml` function, which does not account for HTML boundaries properly. task-5357675 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238833
This change lowers the threshold used by an internal profiler test to avoid occasional failures when shared testing infrastructure is under heavy load. It helps keep automated validation stable without changing customer-facing behavior.
Original PR description
Runbot may be overloaded, got a random error with 48k count. Lowering the limit to 40k. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Time Off dashboard now shows employees' remaining unspent overtime instead of their total accumulated overtime. This gives managers and employees a clearer view of how much overtime is still available to use.
Original PR description
Instead of showing total overtime on the Time off dashboard, show the unspent (remaining) amount. Task-5261777
This fix ensures that when one package is placed inside another, the outer package correctly inherits the company information from its contents. This helps keep inventory ownership and company-specific stock data accurate in multi-company warehouse operations.
Original PR description
Steps to reproduce: - Have two packs, A & B - Put something in pack A - Put pack A in pack B Issue: Despite pack A having both a location & a company set, only the location is set on pack B. Due to a faulty comparison, we compare package records with company records, which means the `all()` condition will never be true. Fixes #236413 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239119
Expense approvals now capture the actual approval time instead of defaulting to an incorrect early-morning hour. This helps keep expense records and related reporting more accurate for users and managers.
Original PR description
When approving an expense, we compute the approval date. We used fields.Date.context_today(expense) that only the the date but the hours are set to 1 AM. By using field.Datetime.now() the hours are computed correctly. task-5262954 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237746
The Website editor now handles pasted embedded video HTML correctly when setting a video background. This prevents users from seeing an error screen and keeps the page editing flow uninterrupted.
Original PR description
Problem: A traceback occurs when adding an embedded video in the Website editor. Cause: The code uses `urlInput` as the URL source, but when an embed is pasted, `urlInput` contains HTML instead of a direct URL. Solution: Parse the `url` instead of using `urlInput` directly. Steps to reproduce: - Go to Website. - Add a slides snippet. - Change the background to video. - Paste embedded video HTML. - A traceback is triggered. opw-5265390 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239074
Users can now open the GIF picker while writing comments on Knowledge articles without the page crashing. This keeps commenting smoother and avoids interruptions when adding visual content to discussions.
Original PR description
Before this commit, opening gif picker in a comment of a knowledge article would lead to crash. This happens because composer uses chatter visual, and pickers in composer picks either the quick or more node element as anchor of picker, depending on whether the action is in the quick or more action. In the case of knowledge article, the buttons are placed in extra actions like in chatter. However the picker placement was not taking into account this place, thus it fails to find action placement. This commit fixes the issue by adding support of extra actions as anchor for composer picker. Task-5163888 Forward-Port-Of: odoo/odoo#239043
This fixes an issue where automation rules using pre-filter conditions could skip recalculating related values. The change helps ensure automated actions run with up-to-date data, reducing incorrect rule behavior.
Original PR description
When having a pre-filter condition that may flush fields, we should keep still recompute them later. For example, if a rule pre-filters on field B which depends on A, computing A should not remove the compute flag from B. task-4409744 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix restores the previous popover behavior to avoid unnecessary screen refreshes and integration issues. Chat and member list popovers are adjusted so users still see the correct open or closed state without disrupting related features.
Original PR description
Partial revert of https://github.com/odoo/odoo/pull/235132 PR above made an improvement on Discuss UI that relies on `usePopover.isOpen` state. Popover hook was not reactive and this PR makes it…
Partial revert of https://github.com/odoo/odoo/pull/235132 PR above made an improvement on Discuss UI that relies on `usePopover.isOpen` state. Popover hook was not reactive and this PR makes it reactive so that the template simply relies on `usePopover.isOpen`. While this change makes sense conceptually, this introduces technical problems: `usePopover` has not designed with reactivity and there's are lots of code using `usePopover` already. Also popover has to integrate with external libs like fullcalendar, so the addition of reactivity layer would trigger more re-renders and actually require more effort to integrate with these libs than with lack of reactivity from the usePopover hook [1]. This commit reverts the change of `useState()` on the `usePopover()` hook, so that the behavior of `usePopover()` is unchanged from how it was designed and business code keeps choice to optionally compensate the reactivity by handling it themselves in a controlled manner. This commit compensates the lack of reactivity of popover.isOpen in `ChannelMemberList` and `ChatBubble` templates that previously relied on `popover.isOpen`. [1]: https://github.com/odoo/odoo/pull/234564
Creating or updating an employee no longer triggers an unexpected system error when the time zone is missing. Instead, Odoo now blocks the invalid entry with a clear validation message, helping users correct the employee record safely.
Original PR description
Description of the issue/feature this PR addresses: On Odoo 19.0 and master, setting an employee’s timezone to None would cause a traceback when creating or updating the employee. Current behavior before PR: a traceback when creating or updating the employee. Desired behavior after PR is merged: A Validation Error occurs because it missing required value for the field 'Timezone' (tz). Model: 'Resources' (resource.resource) task-5257749 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235348
The document signing viewer has been visually refreshed with a more modern toolbar and a lighter, more consistent background. This improves the signing experience by making the interface feel clearer and better aligned with the rest of Odoo.
Original PR description
Before this PR, the toolbar was looking a bit old and the viewer background was to dark in LM. Now it is more harmonized. PR Ent: https://github.com/odoo/enterprise/pull/99438 | Before | After | |--------|--------| | <img width="1596" height="831" alt="Screenshot 2025-11-13 at 17 40 51" src="https://github.com/user-attachments/assets/30eae7ae-f8bb-4fe2-87f7-9151974d5d86" /> | <img width="1596" height="831" alt="Screenshot 2025-11-13 at 17 40 37" src="https://github.com/user-attachments/assets/673ba382-0bf1-4385-b669-a81438123aac" /> | task-5060120 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Hong Kong localization now includes a dedicated Salaries & Wages Payable account for payroll entries. This corrects default setup data so net salary payroll rules can post to the proper current liability account.
Original PR description
Adds a new Salaries & Wages Payable account of type current liabilities in order to use it in payroll for the NET rules and solve a misconfiguration in the default data. task-5042786 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237884
This fixes an issue where shared frozen spreadsheets could interpret empty list results differently from the live spreadsheet. Users now see consistent formula results after freezing and sharing spreadsheets, reducing confusion in reports.
Original PR description
Steps to reproduce: - insert a list - expand the list beyond the number of records in order to have ODOO.LIST with no result - add =ISTEXT( <a reference to an empty ODOO.LIST> ) -> the result is TRUE - Freeze and share the spreadsheet => the result of ISTEXT is FALSE in the frozen version task-5360561 opw-5359100 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#239107 Forward-Port-Of: odoo/odoo#237511
This update corrects a discrepancy in the tests for Odoo's Hong Kong payroll module. The changes ensure the tests accurately reflect the specific salary property requirements for Hong Kong, leading to more reliable payroll calculations. This improves the overall accuracy and compliance of the system.
Original PR description
task-5380844
This update simplifies the appraisal process by removing a duplicate menu option within the Odoo Enterprise system. Previously, users could initiate an appraisal campaign through two different pathways, leading to unnecessary complexity. This change consolidates the launch process for a more intuitive user experience.
Original PR description
purpose: The way to launch an appraisal campaign is double, you can have it from the secondary button and from the cog wheel. Hence, removing it from the cog wheel as it's not necessary task-id: 5395096
This update fixes an issue where holiday pay recovery was incorrectly applied to employees with older contracts. The change ensures that holiday pay recovery is applied appropriately when contracts are reopened, reflecting the employee's status as a new hire.
Original PR description
Purpose ======= Normally contracts start and end dates should be configured without being closed and reopened at each version date. But, if it is the case, holiday pay recovery could be applied on older employees because it is considered the employee just joined the company, and there is an amount to recover. Forward-Port-Of: odoo/enterprise#101564
This update resolves an issue where clicking a Field Service record in the kanban view with the middle mouse button opened it in the same tab. The fix ensures that records now open in a new tab, improving user workflow and efficiency. This change was made to address a usability concern.
Original PR description
Steps to reproduce: 1. Install `industry_fsm` 2. Open Field service module 3. In the kanban view, click a record with the middle mouse button Issue: - The record opens in the same tab instead of a new tab. Cause: - `FsmMyTaskKanbanRecord` overrides `onGlobalClick` without propagating the `newWindow` argument, preventing the expected new-tab behavior. Solution: - Forward the `newWindow` parameter to the parent implementation to restore the correct handling of the middle mouse click opw-5351842 Forward-Port-Of: odoo/enterprise#100926
This update resolves a misleading warning banner that appeared when processing SEPA batch payments for partners without addresses. The system now correctly uses the linked employee's address, ensuring accurate report generation without unnecessary alerts. This improves the user experience and avoids confusion.
Original PR description
…oyee has an address Doing batch payment for sepa payment would generate a warning banner if the partner has no address ( city and country ) However in reality ( already working ) the xml report will be generated with the linked employee address in the case of absence of the partner address thus it should not show a warning. The change removes the warning in this case. task: 5266346 Forward-Port-Of: odoo/enterprise#99928
This update resolves an issue where the AI feature would crash when accessed during the forecast report generation process. The fix addresses a technical incompatibility between the AI's code and the type of action being used (ir.actions.client), preventing the error and ensuring the AI functionality remains stable.
Original PR description
Asking the AI while the user is in the ``ir.actions.client`` action (e.g., forecast report) triggers a traceback. Steps to reproduce the error: - Install ``Inventory`` module - Open any product > Click the forecast report smart button - Click the AI icon from the systray - Ask anything in AI Traceback: ```py AttributeError: 'ir.actions.client' object has no attribute 'search_view_id' ``` https://github.com/odoo/enterprise/blob/ba78913e01f215b44389a5bf0bca0e6886deab1e/ai/models/ai_agent.py#L770-L778 Here, only ``ir.actions.act_window`` actions have the ``search_view_id`` field, while ``ir.actions.client`` does not. So when the ``current_action`` is an ``ir.actions.client``, accessing ``search_view_id`` results in the above error. sentry-6942041136 Forward-Port-Of: odoo/enterprise#100609
This update makes the transcript field in VoIP calls read-only, preventing accidental modifications. This ensures the integrity of call recordings and improves data accuracy for reporting and analysis. This change enhances data reliability within the VoIP AI module.
Original PR description
Task-5404471
This update refines how ringtones are handled in the VoIP system. Previously, ringtones were a global setting, but now they are linked to individual user sessions, aligning with how ringtones are triggered by session activity. This improves system efficiency and accuracy.
Original PR description
Before this commit, ringtones were modeled as a global concept, but this is not correct: ringtones should be tied to a session. This becomes clear when you consider what triggers a ringtone: it's always linked to a progress in the lifecycle of a session. Guards such as `if (isActiveSession)` before playing or stopping ringtones are also a clear symptom of bad modeling, where some concerns are made global when they shouldn't be. After this commit, ringtones are tied to a session.
This update fixes a problem where running IoT tests were causing disruptions to other tests within Odoo. The change ensures that temporary modifications made during IoT testing are removed afterward, preventing interference and ensuring more reliable test results. This improves the stability and accuracy of our overall testing process.
Original PR description
Running iot tests may impact other tests due to monkeypatching done when importing iot_drivers (notably requests methods and http dispatchers). This commit ensures those patches are reverted at the end of the iot tests Runbot error [233918](https://runbot.odoo.com/odoo/runbot.build.error/233918)
This update corrects a display issue on the Odoo portal where users were seeing outdated document counts. Now, the portal only shows documents that are currently available for a user to sign, ensuring a more accurate and user-friendly experience. This improves clarity and prevents confusion for users managing sequential signing workflows.
Original PR description
Version: - 18.0 Steps to reproduce: - Install sign - Upload document. - Add multiple signers - Set a sequential signing order Issue: - When documents require sequential signing, portal users see a banner saying there’s a new document to sign, even if it’s not yet their turn. Solution: - Update the counter to show only the documents that the user can currently sign. Impact: - Portal users now only see documents when it’s their turn to sign. Task-5226240 Forward-Port-Of: odoo/enterprise#98671
This update fixes a technical error that prevented shipping rate calculations when a customer partner lacked address information (country, state, and city). The change ensures the system handles missing data gracefully, preventing errors and allowing users to accurately calculate shipping costs for all partners.
Original PR description
Currently, an error is raised when trying to fetch the shipping rate if the partner does not have the required geolocation fields (country, state, and city). **Steps to Reproduce:** 1. Install and…
Currently, an error is raised when trying to fetch the shipping rate if the partner does not have the required geolocation fields (country, state, and city). **Steps to Reproduce:** 1. Install and configure the **Envia Shipping** module. 2. Create a partner without an address (only name + phone). 3. Create quotation for that partner with a deliverable product (e.g; Conference Chair). 4. Click "**Add Shipping**", choose _Envia Shipping_ Method, and then click "**Get Rate**". **Error:** `TypeError - quote_from_bytes() expected bytes` **Cause:** At [1], the system tries to compute Envia shipping rates based on the partner’s country, state, and city. If any of these fields are not set, an error is raised. **Fix:** This commit adds a check for the required fields (country, state, and city). If any are missing, `_geolocate_zip` returns False, leading to a proper validation error instead of a traceback. - [2] [1] - https://github.com/odoo/enterprise/blob/f1a02626a1fbe76add104832e151c647307f3ae7/delivery_envia/models/envia_request.py#L591-L593 [2] - https://github.com/odoo/enterprise/blob/f1a02626a1fbe76add104832e151c647307f3ae7/delivery_envia/models/envia_request.py#L617-L624 sentry-7063870478 Forward-Port-Of: odoo/enterprise#100734