Daily updates from Odoo
Friday, December 19, 2025
18 changes · master
Resolved issues and error corrections
This update fixes an issue where rental receipts were incorrectly validated without warnings, even when incomplete. The change ensures that rental receipts are handled correctly, preventing validation errors and allowing for accurate tracking of partial rental returns. This improves the rental process for users.
Original PR description
Steps to reproduce: - Enable Rental pickings - Create a rental for a product, for 4 quantity - Process the delivery - Open the barcode app and open the reception - Scan the product once and validate…
Steps to reproduce: - Enable Rental pickings - Create a rental for a product, for 4 quantity - Process the delivery - Open the barcode app and open the reception - Scan the product once and validate Issue: The receipt is validated without issues nor warning, despite being incomplete. This is due to a bad mix of two changes: - #60801, which always sets the rental receipt as return of the delivery - #48788, which removes the backorder check for returns in barcode For regular returns made in barcode, it makes sense to avoid the backorder check, as from here we're processing a full picking return and we'd have the confirmation pop every time. However, things are different for rental receipts, as despite them being set as returns of the delivery, they're proper receipts that need to handle the partial receipt. To avoid the issue, rather than removing the backorder check whenever there's a return linked to the picking, now also checks that there isn't a rental order linked to the picking. opw-5265874 Forward-Port-Of: odoo/enterprise#101387
This update fixes a recurring issue where users were receiving duplicate order receipts due to delays in communication with the IoT printer. The fix ensures a unique identifier is used for all print requests, preventing the IoT box from processing the same action multiple times and eliminating the 'printing failed' error.
Original PR description
Currently multiple clients report double order receipts printing. This PR fixes the issue where due to slow network connection a request would be sent to the iot box but the iot box didn't reply in time to confirm the action finish. The user would then get an error showing 'printing failed' (due to a timout). If he cliks on retry the iot box would still print the previous receipt and then receive the new "retry" request with now a new action uuid which would also be printed because uuid is different from the 1st request. This PR adds a consistent uuid for both the initial and all the subsequent retry requests so that double actions would never be done by the iot box. Forward-Port-Of: odoo/enterprise#102266
This update resolves an issue impacting Swiss payroll calculations, specifically related to overtime payments (ST-Overtime) and the LPP (Lohn- und Premodifizierungs-Pauschale) tax. The fix ensures accurate and compliant payroll processing for Swiss employees, addressing a previous error.
Original PR description
Forward-Port-Of: odoo/enterprise#102249 Forward-Port-Of: odoo/enterprise#102161
A previous access restriction prevented HR Officers from generating offer documents. This fix updates the system to allow Officers to access the necessary data fields, ensuring they can complete this critical step in the hiring process. The change was made to align with recent HR module updates that tightened access controls.
Original PR description
Steps to reproduce: ------------------------- 1. Install Salary Configurator module. 2. Create a new user and assign Officer rights in Employees and Recruitment. 3. Login with that user. 4. Create a…
Steps to reproduce: ------------------------- 1. Install Salary Configurator module. 2. Create a new user and assign Officer rights in Employees and Recruitment. 3. Login with that user. 4. Create a new application and move it to 'Contract proposal' stage. 5. Click on the 'Generate Offer' button. Observation: ------------------------- An Access Error occurs, denying Read access to the `final_yearly_costs` field. Issue: ------------------------- In earlier versions, users had an additional access right that allowed them to access contract fields. After the HR modules were refactored, only HR Administrators and Payroll Users retained access to those fields. As a result users with only Officer rights in HR encountered an access error when generating an offer. Solution: ------------------------- Use `sudo()` to bypass access restrictions for the `final_yearly_costs` field when generating the offer. opw-5243280 Forward-Port-Of: odoo/enterprise#102250 Forward-Port-Of: odoo/enterprise#99478
This update fixes an issue where duplicated subscription deliveries weren't correctly reflecting delivered quantities. The change ensures that delivery dates are properly used to calculate quantities, leading to more accurate tracking of delivered items. This improves the reliability of subscription order reporting.
Original PR description
The use of date_deadline instead of date in the filter messes up the calculation of delivered quantities when you duplicate a delivery. Task: 4910572 Forward-Port-Of: odoo/enterprise#89550
This update resolves an issue where recurring revenue (MRR) calculations were incorrectly converting currency, leading to inaccurate reporting and missing achievement data. The fix ensures accurate currency conversion during reporting, guaranteeing correct revenue recognition and improved financial visibility.
Original PR description
Before this commit, the log amount_signed was converted to the currency of the company of the log before being converted to the currency of the current company. There were issues as sometimes we did not any value in sub_rate_query. The join would fail to find a row and therefore the achievement would not be displayed. Moreover, the conversion rate were not always correct. This commit reuse the logic of the sale_order_log_report. We convert the amount_signed of the log into the currency of the main company and we convert that amount into the currency of the current company. Forward-Port-Of: odoo/enterprise#101813
This update fixes an issue where clicking on activity counters in the systray didn't correctly filter documents. The change ensures users only see documents with relevant pending activities, aligning with standard Odoo behavior. This improves the user experience and accuracy of document views.
Original PR description
Clicking on activity counters (Late, Today, Future) in the systray relies on specific "search_default" keys to filter the target model's view. Previously, these specific activity filters were missing from the document search view or had the wrong name, causing the systray to fail to filter the documents correctly when redirected. This resulted in the user seeing all documents instead of only those with the relevant pending activities. Note: the 'My Activities' filter is set to invisible, to align with standard odoo behaviour. Task-5427921
This update resolves a bug that occurred when multiple CAF ranges were active within a document type, causing errors during invoice processing. The fix ensures the system selects the CAF with the lowest starting number, allowing for proper gap filling and preventing database errors. This improves the reliability of invoice processing for users.
Original PR description
In #92208 the CAF system was improved to find the next starting value in the right sequence if there are multiple in the system. If no CAFs are found, it will reset to the document types starting…
In #92208 the CAF system was improved to find the next starting value in the right sequence if there are multiple in the system. If no CAFs are found, it will reset to the document types starting number. This worked except in the case where there are multiple CAFs that are currently marked active in a document type. As it tries to access `caf.start_nb` it hits an ensure_one() which throws a traceback whenever you open most account.moves on the DB. Steps to reproduce: - Modify the CAF for Doc Type 33 (Electronic Invoices) to have a smaller range than 1 - 999,999 (1 - 5) - Create Two new CAF files also for Doc Type 33 that start after this value (6 - 10 and 11 - 15 for example). - Mark the original to be spent via cancelling it and try to open an invoice. It will find both of the new CAFs and try to get the start_nb of the recordset. In discussion with the PO, when we have multiple CAFs, we should pick by the lowest start number as it will allow for any gaps that might exist be filled. opw-5414350 Forward-Port-Of: odoo/enterprise#102385
This update resolves an issue where online orders with dynamic attributes wouldn't appear in the POS system if the corresponding product variant wasn't created. Now, the system automatically creates the variant before processing the order, ensuring all online orders are correctly reflected in the POS.
Original PR description
Before this commit: --- - When an order was placed with a dynamic attribute and the corresponding variant was not created in Odoo, the order did not appear in POS. After this commit: --- - When an order is placed with a dynamic attribute and the variant does not exist in Odoo, the variant is first created and then the order is successfully placed in POS. task-5056425
This update automatically assigns team members to new tasks created from project templates, ensuring consistent resource allocation. Previously, the task assignment process was unreliable due to an issue with how task order was handled, now it correctly uses the task template to determine team members.
Original PR description
Before this commit, after having created the project from a project template, a loop is made to scheduled the task and check the roles set on the task template. The problem is looping on `zip(self.task_ids, project.task_ids)` cannot guarrantee the tasks in the both are in the same order than the tasks insertion since `task_ids` will depend on the order of the task model. To be sure, the task template is the one used to create the task in the project duplicated, the process should be done in the copy method of task instead of using `task_ids` of both projects. This commit first moves the logic implemented in action_create_from_template in `project_enterprise` module in the copy method of the task. Then, it improves the logic to assign the available resources to the new task planned based on the users set on the roles set on the task template related. task-5139714
This update ensures that AI server actions within Odoo Enterprise always include a prompt. Previously, missing prompts could lead to unexpected behavior. This change improves the reliability and usability of AI-powered features by preventing empty prompts.
Original PR description
In this commit we add an view contraint so that ai server actions are not allowed to have an empty prompt. We cannot make the field itself required since then all server actions will require it. Related 19.0 PR: https://github.com/odoo/enterprise/pull/102441 Task-5379758
This update ensures that documents are automatically created when bank statements are linked to PDF or image attachments. Previously, attachments linked to bank statements weren't generating documents, but now this process is streamlined for better record-keeping of financial data. This improves the accuracy and completeness of accounting records.
Original PR description
In #99297, we synchronize the pdf attachments of bank statements at the attachment creation only. But when the attachment is linked to a bank statement afterward, no document is created. We improve this here by also creating a document when an attachment is linked to a bank statement. As images can also be "converted" into bank statements, we also synchronize the images linked to bank statement with Documents. Use-case: - install accountant and documents_account - Accounting -> Bank - Upload: a pdf or an image - Fill statement lines - Save Here the attachment is linked to the bank statement afterward (see _check_attachments method) so no document was created. Task-5424742
This update resolves an issue where deleting a shopfloor instruction suggestion caused errors. The fix ensures that adding a new suggestion after a deleted one functions smoothly, preventing a traceback related to quality point relationships. This improves the reliability of the shopfloor instruction suggestion process.
Original PR description
**BUG:** Traceback when **suggesting** deleting a BOM step from the shopfoor. **STEPS TO REPRODUCE:** - Open a shopfloor MO (with PLM installed) -- Add a suggestion step (MO > cog> Update…
**BUG:** Traceback when **suggesting** deleting a BOM step from the shopfoor. **STEPS TO REPRODUCE:** - Open a shopfloor MO (with PLM installed) -- Add a suggestion step (MO > cog> Update instructions > Improvement Suggestion > Add a step). -- Add a second suggestion step after the first one. -- Delete the second suggestion step (MO > cog> Update instructions > Improvement Suggestion > Delete a step). -- Add a third suggest suggestion step after the second one we just suggested deleting. -- > Traceback **ORIGIN:** First, when adding the suggestions: - 2 Quality Check (QC) are created on the **new_bom_id** in `add_quality_check_from_tablet.save()` - 2 Quality Point (QP) are also created in `add_check_in_chain()`, (only in mrp_workorder_plm override) - The 2nd new QC is linked to previous QC in `_insert_in_chain` Secondly, when deleting the 2nd added suggestion (_on the same MO, as suggestions are linked to the new bom_id and wont appear on other MOs until ECO is validated_): - The QP of the second QC is deleted (but the QC itself is not deleted) here: https://github.com/odoo/enterprise/blob/f91b0c8c41f40a71cbea3cd4f5ccc6873af3c004/mrp_workorder_plm/wizard/propose_change.py#L72-L74 Finally, when adding a new suggestion after the one we just suggested deleting, in `_add_check_in_chain`, a traceback happens by trying to access the QP point we deleted in the resequencing part of `_add_check_in_chain` here: https://github.com/odoo/enterprise/blob/eb716c18944ec50c9c8c74a2888ed5f3032a7b08/mrp_workorder_plm/models/mrp_workorder.py#L62-L63 **FIX:** We accept that not all QCs must have QPs `[0]` -> `[:1]` (see note on another approach idea) changing ```diff - point = check.point_id if check.point_id.operation_id == operation else points.filtered(lambda p: p._get_sync_values() == check.point_id._get_sync_values())[0] + point = check.point_id if check.point_id.operation_id == operation else points.filtered(lambda p: p._get_sync_values() == check.point_id._get_sync_values())[:1] ``` **NOTES:** -1 Another fix could have been to delete the QC at the same time as the QP but I did not find any `remove_from_chain` function to safely remove the QC from the chain of QC. Along those lines we could rethink the sequencing / resequencing of QC and QP as the logic seems to differ between both. -2 Added some comments to remove the field and the line setting the `is_deleted` field in master as it was not used anywhere in the code (the color highlighting in the ECO is done with `<list decoration-danger="change_type=='remove'" ...>`) Upgrade PR: https://github.com/odoo/upgrade/pull/9076 ticket #5180122 Forward-Port-Of: odoo/enterprise#101366
This update corrects an issue in the Belgian payroll calculations (l10n_be_hr_payroll) related to the deferral of leaves and handling version updates during the month. The fix ensures more accurate PFA (Pension Funds Account) computations, improving payroll reliability and compliance. This impacts the accurate calculation of employee benefits.
Original PR description
Fix the PFA computations: - Fix number of leaves to defer to next months - Deal with change of version in middle of the month Forward-Port-Of: odoo/enterprise#102448
This update streamlines the Website Generator by automatically installing it alongside the Website module, resolving issues with cron activation and improving the user experience. It also cleans up unused code and ensures proper website configuration flow, enhancing the overall stability and functionality of the website import process.
Original PR description
Some fixes and changes before the freeze of 19.1 Make the website_generator auto-install. Move generator specific code from website_enterprise to website_generator as a result of the autoinstall. Fix CRON activation with no records bug. Remove unusued actions in the JS component.
This update resolves an issue where users couldn't adjust prices in the POS system when using the Swedish blackbox. The change allows price control functionality, aligning with requirements for the Swedish market, which differs from the Belgian blackbox implementation. This ensures accurate pricing for Swedish POS transactions.
Original PR description
Before this commit, user couldn't control the price in the POS if using the swedish blackbox. After this commit, user can control the price. It's not clear why the behavior at integration was set to this but it appears that it's not mandatory for swedish blackbox unlike the belgian one. opw-5253401 Forward-Port-Of: odoo/enterprise#101797 Forward-Port-Of: odoo/enterprise#100984
This update fixes a bug in the Mexican Point of Sale (POS) localization that prevented accurate invoice generation after refunds with global discounts. The fix now ensures refund amounts don't exceed the original order total, resolving invoice errors and improving data integrity. This change is specific to the Mexican localization.
Original PR description
When refunding an order that originally had a global discount, if you didn't refund the discount, the refund total amount would exceed the original order total. This would cause issues when trying to…
When refunding an order that originally had a global discount, if you didn't refund the discount, the refund total amount would exceed the original order total. This would cause issues when trying to generate a global invoice for the mexican localization. Steps to reproduce: ------------------- * Activate the global discount option in any PoS * Open PoS and make a sale with a global discount * Refund the sale without including the discount * Go to the backend * Go to the order list and select the 2 orders you made * Now try to create a global invoice > Observation: The global invoice is in error because the negative lines cannot be distributed correctly. Why the fix: ------------ To avoid this issue with the global invoice we simply prevent the user to generate a refund with a greater amount than the original order. We only apply this limit to the mexican localization because it's the only module that is affected by this issue. Other localizations can still refund without restrictions even if this work flow does not really make sense. opw-4899501 Forward-Port-Of: odoo/enterprise#101752 Forward-Port-Of: odoo/enterprise#93101
This update fixes an issue where clicking on activity counters in the systray didn't correctly filter documents. The change ensures that users only see documents with relevant pending activities, improving the user experience and data accuracy. The 'My Activities' filter has been intentionally hidden to align with standard Odoo behavior.
Original PR description
Clicking on activity counters (Late, Today, Future) in the systray relies on specific "search_default" keys to filter the target model's view. Previously, these specific activity filters were missing from the document search view or had the wrong name, causing the systray to fail to filter the documents correctly when redirected. This resulted in the user seeing all documents instead of only those with the relevant pending activities. Note: the 'My Activities' filter is set to invisible, to align with standard odoo behaviour. Task-5427921 Forward-Port-Of: odoo/enterprise#102509