Tuesday, April 7, 2026
15 changes · saas-19.1
New functionality added to Odoo
This update introduces the ability to export Slovak VAT reports in XML format, aligning with the specific requirements of the Slovak government. This ensures accurate and compliant reporting, simplifying the process for our Slovakian clients and improving data accuracy.
Original PR description
Add XML export for the Slovak VAT report, following the official government format Related: https://github.com/odoo/odoo/pull/257528 task-6040973
Enhancements to existing features
This update simplifies database access management for users by adding a dedicated 'databases' tab to the user view. Now, administrators can easily see and manage which databases a user has access to, streamlining the process and reducing manual searching.
Original PR description
The aim of this commit is to allow db_manager to see the list of databases in which a specific user has access and to allow removing this access in bulk if required. Before this commit: To see the list of db in which a user has access, a db_manager would have to go to the list view and make a search on the login/name of the user, potentially matching other db_user in the process. After this commit: The list of db is available out of the box in a databases tab on the res.user view. Task-id: 5945298 Forward-Port-Of: odoo/enterprise#112645
Resolved issues and error corrections
This update corrects a calculation error within the Belgian HR contract salary module that was impacting the accurate determination of yearly cost sacrifice figures. The fix ensures that these figures are now calculated correctly, improving the reliability of financial reporting related to employee contracts. This change primarily affects payroll processing for Belgian entities.
This update resolves an issue preventing the launch of a Web Studio tour due to a problem with how the editor tracked changes. Additionally, a crash in the report processing system was fixed by using a more reliable architecture copy. This ensures the Web Studio functionality continues to operate smoothly.
Original PR description
These changes were made because the diff in https://github.com/odoo/odoo/pull/252844 caused a tour in *web_studio_test_ui_unit_report_tours.js* to fail Cause of issue: =============== For the tour, the powerbox wasn't opening because DOM changes weren't registered with the editor's state system. For *report.py*, after changes to the tour, the system tried loading from file using the backup key as an XML ID. Since backup keys contain dots https://github.com/odoo/enterprise/blob/7ca23bee6f84ccd0cd9c1cd747f434f3cc37861e/web_studio/controllers/report.py#L354 the XML ID parser crashed. Fix: ==== For the tour, registered the DOM mutation (span insertion in the other PR) with the editor's history, since the editor uses a MutationObserver that only processes changes it's aware of. For *report.py*, clearing arch_fs uses the already-copied architecture from arch_db instead.
This update addresses an issue where the Master Production Schedule (MPS) wasn't correctly accounting for safety stock levels when calculating indirect demand. The fix ensures that safety stock is considered, leading to more accurate production forecasts and reduced stockouts. This improves the reliability of the MPS planning process.
Original PR description
Steps to reproduce: ------------------- * Enable "Master Production Schedule" in Inventory settings * Create tracked Product "Child" and set up a vendor * Create tracked Product "Parent" and set up a…
Steps to reproduce: ------------------- * Enable "Master Production Schedule" in Inventory settings * Create tracked Product "Child" and set up a vendor * Create tracked Product "Parent" and set up a bom as component "Child" and Lead Time: 2 days * Create tracked Product "GParent" and set up a bom as component "Parent" and Lead Time: 2 days * Open MPS and add your three products: - Child, Parent: activate indirect demand - Parent: Safety Stock Target of 10 * Add 1 in the forecast demand for "Gparent" on third column -> Will have 20 Indirect Demand Forecast of Child in the first column and -9 on the second Observation: ------------- Usefull comment form the function : https://github.com/odoo/enterprise/blob/b332af45a46b2295797a5096f68b7953554a495b/mrp_mps/models/mrp_mps.py#L424-L447 When creating a demand from the MPS, it will always take the first date of the interval (ex: Week 10 (2-8/Mar), it will create the demand for the 2 of Mars) When calculating the production schedule. we wil we calculate each product for each date_range: https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L488 https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L509 When calculating the values for a product, we will set the indirect demand qty for it component The demand will created the demand in function of the date of when the parent need and the lead time (it will for the previous date range because of the lead time): https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L554 https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L555 If the demand is not equal to the resplensih_qty we will create another demand to compensate, it will use the first date of range minus the lead time it will send it to the previous date range: https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L556-L560 In our case this will create the issue, since it will try to compensate each time on the previous week. opw-5413838 Forward-Port-Of: odoo/enterprise#112811 Forward-Port-Of: odoo/enterprise#107671
This update fixes a bug in how leave dates are calculated for employees, ensuring accurate scheduling across the system. Previously, the system missed potential leave windows if the initial search started too early. The change improves the reliability of leave scheduling and prevents employees from being incorrectly excluded from their approved leave periods.
Original PR description
Before this commit, in `_get_first_working_interval_batch` the `collect_employees` helper only inspected the first item of each employee's work interval. The batch calendar query starts from the global `min_dt` which is the earliest leave end across all employees in the batch. For an employee whose leave ends later, the first returned interval can therefore still fall before that employee's own threshold (`min_dts[employee_id]`). The old code would discard that interval and, since it never examined subsequent ones, silently skip the employee with no result. This commit fixes the issue by replacing the single-item check with a loop that iterates over all of the employee's intervals and picks the first start time strictly after `min_dts[employee_id]`.
This update fixes an issue where carrier tracking information wasn't consistently passed through multi-step delivery processes. The change ensures that tracking references are automatically propagated to subsequent pickings, even without a specific carrier assigned, improving shipment visibility and traceability. This enhancement simplifies tracking and reporting for our users.
Original PR description
Steps to reproduce:
- Enable multi-step routes in Inventory settings
- Go to Warehouse Management → Operation Types
- Set Delivery to 3 steps
- Open the 3-step delivery routes and enable “Propagate carrier” on any rule
- Create a storable product P1
- Create a sales order with 1 unit of P1
- Confirm the sales order
- Open the generated picking
- Go to the Additional Info tab
- Set Tracking Reference = 123
- Confirm the picking
- Open the next picking (Pack operation)
Problem:
The tracking reference is not propagated to the next picking, even though the rule has “Propagate carrier” enabled.
Expected behavior:
The tracking reference should be propagated to the subsequent picking when carrier propagation is enabled on the rule. Even if no carrier set.
opw-6052930
Forward-Port-Of: odoo/odoo#256851This update resolves a bug where the bold formatting action wasn't consistently removing bolding when a `/file` component was present in the selected text. The fix ensures that bolding is correctly applied or removed based on editable text nodes, improving the reliability of the formatting tool. This prevents unexpected bolding behavior.
Original PR description
When determining whether the "bold" action is about adding bold or removing bold, non-editable text nodes are also taken into account. Because of this, if the selection contains an embedded component such as `/file`, it always considers bold was not applied on all nodes, and should therefore be applied. The action thus never removes bold. This commit fixes this by only taking into account the editable nodes. Steps to reproduce: - Go to a "To do" note - Add a few lines of text - Add a `/file` in the middle - Select all - Press Ctrl+B: bold is applied on the surrounding text - Press Ctrl+B again => Bold was not removed from the surrounding text task-5955977 Forward-Port-Of: odoo/odoo#257327 Forward-Port-Of: odoo/odoo#249816
This update fixes a bug where expected hours weren't consistently calculated for attendance records, particularly with overtime. Now, the system correctly updates expected hours after overtime is added, ensuring accurate reporting and time tracking. This resolves discrepancies in reporting views like the Attendance Pivot.
Original PR description
The expected_hours field was not always being computed for attendances. self.add_to_compute is used here to ensure that it is always recomputed. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251989
This update fixes an issue where combo pricing in the self-order mode was incorrect in the backend. The fix accurately calculates prices for combos with multiple quantities, ensuring consistent pricing between the frontend and backend. This improves the reliability of self-order transactions.
Original PR description
**Steps to reproduce:** - Create 2 products, set their price to 0 - Create a combo product, set it's price to 10 - The combo choices should be the 2 products created before - Go to the self order,…
**Steps to reproduce:** - Create 2 products, set their price to 0 - Create a combo product, set it's price to 10 - The combo choices should be the 2 products created before - Go to the self order, order the combo and change the qty to 3 - The price is 30, correct in the frontend - Go to the order in the backend, the price is 0 **Why the fix:** In the backend, during the price recomputation, we did not account for the fact that we could have a parent line with multiple quantity during the split between the free and the extra lines. This means that we counted too many lines, and had to put some in the extra lines. We then override the price_unit with the total_price in this code https://github.com/odoo/odoo/blob/f73c32960721b046076b91e4bc017ddb924e0837/addons/pos_self_order/models/pos_order.py#L341-L342 But the total price has been computed to zero, so the previously computed price_unit is overriden and set to zero. We now divide the line's qty by the parent line's qty to get the qty per parent line, allowing us to have a qty of more than 1 for the parent line. The same is done for the computation of the remaining amount to pay, as **child.qty** is the number of time the item is selected in the combo * the number of combo ordered, meaning it was messing up the computation. opw-6032408
This update fixes an issue where the cost of a sale order was incorrectly calculated when using the dropshipping feature. The fix ensures that the cost accurately reflects the purchase order price (e.g., $10) for dropshipped products, resolving a discrepancy in cost reporting.
Original PR description
**Problem:** The cost is not correctly computed on sale order line when the product is dropshipped. **Steps to reproduce:** - enable "margins" and "dropshipping" settings - create a tracked, fifo…
**Problem:** The cost is not correctly computed on sale order line when the product is dropshipped. **Steps to reproduce:** - enable "margins" and "dropshipping" settings - create a tracked, fifo product with dropship route - add a vendor in the purchase tab - confirm a sale order for 1 unit - set a unit price of 10 in the PO and confirm it - validate the dropship picking - come back to the sale order and unhide de cost column **Current behavior:** the cost is 0 **Expected behavior:** the cost should be 10 based on the unit price of the PO **Cause of the issue:** To compute the purchase price, when there is valued moves linked to the sale order line and the product is fifo/avco, we call _get_price_unit() on the moves. https://github.com/odoo/odoo/blob/98e6e929bf8e0c34ec77fb9d07ef253e0abf681c/addons/sale_stock_margin/models/sale_order_line.py#L21 Which uses the value of the moves https://github.com/odoo/odoo/blob/98e6e929bf8e0c34ec77fb9d07ef253e0abf681c/addons/stock_account/models/stock_move.py#L237-L243 But for dropshipped move the value on the moves is always 0. So the return value will be 0 and purchase price will be 0. **fix:** - The idea of the fix is to use _get_value() instead of the move value for dropship moves. This approach is already used in the code inside _run_average_batch() https://github.com/odoo/odoo/blob/98e6e929bf8e0c34ec77fb9d07ef253e0abf681c/addons/stock_account/models/product.py#L474-L475 - In case there is not only dropship moves we need to do a weighted average opw-6051004 Forward-Port-Of: odoo/odoo#256089
This update fixes an issue where date alignment was automatically applied to Czech tax documents after they were posted. This was causing problems with late tax deductions, which are common in the Czech Republic. Now, users must manually adjust dates for posted documents to ensure accurate reporting.
Original PR description
Description of the issue/feature this PR addresses: This automatic date alignment make sense in case of new document, but when you work on document that was posted. User should change it manually. In Czech republic we have something like late tax deduction and in this case there is not alignment of dates. Current behavior before PR: When you change taxable_supply_date it automatically change date Desired behavior after PR is merged: Disable this calculation od moves that hase been posted. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257135
This update fixes an issue where a second resupply picking was being created when adding components to a subcontracting production order. The fix ensures that new components are correctly grouped with existing pickings based on shared purchase orders, streamlining inventory management and reducing manual effort. This improves the efficiency of our subcontracting processes.
Original PR description
Steps to reproduce: 1- Install Inventory, Purchase and Manufacturing 2- Enable 'multi-step routes' in the settings 3- Create Product A and create a Bill of Materials (BoM type: subcontracting,…
Steps to reproduce: 1- Install Inventory, Purchase and Manufacturing 2- Enable 'multi-step routes' in the settings 3- Create Product A and create a Bill of Materials (BoM type: subcontracting, Component A) 4- Repeat the same for Products [B,C] with components [B,C] correspondingly. 5- Assign the same subcontractor to all of them 6- Create a Purchase Order for both Product A and Product B with vendor as the subcontractor and confirm it 7- Add a new order line with Product C and save Description of issue: A second resupply picking is created Expected behavior: Should group the new product's component with the existing picking Why this happens: When assigning the resupply picking for the new product's component, the search domain for the existing picking includes production_group_id, which is different for the added product. This prevents merging of components into a single resupply picking despite sharing the same destination and purchase order Fix: We ignore production_group_id since it is not necessary in the resupply stock moves domain. opw-5906451 Forward-Port-Of: odoo/odoo#251713
This update fixes issues with capturing Chrome logs during shutdowns and improves the stability of the Odoo server's stop process. The changes ensure critical errors are logged, even during unexpected shutdowns, and enhance the server's resilience to Chrome-related problems.
Original PR description
odoo/odoo#255054 saved the chrome log at the end of a tour (logging that as `INFO` on success and `RUNBOT` on failure). However as it turns out there are a few issues with that: 1. In case of chrome error during termination (`stop`), those errors can not be in the log, since the log was already saved. 2. Chrome buffers logs a lot more than anticipated, and because `--v=0` logs are a lot less chatty than `--v=1` the logs routinely show essentially nothing (a few tour steps are logged then nothing). Also make `stop` a bit more resilient to chrome issues: - handle errors around ws shutdown - wait for chrome to shut down before we try to remove the data directory - also add a fallback *killing* chrome if it doesn't seem to be shutting down Forward-Port-Of: odoo/odoo#256656 Forward-Port-Of: odoo/odoo#256061
This update resolves an issue where switching browser tabs while a product configurator dialog is open would reset sales orders to their original state. Now, changes made within the dialog are correctly saved, ensuring data integrity when navigating between tabs. This improves the user experience when configuring complex products.
Original PR description
## Versions 18.0+ ## Issue When the product configurator dialog is open, a browser tab change acts like a discard on the SOL: coming back to the Odoo tab displays the dialog but the SOL has been…
## Versions
18.0+
## Issue
When the product configurator dialog is open, a browser tab change acts like a discard on the SOL: coming back to the Odoo tab displays the dialog but the SOL has been reverted to its previous state.
## Steps to reproduce
- Create a new SO for any customer:
- Add a standard (non-combo/non-variant) product (e.g. "Apple Pie");
- Save manually;
- Change the product for a combo or variant one (e.g. "Customizable Desk");
- With the opened dialog, change from browser tab then come back;
- The SOL has been reset to the standard product ("Apple Pie") and confirming the dialog has no effect).
## Cause
The `beforeVisibilityChange` hook is triggered by the tab change and saves the form without updated values. This is because the hook checks for two conditions to be true: https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/web/static/src/views/form/form_controller.js#L479-L483 The tab change indeed changes the document's visibility to "hidden" but the controller has never been updated with the form's display in the dialog and, therefore, `this.formInDialog` is indeed equal to zero.
## Test
No test as we cannot simulate a browser tab change then come back to the first tab.
opw-5494089
Forward-Port-Of: odoo/odoo#257846
Forward-Port-Of: odoo/odoo#247797