Friday, March 6, 2026
50 changes · saas-19.1
Resolved issues and error corrections
This update corrects a problem with how leave periods are calculated, specifically addressing potential inconsistencies caused by different time zones. By updating the system to use 'request_date_from' and 'request_date_to' instead of 'date_from' and 'date_to', the system now accurately reflects leave periods regardless of time zone differences, ensuring correct payroll processing.
Original PR description
This commit fixes the leaves work interruption constraint by replacing `date_from` and `date_to` with `request_date_from` and `request_date_to`, thereby resolving any inconsistencies that may arise from time zone differences. task-5966780 Forward-Port-Of: odoo/enterprise#109421 Forward-Port-Of: odoo/enterprise#108541
This update clarifies the behavior of Helpdesk article searches when using non-root articles as the main article. Previously, searches didn't include descendant articles. Additionally, a minor issue with dropdown functionality has been addressed to prevent empty dropdowns. The team has opted to provide clearer guidance in the article help documentation instead of attempting a complex domain fix.
Original PR description
*: website_helpdesk_knowledge **Steps to reproduce:** - Install Helpdesk/Knowledge/Website apps - Go to Knowledge - Set up a Knowledge workspace root article with some child articles to it - Go to…
*: website_helpdesk_knowledge
**Steps to reproduce:**
- Install Helpdesk/Knowledge/Website apps
- Go to Knowledge
- Set up a Knowledge workspace root article with some child articles to it
- Go to Helpdesk > Configuration > Helpdesk Teams
- Open a Helpdesk team, and go to its Help Center config
- Check Knowledge and set a non-root article as main Article
- Go to Website > Help
First issue (non-root main article):
- Type a word which is present in both the article and one of its child articles
- Only the given article match the word
- If you use the root article it will match in any descendant
Second issue (in every case):
- Type a word in the search bar
- Wait for the dropdown to appear
- Click elsewhere, dropdown is properly hidden
- Try to change the search > Traceback
**Issue:**
The domain used to find the articles to match the search uses the current id as the `root_article_id`:
`['|', ('id', '=', team_article.id), ('root_article_id', '=', team_article.id)],` which was previously working in every case as it was not possible to set a non-root article in the team setting.
This was later changed to allow any article as the default website page. As a result, when a non-root article is selected, the search domain only applies to that specific article and no longer includes its descendants.
The other issue is related to the added boostrap attribute `data-bs-toggle="dropdown"` which is not properly reset when the dropdown is removed, and triggers the creation of an empty dropdown.
**Fix:**
Doesn't seem easy to fix to allow the search on all the descendants of the given article as we can't use the article `root_article_id` and filter out the unwanted results in a clean way (and it doesn't seem doable with a direct domain). Instead clarify the situation in the help of the article.
Also manually reset the attribute for `_onFocusOut`.
related: https://github.com/odoo/enterprise/commit/ed971d4d02624f8b864ab6c37c6e7db8ba3dfe11
opw-5258607
Forward-Port-Of: odoo/enterprise#109612
Forward-Port-Of: odoo/enterprise#107438This update fixes a technical issue preventing internal users from accessing AI tools within the Odoo Enterprise platform. The fix removes a restriction on accessing tool data, allowing proper functionality of the voice transcript command. This ensures consistent and reliable AI tool performance.
Original PR description
Steps to reproduce: 1. Open any editor and use /voice transcript command. 2. Start recording, say some words, stop recording. 3. Observe the access error on `tool_ids`. The `tool_ids` field on `ai.topic` is restricted to `base.group_system`, preventing internal users from accessing it. The fix is to use sudo to retrieve the available tools. ticket task-5965009 Forward-Port-Of: odoo/enterprise#109366
A technical glitch was causing a crash when using the chatbot while the website editor was active. This update ensures the chatbot data is properly handled across all Odoo environments, preventing the error and improving stability.
Original PR description
Using a chatbot while the website editor is active triggers a traceback. The issue occurs because bus notifications containing `Chatbot` model data are also received by the backend bundle. In the backend bundle, the `Thread` model did not define the `chatbot` field, so the inverse thread relation on the `Chatbot` model could not be resolved, leading to a crash. This commit adds the chatbot field to the core bundle so it is available in all contexts and prevents the traceback. Steps to reproduce: - Goto localhost:8069/@/contactus - Start chatbot - Answer any question -> traceback task-5924295 Forward-Port-Of: odoo/odoo#252186 Forward-Port-Of: odoo/odoo#248216
This update resolves an issue where by-products tracked with serial numbers were incorrectly displaying extra, empty lines in the shop floor manufacturing order views. The fix ensures that by-products only show lines that are manually added, aligning with the intended workflow. This improves the clarity and accuracy of shop floor data.
Original PR description
When the "pre fill lot/serial numbers in shopfloor" setting is enabled on the manufacturing operation type, by-products tracked by serial number were incorrectly showing extra empty lines in…
When the "pre fill lot/serial numbers in shopfloor" setting is enabled on the manufacturing operation type, by-products tracked by serial number were incorrectly showing extra empty lines in shopfloor MO cards (both in overview and work center views). Steps to reproduce: 1. Create a bill of materials for a final product 2. Add a consumable component 3. Create an operation without steps 4. Add a by-product tracked by serial number 5. Specify that the by-product is produced in the operation above 6. In Inventory > Configuration > Operations Types, open the Manufacturing operation type, go to the Traceability section and enable "Pre fill lot/serial numbers in shop floor moves" 7. Create a manufacturing order for the BOM and confirm it 8. Open the Shop Floor view from the MO 9. Observe the extra line for the by-product in both overview and work center views Root cause: The visibleMoveLines getter in stock_move.js was showing ALL move lines (including unpicked ones) when picking_type_prefill_shop_floor_lots was enabled, without distinguishing between raw materials/components and by-products. By-products should never show pre-filled lines since users must register them manually by clicking the + button. Solution: Modified the visibleMoveLines getter to always filter by-products to show only picked move lines, regardless of the prefill_shop_floor_lots setting. This ensures by-products only display lines that have been explicitly registered by the user, while regular components continue to show pre-filled lines when the setting is enabled. Task-5431295 Forward-Port-Of: odoo/enterprise#109689 Forward-Port-Of: odoo/enterprise#103260
This update fixes an issue where highlights within the settings page were difficult to see in dark mode. The team adjusted the text color to black, significantly improving contrast and readability for users. This ensures a better user experience for all customers, regardless of their chosen theme.
Original PR description
Before this commit, highlights were not readable when searching on the settings in dark mode. Now, we force the text color to black to improuve the contrast and redability. task-id 6003446 Forward-Port-Of: odoo/odoo#251979
This update resolves an issue where the Documents app would crash after deleting a payslip run. The fix ensures that related documents are also removed when a payslip run is deleted, preventing data inconsistencies and improving app stability. This improves the overall user experience and data integrity.
Original PR description
### Issue: When deleting a payslip run, the documents from the payslips of the run are not deleted. This results in a traceboack when opening the document app. ### Steps to reproduce: - Have a…
### Issue: When deleting a payslip run, the documents from the payslips of the run are not deleted. This results in a traceboack when opening the document app. ### Steps to reproduce: - Have a payslip run with payslips - Go to a payslip, validate and generate the document - Then cancel and reset to draft - Reset the Payslip Run to draft - Delete it - Open the Documents app ### Cause: The payslips are linked to the run with a `ondelete='cascade'` relation. https://github.com/odoo/enterprise/blob/03b2a7dae0e5c5ad3142ec2da8f3de5c9b1957f4/hr_payroll/models/hr_payslip.py#L110-L113 This means that deleting the run also deletes its payslips on a database level, bypassing the ORM. As the document is not directly linked by a relational field but instead by `res_model` and `res_id`, these fields are not updated and therefore are still pointing to a record that is no longer in DB. ### Solution: Extend the `unlink()` method in `hr.payslip.run` and unlink the documents there. opw-5501061 Forward-Port-Of: odoo/enterprise#109510 Forward-Port-Of: odoo/enterprise#105969
The loyalty program's redemption popup now correctly displays the program name instead of a generic 'Gift Card' message, providing a clearer experience for customers. Additionally, the points balance is now formatted dynamically based on the program's currency, ensuring accurate point display. This improves the user experience and consistency across loyalty programs.
Original PR description
Currently, the popup message shown when redeeming a code is the same for all programs but is always displayed as if it was a giftcard. Steps to reproduce: ------------------- * Create a program of type coupon, points unit: Coupon points, currency: USD * Create x coupons with 5 points * Copy a coupon code * Open shop * Enter code > Popup message says: Gift card: *code*, Balance: $ 5.00 Why the fix: ------------ Since this popup is used for multiple program we try to make it as generic as possible. Now we'll use the prgram name instead of the generic "Gift Card" string. Instead of formatting the points with the currency we can use `points_display` as it reflects the currency symbol or point unit name accordingly. <img width="416" height="82" alt="image" src="https://github.com/user-attachments/assets/a4c3c1ef-e02f-4618-809f-4bff5d99c948" /> opw-5220834 Forward-Port-Of: odoo/odoo#249312
This update fixes a potential data error that could occur when moving folders linked to accounting settings to the trash. The automated system cleaning process was incorrectly attempting to delete these folders, leading to database inconsistencies. This change ensures these folders are excluded from the cleanup process, maintaining data integrity.
Original PR description
When a workspace(folder) linked to a folder setting is moved to the trash and the ``Base: Auto-vacuum internal data`` cron runs, a traceback will generate. Steps to reproduce the error: - Install…
When a workspace(folder) linked to a folder setting is moved to the trash and the ``Base: Auto-vacuum internal data`` cron runs, a traceback will generate. Steps to reproduce the error: - Install ``documents_account`` module - Go to Documents > Configuration > Files Centralization > Enable Accounting > Select any workspace > Save > - Click on Journals > Create a new > Select any Journal > Create a Workspace A > Save - Go to Documents > Click on Workspace A > Actions > Move to trash - Run the ``Base: Auto-vacuum internal data`` cron Traceback: ```py ForeignKeyViolation: update or delete on table "documents_document" violates foreign key constraint "documents_account_folder_setting_folder_id_fkey" on table "documents_account_folder_setting" ``` solution: override the ``_get_gc_clear_bin_domain`` method to exclude folders linked to folder settings, preventing their deletion during the garbage collection. sentry-7193540869 Forward-Port-Of: odoo/enterprise#109636 Forward-Port-Of: odoo/enterprise#104875
This update fixes an issue where emails weren't automatically sent to candidates when they were refused through the recruitment process. The fix ensures that a rejection notification is properly delivered to the applicant's email address, improving communication and candidate experience. This was caused by a technical error in how email data was processed.
Original PR description
## Short functional explanation of the error When a candidate is refused, an email isn't sent to their email address. ## Reproduction Steps 1. Open Mailhog in a separate tab. 2. Go to the Recruitment…
## Short functional explanation of the error When a candidate is refused, an email isn't sent to their email address. ## Reproduction Steps 1. Open Mailhog in a separate tab. 2. Go to the Recruitment app and select any job position. 3. Click on new to create a new application. Enter an applicant name and an applicant email. 4. Check Mailhog: a job application has been sent to the applicant. 5. Go back on the Recruitment app and click on Refuse. In the wizard, make sure you toggle Send Email and click on Refuse. ### Expected behavior In Mailhog, a refusal mail has been sent to the applicant. ### Unexpected behavior Nothing is sent. ## Origin of the issue When refusing a candidate, we create a notification in the chatter but an email isn't sent. This is due to the `incoming_email_to` field, which is checked here: https://github.com/odoo/odoo/blob/bfc1c210eca65de1116aa09cdd62749ed9192407/addons/mail/models/mail_thread.py#L4040-L4053 but because this field is already retrieved here: https://github.com/odoo/odoo/blob/bfc1c210eca65de1116aa09cdd62749ed9192407/addons/mail/models/mail_thread.py#L4025 the last condition will always be true, preventing the recipient's data to be added to the message, thus preventing the message to be sent correctly. Note: as of 19.0, the field `outgoing_email_to` can be used to determine the recipient's email address. Note: we remove `'body_is_html': True` because this field is misused in this case: when set at true, the field is always considered as HTML __ opw-5980079 Forward-Port-Of: odoo/odoo#252036
This update adds a temporary field to the burndown chart's embedded actions to ensure a smooth upgrade process. Previously, a database constraint prevented changes to the chart's action ID, causing temporary issues. This fix provides a safe path for future updates and improvements to the burndown chart functionality.
Original PR description
Add an empty `python_method` field to the burndown chart embedded actions as a preparatory change for a safe upgrade path. Without this, replacing `action_id` with `python_method` in master would temporarily violate the SQL constraint on `ir.embedded.actions` that prevents both from being set simultaneously. references: #239000 task-5347524 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This pull request updates the core spreadsheet component (o_spreadsheet) to the latest version for the 19.1 release. It addresses several minor bugs and improves the dynamic pivot feature, ensuring a smoother user experience when working with spreadsheets within Odoo. This update contributes to overall stability and performance.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c7598b3a3e [REL] 19.1.9 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c7598b3a3e [REL] 19.1.9 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/f59db40bd3 [FIX] Dynamic pivot: header alignment [Task: 5922279](https://www.odoo.com/odoo/2328/tasks/5922279) https://github.com/odoo/o-spreadsheet/commit/1103dcbea7 [FIX] chart-panel: reset when changing panel [Task: 5926661](https://www.odoo.com/odoo/2328/tasks/5926661) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update adjusts the minimum and maximum amounts available for employee mobility budgets each year. These amounts are indexed annually to reflect changes in compensation and market rates. This ensures employees have access to the appropriate budget for relocation expenses.
Original PR description
Each year the minimum and maximum amount of mobility budget is indexed, here are the new values. Forward-Port-Of: odoo/enterprise#109641
This update fixes an issue where category images in the Point of Sale selector were too large and overwhelmed the category names. The change adjusts the layout to ensure images are appropriately sized, preventing overflow and improving the user experience. This ensures a cleaner and more organized display of product categories.
Original PR description
Before this commit, when a category image was too large, it would overflow and take all the space dedicated to the category name. Now we set the width of the image to 1/3 of the button and the name to 2/3, so that the image never takes too much space. task-id: 5462315 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249368 Forward-Port-Of: odoo/odoo#242054
This update corrects a rounding issue that caused incorrect pricing when ordering combos with multiple identical items in Point of Sale. The fix involves adjusting how prices are calculated for combo lines, ensuring accurate totals are displayed. This improves the reliability of PoS transactions.
Original PR description
**Steps to reproduce:** - Create a combo, set the free and max to 3 - Create the product combo and set it's price to 50 - Go to PoS, order said combo and chose the same product 3 times - The price is…
**Steps to reproduce:** - Create a combo, set the free and max to 3 - Create the product combo and set it's price to 50 - Go to PoS, order said combo and chose the same product 3 times - The price is 49.98 instead of 50 **Problem:** When ordering a combo and taking the same product multiple times, the method to adjust the price does not work as it should. In this case, the method would subtract too much from the total, leading it to be only 49.98 instead of 50. **Why the fix:** This happens because when ordering a combo, each line will get it's price_unit from the combo's price divided by the number of lines. In the case where we have 3 different products, hence 3 different lines, the first two would have a unit_price of 16.67 and the last line will be adjusted as to make it equal to the combo's price, so the last line would be 16.66, making the sum 50. But in the case where there is only one line, the last line is still adjusted, making all the lines 16.66, introducing this error. The solution would be to take the line's qty into account when computing how much we should subtract. Unfortunalty, doing so will, in some cases, introduce a rounding error. If the new unit_price does not round up well (like in this case where it is 16.666668 before rounding and 16.67 after), the rounding will cause a difference between what's shown in the frontend and what's written on the lines in the backend, as the lines are rounded up again before being saved to the backend. The introduced solution is to split the lines, and each have a quantity of 1. With this solution, we can have a different price_unit for each line, which resolves our problem, as the first two lines will have 16.67 and the last one will have 16.66 as price_unit. This is how it was done up until version 18.0, showing every line with a quantity of 1 instead of grouping them. As the grouped lines are now single, some rounding with taxes might differ from what it was before, which is why a test was altered. opw-4931215 Forward-Port-Of: odoo/odoo#247995 Forward-Port-Of: odoo/odoo#221189
This update fixes an issue where editing recurring events synced from Outlook would trigger unwanted emails to attendees. The change prevents Odoo users from directly modifying Outlook-created recurring events, ensuring email notifications are controlled and reliable. This improves user experience and reduces potential communication disruptions.
Original PR description
## Issue: Recurring events created from Outlook should not be able to be edited from Odoo, this is because the changes made are going to be sending unwanted emails to the attendees. ## Steps to…
## Issue: Recurring events created from Outlook should not be able to be edited from Odoo, this is because the changes made are going to be sending unwanted emails to the attendees. ## Steps to reproduce: 1. Connect to Outlook and Sync for user A. 2. Create a recurring event from Outlook. 3. Connect into a user B with access to the event and edit all the events from the series. 4. Run the scheduled action to sync user A. 5. Many emails are going to be sent to the attendees from Outlook. ## Solution: With the current implementation, we are going to avoid editing for the users connected to Outlook, however any user with the access to that event in Odoo and that it has not synced with Outlook is going to be able to edit the event. To avoid this, we should check if the event is recurring and it has been created from Outlook, for this we are going to be looking for the event `microsoft_recurrence_master_id` which will be available only for the recurring events created from Outlook. opw-4374503 Forward-Port-Of: odoo/odoo#252079 Forward-Port-Of: odoo/odoo#199663
This update resolves an issue causing unreliable test results for the HTML editor toolbar. The fix replaces excessive timeouts with a more robust mechanism that accurately waits for the toolbar to appear, ensuring consistent test outcomes. This improves the stability of the HTML editor functionality.
Original PR description
Because a timeout in js only ensures to wait at least for that amount of time while giving no upper bound to the actual awaited time, it was possible for advanceTime(100) to actually wait for more…
Because a timeout in js only ensures to wait at least for that amount of time while giving no upper bound to the actual awaited time, it was possible for advanceTime(100) to actually wait for more than 300ms when the runbot was slow enough. In that case, since enough time has elapsed between the action and checking that the toolbar hadn't opened yet, well it was actually already opened, since we had waited too much, and the test failed non-deterministically. This is actually a special case here. Usually we want to use `waitFor` or `expectElementCount` with the toolbar since it's a popover and is therefore affected by [1]. But we cannot use them to check if the toolbar hasn't opened too early, lest we find ourselves with the same problem than explained above. Using only advanceTime with a timeout of 100ms and a synchronous `expect` check ensures that, in the general case when the runbot is fast, the test will fail in case of a regression, since there would have been ample time to have multiple animation frames during 100ms. The regression will only be hidden when the runbot is very slow and no animation frame has happened during the 100ms timeout, which is an acceptable tradeoff. The same issue appeared in another test so I fixed it as well. Timeouts throughout this test file were excessive, with multiple uses of `advanceTime(500)` while OPEN_TOOLBAR_DELAY is 300ms. This is because the commit dates from before [1] and so it was hard to ensure that enough time and animation frames had passed before we could check with `expect`, which is synchronous. Now we are using `expectElementCount`, which uses `waitFor` under the hood which has a proper mechanism to wait for enough animation frames with an additional internal delay. With these, there is no more need for a manual timeout to exceed the value of OPEN_TOOLBAR_DELAY. Note that this only applies to the cases where we check that the toolbar should be displayed, since cases where it should NOT be displayed before a certain timeout should NOT use those utils, as explained above. runbot-238562 [1]: https://github.com/odoo/odoo/commit/54da715df84789f9a1acc0cfc91be41dcdbab140 Co-authored-by: Sébastien Geelen <sge@odoo.com> Forward-Port-Of: odoo/odoo#247551
This update streamlines testing by consolidating setup steps and reducing unnecessary logging within the Odoo test environment. By optimizing test setup and suppressing noisy logs, the team has lowered the cost of running tests, improving efficiency.
Original PR description
- move a bunch of expensive setUp to setUpClass - backport #152378 to avoid password keying in 17.0 also Forward-Port-Of: odoo/odoo#251905 Forward-Port-Of: odoo/odoo#250667
This update resolves an issue where duplicate labels were appearing for widget properties within the Odoo Studio. The fix involves a technical workaround to prevent the duplication of content rendered by the OWL2 framework, ensuring a cleaner and more consistent user experience when creating and editing widget properties.
Original PR description
steps: - Install Project and Studio - Open studio, add a decimal field - Click on it - There are two "Minimum Digits" instead of "Digits" & "Minimum Digits" Add dummy `t-set` nodes before `t-esc` directives in property sub-templates to prevent label content from being rendered twice. This is a known OWL bug (https://github.com/odoo/owl/issues/1610) where `t-esc` inside a named slot gets duplicated. Since the issue lies in the OWL2 framework itself, a `<t t-set="__dummy"/>` is used as a workaround to break the duplication pattern in owl2. opw-5974611 Forward-Port-Of: odoo/enterprise#109694
This update fixes an issue where flexible calendar employees were incorrectly displaying grayed-out days in planning and related modules. The change ensures that these employees show availability accurately, reflecting only public holidays and leaves as unavailable periods. This improves the usability of the planning app for employees with flexible work schedules.
Original PR description
### Issue: When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible…
### Issue:
When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible calendar should not have any grayed out days other than public holidays.
### Steps to reproduce:
- Create a new work schedule:
- Flexible Hours
- 24 hours per week
- 8 average hours per day
- Create an employee with this work schedule
- Open Planning app
- Only the three first days of the week are not grayed out
### Cause:
With 24 hours per week, the worked time can be done in three days. Odoo considers that the first three days of the given time frame are worked, but the others aren't. This result is returned by `_work_intervals_batch()`. In `_unavailable_intervals_batch()` we then build the unavailabilities by taking the inverse of the work intervals. The only exception was for fully flexible resources (i.e. without a calendar).
### Solution:
The case we need to consider is for flexible resources: they are available anytime, all week long except on public holidays and leaves.
To do this we fix the method `_unavailable_intervals_batch()` which is then called by each module. If the resource is flexible, then we only return the interval of the public holidays overlapping with the time frame.
Works in `appointment`, `hr_holiday_gantt`and `project_enterprise`.
In `planning`, we need to skip the case where nothing is returned in `leaves_mapping` otherwise it will consider the `company_leaves` during weeks with no public holiday or leaves.
In `hr_attendances_gantt`, `_unavailable_intervals_batch()` is not called. So we change the way the unavailabilities were computed to call `_unavailable_intervals_batch()` instead.
opw-4879481
Forward-Port-Of: odoo/odoo#252062
Forward-Port-Of: odoo/odoo#245741This update fixes an issue where employees with flexible calendars were incorrectly displaying grayed-out days in planning and related modules. The change ensures that only public holidays and leaves are reflected as unavailable, providing a more accurate representation of employee availability. This improves the planning experience for teams utilizing flexible work schedules.
Original PR description
### Issue: When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible…
### Issue:
When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible calendar should not have any grayed out days other than public holidays.
### Steps to reproduce:
- Create a new work schedule:
- Flexible Hours
- 24 hours per week
- 8 average hours per day
- Create an employee with this work schedule
- Open Planning app
- Only the three first days of the week are not grayed out
### Cause:
With 24 hours per week, the worked time can be done in three days. Odoo considers that the first three days of the given time frame are worked, but the others aren't. This result is returned by `_work_intervals_batch()`. In `_unavailable_intervals_batch()` we then build the unavailabilities by taking the inverse of the work intervals. The only exception was for fully flexible resources (i.e. without a calendar).
### Solution:
The case we need to consider is for flexible resources: they are available anytime, all week long except on public holidays and leaves.
To do this we fix the method `_unavailable_intervals_batch()` which is then called by each module. If the resource is flexible, then we only return the interval of the public holidays overlapping with the time frame.
Works in `appointment`, `hr_holiday_gantt`and `project_enterprise`.
In `planning`, we need to skip the case where nothing is returned in `leaves_mapping` otherwise it will consider the `company_leaves` during weeks with no public holiday or leaves.
In `hr_attendances_gantt`, `_unavailable_intervals_batch()` is not called. So we change the way the unavailabilities were computed to call `_unavailable_intervals_batch()` instead.
Forward-Port-Of: odoo/enterprise#109571
Forward-Port-Of: odoo/enterprise#105521This update prevents Instagram posts from failing due to delays in media processing. By using a scheduled cron job to retry, the system now handles temporary processing delays gracefully, ensuring posts are published reliably. This improves the overall user experience for Instagram integration.
Original PR description
With the current behavior the Instagram API sometimes requires time to process media containers, the media_id is not yet ready on Instagram side, leading to failed posts. To avoid this, we now use an asynchronous flow: If the media container is not immediately 'FINISHED', we store the container ID in `instagram_post_id` (prefixed with `containerIDs-`), set the state to 'posting', and trigger the scheduled cron to retry in 1 minute. The `_cron_publish_scheduled` method has been updated to detect these pending posts and resume the publication attempt so workers remain free while Instagram processes the media. opw-5081325 Co-authored-by: @ushyme Forward-Port-Of: odoo/enterprise#100313
This update fixes a potential issue where user identification within several Odoo modules (mail, HR, and portal) was inconsistent. By explicitly sending the `partner_id` with `main_user_id`, the system now accurately tracks users across different applications. This prevents unexpected behavior and ensures data integrity.
Original PR description
`main_user_id` should always be sent with its `partner_id` to avoid subtle issues. Indeed the `partner_id` inverse is on `user_ids` not on `main_user_id`. It is indirectly assumed `partner_id` should be set on `res.users`, in particular when using `partner.main_user_id.partner_id`. https://github.com/odoo/enterprise/pull/109364 Forward-Port-Of: odoo/odoo#252185 Forward-Port-Of: odoo/odoo#251641
This update resolves an issue where multi-page invoices in PDF format displayed with an empty first page. The fix adjusts how the PDF rendering engine handles tables, ensuring that invoice line items are correctly split across multiple pages. This improves the overall presentation and usability of invoices.
Original PR description
Steps to reproduce: 1. Create an invoice with enough lines to span at least two pages. 2. Print the Invoice PDF. Observation: The first page appears empty (except for the header), and the entire invoice lines table is pushed to the second page. Cause: The introduction of the 'table-responsive-sm' wrapper in saas-19.1 includes 'overflow-x: auto'. The wkhtmltopdf rendering engine treats elements with overflow properties as unbreakable atomic blocks. If the block's height exceeds the remaining space on the current page, the engine moves the entire container to the next page rather than splitting it. Solution: Apply 'overflow: visible !important' to the 'table-responsive-sm' div. This overrides the Bootstrap default for the reporting engine, allowing the internal table rows to break naturally across pages while retaining the responsive wrapper for web/portal views." opw-5937043
This update resolves a bug that caused the Odoo AI composer to crash when users switched between text and HTML modes. The fix ensures focus handling works correctly for both composer types, improving stability and user experience.
Original PR description
*=ai_app In AI chat, focusing the composer used to call ev.target.select(). That works for the text composer (textarea), but not for the HTML composer (contenteditable), where select() doesn’t exist and causes a TypeError. This update makes focus handling respect the active composer mode: - text mode keeps the existing select behavior - html mode uses the editor focus path instead task-5981018 Forward-Port-Of: odoo/enterprise#109163
This update resolves an issue where the delivery partner wasn't correctly set on shipments created through MTSO pull flows. The fix ensures that partner information is accurately propagated during multi-step delivery processes, particularly in scenarios involving subcontractor resupply orders. This improves order fulfillment accuracy and traceability.
Original PR description
*:{sale_,}stock, mrp_subcontracting ### Sate of the art: Since the refactoring of 19.0 removing the procurement groups and introducing stock references 2713876dbc70d3984e584a9037a2206dcda4e84a, the…
*:{sale_,}stock, mrp_subcontracting
### Sate of the art:
Since the refactoring of 19.0 removing the procurement groups and introducing stock references 2713876dbc70d3984e584a9037a2206dcda4e84a, the `partner_id` is not propagated in pull flows. While the following fix 3bd213c24536fa6d40a7d7a44d4c553947f82c84 addresses some of these propagation issues, it only propagates the partner in case of a move chain for mto moves generated by mto rule. The current PR addresses some of the mtso use cases such as the mtso multi-step pull delivery and the mtso resupply subcontractor on order.
## 1. mtso multi-step pull delivery
### Steps to reproduce:
- In the settings enable: Multi-Step Routes
- Inventory > Configuration > Warehouse Management > Warehouses
- Put your warehouse in deliveries in 3 steps
- Inventory > Configuration > Warehouse Management > Routes
- Modify you 3 steps Delivery (pick, pack, ship) route:
- Change the rules to be in pull Stock -> Pack -> Out -> Cust
- Change the rules: Pack -> Out -> Cust to be in mtso and not mto
- Create and confirm a sale order for a partner A
- The pick, pack and ship should be created
#### > The delivery partner (contact) is only set on the ship
### Cause of the issue:
As the route has been modified to be handled by pull rules, it is generated from end to start by subsequent move confirmations. However, as, the pull rules Pack -> Out -> Cust are in mtso, the associated moves will be created with a `make_to_stock` `procure_method`.
https://github.com/odoo/odoo/blob/5143840911e1f05be3f5f5c7fa786f05e4966312/addons/stock/models/stock_rule.py#L304-L305
Hence, when a procurement is created because of the `mts_else_mto` rule in the `_action_confirm`, the procurement will not set any `move_dest_ids` nor `partner_id`:
https://github.com/odoo/odoo/blob/5143840911e1f05be3f5f5c7fa786f05e4966312/addons/stock/models/stock_move.py#L1549-L1552
https://github.com/odoo/odoo/blob/5143840911e1f05be3f5f5c7fa786f05e4966312/addons/stock/models/stock_move.py#L1688-L1690
https://github.com/odoo/odoo/blob/5143840911e1f05be3f5f5c7fa786f05e4966312/addons/stock/models/stock_move.py#L1699
In other words, the pick and pack moves will not be part of a move chain (with `move_dest_ids`), and the `partner_id` is not propagated.
While the move chain `move_dest_ids` propagation is indeed only intended for mto moves (created by mto rules) since the mtso refactoring: a72382063ee662010729d983fbf6fb6305b8adf2 the `partner_id` should be propagated for pull rule in `mts_else_mto` to avoid losing the delivery partner that used to be propagated by procurement groups which were removed in 19.0 by 2713876dbc70d3984e584a9037a2206dcda4e84a Since the associated fix: 3bd213c24536fa6d40a7d7a44d4c553947f82c84 the `partner_id` can now be propagated via the `procurement_values` but is currently only propagated in case of mto moves:
https://github.com/odoo/odoo/blob/5143840911e1f05be3f5f5c7fa786f05e4966312/addons/stock/models/stock_move.py#L1699
## 2. Resupply subcontractor on order
### Steps to reproduce:
- In the settings enable: Multi-Step Routes, Subcontracting
- Inventory > Configuration > Warehouse Management > Routes
- Set the rule of the "Resupply Subcontractor on order" route to mtso
- Create a subcontracting bom for a finished product (FP) with a storable
component (comp) for subcontractor: Bob
- Create and confirm a PO for 1 unit of FP with Bob as vendor
#### > Bob is not set as delivery contact on the resupply delivery for comp
### Cause of the issue:
When the rule is in MTO, so is procure method of the move raw for comp in the subcontracted MO. As such, the procurement generated at its confirmation will provide a `move_dest_ids`:
https://github.com/odoo/odoo/blob/c2cb705c078015bff0bc673e83a205d7657918e0/addons/stock/models/stock_move.py#L1688-L1698
which allows to propagate the subcontractor once the procurement is run because of these lines:
https://github.com/odoo/odoo/blob/c2cb705c078015bff0bc673e83a205d7657918e0/addons/stock/models/stock_rule.py#L307
https://github.com/odoo/odoo/blob/37c787ed7ca129bbccd02a073b1e03729b22c2b8/addons/mrp_subcontracting/models/stock_rule.py#L15-L20
In the present case, since the rule is in mtso, the `procure_method` of the raw move will be mts and the `move_dest_ids` will not be propagated. So that `partner_id` is never set as the subcontractor.
### Note about the fix:
When the rule `procure_method` is `mts_else_mto`, at the time we enter override of the `_get_stock_move_values` of `mrp_subcontracting`:
https://github.com/odoo/odoo/blob/37c787ed7ca129bbccd02a073b1e03729b22c2b8/addons/mrp_subcontracting/models/stock_rule.py#L15-L20
the only reference to the subcontractor is the one contained in the `production_ids` of the `reference_ids` of the procurement values which does not look like a reliable link as:
- Multiple `reference_ids` could be set in the values of the procurement
- Multiple `productions_ids` could be linked to the `reference_ids`
- Without the link to the subcontracted move raw nothing indicates that we trigger the creation of a move destined for a subcontractor
By contrast, the current proposition rely on the move that should have been set as `move_dest_ids`in the mto flow and mitigate these uncertainties.
opw-5402407
opw-5883477
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#250307This update fixes an issue where formatting was lost when restoring content from the full composer to the basic composer. Now, users receive a helpful popover to choose between restoring formatting or using the simpler composer, addressing a common user frustration and improving workflow efficiency.
Original PR description
Before this commit, when using the full composer and accidentally closing it with some content, the composer content was recovered on the basic composer and formatting was lost. This happens because…
Before this commit, when using the full composer and accidentally closing it with some content, the composer content was recovered on the basic composer and formatting was lost. This happens because restore of content only works in the basic composer, and basic composer does not support rich HTML like the full composer. This commit adds a new UX/UI to restore formatting when accidentally leaving the full composer: When some content has been restored from full composer, opening the chatter composer momentarily disables everything but the full composer button, in addition to show a popover suggesting the user to decide to either continue with Full Composer and restore formatting, or restore content in the small composer without the formatting. Most of the time people want to restore formatting from the full composer, but at the same time the full composer can be a frustrating experience that may incite to just continue with the more reliable small composer. This new popover support both use-cases. Task-5910961 <img width="1219" height="175" alt="Screenshot 2026-02-26 at 17 28 06" src="https://github.com/user-attachments/assets/13d8e1ca-4186-445e-8422-a14c31f8570f" /> Forward-Port-Of: odoo/odoo#247245
This update fixes an issue where production orders couldn't be completed after modifying the Bill of Materials (BoM). The system now accurately reflects changes to the BoM when updating a production order, ensuring orders can be finalized correctly. This prevents delays and errors in the manufacturing process.
Original PR description
Steps to reproduce the issue: - Create a storable product P1 with the following BoM: - A component consumed in an operation. - Create a MO to produce one unit of P1 and confirm it. - Modify the BoM…
Steps to reproduce the issue:
- Create a storable product P1 with the following BoM:
- A component consumed in an operation.
- Create a MO to produce one unit of P1 and confirm it.
- Modify the BoM so that the component is no longer consumed in the operation.
- Update the BoM on the MO.
- Start and finish the operation.
Problem:
The MO cannot be closed because the component is not consumed.
The `manual_consumption` field on the stock move is set to True when the move is linked to a BoM line consumed in an operation. However, when the BoM is modified so that the component is no longer consumed in the operation, this field should be updated to False when the MO is updated from the BoM.
https://github.com/odoo/odoo/blob/1305c7262fff762c00159377a9ce1ca09d423625/addons/mrp/models/mrp_production.py#L1193
https://github.com/odoo/odoo/blob/1305c7262fff762c00159377a9ce1ca09d423625/addons/mrp/models/stock_move.py#L611-L612
opw-5993652
Forward-Port-Of: odoo/odoo#251796This update resolves an issue where users received an empty depreciation schedule report if customers had customized their accounting rules. The fix ensures accurate report generation by granting administrative access to verify asset data, addressing a potential reporting discrepancy.
Original PR description
Following odoo/enterprise@ece0405785, in case a customer modified the `account.move.line` record rules in a way which is incompatible with the AML shadowing, user will only get an empty deprecation schedule report. This commit as a sudo, to ensure we get a correct report, access rights being already check for `account.asset` records.
This update fixes an issue where link popovers in the preview mode were excessively large when titles were long. Now, the popover size is consistently maintained, ensuring a cleaner and more professional look for previews with longer titles. This improves the overall user experience.
Original PR description
Before this commit: the link popover is oversize when the preview has long title. After this commit: the link popover retains its size. task-6000052 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update refines the visual style of polls within the Discuss feature, enhancing readability and user experience. The changes include adjustments to spacing, text and icon sizes, and the removal of a misleading subtitle when a poll is closed. These improvements contribute to a cleaner and more intuitive interface.
Original PR description
- improved spacing (around card, between items, etc.) - small size and opacity / muted tweaks on text and icons - don't show "Select" subtitle when poll has closed Before / After <img width="1618" height="578" alt="Screenshot 2026-03-04 at 18 33 44" src="https://github.com/user-attachments/assets/bef827cd-d9f6-4067-8f77-4f3e17f6f73f" /> <img width="1581" height="571" alt="Screenshot 2026-03-04 at 18 32 51" src="https://github.com/user-attachments/assets/aeb9af94-5095-4784-8b87-d06876c52ba3" />
This update fixes an issue where sick leave days weren't accurately counted across months and the basic salary rule was incorrectly applied when no work entries existed. The changes ensure accurate calculation of sick leave and basic salary, particularly for leaves spanning multiple months or payslips with no work data.
Original PR description
### Issue: - Sick leaves were calculated using the leave record dates, so leaves that started in one month and continued into another month were not counted correctly. - The Basic salary rule was applied even when there were no `WORK100` work entries on the payslip. ### Fix: - Updated the leave filtering logic to consider leaves whose `request_date_from` or `request_date_to` overlaps with the payslip period year, instead of relying solely on the leave start date. - Adjusted the Basic salary computation to execute only when `WORK100` exists in `worked_days_line_ids`, preventing calculation when no effective worked entries are present. ### Impact: - Ensures sick leave days are correctly accounted for in the relevant payslip period, even when the leave spans across months. - Prevents incorrect Basic salary computation on payslips with no `WORK100` work entries, resulting in accurate payroll calculations. --- task-5462380
This update fixes errors preventing users from searching for job titles within the employee directory. Previously, access restrictions based on HR version models caused issues for certain users. The changes now allow all users to search for job titles, resolving both the initial access error and a separate issue related to resume searches.
Original PR description
[FIX] hr: fix job title search access error Bug reproduction: Select marc demo -> employee app -> try to search something for job title -> Access error appears for no hr ones Bug cause: Only…
[FIX] hr: fix job title search access error Bug reproduction: Select marc demo -> employee app -> try to search something for job title -> Access error appears for no hr ones Bug cause: Only users/managers can access to hr_version model and since marc demo has not, it receives this error. Bug solution: I put store=True and compute_sudo for job_title and by that way everyone can search for job_title without access. In the task [MOHF] showed another traceback about job title search. I fixed that in this commit as well. Bug 2 reproduction: employee app -> try to search something for resume -> it will give error (there is no version_ids) Bug 2 cause: There is no version_ids in the employee.public model, in the search version_ids.job_title is used but job_title can be used directly. Bug 2 solution: I used job_title in the search instead of using version_ids.job_title. task - 6000488 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 update resolves an issue where invoice content overlapped with the header on subsequent pages when invoices had many lines. The fix prevents a technical problem with how wkhtmltopdf handles tables across pages, ensuring the header and invoice content are properly spaced.
Original PR description
**Steps to reproduce:** * Install `Accounting` module. * Create an invoice with enough lines to span multiple pages. * Print the invoice to PDF (or use the 'Print' action). **Observed behavior:** *…
**Steps to reproduce:** * Install `Accounting` module. * Create an invoice with enough lines to span multiple pages. * Print the invoice to PDF (or use the 'Print' action). **Observed behavior:** * On the second page (and subsequent pages), the invoice table rows overlap with the company header (logo, address). * This regression was introduced in saas-19.1 after the flexible document layout refactoring (commit). **Cause:** * The invoice's main table (`o_main_table`) is wrapped in a `<div class='table-responsive-sm'>`. * `table-responsive-sm` applies `overflow-x: auto` at narrow viewports, which creates a Block Formatting Context (BFC). * In wkhtmltopdf's WebKit engine, a BFC container does not participate in normal page fragmentation. When the table spans multiple pages, the content bleeds into the next page without respecting the header spacing defined by `--margin-top` and `--header-spacing`. * This causes the continued table rows (and any repeated `<thead>`) to render at the very top of the content area, overlapping with the page header. **ref:** https://github.com/odoo/odoo/commit/15697add5751181544fb61302ddb745a354a2935#diff-c85e75bc27fc841662ca0598c09a22670e0a0b4e5120815934c0a50999ff02bfR172 with this commit `table-responsive-sm` added to invoice pdf layout. **Fix:** * Add `overflow: visible` on the `table-responsive-sm` wrapper div to prevent the creation of a scroll container / BFC. * This ensures wkhtmltopdf can properly fragment the table across pages and respect the header spacing on all pages. **Before:** <img width="874" height="250" alt="image" src="https://github.com/user-attachments/assets/2da0a82a-abc9-49d6-9788-c8e89283e4b2" /> **After:** <img width="872" height="256" alt="image" src="https://github.com/user-attachments/assets/cd38b7e3-b2b6-4c03-a1d8-5ac31cad0925" /> opw-5949713
This update allows all live chat agents with access to modify the description of a channel, regardless of their membership status. Previously, only channel members could make these changes. This enhancement improves agent flexibility and efficiency in managing live chat conversations.
Original PR description
…cription **Before this PR**, only users who were channel members could edit the description of a live chat conversation. With this change, agents who have live chat access can now edit the channel description **even if they are not members** of that specific live chat channel. task-5046015 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update addresses instability in the HTML editor's automated tests. The issue stemmed from the toolbar being a popover, making it susceptible to timing inconsistencies during testing. The team adjusted timeouts and addressed dependencies to ensure more reliable test results.
Original PR description
Forward-Port-Of: odoo/odoo#252130 Forward-Port-Of: odoo/odoo#251122
This update resolves a crash occurring when posting expense entries with the Avalara Avatax integration. The change adjusts how Avatax handles move types, specifically addressing a 'KeyError' related to 'in_receipt'. This ensures smoother expense processing for US-based employees using the Avatax feature.
Original PR description
Currently, the expenses flow with Avatax integration crashes when posting the expense entry. Steps to reproduce: - Have an employee with an address in the US. - Enable 'Detect Automatically' in the Avalara fiscal position. - Create an expense for the employee, paid by Employee. - Submit > Post Journal entry > Post Expense. Action will be blocked by a traceback reporting error `KeyError: 'in_receipt'` Analysis: After [1] expense journal entries are now 'in_receipt'. The dictionary in account_avatax does not take into account this move type. This provides a fallback to 'Any' for any other move types [1] https://github.com/odoo/odoo/commit/f835ac0c8adb49d04bed746fd624b8976cc32991 opw-5872768 Forward-Port-Of: odoo/enterprise#109381
This update resolves a JavaScript error that occurred when reloading the shopfloor app, specifically during MO process runs. The fix disables the automatic focus of the search bar, preventing the 'Cannot read properties of null' error and ensuring a smoother user experience. This improves stability and reliability of the shopfloor functionality.
Original PR description
Steps to reproduce:
- Open the shopfloor app
- Reload or duplicate the page where the MO process is running
Issue:
A JavaScript error occur during reload:
UncaughtClientError > TypeError
Uncaught Javascript Error > Cannot read properties of null (reading 'blur')
Occured on 101125414-19-0-all.runbot180.odoo.com on 2026-02-16 04:59:28 GMT
TypeError: Cannot read properties of null (reading 'blur')
at https://101125414-19-0-all.runbot180.odoo.com/web/assets
/9d8abcf/web.assets_web.min.js:36280:459
Cause:
This happens when the search bar component attempts to call `blur()` on `inputRef.el` while the element is not yet available or has already been destroyed during the component lifecycle.
Fix:
Disable the search bar autofocus in the shopfloor
`env.config.disableSearchBarAutofocus = true`.
opw-5902675
upg-3894728
Forward-Port-Of: odoo/enterprise#107491This update resolves an issue where avatars in collaborative list views (like 'To Do' notes) were consistently positioned on the first line, regardless of where the user focused within the list. The fix ensures avatars now dynamically follow the user's cursor movement, improving the visual experience and usability of collaborative lists. This enhancement was implemented as a bug fix.
Original PR description
Since [1] when using collaboration, the position of the avatar for list items is always displayed on the first line - instead of following the user's focus. This commit fixes this by only applying the patch of [1] when inside an embedded component. Steps to reproduce: - Go to a "To do" note - Add a checked list with indented items - Access the same note from another window - Move around the checked list and observe avatar in other window => Avatar remained on first line while moving around list items [1]: https://github.com/odoo/odoo/commit/9863cb25d6dfdba224897f21634bdaaf3eca91a7 task-5930388 Forward-Port-Of: odoo/odoo#248438
This update fixes an issue where negative values were appearing in tax reports for carried over amounts (specifically lines 81-88). The change ensures that tax report XML files accurately reflect tax calculations, preventing potential reporting discrepancies. This improves the accuracy of financial reporting.
Original PR description
When generating the xml for tax report, negative values should not be present in the xml for carried over lines (81, 82, 83, 86, 87, and 88) Steps: - Create a RBILL for today - 1 month, add an invoice line with tax using one of the following tags: -81, -82, -83, -86, -87 or -88 in its base refund repartition line - Open the tax report on the month of the RBILL - Generate the xml, either by the dedicated button, or by creating and posting the closing entry -> there is line(s) for negative amounts opw-5955323 opw-5428395 Forward-Port-Of: odoo/enterprise#109568 Forward-Port-Of: odoo/enterprise#108916
This update resolves an issue where rounded corners and background colors weren't consistently applied in the Mass Mailing app's email templates. The fix adjusts table styling to ensure accurate preview and rendering of card elements, improving email design consistency.
Original PR description
**Steps to reproduce:** - Go to mass_mailing app - Add Columns block with multiple content size - Increase Round Corners (e.g. 20 px) - In "Vert. Alignment" field > Select the "Stretch to Equal…
**Steps to reproduce:**
- Go to mass_mailing app
- Add Columns block with multiple content size
- Increase Round Corners (e.g. 20 px)
- In "Vert. Alignment" field > Select the "Stretch to Equal Height" option
- Add color background for the columns
- Save the record and send test mail
- Round corners are not applied
- Background color doesn't expand to the bottom of the body
**Issue:**
Default table style used for the inline conversion of
`await toInline($(editableClone), { $iframe: $(iframe), wysiwyg: this.wysiwyg });` in `mass_mailing_html_field`,
has its 'border-collapse' attribute set to 'collapse' by default in `enforceTablesResponsivity`.
This attribute doesn't work with `border-radius` and the resulting display differs from the preview of the editor.
Relevant links:
https://stackoverflow.com/questions/628301/the-border-radius-property-and-border-collapsecollapse-dont-mix-how-can-i-use https://stackoverflow.com/questions/36035461/what-is-the-difference-between-border-collapse-collapse-and-border-spacing-0
**Fix:**
Use `'border-collapse': 'separate'` and `'border-spacing': 0` but this can
introduce border stacking inside the table element where the original collapse
was needed.
Add back the `overflow` inherited by the card attributes to ensure
inside border are visually properly contained inside the border (but not
sure as to why it was removed 4 years ago).
Also set the height of table sub-elements to `100%` to ensure background
property is properly applied on the whole card body.
opw-5218581
Forward-Port-Of: odoo/odoo#251863
Forward-Port-Of: odoo/odoo#242001This update fixes an issue where 'ship later' orders were incorrectly showing a zero total cost due to stock moves not yet being valued. The fix now uses the product's standard price when stock moves are unvalued, ensuring accurate order totals for FIFO/AVCO orders with a shipping date. This improves the reliability of order pricing.
Original PR description
When "ship later" is selected, stock moves are created at order time but not yet valued. This caused `_compute_total_cost` to set `total_cost = 0` for FIFO/AVCO order lines because `_get_price_unit()` returns 0 on unvalued moves, and the existing fallback to the refunded line's cost only covered the refund case. Fix by also falling back to `product.standard_price` when the move cost is zero, `shipping_date` is set, and the line is not a refund. opw-5997872 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251799
This update fixes an issue where combo items weren't always printed to the preparation printers if their category didn't match the main combo product. Now, items are printed based on their own category, ensuring all combo components are correctly prepared for self-order orders. This improves the accuracy and efficiency of the POS system.
Original PR description
Previously, combo choice items with categories assigned to a preparation printer were skipped when their category differed from the combo parent product’s category. This commit ensures that items are printed to the preparation printer based on their own product category. Task: 5902389 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249859
This pull request addresses a minor technical issue in the German localization (l10n_de) of Odoo. Specifically, a problem with how tags were being defined in the account account tags data file was corrected. This ensures accurate reporting and categorization of financial transactions for German-speaking users.
Original PR description
Commit db0d499952192ede0def2a070e103ba67952387c inverted some tags which is wrong opw-5415426 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250744
This update corrects a bug where tags in German financial reports were incorrectly sorted, preventing proper auto-completion functionality. The team has also improved testing to catch similar errors in the future. This ensures accurate reporting for our German-speaking customers.
Original PR description
Commit https://github.com/odoo/odoo/commit/db0d499952192ede0def2a070e103ba67952387c inverted some tags which is wrong Tags must be sorted for the auto complete to work properly Improving tests to catch more errors opw-5415426 Forward-Port-Of: odoo/enterprise#108848
This update removes a display field ('Visible Internally Only') from the customer rating form in the Helpdesk module. This field was no longer needed as customer ratings are no longer visible on the website. This change improves the user experience and simplifies the Helpdesk interface.
Original PR description
**Steps to reproduce:** - Open a Helpdesk ticket with a customer rating. - View the rating form. - Observe the field ‘Visible Internally Only’ still showing. **Issue:** - The field is displayed even though ratings are no longer shown on the website. **Reason:** - The field is now irrelevant but still present in the view. **Fix:** - Invisible the ‘Visible Internally Only’ field from the customer rating form in the affected version. **Task id - 5359052** Forward-Port-Of: odoo/enterprise#109287 Forward-Port-Of: odoo/enterprise#100686
This update fixes a technical problem that prevented Odoo from reliably sending messages to the Peppol network. Specifically, a backlog of messages caused a recurring cron job loop and token issues, leading to connection errors. This change ensures smoother and more consistent communication with the Peppol network, improving data synchronization.
Original PR description
Fix two issues observed on Odoo production. 1) When more than 50 messages from this odoo db/client are queued to be sent on peppol-ap, all client-side messages remain in `processing` If the send queue stays saturated, the retrigger logic repeatedly schedules the cron, causing an infinite `ir_cron_peppol_get_message_status` loop. 2) Each cron refreshes the authentication token, which allows concurrent threads to refresh it in parallel. Due to the `REPEATABLE READ` isolation level, a long-running cron may continue using the old token while another thread has already refreshed it. This leads to `invalid-signature` responses and incorrectly marks the connection as out of sync on one thread, even through the long-running transaction fails on trying to commit. Thus, simply flushing the cursor will block the transaction in such a situation no-task Forward-Port-Of: odoo/odoo#252177
This update ensures that One Stop Shop (OSS) invoices for intra-EU B2C sales in Italy comply with Italian Revenue Agency regulations. Previously, invoices were rejected due to the way foreign VAT was presented. Now, the system correctly generates invoices by separating VAT into distinct lines, meeting the required format for electronic invoicing.
Original PR description
This commit aligns the Italian e-invoicing (FatturaPA) generation for One Stop Shop (OSS) transactions with the requirements of the Italian Revenue Agency ( Agenzia delle Entrate). Current behavior:…
This commit aligns the Italian e-invoicing (FatturaPA) generation for One Stop Shop (OSS) transactions with the requirements of the Italian Revenue Agency ( Agenzia delle Entrate). Current behavior: Invoices for intra-EU B2C sales (OSS) are generated with a single line containing the foreign VAT rate. This is rejected or considered non-compliant by the SDI because foreign VAT cannot be typically exposed in the standard way for Italian electronic invoices. New behavior: The XML generation logic has been updated to follow the specific codification required for OSS operations: 1. Invoice Lines (`DettaglioLinee`): - The product line is reported with 0% VAT and Nature 'N7' (VAT paid in another EU member state). - A new, separate line is injected to represent the VAT amount, classified with Nature 'N2.2' (Non-taxable/Other). 2. Tax Summary (`DatiRiepilogo`): - The original foreign tax lines are excluded from the summary. - Synthetic summary lines are added for the 'N7' (Taxable Base) and 'N2.2' (VAT Amount) categories. Implementation details: - Added `_l10n_it_is_oss_tax` helper to identify OSS taxes. - Modified `_l10n_it_edi_get_line_values` to split OSS lines. - Modified `_l10n_it_edi_get_tax_values` to adjust the tax summary. task-4711509 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#252216 Forward-Port-Of: odoo/odoo#243740
This update fixes a discrepancy in how inventory values are calculated. Previously, Odoo incorrectly assumed midnight when processing dates for inventory valuation, leading to inaccurate reports. This change ensures that inventory values are calculated through the end of the day, aligning with standard business practices and improving reporting accuracy.
Original PR description
### Problem: If `_compute_quantities` is called with only a date specified in `to_date` context (no timestamp), Odoo will assume midnight (00:00:00) instead of end of day (23:59:59). This contradicts logic in other places, such as `_compute_total_value`, which opts for the convention that "As of \<date>" means "through \<date>". ### Solution: We will run `_compute_quantities` with `to_date` at 23:59:59. ### Steps to replicate (Runbot 19): 1. Receive a valued and tracked product (you can make the impact more obvious by setting the cost very high) 2. Backdate the receipt to some day in the past using the method of your choice (inspector tool, server action) 3. Go to the Inventory Valuation report, set "As of" date to the backdated receipt date, note that the value of the validated receipt is not there 4. Set "As of" to the day AFTER the receipt date, note the value is now shown opw-5893999 Forward-Port-Of: odoo/odoo#251253
This update fixes an issue where changing the popup backdrop color or hiding/showing the popup would unexpectedly cause it to disappear. The fix ensures the history plugin correctly tracks backdrop changes, preventing these inconsistencies and improving popup stability. This resolves a reported bug impacting user experience.
Original PR description
Steps to reproduce in 18.4: - Add a popup on the page - Click on the popup - Change the backdrop color - Hide the popup by clicking on its entry in "Invisible Elements" - Undo - Redo - Bug: The popup disappears Steps to reproduce in 19.0: - Add a popup on the page - Click on the popup - Hover a color in the colorpicker of the backdrop option of the popup - Stop hovering the color - Bug: The popup disappears Forward-Port-Of: odoo/odoo#251849 Forward-Port-Of: odoo/odoo#244213