Daily updates from Odoo
Navigate
Branch
Friday, March 6, 2026
268 changes
13 changes
Enhancements to existing features
This update improves the user interface and simplifies maintenance for the Vietnam tax settings within Odoo. It updates tax information files, ensuring accurate calculations and a better experience for users in Vietnam. This change is part of a larger effort to enhance the Odoo platform.
Original PR description
For better UI and maintenance. task-[5904297](https://www.odoo.com/odoo/all-tasks/5904297) enterprise-[109478](https://github.com/odoo/enterprise/pull/109478)
Resolved issues and error corrections
This update corrects a problem with how leave periods are calculated, specifically addressing potential inconsistencies caused by differences in time zones. By using a new date field, the system now accurately reflects leave periods regardless of where the employee is located, 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 addresses a technical issue within the Odoo `l10n_vn` module related to tax report testing. The change involves updating a tax label to ensure existing tests pass, improving the reliability of the tax reporting functionality for Vietnamese users. This resolves a previously failing test and ensures accurate reporting.
Original PR description
Updates in the `l10n_vn` module revised a tax label. We update it here to pass otherwise failing tests. task-[5904297](https://www.odoo.com/odoo/all-tasks/5904297) odoo-[251906](https://github.com/odoo/odoo/pull/251906)
This update resolves a recurring issue in the l10n_ph_reports_asset module's test suite. The problem stemmed from how daily depreciation calculations were handled, specifically when dealing with leap years, which caused intermittent test failures. This fix ensures accurate depreciation reporting, particularly during leap years.
Original PR description
The test suite fails intermittently due to leap years affecting daily -computed depreciation runbot-[241145](https://runbot.odoo.com/odoo/runbot.build.error/241145)
This update fixes an issue where highlight colors were difficult to see in Odoo's dark mode settings. The change ensures text is black, significantly improving readability and the user experience when navigating the settings interface.
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 a technical issue that prevented users from correctly ordering stock when using the replenishment multiple feature. The fix corrects a calculation error within the stock management system, ensuring accurate order quantities are generated. This improves the reliability of stock replenishment processes.
Original PR description
Backport of: https://github.com/odoo/odoo/commit/fe806166968d55a70f5bf335dcb3633e18d8ecc7 Steps to reproduce: - Create a storable product “P1”: - UoM: Unit and Pack of 6 - Purchase tab: add any vendor - Go to Replenishment and create a new rule: - Product: P1 - Min: 10 - Max: 100 - Replenishment Multiple: Pack of 6 - Select the line and click “Replenish” → “Order to Max” Issue: A traceback is raised: “TypeError: unsupported operand types in: uom.uom(2,) - 4.0” In `_get_qty_to_order`, we compute the quantity to order and then adjust it according to the replenishment multiple, but we try to Subtract the rounded remainder from the uom (which is a recordset) instead of the quantity (which is a float). opw-5947919 Forward-Port-Of: odoo/odoo#251756 Forward-Port-Of: odoo/odoo#250608
The loyalty program's redemption popup now correctly displays the program name instead of a generic 'Gift Card' message. This change also uses the appropriate currency symbol for points, providing a clearer and more accurate representation of the customer's reward. This enhances the user experience and ensures consistent messaging across all 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 UI issue related to work order completion dates and excludes subcontracted productions from the Kanban view. These changes enhance the clarity and usability of the work order management process, ensuring accurate tracking and reporting.
Original PR description
A few UI Fixes. Fix date_finished when setting a workorder 'in progress'. Exclude subcontracted productions from Kanban view. task: 5945452
This update resolves an issue where work orders weren't correctly displayed in the Kanban view, particularly for subcontracted productions. It also fixes a bug related to accurately reflecting the status of work orders as 'in progress'. This ensures a more accurate and reliable view of work order activity.
Original PR description
A few UI Fixes. Fix date_finished when setting a workorder 'in progress'. Exclude subcontracted productions from Kanban view. task: 5945452
This update fixes several issues within the Odoo spreadsheet component, ensuring it's running the latest version compatible with the 19.2 release. These fixes improve the dynamic pivot table functionality and address minor UI inconsistencies, enhancing the user experience.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/ccf90d6262 [REL] 19.2.2 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/ccf90d6262 [REL] 19.2.2 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/5883e326cd [FIX] Dynamic pivot: header alignment [Task: 5922279](https://www.odoo.com/odoo/2328/tasks/5922279) https://github.com/odoo/o-spreadsheet/commit/a714ce64b1 [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 for employee mobility budgets each year, aligning with local regulations. The changes ensure accurate budget calculations and support employee relocation needs. This is a routine maintenance update.
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 resolves an issue where rapidly clicking the 'Back' button during barcode internal transfer creation resulted in duplicated quantities being added to the transfer. The fix prevents multiple 'save' calls, ensuring accurate quantity tracking.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to the > Settings*, enable *Packages* and *Storage Locations*(warehouse). * Create a storable product and set *Tracking Inventory* to **By…
**Steps to reproduce:** * Install `stock` module. * Go to the > Settings*, enable *Packages* and *Storage Locations*(warehouse). * Create a storable product and set *Tracking Inventory* to **By Quantity** and set some *barcode* * Update the on-hand quantity for the product and assign it to one packages. * Open *Barcode > Operations > Internal Transfer* and create a new transfer. * Click the *gear icon* in the top-right corner to open the barcode scanning flow. * manually enter the created product barcode and apply it. * Click the **Back** button multiple times in quick succession. * Go to the backend and open the created internal transfer. **Observed behavior:** * The internal transfer is created with *double quantities* compared to what was added in the barcode interface. **Cause:** * When clicking the *Back* button, the following flow is triggered: `exit()` → `beforeQuit()` → `save()`. https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/components/main.js#L406-L414 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_model.js#L473-L475 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_picking_model.js#L828-L832 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_model.js#L477-L483 * If the button is clicked multiple times rapidly, `exit()` is called again before the previous `save()` RPC completes. * This results in multiple `save()` calls being executed, causing duplicated quantities on the picking. reference - https://github.com/odoo/enterprise/pull/103999/changes/b791239c154deb6a25f85d65ebc72e3ac53b6c74 **Fix:** * Prevent rapidly clicking the Back button multiple times does not multiply quantities. --- opw-5375899 Forward-Port-Of: odoo/enterprise#109013 Forward-Port-Of: odoo/enterprise#103130
This update fixes an issue where large category images in the Point of Sale selector would overflow, obscuring the category name. The change adjusts the layout to ensure images are appropriately sized, preventing overflow and improving the visual clarity of the selector. This enhances the user experience for product selection.
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
19 changes
New functionality added to Odoo
This update incorporates recently added cities in Mexico into the Odoo Enterprise system. This ensures accurate reporting and compliance for Mexican businesses using the l10n_mx_edi_extended module. It’s a routine update to maintain data accuracy.
Original PR description
The Mexican government has recently introduced new cities. This pr adds those cities here as well. task-5883334 Forward-Port-Of: odoo/enterprise#109358 Forward-Port-Of: odoo/enterprise#107623
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
7 changes
New functionality added to Odoo
This update incorporates recent changes to Mexican city listings within the Odoo Enterprise system. This ensures accurate reporting and compliance for Mexican businesses utilizing the l10n_mx_edi_extended module. The change reflects the latest government updates.
Original PR description
The Mexican government has recently introduced new cities. This pr adds those cities here as well. task-5883334 Forward-Port-Of: odoo/enterprise#109358 Forward-Port-Of: odoo/enterprise#107623
Enhancements to existing features
This update enhances logging for transactions related to Codabox integration (_l10n_be_codabox_fetch_coda_transactions). These improved logs will assist the support team in quickly identifying and resolving any issues with the Codabox data synchronization process. This ultimately reduces support response times and improves the reliability of the integration.
Original PR description
This commit will improve the logs of _l10n_be_codabox_fetch_coda_transactions to help the support team to debug possible problem. task-5436868 Forward-Port-Of: odoo/enterprise#108213 Forward-Port-Of: odoo/enterprise#107779
Resolved issues and error corrections
This update fixes a bug where users could incorrectly cancel subscriptions that already had invoices generated. The change adds a check to ensure subscriptions with invoices remain uncancelled after being closed, preventing revenue discrepancies and ensuring accurate subscription management. This resolves an issue identified in opw-5479719.
Original PR description
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to…
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to cancel the subscription * A ValidationError is correctly raised 5. Close the subscription by selecting any close (churn) reason 6. Attempt to cancel the same closed subscription again Observation: -------------------------------- The subscription is successfully cancelled even though it already has invoices Issue: -------------------------------- In the following code: https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/sale_subscription/models/sale_order.py#L741-L742 The cancellation logic does not check whether a subscription is already churned and still has active invoices Solution: -------------------------------- Added an additional condition to prevent cancelling churned subscriptions that still have active invoices opw-5479719 Forward-Port-Of: odoo/enterprise#106596
This update resolves an issue preventing PDF exports of composite reports that included journal report sections. The fix ensures that journal reports utilize their specialized PDF generation process, allowing for accurate PDF creation. This improves the functionality of composite reports for users generating financial data.
Original PR description
# Steps to reproduce: * Enable **Developer Mode**. * Go to **Accounting → Configuration → Accounting → Accounting Reports**. * Create a new report and enable **Composite Report**. * Add a new line of…
# Steps to reproduce: * Enable **Developer Mode**. * Go to **Accounting → Configuration → Accounting → Accounting Reports**. * Create a new report and enable **Composite Report**. * Add a new line of type **Journal Report**. * Save the report and create a menu item from the gear icon. * Open the report from the reporting menu. * Try to download the report in **PDF** format. # Observed behavior: * PDF export fails with a traceback. * Composite reports containing journal report sections cannot be exported as PDF. # Cause When exporting a composite report to PDF, the export flow iterates over each embedded sub-report and generates the HTML body used for PDF rendering. * The composite export relies on the base [`export_to_pdf`](https://github.com/odoo/enterprise/blob/a4e2c7c7d3aa50c8b57668c9ca73f523a31a5c41/account_reports/models/account_report.py#L5875) implementation from `account.report`, which directly calls `_get_pdf_export_html()` for each sub-report. * For standard reports, this works as expected because they use the base [`_get_pdf_export_html`](https://github.com/odoo/enterprise/blob/a4e2c7c7d3aa50c8b57668c9ca73f523a31a5c41/account_reports/models/account_report.py#L5944) method, which renders flat report lines into the default PDF template. * Journal reports, however, rely on a completely different PDF structure. Their templates expect `document_data` (journal entries grouped by journal/document) instead of flat report lines. * This `document_data` is generated exclusively by the journal report’s custom handler via its own [`export_to_pdf`](https://github.com/odoo/enterprise/blob/a4e2c7c7d3aa50c8b57668c9ca73f523a31a5c41/account_reports/models/account_journal_report.py#L240) flow. * The handler builds the required `document_data` using [`_generate_document_data_for_export`](https://github.com/odoo/enterprise/blob/a4e2c7c7d3aa50c8b57668c9ca73f523a31a5c41/account_reports/models/account_journal_report.py#L261C9-L261C22). * When a journal report is embedded inside a composite report, the composite export logic bypasses the custom handler and forces the report through the base `_get_pdf_export_html()` pipeline. * Since the base pipeline does not generate `document_data`, the journal report PDF template fails at render time with `KeyError: 'document_data'`. In short, journal reports embedded in composite reports were incorrectly routed through the standard PDF export pipeline instead of their specialized handler-based one. # Fix: * Add PDF export support to the journal report custom handler. * Centralize common print option logic in a shared helper. * Update composite report export logic to delegate PDF generation to custom handlers when available. * Journal reports inside composite reports now export to PDF correctly. opw-5477551 Forward-Port-Of: odoo/enterprise#109262 Forward-Port-Of: odoo/enterprise#105040
This update fixes an issue where IoT blackbox warnings were incorrectly treated as errors. Now, when the blackbox returns a warning code (starting with '1'), a notification is displayed to the user. This ensures warnings are properly communicated and addressed, improving the overall reliability of the POS system.
Original PR description
Before this commit, all errors returned by the iot after a call to the blackbox were considered as errors. Actually, the errors are only the ones that do not start with 0 (no error) or 1 (warning). This commit changes the behaviour when handling warning. We now show a notification. task-id: 5062178 Forward-Port-Of: odoo/enterprise#103112 Forward-Port-Of: odoo/enterprise#93896
This update adjusts the minimum and maximum amounts for employee mobility budgets each year, aligning with local regulations. These changes ensure employees have access to the appropriate budget range for relocation expenses, improving compliance and employee support. The update affects the l10n_be_hr_payroll module.
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 prevents Instagram posts from failing due to delays in media processing. By using a scheduled cron job to retry publication, the system now handles temporary processing delays gracefully, ensuring posts are successfully published without impacting server performance.
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
6 changes
Resolved issues and error corrections
This update fixes a bug where users could cancel subscriptions that had already been closed and generated invoices. The change adds a check to ensure that cancelled subscriptions with outstanding invoices cannot be re-cancelled, preventing potential billing issues and maintaining data integrity. This ensures accurate subscription management.
Original PR description
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to…
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to cancel the subscription * A ValidationError is correctly raised 5. Close the subscription by selecting any close (churn) reason 6. Attempt to cancel the same closed subscription again Observation: -------------------------------- The subscription is successfully cancelled even though it already has invoices Issue: -------------------------------- In the following code: https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/sale_subscription/models/sale_order.py#L741-L742 The cancellation logic does not check whether a subscription is already churned and still has active invoices Solution: -------------------------------- Added an additional condition to prevent cancelling churned subscriptions that still have active invoices opw-5479719 Forward-Port-Of: odoo/enterprise#106596
This update corrects a visual issue where avatars in collaborative list items (like 'To Do' notes) were consistently displayed on the first line instead of following the user's focus. The fix ensures avatars remain aligned with the selected list item, improving the user experience when navigating between different windows or sections of a collaborative note.
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 resolves an issue where payment processing through Authorize.Net was occasionally failing due to a conflict between API requests and background updates. By implementing a temporary lock on payment records, Odoo now ensures that tokens are used only once, preventing errors and guaranteeing successful payment processing. This improves the reliability of our payment system.
Original PR description
Currently, when processing a payment through Authorize.Net, a concurrent update (e.g., from a background cron job) can trigger a PostgreSQL `SERIALIZATION_FAILURE` right after the API request succeeds. Because Odoo automatically retries the request upon this failure, the second attempt sends the same One-Time-Use (OTS) token. Authorize.Net rejects the reused token ("Invalid OTS Token"), causing a successful charge to be incorrectly marked as failed in Odoo.
This commit introduces a pessimistic lock (`FOR NO KEY UPDATE`) on the `payment_transaction` record before making the call to Authorize.Net. This serializes access to the transaction row, ensuring that any lock waits or serialization failures occur *before* the single-use token is consumed, allowing Odoo's automatic retry mechanism to succeed safely.
opw-5475032
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#249088This update adjusts the minimum and maximum amounts for employee mobility budgets each year, aligning with local regulations. These adjustments ensure employees have access to the appropriate budget levels for relocation expenses. This change impacts the HR payroll module.
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 resolves an issue where editing recurring events synced from Outlook triggered unwanted email notifications to attendees. The fix prevents Odoo users from directly editing Outlook-created recurring events, ensuring email notifications are only sent when necessary. This improves user experience and reduces unnecessary communication.
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 fixes an issue where manually adjusted prices in Point of Sale (PoS) settlements weren't being correctly applied. Previously, PoS settlements would revert prices back to the base price, even if the user had manually set a different price. Now, the system accurately reflects user-defined prices during settlement, ensuring accurate transactions.
Original PR description
**Steps to reproduce:** - Create a product tracked by lot, set it's price to 1000 - Create a quotation add a line with the created product and change the price to 1200 - Add another line with the…
**Steps to reproduce:** - Create a product tracked by lot, set it's price to 1000 - Create a quotation add a line with the created product and change the price to 1200 - Add another line with the same product and change it's price to 600 - Go to PoS and settle this quotation - The lines' prices will be 1000 and 600 instead of 1200 and 600 **Why the fix:** In the event of a settle with a product tracked by lots, we are setting the price of all *related_lines* (lines with the same product in this case) to it's base price, not taking into account the fact that this price has been modified by the user when making the quotation. This only happens for related lines, which explains why one line's price is still 600 while the other was reverted to the base price of 1000 instead of being 1200 as it was previously set. To avoid this, we now set the price_unit back to the base one only if the price hasn't been changed manually. opw-5223463 Forward-Port-Of: odoo/odoo#251883 Forward-Port-Of: odoo/odoo#238295
2 changes
Resolved issues and error corrections
This update fixes a bug where users could incorrectly cancel subscriptions that already had invoices generated. The change adds a check to ensure subscriptions with active invoices cannot be cancelled after they've been closed, preventing revenue discrepancies and ensuring accurate subscription management. This improves data integrity and reliability.
Original PR description
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to…
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to cancel the subscription * A ValidationError is correctly raised 5. Close the subscription by selecting any close (churn) reason 6. Attempt to cancel the same closed subscription again Observation: -------------------------------- The subscription is successfully cancelled even though it already has invoices Issue: -------------------------------- In the following code: https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/sale_subscription/models/sale_order.py#L741-L742 The cancellation logic does not check whether a subscription is already churned and still has active invoices Solution: -------------------------------- Added an additional condition to prevent cancelling churned subscriptions that still have active invoices opw-5479719 Forward-Port-Of: odoo/enterprise#106596
This update ensures that the 'Insert in spreadsheet' action is only visible to users with the necessary permissions for Documents and Dashboards. Previously, all users could see this option, regardless of their access rights. This change improves the user experience by aligning the available actions with user roles.
Original PR description
Current behavior before PR: - The 'Insert in spreadsheet' action was always visible in the list view action menu, even when the user lacked access rights for Documents or Dashboards. Desired behavior after PR is merged: - The action is shown in the list view action menu only if the user has the required permissions. Task: 5930184 Forward-Port-Of: odoo/enterprise#108099
35 changes
New functionality added to Odoo
This update introduces a new Profit and Loss report specifically designed to align with Mexican tax regulations (NIF B3). This ensures accurate reporting for businesses operating in Mexico, simplifying tax preparation and compliance.
Original PR description
Added new Profit and Loss report to follow NIF B3 structure task-5174207
This pull request updates several components within the Odoo Enterprise accounting module, specifically related to bank reconciliation workflows. The changes include refinements to the user interface and functionality for managing bank reconciliation lines, statements, and related processes. These updates aim to improve the overall user experience and accuracy of bank reconciliation operations.
Enhancements to existing features
This update improves the accuracy of employee payroll data by adding three new fields to DMFA work locations. These changes automatically populate related competence information, streamlining payroll processing and ensuring data consistency. This enhancement supports compliance with Belgian payroll regulations.
Original PR description
This commit aims to add 3 new fields on the DMFA work locations, some data is updated accordingly to prefill competence field on existing data task-5979423
This update makes it easier for users to add sign templates to offers. Now, when no templates exist, a clear warning message with an upload button guides them to set up their first template. This eliminates the previous manual process of adding PDFs, creating a more streamlined workflow.
Original PR description
Before this PR, if no PDF was uploaded, users had to add it manually. In this PR, - If no Sign templates exist in the system, show a blue warning message: "No templates are configured yet. Do you want to set up the first one?" - The warning includes an Upload PDF button. - When no Contract Template is selected, show an Upload PDF button next to the field. Impact - Users can now add a PDF Sign Template directly from the Offer, without needing an existing Contract Template first. This provides a smoother and more intuitive experience. task-5358196
This update streamlines testing for the `mrp_workorder` module by running tests after other modules are installed, speeding up the process. Additionally, a fix resolves an access issue preventing workorder cancellation for users without full accounting permissions, and removes an obsolete quality override.
Original PR description
The main change is to set `mrp_workorder` tests as `post_install`. Other commits are fixes that emerged from trying to run those tests with other modules installed.
Resolved issues and error corrections
This update resolves an issue where buttons in the Master Production Schedule (MPS) view remained visible even when no MPS records were present, creating a confusing user experience. The fix ensures these buttons are hidden when no records exist and refreshes the view after deleting all records, directing users to the next available MPS record.
Original PR description
Before this commit: ==================== In the Master Production Schedule (MPS) view, the `Order` and `Duration` buttons remain visible even when there are no MPS records. It leads to a confusing…
Before this commit: ==================== In the Master Production Schedule (MPS) view, the `Order` and `Duration` buttons remain visible even when there are no MPS records. It leads to a confusing user experience, as actions are shown while no records are available to act upon. Steps to Reproduce: ==================== 1. Install `mrp` module. 2. Go to Settings → Enable `MPS` option. 3. Navigate to MPS → Delete all MPS records → the `Order` and `Duration` buttons are still visible. Additionally, when MPS records span multiple pages and the user deletes all records from current page, the view is not refreshed to redirect the user to another page that still contains records. Cause of the issue: ==================== - The visibility of the `Order` and `Duration` buttons was not tied to the presence of MPS records. The logic did not check whether any MPS records existed, so both remains visible even when no MPS records were present. After this commit: ==================== This commit ensures that `Order` and `Duration` buttons are hidden when there are no MPS records. Additionally, the view is refreshed after deleting all records from a page, ensuring the user is redirected to a page with remaining MPS records. TaskID-5356994
This update fixes an issue where multi-employee payslips were defaulting to the language of the first employee. The change ensures that each employee's payslip is printed in their correct, selected language, improving accuracy and user experience. This resolves a previous bug related to date formatting and caching.
Original PR description
Steps to detect the bug: - Install payroll - Create more than one employee with different payslip languages - Add a contract for the employees - Payroll -> Payslip -> Pay run - Create a new payroll for more than one employee - Select all the employees in the pay run - Click 'print' button - Dates for the employees that are not the first one are in the language of the first employee This commit will allow the user to create multiemployee payslips maintaining the correct selected payslip language for each one of them. The issue was caused by a cache dictionary that used only the date and date format as a key, failing to include the user language. This led the system to reuse the first translated date for all subsequent employees. opw-5865260 Forward-Port-Of: odoo/enterprise#107269 Forward-Port-Of: odoo/enterprise#106575
This update corrects an issue where internal users receiving ‘Signed Document’ emails were incorrectly directed to the public portal instead of the document preview. The change now ensures internal users are automatically redirected to the correct internal preview, while the portal experience remains unchanged for public users. This improves the user experience for internal teams.
Original PR description
Internal users opening the “Signed Document” email link were redirected to the portal instead of the document preview. Now they are redirected to the internal preview, while public users remain unchanged. task-5486043 Forward-Port-Of: odoo/enterprise#109425 Forward-Port-Of: odoo/enterprise#107079
This update resolves a crash issue that occurred when viewing pay runs on mobile devices with a smaller screen size. The fix ensures the system correctly identifies the scrollable container, preventing errors and improving the stability of the payroll module. This update maintains the existing Kanban layout while addressing a critical functionality problem.
Original PR description
**Steps to Reproduce:** 1. Open Payroll->Payslips->Pay Runs 2. Click on a Pay Run in Mobile View (Width < 600px). 3. Return to the previous view using the breadcrumb. 4. The system crashes with…
**Steps to Reproduce:** 1. Open Payroll->Payslips->Pay Runs 2. Click on a Pay Run in Mobile View (Width < 600px). 3. Return to the previous view using the breadcrumb. 4. The system crashes with Traceback: TypeError: Cannot set properties of null (setting 'scrollLeft') **Bug Cause:** The custom 'hr_payroll.PayrunKanbanRenderer' template overrode the 'class' attribute of the root div. By setting it only to 'o_payrun_kanban', the standard 'o_renderer' class was removed. The Kanban controller's scroll restoration logic (introduced in recent lazy-loading updates) relies on the '.o_renderer' selector to find the scrollable container. When missing, querySelector returns null, leading to a traceback. **Solution:** Updated the XML template to explicitly include 'o_renderer' in the class list. This restores the functional hook required by the JavaScript controller for scroll restoration while maintaining the custom 'o_payrun_kanban' layout. Task: 5971861 Forward-Port-Of: odoo/enterprise#108847
This update resolves a test failure related to holiday attestations in the Belgian payroll module. Adding a 'freeze_time' setting to the test ensures it accurately reflects the payroll calculations, preventing disruptions to payroll processing. This fix improves the reliability of the holiday attestations feature.
Original PR description
Addind freeze_time to Fix holiday attest test that failed on the runbot Forward-Port-Of: odoo/enterprise#109519 Forward-Port-Of: odoo/enterprise#107490
This update corrects a bug that prevented the billable timesheet KPI from accurately filtering timesheets. The fix now uses a more reliable method – checking for a linked Service Order Line – to determine billable status. This ensures accurate reporting and improves the usability of timesheet data.
Original PR description
Due to a previous [commit](https://github.com/odoo/odoo/commit/8e8b273), the "Billable" and "Non-Billable" were incorrect for timesheets. This lead the billable timesheet KPI button not to filter the timesheets anymore. This is fixed by filtering based on whether the analytic line has an SOL associated to it, which is more robust to changes in the `billable_type` field, and improves clarity. Further, remove unnecessary service patch introduced in odoo/enterprise#108035. See odoo/odoo#250149 task-5956027 Forward-Port-Of: odoo/enterprise#108347
This update resolves a bug that caused a RecursionError when producing large quantities of products with serial tracking. The issue stemmed from excessive recordset access during order splitting, leading to performance problems. This change ensures stable production processes for high-volume operations.
Original PR description
**Issue** When producing a large number of serial-tracked products, a RecursionError can occur. **Steps to reproduce** - Create three products tracked by serial number (ensure MTO and Manufacture…
**Issue** When producing a large number of serial-tracked products, a RecursionError can occur. **Steps to reproduce** - Create three products tracked by serial number (ensure MTO and Manufacture routes are enabled). - Create a BoM for product A containing product B. - Create a BoM for product B containing product C. - Create a BoM for product C containing another product. - Create a manufacturing order of 100 units for product A and confirm it. - Go to the MO C and split into 100 mo - Go to the MO B and split into 100 mo -> RecursionError: maximum recursion depth exceeded. **Cause** While splitting, this method is called: https://github.com/odoo/odoo/blob/cda011dc8590773f6c3a26f4ae9d5242a3147024/addons/mrp/models/mrp_production.py#L2031 which ultimately calls: https://github.com/odoo/odoo/blob/cda011dc8590773f6c3a26f4ae9d5242a3147024/addons/stock/models/stock_move.py#L658-L661 This retriggers `_compute_packaging_uom_id` for all moves in `move_orig_ids` or `move_dest_ids`, and accessing the full recordsets causes recursive recomputation leading to a RecursionError. opw-5265424 Forward-Port-Of: odoo/enterprise#106999
This update fixes an issue where the depreciation amounts for assets with analytic distribution weren't being calculated correctly in the depreciation schedule report. Now, when the analytic filter is enabled, the depreciation amounts are accurately distributed across each asset's analytic account, ensuring more precise financial reporting.
Original PR description
Previously, when the analytic filter is enabled in the depreciation schedule, the total depreciation amount was shown in each respective depreciation column, and the analytic distribution was not taken into account. This commit fixes the depreciation amount for assets with analytic distribution in the depreciation schedule report. When the analytic filter is enabled, the amounts are computed correctly under each analytic's depreciation column. task-5959962 Forward-Port-Of: odoo/enterprise#108484
A recent update caused a disruption in SEPA direct debit payments, preventing customers from completing transactions. This fix addresses a missing data element within the payment provider object, resolving the error and restoring functionality. The change was introduced following another update and is now corrected.
Original PR description
Issue: --- The SEPA direct debit is broken. Steps to reproduce: --- 1- Enable SEPA direct debit in payment providers. 2- Add something to cart and try paying using SEPA direct debit. You get the error: `payment.provider object has no attribute company.` Cause: --- This is introduced after #250326. opw-5993720 Forward-Port-Of: odoo/enterprise#109672
This update resolves an issue where US payroll reports were incorrectly appearing in Odoo databases set up for India. The fix ensures that the necessary US payroll module is automatically installed when the base HR payroll module is installed, preventing this unexpected report visibility. This ensures consistent and accurate reporting across all Odoo environments.
Original PR description
**Version:** saas-19.1 **Steps to reproduce:** - Create a new database with India as country. - Install l10n_in_hr_payroll. - US company based reports are visible. **Issue:** Reports specific to us payroll localisation are visible for base hr_payroll module **Cause:** The l10n_us module was missing as the auto_install dependency. **Solution:** Added l10n_us as the auto_install dependency in the manifest file. **task-5948747** Forward-Port-Of: odoo/enterprise#108435
This update corrects a bug where the hours displayed for shifts spanning across multiple days were incorrectly truncated. The issue stemmed from outdated logic related to grid snapping. Removing this logic ensures accurate hour display for shifts, regardless of their duration, now that the Gantt chart no longer truncates pill names.
Original PR description
### Issue: The pill name contains the hours when it spans over the next day for less than 3 hours but not if more than 3 hours. ### Steps to reproduce: - Go to Planning app - Create a shift for an…
### Issue: The pill name contains the hours when it spans over the next day for less than 3 hours but not if more than 3 hours. ### Steps to reproduce: - Go to Planning app - Create a shift for an employee from 3pm to 2am (over two days) - The hours of the shift are displayed - Modify the shift end to 3am - The hours of the shift aren't displayed ### Cause: Before the refactor adapting the gantt view to OWL, when a shift spanned over two days less than three hours, then the gantt view truncated the pill to display it in only one day. (see [`_snapToGrid()`](https://github.com/odoo/enterprise/blame/a16b2ef569903c0ae5803c169dbd68acd0141fe1/web_gantt/static/src/js/gantt_row.js#L1044-L1072)) The same logic was done for the computation of the pill's name in [this commit](https://github.com/odoo/enterprise/commit/98a86cbacf484646f486e4648788cfa53cc9648c). But as the pills are no longer truncated since 17.0, the computation of pill names is faulty. ### Solution: We remove the checks of the 3-hour margin. This also makes the variable `spanMoreThanOneDay` useless, so we delete it. opw-5881532 Forward-Port-Of: odoo/enterprise#109548 Forward-Port-Of: odoo/enterprise#107233
This update resolves a rare crash in the Gantt chart view that occurred when users interacted with search filters. The fix prevents the chart from losing track of task pills during search operations, ensuring a more stable user experience. This improves the reliability of the Gantt chart for managing projects.
Original PR description
This commit fixes a traceback in the Gantt view caused by a race condition during search operations. If a user clicks a search dropdown item located directly above a task pill, and that search filters out the underlying pill, a `pointerenter` event can fire on the pill just as the dropdown closes. Because the search amy already be applied, the renderer could lose track of the pill, causing the handler to crash when trying to access it. This commit adds a safety check to the event handler to exit early if the hovered pill is no longer found in the renderer. Forward-Port-Of: odoo/enterprise#109545
This update clarifies how Helpdesk articles are searched when a non-root article is selected as the main article. Previously, searching didn't include child articles, but now it only searches the selected article. Additionally, a minor issue with the dropdown functionality has been addressed to prevent empty dropdowns.
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 resolves a tour test failure caused by a delay in order synchronization. The fix adds a pause in the tour to ensure the order is fully processed before initiating refunds, preventing a constraint error related to negative order amounts.
Original PR description
In this commit: =============== - Fix the tour `test_mx_pos_invoice_order_and_refund` failing with **WARNING**: `The amount of the order must be positive for a sale and negative for a refund`. caused by an order sync issue with the backend. Cause: ====== - The tour started the refund immediately after validating the order, while the original order was still syncing with the backend. - Because of this, the constraint `_l10n_mx_edi_constrains_amount_total` was triggered since the order had `amount_total < 0` but `refunded_order_id` was not set yet. Fix: ==== - Add a waiting step in the tour to make sure the order is fully synced before starting the refund flow. Task: 5993576 Error: 237980 Forward-Port-Of: odoo/enterprise#109362
This update fixes an issue where the VoIP keypad wasn't correctly updating during calls. Now, when users type digits on the keypad, the system accurately reflects those presses in the softphone, ensuring a seamless call experience. This improves the reliability and usability of the VoIP feature.
Original PR description
When typing digits in the VoIP PiP keypad during an in-progress call, only DTMF was sent and the in-call keypad model was not updated. This change syncs PiP keypad presses with the softphone. task-5979774
This update corrects a problem with how leave periods are calculated, specifically addressing potential inconsistencies caused by different time zones. By using a new date field, the system now accurately reflects leave schedules regardless of where the data is accessed, ensuring accurate payroll processing for employees in Switzerland.
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#109736 Forward-Port-Of: odoo/enterprise#108541
This update resolves a technical issue preventing tax report tests from running correctly within the `l10n_vn` module. The change involves updating a tax label to ensure all tests pass, improving the reliability of tax reporting functionality. This ensures accurate tax calculations and reporting.
Original PR description
Updates in the `l10n_vn` module revised a tax label. We update it here to pass otherwise failing tests. task-[5904297](https://www.odoo.com/odoo/all-tasks/5904297) odoo-[251906](https://github.com/odoo/odoo/pull/251906) Forward-Port-Of: odoo/enterprise#109478
This update resolves intermittent test failures in the l10n_ph_reports_asset module related to how depreciation calculations handle leap years. The fix ensures accurate reporting by stabilizing the test suite against this specific drift, preventing potential reporting discrepancies.
Original PR description
The test suite fails intermittently due to leap years affecting daily -computed depreciation runbot-[241145](https://runbot.odoo.com/odoo/runbot.build.error/241145) Forward-Port-Of: odoo/enterprise#109482
Code cleanup and technical improvements
This update adds `.this` to template variables across several Odoo modules in preparation for a future update (OWL3). This change is necessary because OWL3 will require a specific syntax for accessing component variables within templates, ensuring compatibility and functionality.
Original PR description
In preparation for OWL3, where template variables will need to use `.this` to target component variables, we add `.this` to template variables that are targetting the component. communtiy PR: https://github.com/odoo/odoo/pull/250843 Script PR: odoo/odoo#247965 task: OWL3 prep - add this. to template variables
This update modifies Odoo templates to align with OWL3 requirements, specifically by adding `.this` to template variables that target component parts. This change is a necessary preparation for the new OWL3 framework and ensures consistent functionality moving forward. It impacts several knowledge and IoT modules.
Original PR description
TODO: Double check the change of quote in `knowledge.MacrosEmbeddedClipboard` In preparation for OWL3, where template variables will need to use `.this` to target component variables, we add `.this` to template variables that are targetting the component. Community PR: https://github.com/odoo/odoo/pull/250118 Script PR: odoo/odoo#247965 task: OWL3 prep - add this. to template variables THIS_TARGETS = ["iap", "im_livechat", "iot", "knowledge", "link_tracker", "loyalty", "lunch"]
This update modifies Odoo templates to align with upcoming OWL3 requirements. Specifically, it adds `.this` to template variables that reference components, ensuring compatibility with the new OWL3 framework. This preparation is crucial for a smooth transition to the next version.
Original PR description
In preparation for OWL3, where template variables will need to use `.this` to target component variables, we add `.this` to template variables that are targetting the component. Script PR: odoo/odoo#247965 THIS_TARGETS = ["documents", "equity", "esg"] task: OWL3 prep - add this. to template variables
This update prepares Odoo for OWL3 by modifying template variables to correctly reference component data using `.this`. This change is necessary to ensure proper functionality with the upcoming OWL3 framework and avoids potential issues with how variables are accessed.
Original PR description
In preparation for OWL3, where template variables will need to use .this to target component variables, we add .this to template variables that are targetting the component. Script PR: https://github.com/odoo/odoo/pull/247965 task: OWL3 prep - add this. to template variables
This update prepares Odoo for the upcoming OWL3 release by updating template variables. Specifically, it adds `.this` to certain variables, which is a necessary change to ensure compatibility with OWL3's new variable targeting system. This ensures continued functionality after the upgrade.
This update prepares the Helpdesk module for a future upgrade (OWL3) by adding `.this` to template variables. This change ensures that the Helpdesk interface correctly targets component variables, preventing potential issues after the upgrade. It's a necessary step to maintain functionality and avoid disruptions.
Original PR description
In preparation for OWL3, where template variables will need to use `.this` to target component variables, we add `.this` to template variables that are targetting the component. Script PR: odoo/odoo#247965 THIS_TARGETS = ["fleet", "frontdesk", "gamification", "google", "helpdesk"] task: OWL3 prep - add this. to template variables
This update adds the `.this` syntax to template variables within several Odoo modules to align with upcoming OWL3 requirements. This change is a necessary preparation step to ensure compatibility with the new OWL3 rendering engine, preventing potential issues with how template variables access component data.
Original PR description
In preparation for OWL3, where template variables will need to use `.this` to target component variables, we add `.this` to template variables that are targetting the component. Script PR: odoo/odoo#247965 THIS_TARGETS = ["currency", "data", "digest", "delivery"] task: OWL3 prep - add this. to template variables
This update modifies Odoo's templates to align with upcoming OWL3 requirements. Specifically, it adds `.this` to template variables that reference components, ensuring compatibility with the new variable targeting method. This preparation is crucial for a smooth transition to the OWL3 environment.
Original PR description
In preparation for OWL3, where template variables will need to use `.this` to target component variables, we add `.this` to template variables that are targetting the component. Community PR: odoo/odoo#250049 Script PR: odoo/odoo#247965 task: OWL3 prep - add this. to template variables
This update modifies Odoo's templates to align with upcoming OWL3 requirements. Specifically, it adds `.this` to template variables that reference components, ensuring compatibility with the new variable targeting system. This preparation is crucial for a smooth transition to OWL3 and avoids potential issues with future template functionality.
Original PR description
In preparation for OWL3, where template variables will need to use `.this` to target component variables, we add `.this` to template variables that are targetting the component. Community PR: https://github.com/odoo/odoo/pull/250096 Script PR: odoo/odoo#247965 task: OWL3 prep - add this. to template variables THIS_TARGETS = ["hr"]
This update adds `.this` to template variables within the appointment and approvals modules to align with upcoming OWL3 requirements. This change is a necessary preparation step to ensure compatibility with the new OWL3 template engine and avoid potential issues with how variables are referenced.
Original PR description
In preparation for OWL3, where template variables will need to use `.this` to target component variables, we add `.this` to template variables that are targetting the component. Script PR: odoo/odoo#247965 task: OWL3 prep - add this. to template variables
This pull request contains a series of updates to various UI components within the Odoo Enterprise application. These changes primarily focus on improving the user experience and streamlining workflows related to bank reconciliation, financial reporting, and online transaction synchronization. The updates are largely cosmetic and aimed at enhancing usability.
This update modifies Odoo templates to align with upcoming OWL3 requirements, specifically by adding `.this` to target component variables. This change is a necessary preparation for a future update and ensures compatibility with the new OWL3 framework. It impacts several modules to maintain functionality.
Original PR description
In preparation for OWL3, where template variables will need to use `.this` to target component variables, we add `.this` to template variables that are targetting the component. Community PR: https://github.com/odoo/odoo/pull/251512 Script PR: odoo/odoo#247965 THIS_TARGETS: ["hr", "iap", "im_livechat", "iot", "knowledge", "link_tracker", "loyalty", "lunch"] task: OWL3 prep - add this. to template variables
6 changes
Resolved issues and error corrections
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 update addresses a technical bug that impacted user experience.
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
This update resolves an issue where deleting a workspace (folder) linked to a folder setting would trigger a database error. The fix prevents these folders from being deleted during the system's automatic cleanup process, ensuring data integrity and stability. This improves the reliability of the Documents module.
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#109434 Forward-Port-Of: odoo/enterprise#104875
This update fixes an issue in Odoo's Web Studio where dropdown menus with tags would shrink unexpectedly. Now, the dropdowns always occupy the full width and the caret is correctly aligned, ensuring a consistent and user-friendly experience. The visual appearance of the popover options remains unchanged to maintain tag visibility.
Original PR description
Prevents the SelectMenu from shrinking the dropdown input in studio due to tags on the same flex div BEFORE: - The dropdown width was not fixed. - Dropdown caret not on top of input when mulitple tag force dropdown on new line. NOW: - Web studio dropdown property width always full. - Caret aligned from the bottom ensuring its always on top of the input. Note: The pop over with all the option is still visually odd, but left it as is as it means we can still see the tags when selecting another option. task#5226503
This update removes a confusing zoom feature from the scatter plot chart in Odoo Enterprise. This change simplifies the chart's functionality and aligns with upcoming plans to allow users to manually set axis ranges. The removal improves the chart's usability and prepares for future customization options.
Original PR description
## Task Description This PR aims to remove the zoomable feature for the scatter plot, as it's kind of non-sense to be able to zoom on an axis and not on the other for this type of chart. Moreover, we will soon be able to manually set the min/max of each axis manually (in master). ## Related Task - Task: 5388389
A JavaScript error was causing issues when reloading the shopfloor app. This update disables the automatic focus of the search bar, preventing the error and ensuring the app functions correctly after a reload or duplication of the page. This improves stability and user experience.
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-3894728This update adjusts the minimum and maximum amounts available for employee mobility budgets each year. These limits are automatically indexed to reflect inflation and market changes, ensuring employees have appropriate support for relocation. This change ensures compliance with Belgian tax regulations regarding mobility 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
10 changes
Resolved issues and error corrections
This update fixes a potential issue where the ECPay integration for Taiwanese companies wasn't working correctly. The change ensures the integration triggers accurately by checking the company's fiscal country instead of just its physical location. This guarantees proper ECPay processing for all Taiwanese businesses using the Odoo system.
Original PR description
Previously, the module checked `company_id.country_id.code == 'TW'` to determine if Taiwan's ECPay logic should be applied. However, `country_id` only represents the physical address of the company. This commit replaces `country_id` with `account_fiscal_country_id` across the sale order model and website controllers. This ensures that the ECPay integration correctly triggers for any company using the Taiwan fiscal localization. Task-6002433 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that refund invoices (credit notes, debit notes, and refunds) generated for Malaysian e-Invoicing (MyInvois) comply with API requirements. Specifically, the prepaid amount is now correctly set to zero, and the payable amount reflects the full invoice total for these document types. This improves data accuracy for e-invoicing submissions.
Original PR description
Currently, the `prepaid_amount` in the UBL export is calculated as `amount_total - amount_residual` for all document types. However, for credit notes, debit notes, and refund notes (both standard and self-billed, corresponding to document type codes 02, 03, 04, 12, 13, and 14), this amount should be 0 to comply with Malaysian e-Invoicing (MyInvois) API requirements. This commit introduces the following fixes: - Sets the `prepaid_amount` to 0 for document types '02', '03', '04', '12', '13', and '14'. - Update the `payable_amount` to the full `invoice.amount_total`. Task-5971843 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251915
This update resolves an error that occurred when exporting UBL/CII documents due to incorrect handling of missing country codes on invoices. The change ensures the system safely processes invoices without country codes, preventing errors and improving the reliability of UBL/CII exports. This update is a critical fix for accurate international invoicing.
Original PR description
Description of the issue/feature this PR addresses: This PR fixes an error occurring during the evaluation of the UBL/CII export condition when the country_code field on the invoice or its commercial…
Description of the issue/feature this PR addresses:
This PR fixes an error occurring during the evaluation of the UBL/CII export condition when the country_code field on the invoice or its commercial partner is not set. In Odoo, unset fields may return False, which can lead to type comparison errors when performing membership checks against string values.
Current behavior before PR:
If invoice.country_code or invoice.commercial_partner_id.country_code is False, the condition that checks whether the country code is in ('FR', 'DE') may raise an error because a boolean value is being evaluated where a string is expected.
Desired behavior after PR is merged:
The condition safely handles cases where country_code is not set by normalizing the value before performing the membership check. This prevents type errors and ensures the logic behaves correctly even when the country code is missing.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves a bug where scanning products tracked by lot incorrectly added all quantities to a single line in the barcode app, leading to unnecessary backorders. The fix ensures quantities are distributed across all relevant move lines during the scanning process, improving order fulfillment accuracy. This prevents overfilling of lines and avoids incorrect backorder creation.
Original PR description
### Issue: When scanning products tracked by lot in the barcode app, if multiple move lines existed for the same product, all scanned quantities were incorrectly added to a single line. This left…
### Issue: When scanning products tracked by lot in the barcode app, if multiple move lines existed for the same product, all scanned quantities were incorrectly added to a single line. This left other lines unfulfilled and caused an unnecessary backorder. #### To reproduce the issue: 1- Enable `Lots and Serial Numbers` in setting 2- Create a product and track it by lots 3- Create a PO, with 2 lines of each 1 quantity of our product 4- Go to barcode. From `receipt` operation find the PO picking 5- Scan the product and fulfill the line. You will have a line of 2/2 fulfilled. Validate. 6- As you see a backorder is created. 7- If you check the moves from PO, you can see there are 2 lines with 2/1 and 0/1 qty_done which made the backorder #### Cause: This is caused because in addQuantity, the quantity increment is only applied to 1 line, ignoring the fact there might be multiple lines: https://github.com/odoo/enterprise/blob/def740d23c006b97b60fd1a0cd5acadca8abfac6/stock_barcode/static/src/components/line.js#L118-L127 This will going to add all quantities to single line, making it ovefilled. Here the line will have the `qty_done` = 2 while its `quantity` is 1. The other line's qty_done remain 0, causing backorder. ### Fix: We can first, make sure to fulfilling all lines, then if all are fullfilled and there are stil quantities to add, then it can be arbitrary added to one line. We keep the current logic for negative quantitites, as the increment is only done by -1. opw-5035778
This update adjusts the minimum and maximum amounts for employee mobility budgets each year, aligning them with inflation. This ensures employees continue to have access to appropriate budget levels for relocation expenses. The change is a technical update to the payroll module.
Original PR description
Each year the minimum and maximum amount of mobility budget is indexed, here are the new values.
This update resolves an issue preventing the deletion of products tied to specific companies when a Point of Sale session is open in another company. The fix now only checks for open sessions matching the product's company ID, allowing for smoother product management across different company environments. This improves user workflow and reduces unnecessary session closures.
Original PR description
**Problem:** When we try to delete a company specific product (company_id field), the deletion will fail if we have an opened session, even in another company that does not have access to this product. **Steps to reproduce:** - Create a product for company A only - Go to company B and open a PoS session - Go back to company A and try to delete the product - It fails and asks to close all PoS sessions **Why the fix:** The way it was done before this commit is to check that all PoS session were closed before allowing the deletion of a product. It makes more sense to only check this if the product we are trying to delete is not a company specific product. The way we do it now is that if the products are company specific, we only check the open sessions that match the product's company_id field. This way, the product could be deleted even if some sessions are opened in other companies. opw-5050325
This update resolves an issue where reconciling batch payments with bank statements would fail due to currency exchange rate discrepancies. The system was incorrectly using outdated exchange rates when calculating the reconciliation amount, leading to an unbalanced move error. This fix ensures accurate bank reconciliation for batch payments.
Original PR description
…tion Currently, under certain conditions, reconciling a batch payment with a bank statement may not be possible as the system tries to create an unbalanced move. Steps to reproduce: - Have the main…
…tion Currently, under certain conditions, reconciling a batch payment with a bank statement may not be possible as the system tries to create an unbalanced move. Steps to reproduce: - Have the main company in USD and EUR as foreign currency - Have a bank journal with currency EUR (Bank EUR) - Create an xchange rate for today (1.1) - Make a Payment (EUR), it should not have an associated move - Put the payment in a batch - Update the exchange rate for today (1.2) - Create a Bank transaction in the journal Bank EUR matching the payment amount - Open the bank reconciliation screen and reconcile the transaction with the batch Expected result: Everything is reconciled. Actual result: User gets an error message saying that the account move is not balanced. Analysis: The issue occurs because the reconciled payment amount is converted to the company currency using the date provided in the payment. However the rate was changed in the meanwhile, so it does not match the amount that was used to create the exchange entry values. opw-5164405
This update resolves an issue where users without project access rights would encounter errors when modifying work orders linked to private projects. The fix ensures that workers can successfully update these work orders, improving workflow efficiency and preventing disruptions.
Original PR description
When working on a MO that is linked to a project in private, it will trigger a access error if the worker is does not have project access right Steps to reproduce: ------------------- * Install Project, MRP, Accouting * Create a private project * Create a MO and link it to this project * confirm this MO with a user that has no project access right Observation: ------------- When modifying the MO, we will pass through the write that has been overwritten: https://github.com/odoo/enterprise/blob/b332af45a46b2295797a5096f68b7953554a495b/project_mrp_workorder_account/models/mrp_production.py#L6-L10 we will call _get_analytic_distribution on project.project and since _get_analytic_distribution will [read fields from self](https://github.com/odoo/odoo/blob/436921c24a531eba6bf57ffe3f7c3b4978139d83/addons/analytic/models/analytic_line.py#L59-L64) we need project.project read rights. opw-4919576
This update significantly speeds up a key process within the Odoo accounting module by optimizing how it identifies related accounts. Previously, the system searched through many records, but now it uses a more efficient method to quickly find and match accounts, resulting in a substantial performance boost.
Original PR description
Before this commit, retrieving the `account_ids` from the properties in the method `_get_default_amls_matching_domain` involved searching for all the properties and calling the method `get_by_record` on each record. The `accounts` were fetched only to get the ids to add them to the `blaclisted_stock_account_ids`. Since, the domain had the condition `value_reference != False`, and the field holds the model name and the id of the record, we can directly fetch the `ids` by doing a read_group to eliminate possible duplicates and add the ids to a set of `account_ids`. This will eliminate a search to every record of the `properties` fetched which will improve the performance significantly. The benchmark done below was on a database that fetched **15630** properties and it was only tied to **two** accounts. | Scenario | Time (seconds) | |-----------|----------------| | **Before** | **7s** | | **After** | **27ms** | opw-5868236 Forward-Port-Of: odoo/enterprise#107257
Documentation and clarification updates
This pull request adds a required Certificate of License Agreement (CLA) signature for Odoo version 17.0. This ensures compliance with Odoo's open-source licensing requirements and protects the project's legal standing. The change is a standard legal update.
Original PR description
Added missing CLA for V17.0 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252213
2 changes
Resolved issues and error corrections
This update ensures the delivery button remains accessible on sales quotes, even after products are removed from the associated delivery. Previously, the button disappeared, creating a usability issue. This change prevents confusion and maintains a consistent workflow for users managing sales orders and deliveries.
Original PR description
Steps to reproduce: - Create a new sales quote with >=1 products and confirm it - Click on the delivery smart button - Remove all products from the delivery and save - Navigate back to the sales quote Current behavior: - The smart button for the delivery is gone in the sales quote form Expected behavior: - The smart button for the delivery should always remain Note: There is no way for the user to relink the sales order to the delivery or make a new one, hence the necessity of this opw-5941496
This update fixes a bug causing excessive and unwanted warning messages in Odoo. The issue stemmed from how Odoo uses a specific library (werkzeug.urls) and a previous version of that library didn't include necessary fixes. This change ensures warnings are handled correctly, preventing a cascade of notifications.
Original PR description
Every manipulation of the warnings list flushes the warnings registry, which prevents `warnings.warn` from deduplicating `default`, `module`, and `once` actions, instead they all behave as if `always`. Because werkzeug.urls is used *a lot* in odoo, this causes warnings to be emitted continuously even if that's not intentional, something which is already an issue due to workers (every new worker has an empty warnings registry triggering duplicate warnings). Upstream fixed this issue in pallets/werkzeug#2692 which was merged in 2.3.4, but apparently we vendored 2.3.0 which didn't have these fixes.